Wednesday, December 27, 2006

Netbeans 5.0 en español

La versión final de netbeans 5.0 en español ha sido liberada, un gran esfuerzo del equipo de desarrollo. Aunque sabemos que la versión 5.5 es la mas reciente , sin duda para muchos tenerla a disposición en español será de gran ayuda.

Tuesday, December 26, 2006

Refactorizar Paginas JSP

En algunas ocasiones necesitamos copiar una pagina, recuerde que tambien podemos hacerla mendiante una plantilla que usemos para diseñar las demas paginas. Bien en algunas ocasiones tal vez solo necesitamos hacerlo con una pagina, y no deseamos guardarla como plantilla. Solo queremos copiarla y realizarle algunos cambios. Esto lo podemos realizar de una manera sencilla.
Pasos:
1. Nos hubicamos en la pagina .jsp que deseamos copiar, damos click derecho sobre la pagina y seleccionamos copiar.








2. Nos hubicamos sobre webpages









3. Dar click sobre pegar.









4. Se coloca a la pagina el mismo nombre seguido de _1.jsp o una secuencia numerica para que no se repita.










5.Ahora damos click derecho sobre la nueva pagina y escojemos RENAME.











6.En la ventana Rename Class escribimos el nuevo nombre y damos click en NEXT.










7.Se inicia un proceso de verificacion.







8. Ahora damos click en DO REFACTORING. Para que inicie el proceso de refactorizacion, el cual consistira en realizar una busqueda en todo el proyecto y aplicar los cambios de la nueva clase.





9. Inicia el proceso de refactorizacion.






10. Cuando termina el proceso, la pagina y la clase ademas de los demas componentes del proyecto quedan actualizados con el nuevo nombre de la clase.

Sunday, December 24, 2006

Usando Virtual Forms en VWP /Parte 2

Ahora seleccionamo la opción de mostrar formularios virtuales, en la parte
superior de la opción Desing.





Se muestran los formularios virtuales que hemos creado.







Seleccionamos los componentes para el virtualform, y le damos clic derecho y escogemos la opción Configure VirtualForms…







Se muestran los componentes en la ventana de dialogo de virtual form







Seleccionamos en la opcion Participate YES para que esos componentes participen del virtual form, y sean manipulados solo ellos cuando ocurre un submit de la pagina.







Ahora seleccionamos el boton Entrada y damos clic derecho y luego Configure VirtualForms








Recuerde que el boton es un componente submit. Seleccionamos la propiedad submit y seleccionamos YES









Al regresar a la pagina aparecen los componentes marcados con el virtual form








Añadimos un segundo virtual form y repetimos el procedimiento pero seleccionando los otros componentes. Si observa se asignara un color diferente.












Al seleccionar los otros componentes nos aseguramos que estemos usando el formulario virtual correspondiente, en este caso lo llame crearvirtualForm





La pagina final se vería de esta manera, con los colores indicando cada formulario virtual. Ahora solo ejecutamos el proyecto y listo.







Observe la pagina final en ejecucion.












Usando Virtual Forms en VWP

Es una pequeña traduccion del sitio en ingles.
Virtual Form, permite limitar los campos de entrada que seran procesados cuando una pagina web es subbmitted. Los dos elementos escenciales de un virtual form, son los componentes de entrada y los componentes submission.
Los componentes de entrada como cajas de texto, areas de texto, combos y botones de radio buttons. Participann en el virtual form. Los componentes submission, mas comunmente son botones, links,
Cuando un virtual form es submitted, los participantes del virtual form son procesados mientras los otros componentes de la paginas son ignorado.
Usted puede incluir mas de un virtual form en su pagina y cada uno es procesado separadamente.

Ahora vamos a la practica , luego de haber entendido brevemente lo que es un virtual form.
Podemos utilizarlo en un pagina en la cual deseamos que un usuario registrado ingrese su username y password y tambien en la misma pagina tenga la opcion de registrarse como usuario nuevo. Para esto deseamos que los valores de username y password sean obligatorios cuando la persona de click en el boton entrar. Si la persona desea registrarse por primera vez, al colocar los campos anteriores como requeridos no nos permitira registrar un nuevo usuario si no ingresa el username y password para la validacion de entrada.













Ahora vamos a agragar los virtual forms.
Nos ubicamos en cualquier lugar en blanco de la pagina y damos click derecho y seleccionamos Virtual Form












Nos aparece la ventana de dialogo Virtual Forms










Damos click en el boton New








y le cambiamos el nombre y le ponemos entradavirtualForm




Si lo ejecutamos se veria de esta manera, recuerde que aun no hemos colocado los formularios virtuales y los componentes a cada formulario.







Thursday, December 21, 2006

NetBeans in 2006: A Year in Review

El año 2006 ha sido un año muy productivo para Netbeans, muchas liberaciones, world tour, soporte para otros idiomas, un cambio de look del sitio entre otros.
NetBeans in 2006: A Year in Review
Nos nuestra los eventos mas importantes ocurridos en cada mes del 2006.
Para mi uno de los esperados fue a finales de octubre con la liberación del visual web pack, sin desmeritar la importancia de los demás.
Puedes entrar en Netbeans y observar la lista general.

Monday, December 18, 2006

De vacaciones

Estoy de vacaciones, por eso mi blog esta un poco desactualizado en estos dias, además con algunos problemas de conexion a internet.Pero retornando un poco al mundo Netbeans y Java.

Tuesday, December 12, 2006

Administracion de registros VWP/ Parte 5

Actualizar los registros
Es muy sencillo, lo unico que debemos hacer es hacer binding de cada uno de los elementos de la tabla , en el metodo init() buscar el registro , y el boton actualizar solo tenemos que usar commitchanges().

Para actualizar las fotos, lo haremos de una manera un poco distinta a como se hacia para la creacion de registros.
Mostramos todas las imagenes en una pagina y colocamos hipervinculos en cada una, que llevaran al usuario a una pagina donde cargaremos las fotos. Un metodo simple.









Ahora colocamos una pagina donde actualizamos la foto, recuerde colocar los mismos componentes para subir la imagen: fileupload, staticText,textField, Image y el boton Subir.

Sunday, December 10, 2006

Administracion de registros VWP/ Parte 4

Despues de guardar el registro en la tabla información, vamos a agregar las 7 fotos restantes a la tabla. Recordaran que ya guardamos el registro con una foto, ahora, podemos actualizar los demas campos con el url de la foto.
De esta manera debemos añadir un fileupload, boton, staticText, textField, Image para cada imagen que deseamos subir.(En total serian 7 de cada componente). Recuerde colocar los staticText y los textField, con la propiedad rendered en false.












Usamos el codigo similar al de la pagina de agregar para el metodo prerender y para cada boton SUBIR FOTO, solo que ajustamos el codigo a la imagen respectiva. Cambiando solo el fotoStaticText por el nombre del objeto de la imagen actual.
Ejemplo:
Para la foto 2
this.foto2StaticText.setValue(justFileName);

Para la foto 3
this.foto3StaticText.setValue(justFileName);

Ahora hacemos un Binding to Data...
Seleccionamos los textField y damos click derecho en foto2Field y escogemos Bind to Data..




















Luego escogemos de la tabla informacion el campo que pertenece a la foto actual.
















En el metodo init()
Buscamos el registro en base al idInformacion seleccionado en la pagina de informacionAdministracion.jsp
String idInformacion = getSessionBean1().getIdInformacion();
RowKey informacionRowKey = informacionDataProvider.findFirst("informacion.idinformacion", idInformacion);
informacionDataProvider.setCursorRow(informacionRowKey);

En el metodo prerender()
Usamos el codigo para las 7 imagenes, solo le cambiamos fotoImage y el fotoField.
Recuerde que podemos usar otra forma de subir las imagenes el cual consistiria en colocar un solo fileupload y solo necesitamos controlar las imagenes a mostrar, este metodo lo explicaremos en otro blog.
String uploadedFileName;

uploadedFileName = (String)this.foto2StaticText.getValue();
if ( uploadedFileName != null ) {
String tmpFile = uploadedFileName.replaceAll(" ", "%
20");
foto2Image.setUrl("/resources/fotos/"+tmpFile);
String urlFoto = "/resources/fotos/"+tmpFile;
this.foto2Field.setText(urlFoto);
}

uploadedFileName = (String)this.foto3StaticText.getValue();
if ( uploadedFileName != null ) {
String tmpFile = uploadedFileName.replaceAll(" ", "%20");
foto3Image.setUrl("/resources/fotos/"+tmpFile);
String urlFoto = "/resources/fotos/"+tmpFile;
this.foto3Field.setText(urlFoto);
}




en el boton GUARDAR utilizamos el siguiente metodo, ya que solo deseamos actualizar el registro.
public String guardarButton_action() {
// TODO: Procesar la acción de clic de botón. El valor de devolución es un
// nombre de caso de navegación en el que un valor nulo devolverá la misma página.
try {
informacionDataProvider.commitChanges();
info("Se guardaron los cambios....");
this.guardarButton.setDisabled(true);
} catch (Exception e) {
error("No se pueden guardar los cambios -- " + e);
log("Exception: " + e);
}
return null;
}


Veremos un poco de las reglas de navegacion.
Son bastantes sencillas, nos permiten controlar la navegacion entre las paginas, generalmente lo obtenemos mediante un valor string de retorno que se genera en la pagina.















Nos ubicamos en nuestro proyecto y le damos click sobre Page Navigation. Ahora crearemos una navegacion desde la pagina de administracion a la pagina actualizar. Recuerden que el boton actualizar retorna el valor "actualizar", ese valor es el que usamos para saltar a la pagina informacionActualizar.jsp














Este es el XML que se genera donde vemos las reglas de navegación.

/informacionAdministracion.jsp

actualizar
/informacionActualizar.jsp

Administracion de registros VWP/ Parte 3

Agregar registros
Continuando con nuestra aplicacion de Administracion de registros, ahore crearemos la pagina de agregar registros. Tendra una apariencia un poco basica como esta:













Es bastante sencillo su comportamiento, agregamos los datos generales y la foto principal, luego si deseamos añadir las 7 fotos restantes damos click en el boton Agregar Fotos.
Acontinuación el codigo del boton Guardar.
try{
String primerRegistro;
RowKey informacionRowKey;
int numeroRegistros;

// devuelve el numero de registros
numeroRegistros = informacionDataProvider.getRowCount();
if ( numeroRegistros == 0)
{

// info("No hay registros de informacion");

boolean nada;

}
else
{

boolean ok = true;
informacionRowKey = informacionDataProvider.findFirst("informacion.idinformacion",idInformaciontextField.getText()); if (informacionRowKey != null) {
error("Codigo de Informacion ya esta en uso....");

ok = false;
}
informacionRowKey =
informacionDataProvider.findFirst("informacion.informacion",informaciontextField.getText()); if (informacionRowKey != null)
{

error("Titulo de la informacion ya esta en uso...");
ok = false;
}

if (!ok)
{
return null;
}

}
informacionRowKey = informacionDataProvider.appendRow(); informacionDataProvider.setValue("informacion.idinformacion",informacionRowKey,idInformaciontextField.getText()); informacionDataProvider.setValue("informacion.informacion",informacionRowKey,informaciontextField.getText()); informacionDataProvider.setValue("informacion.descripcion",informacionRowKey,descripcionArea.getText()); informacionDataProvider.setValue("informacion.descripcioningles",informacionRowKey,descripcionenglishArea.getText()); informacionDataProvider.setValue("informacion.foto1",informacionRowKey,foto1Field.getText()); informacionDataProvider.setValue("informacion.activo",informacionRowKey,"1"); informacionDataProvider.commitChanges();
info("Se registro el nuevo informacion");
this.guardarButton.setDisabled(true);
this.agregarFotosButton.setDisabled(false);

} catch (Exception e) {
log("No puede registrar la nueva informacion: " , e);
error("No puede registrar la nueva informacion : "+e); informacionDataProvider.revertChanges();
this.guardarButton.setDisabled(false);
this.agregarFotosButton.setDisabled(true);

}

return null;
}
En este codigo verificamos que no exista un registro con ese codigo y con ese titulo, para ello usamos RowKey para recorrer las filas de la tabla y localizar los registros. appendRow() agrega una fila vacia a la tabla. Con informacionDataProvider.setValue("informacion.activo",informacionRowKey,"1"); permite asignarle el valor al campo activo, debemos usar como segundo parametro RowKey que indica la fila actual y con commitChanges(); guardamos los datos en la tabla.





El Boton Agregar Fotos, solo se usa para almacenar el codigo de la informacion en el bean de sesion y retornar el valor agregar fotos, que se usa en las reglas de navegacion para llamar a la pagina donde agregamos las demas fotos.
public String agregarFotosButton_action()
{

// TODO: Procesar la acción de clic de botón. El valor de devolución es un

// nombre de caso de navegación en el que un valor nulo devolverá la misma página. String idinformacion = (String)idInformaciontextField.getText();
getSessionBean1().setIdInformacion(idinformacion);

return "agregarFotos";
}







Subir Fotos
Para subir la foto podemos consultar los tutoriales en java studio creator o el de visual web pack en este link.
En el proyecto no guardamos la imagen el la base de datos, solo guardamos su url. Recuerde crear la carpeta fotos dentro de la carpeta resources de su proyecto.
Arrastramos el componente a la pagina.












Agregamos un objeto Image, un textField y un StaticText, y un boton que le colocamos el texto Subir Foto.
Alli colocamos el siguiente codigo:
public String subirFotoButton_action() {
// TODO: Procesar la acción de clic de botón. El valor de devolución es un
// nombre de caso de navegación en el que un valor nulo devolverá la misma página.
UploadedFile uploadedFile = fileUpload1.getUploadedFile();
String uploadedFileName = uploadedFile.getOriginalName();
// some browsers return complete path name, some don't
// make sure we only have the file name
String justFileName = uploadedFileName.substring
( uploadedFileName.lastIndexOf(File.separatorChar) + 1 );
this.nombreFoto1StaticText.setValue(justFileName);
Long uploadedFileSize = new Long(uploadedFile.getSize());
// this.fileSizeStaticText.setValue(uploadedFileSize);
String uploadedFileType = uploadedFile.getContentType();
// this.fileTypeStaticText.setValue(uploadedFileType);
if ( uploadedFileType.equals("image/jpeg")
|| uploadedFileType.equals("image/pjpeg")
|| uploadedFileType.equals("image/gif")
|| uploadedFileType.equals("image/png")
|| uploadedFileType.equals("image/x-png")) {
try {
// get the path to the /resources/images directory
// from the servlet context
ServletContext theApplicationsServletContext =
(ServletContext) this.getExternalContext().getContext();
String realPath =
theApplicationsServletContext.getRealPath
("/resources/fotos");
File file = new File(realPath + File.separatorChar +
justFileName);
uploadedFile.write(file);
} catch (Exception ex) {
error("No puede subir la foto : " + justFileName);
}
} else {
error("La foto debe ser tipo JPEG, PJPEG, GIF, PNG, or X-PNG.");
}
return null;
}


Ahora en el metodo prerender colocamos el siguiente codigo
Donde
nombreFoto1StaticText es el StaticText que agregamos, foto1Image es el objeto Image al cual usamos el metodo setUrl() para mostrar la imagen, y el textField lo denominamos foto1Field, y usamos el metodo setText() para que contenga el url, estos objetos le colocamos la propiedad rendered a false para que no sean mostramos en la pagina. Si observa el codigo del boton Guardar alli usamos el textField foto1. Para almacenar en la tabla el url de la imagen.
String uploadedFileName = (String)
this.nombreFoto1StaticText.getValue();
if ( uploadedFileName != null ) {
String tmpFile = uploadedFileName.replaceAll(" ", "%20");
foto1Image.setUrl("/resources/fotos/"+tmpFile);
String urlFoto = "/resources/fotos/"+tmpFile;
this.foto1Field.setText(urlFoto);
}

Administracion de registros VWP/ Parte 2





2. Actualizar registros

Describiremos brevemente el codigo del boton actualizar, luego explicaremos las reglas de navegación que utilizaremos para saltar a la pagina donde se actualizaran los datos.
Debemos guardar el codigo de información para poder localizar el registro adecuado.
Ahora damos click sobre el boton de actualizar que esta en la tabla , y escribimos el siguiente codigo.
public String buttonActualizar_action() {
// TODO: Process the button click action. Return value is a navigation
// case name where null will return to the same page.
RowKey rowKey = tableRowGroup1.getRowKey();
String idInformacion = (String) informacionDataProvider.getValue("informacion.idinformacion", rowKey); getSessionBean1().setIdInformacion(idInformacion);
return "actualizar";
}

Recuerde que debe agregar la propiedad idInformación al bean de sesion, una forma de hacerlo seria la siguiente:
  • Dar click derecho sobre SessionBean(recuerde que la duracion de SessionBean, esta dada mientras se mantenga abierta la sesion).












  • Seleccionamos Open para abrir el bean.
  • Añadimos la propiedad y los metodos set y get.

// propiedad idInformacion
private String idInformacion;
public String getIdInformacion() {
return this.tipo;
}

public void setIdInformacion(String idInformacion) {
this.idInformacion = idInformacion;
}


3. Eliminar registros











Ya lo habia mencionado en un blog anterior, en el boton eliminar usaremos una ventana para solicitar la confirmación del usuario para la eliminación del registro. En la propiedad onClick del boton escribimos el siguiente codigo:
if (!confirm("Desea eliminarlo")) return false;
Ahora escribimos el codigo para eliminar el registro.
RowKey rowKey = tableRowGroup1.getRowKey();
try {
informacionDataProvider.removeRow(rowKey);
informacionDataProvider.commitChanges();
} catch (Exception e) {
error("No se puede eliminar la informacion, fila clave " + rowKey + e);
}

return null;


El RowKey nos trae la clave del registro actual seleccionado en la tabla, luego usamos removeRow() del DataProvider para eliminarlo de la tabla, y usamos el commitChanges() para enviar la petición a la base de datos.

Administracion de registros VWP

  1. Lista numérica











En todas las aplicaciones web es importante administrar los registros de la base de datos, esta opcion debe estar permitida solo aquellas personas con privilegios para esta actividad.
Es importante notar que no usare EJB, usaremos DataProvider, para que sea un ejemplo bastante sencillo, en otra ocasión mostraremos el ejemplo con EJB.

Es por ello que debemos validar su perfil e indicarle si puede o no accesar el sitio.
El tutorial que expondre es bastante basico.
Se trata de una aplicacion que permite administrar los
registros de una tabla denominada informacion que contiene la siguiente estructura.
informacion (idinformacion varchar(35), detalle text, detalleenglish text, foto1 varchar(135), foto2 varchar(135), foto3 varchar (135), foto4 varchar (135), foto5 varchar (135), foto6 varchar(135), foto7 varchar(135),
foto8 varchar(135), activo int).


Primero creamos una pagina para la administracion de registros.
En esta pagina validamos si el usuario tiene privilegios de acceso.
Colocamos unos hipervinculos para agregar nuevos registros, y una tabla que muestra
los registros ademas de dos botones , uno para eliminar los registros y otro para actualizarlos.
El de eliminar, solicita la confirmacion del usuario mediante un popup,. y el de actualizar toma el registro
seleccionado de la tabla guarda la llave y llama a la pagina de actualizar los datos.
Recuerde desde el Runtime seleccione la taba informacion y arrastrela hasta el componente table en el formulario.















Pasos:
    1. Verificar los privilegios
En el metodo prerender() realizamos la validación, es importante tener presente que
en la pagina de login. Se registran las propiedades username, grupoUsuario en el bean correspondientes al usuario que se logeo.
public void prerender() {
try{
String username = getSessionBean1().getUsername();
if (username == null) {
// info("No se ha logeado ningun usuario");
this.getExternalContext().redirect("faces/login.jsp");
return;
}
if ( getSessionBean1().getGrupoUsuario().equals("administrador")) {
// info("Bienvenido en prender" + "" +getSessionBean1().getUsername() );
} else{
this.getExternalContext().redirect("faces/accesoDenegado.jsp");
return;
}
}catch(Exception e) {
log("Error ", e);
error("Error " + e);
}
}

Saturday, December 09, 2006

Dynamic Faces

En el blog del Charles Ditzel
Explica brevemente el proyecto Dynamic Faces
Este permite añadir Ajax a los componentes Java Server Faces, existen algunos ejemplos de su integracion con jMaki, sin lugar a dudas , parece tener un buen futuro.

Wednesday, December 06, 2006

Usando FileUpload

En la seccion de tutoriales sobre Visual Web Pack, se presenta Using the File Upload Component
Un tutorial desarrollado para Java Studio Creator y adaptado a Nebteans.
Ahora explicare algunos pasos para subir fotos a una base de datos en MYSQL, en realidad no carga directamente el archivo de foto a la base de datos(ya que esto la haria muy pesada y un poco lenta si se incrementa considerablemente la cantidad de fotos), en lugar de ello guardaremos en el campo en la tabla el url que corresponde a la direccion donde es guardada la foto.
Son tres ejemplos sencillos, en el primero crearemos un nuevo registro en la tabla y solo guardaremos una foto, en el segundo ejemplo guardaremos varias fotos, y en el tercer ejemplo actualizaremos dichas fotos. Para nuestro ejemplo en la tabla definimos 8 (ocho) campos de tipo varchar que contendran las url de las diferentes fotos.