Validar un checkbox con JQuery

,
Hace un rato un compañero me pidió auxilio para validar si un checkbox esta seleccionado usando jquery,  así que me metí rápidamente a la  pagina de jquery pero no encontré  algo rápido que me dijera como =S (ya ven que todo en desarrollo es para ayer), así que metiéndome a foros encontré unas soluciones, las cuales quiero compartir:



// Opcion 1
var isChk = $('#checkboxId').is(':checked'); // return true o false

// Opcion 2
var isChk = $('#checkboxId').attr('checked'); // return true o false

if( isChk ) {
// TODO Something
}



Son formas fáciles y rápidas de hacer la validación.

Suerte

Hacer FTP de Texto Dinamico

,
Saludos, para empezar no se si puse correctamente el titulo de este post con lo quiero explicar =D, lo que quería hacer era mandar crear un archivo en una maquina remota por FTP con un contenido generado dinámicamente sin tener un archivo local, aja, lo que tenia era un StringBuffer con un contenido que fui armando de manera dinámica, y por restricciones en el servidor (esto lo ocupe para un desarrollo web) no podía generar el archivo de manera local, lo que la mayoría de los ejemplos que había encontrado requerían, así que después de googlear un rato me decidí a ocupar el Jakarta Commons Net el cual requiere de Jakarta Oro para funcionar.

Para Ejecutar la clase se requiere tener estos jars:

•    jakarta-oro-2.0.8.jar
•    commons-net.2.0.jar
•    commons-net-ftp-2.0.jar (este no estoy seguro que sea necesario, pero lo puse =P)

Una vez con los jars adecuados les dejo la clase para su uso:


package com.test;

import java.io.ByteArrayInputStream;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

public class TestFTP {

public static void main(String [] args) {
System.out.println("-------- main ---------");

TestFTP ftpTest = new TestFTP();

try {

ftpTest.setFtpHost("XXX.XXX.XXX.XXX"); // IP del Servidor Remote
ftpTest.setFtpUser("ftpUser"); // Usuario FTP
ftpTest.setFtpPassword("ftpPWD"); // Password Usuario
ftpTest.setFtpRemotePath(""); // Path del directorio, si no hay nada se deja en raiz.
ftpTest.setFtpRemoteFileName("Test.txt"); // Nombre del archivo Remoto

if( !ftpTest.connect() ) {
System.err.println("No se logro la conexion =(");
} else {

StringBuffer strBuff = new StringBuffer("");
strBuff.append("Este es en contenido de Prueba");
strBuff.append("\n");
strBuff.append("=D");

boolean okC = ftpTest.send(strBuff);

if( !okC ) {
System.err.println("No se logro enviar el archivo =(");
} else {
System.out.println("El archivo fue enviado =D.");
}
}
System.out.println("-------- FIN ----------");

} catch( Exception e) {
e.printStackTrace();
} finally {
ftpTest.disconnect();
}
}

private String ftpHost;
private String ftpUser;
private String ftpPassword;
private String ftpRemotePath;
private String ftpRemoteFileName;

private FTPClient ftpClient;

public boolean send(StringBuffer strBuff) {
boolean ok = false;
try {

//ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.setFileType(FTP.ASCII_FILE_TYPE);

// Cambiando el Directorio en caso de que exista
if (ftpRemotePath != null && ftpRemotePath.trim().length() > 0) {
System.out.println("Changing to FTP remote dir: " + ftpRemotePath);
ftpClient.changeWorkingDirectory(ftpRemotePath);
int reply = ftpClient.getReplyCode();

if( !FTPReply.isPositiveCompletion(reply) ) {
System.out.println("Unable to change working directory to:" + ftpRemotePath);
ok = false;
} else {
ok = true;
}
} else {
ok = true;
}

// Enviando Archivo
if (ok) {

ByteArrayInputStream iStream = new ByteArrayInputStream( strBuff.toString().getBytes());
System.out.println("Storing file as remote filename: " + this.ftpRemoteFileName);
ok = ftpClient.storeFile(this.ftpRemoteFileName, iStream);

}

} catch(Exception e) {
e.printStackTrace();
}
return ok;
}

public boolean connect() {
boolean ok = false;
try {


ftpClient = new FTPClient();

// Connect FTP
ftpClient.connect(ftpHost);
int reply = ftpClient.getReplyCode();

if (!FTPReply.isPositiveCompletion(reply)) {
this.disconnect();
ok = false;

} else {
System.out.println("Connected to " + ftpHost + ". "+ ftpClient.getReplyString());

// Login FTP
boolean okC = ftpClient.login(this.ftpUser, this.ftpPassword);

if( !okC ) {
System.out.println("Unable to login to FTP server");
this.disconnect();
this.ftpClient = null;
ok = false;

} else {
System.out.println("Server Login OK.");
System.out.println("Remote system is " + ftpClient.getSystemName());
ok = true;
}
}

} catch( Exception e) {
e.printStackTrace();
this.disconnect();
this.ftpClient = null;
ok = false;
}
return ok;

}


public void disconnect() {
try {
System.out.println("FTP Disconnect");
if( this.ftpClient != null ) {
ftpClient.disconnect();
ftpClient = null;
}
} catch (Exception e) {
e.printStackTrace();
}
}


-- Getters & Setters --
}

Solamente hay que generar los getters y setters de las variables y en el main esta el ejemplo de cómo usarla.

Suerte!!


Spread Firefox Affiliate Button

Validacion JavaScript en IceFaces JSF

,
Hace tiempo estuve buscando una forma de hacer la validación javascript usando el framework de JSF específicamente con Ice Faces, esto ya que muchos de mis compañeros y yo mismo no me agrada la idea de estar haciendo peticiones al servidor solo para la validación y mejor dejar esa parte al cliente.

Después de mucho buscar y googlear, encontré una solución que resulta útil, no se si sea le mejor o las mas optima, pero al menos funciona =D.

El truco esta en crear la validación en el método onclick de un ice:commandButton.


<ice:commandButton value="Buscar" partialSubmit="false" onclick="if(!validar()){return false;};" action="XXXX" actionListener="#{XXXX.zzzz}" />



donde validar() es la función en js que queremos hacer.

Se hace de de esta manera ya que si no se hace la segunda validación dentro del mismo onclick al terminar la validación independientemente del resultado de la misma se seguirá ejecutando el código de Ice Faces (ver código fuente generado) y no tomara en cuanta nuestra validación, por eso la segunda validación, para tronar el siguiente código y detener la ejecución.

Espero les sirva.

Bloqueo de Pantalla

,
En esta ocasión revisaremos dos opciones para hacer el bloqueo de pantalla para impedir que los usuarios puedan hacer doble clic en los botones o algún otro elemento y darle una señal visual de que el sistema esta procesando la acción.

La primera opción es protoload que hace uso de la librería Prototype , la dirección es:

http://aka-fotos.de/protoload/

Para hacerla funcionar solo debemos incluir las librerías js y la hoja de estilo que se pueden descargar de la pagina dentro del jsp y con un código simple como el siguiente funciona de maravilla:



<input type="button" onclick="javascript: initEspera();">

<script>
function initEspera() {
$(document.body).startWaiting();
}
</script>



La segunda opción es jQuery Block UI que usa jQuery, su dirección es:

http://malsup.com/jquery/block/

Este componente tiene una mayor grado de configuración que Protoload, además de mayor documentación, para hacerlo funcionar descargamos el componente de la pagina y ponemos las librerías y hoja de estilos correspondientes, con el siguiente código podemos hacer funcionar el componente.



<input type="button" onclick="javascript: initEspera();">

<script>
function initEspera() {
$.blockUI();
}
</script>




Espero les sirva, suerte.

DownloadAction Strtus

,
Hola, en este post mostrare el uso de la clase DownloadAction del framework de struts para descargar archivos, en este caso uno creado en excel con el api de JXL.

1. Para empezar ponemos un link en la pagina para la llamada del action


<html:link action="CrearArchivoAction" > Excel </html:link>



2. Añadimos la entrada a struts.config


<action name="CrearArchivoAction" path="/CrearArchivoAction" type="com.test.CrearArchivoAction" scope="request" input="/Welcome" />



3. Creamos el DownloadAction



public class CrearArchivoAction extends DownloadAction{

/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public StreamInfo getStreamInfo(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {

System.out.println("--- CrearArchivoAction ---- ");

String fileName = "sampleName.xls";
String contentType = "application/vnd.ms-excel";

File file = new File(fileName);

try {

WritableWorkbook w = Workbook.createWorkbook(file);
WritableSheet s = w.createSheet("Demo", 0);
s.addCell(new Label(0, 0, "Hello World"));
w.write();
w.close();

} catch (Exception e) {
System.err.println("Ocurrio un error al generar el EXCEL");
e.printStackTrace();
}

System.out.println("--- regresando arhivo --");
return new FileStreamInfo(contentType, file);

}


}




Nota. Para que funcione este ejemplo es necesario tener el jar de jxl.jar

Suerte.

Spread Firefox Affiliate Button

Recorrer Listas con JSTL

,
Intentando publicar información útil y practica en esta ocación explicare de manera fácil y rápida la forma para recorrer un objeto List con JSTL para crear una tabla o llenar un select.

Para empezar se necesita tener habilitado dentro del proyecto JSTL, para esto se necesita tener el jar jstl.jar. Verificar que se tenga el encabezado:



<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>



Despues con el siguiente código se recorre el List



<c:forEach items="${listAvisos}" var="item">

   ${item.property1} : ${item.property2} : ${item.property3} <br/>

</c:forEach>



donde:

  • listAvisos en un objeto dentro del request o session del tipo java.util.List
  • item es un objeto del tipo MO con sus respectivos setters y getters.


Con esto tendremos código limpio y ya no necesitamos tener imports en el JSP.

Ejemplo de Tabla:

Para este ejemplo suponemos que tenemos un objeto MO con los atributos de: Nombre, Apellido, Teléfono con sus respectivos setters y getters, el codigo quedaria como:


<table>
<tr>
<th> NOMBRE </th>
<th> APELLIDO </th>
<th> TELEFONO </th>
</tr>
<c:forEach items="${listContactos}" var="item">
<tr>
<td> ${item.nombre} </td>
<td> ${item.apellido} </td>
<td> ${item.telefono} </td>
</tr>
</c:forEach>
</table>



Ejemplo de Select

Usamos la misma suposición del ejemplo anterior, y el código es:



<select id="slcContacto" name="slcContacto">
<c:forEach items="${listContactos}" var="item">
<option value="${item.telefono}"> ${item.nombre} </option>
</c:forEach>
</select>




Creación de un componente de Avisos II

,
Hola de nuevo, en este post continuare la creación de un componente de avisos, ahora enfocandame en la parte de Java y BD, es decir, el lado del servidor.

1. Crearemos un servlet ( también puede ser un Action, etc..) donde llamaremos a los DAO y otra lógica (tan compleja o básica como se necesite), para no extenderme en código solo pondré la parte de la función post.


/**
* Controlador de Componentes
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 System.out.println("->> BatchAjustesAction <<-");
 String url="/blank.jsp";
 try {
  String componente = request.getParameter("component");
  System.out.println("- componente:" + componente);
  if ( componente != null) {
   if ( componente.trim().equals("mostrarAvisos")) {
   // Carga Mensajes del sistema
   url="/jsp/componentes/avisos.jsp";
   AvisoDAO avisosDAO = new AvisoDAO();
   List listAvisos = avisosDAO.getAvisos();
   request.setAttribute("listAvisos", listAvisos);
  }
 } catch( Exception e) {
  e.printStackTrace();
  url="/jsp/common/error.jsp";
 }
 this.dispatch(request, response, url);
}

protected void dispatch(HttpServletRequest request,HttpServletResponse response, String url) {
 try {
  System.out.println("-- dispatch: " + url);
  RequestDispatcher rd= request.getRequestDispatcher(url);
  rd.forward(request, response);
 } catch(Exception e){}
}



6. Las clases axiliares de AvisoDAO y AvisoVO son como siguen:


public class AvisoDAO {
  List listAvisos = null;
  Connection conn = null;
  PreparedStatement pstm = null;
  ResultSet rset = null;
  try {
   AvisoVO item = null;
   String sql = "SELECT * FROM TBL_AVISO A, TBL_AVISO_DET B
WHERE B.IDAVISO = A.IDAVISO
AND A.ESTATUS = 'A' ORDER BY A.FECHA DESC, SECUENCIA ASC
   conn = DBManager.getConnection();
   pstm = conn.prepareStatement(sql);
   pstm.clearParameters();
   rset = pstm.executeQuery();
   listAvisos = new ArrayList();
   String key = "";
   boolean primero = true;
   while( rset.next()) {
    String idAviso = rset.getString("IDAVISO").trim();
    if( !key.equals(idAviso)) {
     if( !primero) {
      listAvisos.add(item);
     }
     item = new AvisoVO();
     item.setIdAviso( idAviso);
     item.setFecha( rset.getDate("FECHA"));
     item.setDetalle( rset.getString("DETALLE"));
     primero = false;
     key = idAviso;
    } else {
     item.appendDetalle( rset.getString("DETALLE"));
    }
   }
   if( item != null) {
    listAvisos.add(item);
   }
   System.out.println("----- Total de avisos: " + listAvisos.size());
 } catch( Exception e) {
   e.printStackTrace();
 } finally {
  try{ if( rset !=null) rset.close(); }catch( Exception e) {}
  try{ if( pstm !=null) pstm.close(); }catch( Exception e) {}
  try{ if( conn !=null) conn.close(); }catch( Exception e) {}
 }
}






public class AvisoVO {

  private Date fecha;
  private String idAviso;
  private String detalle;

  public void appendDetalle(String detalle) {
   if( this.detalle == null) {
    this.detalle = detalle;
   } else {
    this.detalle += detalle;
   }
  }
  getters() ..
  setters() ..
}




7. Las tablas tienen la siguiente estructura:


CREATE TABLE TBL_AVISO (
IDAVISO CHAR(10),
FECHA DATE,
ESTATUS CHAR(1),
PRIMARY KEY(IDAVISO)
);

CREATE TABLE TBL_AVISO_DET (
IDAVISO CHAR(10),
SECUENCIA NUMBER,
DETALLE CHAR(250),
PRIMARY KEY(IDAVISO, SECUENCIA)
);



Donde TBL_AVISO tiene el encabezado del aviso, y TBL_AVISO_DET contiene el mensaje del aviso, se tiene esta estructura ya que el mensaje se encuentra en el campo de DETALLE y si este supera los 250 caracteres se tiene que crear otro registro en la tabla de AVISO_DET con un numero de secuencia mayor, un ejemplo de aviso seria:


INSERT INTO SIPAB_AVISO VALUES ('TEST',SYSDATE,'A');

INSERT INTO SIPAB_AVISO_DET VALUES('TEST',0,'Mensaje de Prueba');
INSERT INTO SIPAB_AVISO_DET VALUES('TEST',1,' continucacion del mensaje de prueba');



Integrando esta parte con el primer Post estará listo y funcional un componente para Mostrar Avisos Básico y puede ser posicionado en cualquier parte de la página.

Todos los comentarios, sugerencias y dudas son bien recibidos.

Creación de un componente de Avisos I

,
Como en muchos sistemas el mostrar avisos a los usuarios es algo que se va volviendo cada vez mas necesario ( cambios, dudas generales o que el sistema no va a funcionar tal día) mostrare una manera sencilla de crear un componente que muestre avisos, para esto usare jQuery para manejar la parte de Ajax e interfaz y Java para la conexión con la BD y lógica.

Primero necesitamos las librería de jQuery y también la libreria Classy Query , esta última para crear clases en Java Script usando jQuery, y las ponemos en nuestra carpeta respectiva donde tengamos nuestros archivos js, como recomendacion estan deben estar en una subcarpeta llamada lib, ya que los librerias de apoyo.

Una vez que tenemos las librerías seguimos los siguientes pasos:

1. Llamamos las librerías en la página:


<SCRIPT language="JavaScript" src="<%= request.getContextPath() %>/js/lib/jquery.js">
<SCRIPT language="JavaScript" src="<%= request.getContextPath() %>/js/lib/jquery-classy">



2. En el jsp donde queramos el componente creamos un div y le asignamos un ID, en esta caso CAviso, y le ponemos la clase con el estilo que queramos :


<div id="CompAviso" class="avisos"> </div>



3. Creamos un archivo llamado jComponentes.js, este servirá de comunicación entre la interfaz y el servidor, y le ponemos lo siguiente:


 var jComponentes = jQuery.Class.create({
  init: function(contextPath) {
   this.contextPath = contextPath;
   this.action = '/servlet/ComponentesAction';
   this.waitMsg = '<img src="/myApp/images/load.gif" /> Espere un momento..';
  },

  mostrarAvisos: function(nombreContenedor) {
   $('#'+nombreContenedor).html(this.waitMsg);
   $('#'+nombreContenedor).load(
    this.contextPath + this.action,
     {
      component: 'mostrarAvisos'
     }
   )
  }
});



4. Ponemos nuestra clase en el encabezado:


<SCRIPT language="JavaScript" src="<%= request.getContextPath() %>/js/jPortada.js">




5. Ahora falta crear la vista del componente, para esto creamos un jsp llamado avisos.jsp y lo ponemos en la carpeta de componentes, para este ejemplo use la libreria JSTL por lo que es necesario incorporla:


<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


y dentro del body:


<div class="tituloBox"> Avisos myApp</div>
  <c:forEach items="${listAvisos}" var="item">
   <b> ${item.fecha} : </b>${item.detalle}<br/>
  </c:forEach>


6. Ya para terminar solo lo mandamos a llamar, para esto con el siguiente código es suficiente:


<script type="text/javascript">
 var componentes = new jComponentes('<%= request.getContextPath() %>');
 componentes.mostrarAvisos('CompAviso');
</script>



En el siguiente post mostrare la parte que corresponde a Java y BD.

Bienvenidos

,
Hola a todos, les doy la Bienvenida a este Blog donde tratare de llevar con frecuencia ideas y ejemplos para todos aquellos que están inmersos en el mundo de Java enfocados a la WEB y quieren adentrarse al mundo de Ajax y a la WEB 2.0.

Spread Firefox Affiliate Button