Alcances de variables de Sesión en JSF.

Introducción.

Sabemos que es un dolor de cabeza usar las variables de sesión a través de los objetos HttpSession y HttpRequest. No sabemos si una variable está en nivel de sesión o en nivel de request, simplemente lo ponemos y lo usamos, aunque después nos pueden dar problemas a lo largo de la aplicación, pero al usar JSF esto se hará mucho más sencillo.

JSF nos permite utilizar tres tipos de alcances:

Aplicación: Una variable guardada en este alcance es visible durante toda la aplicación, hasta que se repliegue la aplicación o hasta que se detenga el servidor.

Sesión: Una variable guardada a nivel de sesión, puede ser visible durante el tiempo de vida del usuario en la aplicación hasta que se invalide la sesión.

Request: Una variable en nivel request dura solo hasta la siguiente página, una página 1, guarda la variable en nivel request y redirecciona la petición a la página 2. La página 2 la utiliza, y el objeto desaparece.

Haremos una aplicación que permita hacer votos y mostrar los resultados.

Primero se deberá seleccionar un jugador de futbol perteneciente a un equipo mostrado en un SelectOneMenu. Los equipos, jugadores y variable que cuenta los votos se almacenaran a nivel de aplicación; el usuario que haya hecho el voto no podrá volver a votar, por tanto la aplicación sabrá que se trata del mismo usuario porque mantiene la sesión; y cuando el usuario quiera ver los resultados, estos se mostrarán de de acuerdo al requerimiento.

Creando una aplicación JSF con Visual ICEFaces.

Para comenzar crearemos una aplicación Web en Netbeans la que llamaremos variableSesionJSF.

image Ilustración 1: Creación del proyecto web.

En la paso donde seleccionamos el Frameworks de la creación del proyecto web activamos el framework Visual Web ICEfaces.

image Ilustración 2: Selección de Frameworks.

Diseño página inicial de la aplicación.

Agregaremos al diseño de nuestra pagina dos SelectOneMenu para seleccionar el equipo y al jugador a quien vamos a dar nuestro voto. También agregaremos dos CommandButton, uno para votar y otro para ver el resultado parcial de la votación.

En la ventana llamada JSP de nuestro archivo Page1.jsp agregamos el siguiente script en el interior del cuerpo de nuestra página.

<ice:form idform1«>
<ice:outputText idcabecera» styleborder-color: rgb(204, 204, 204); background-color: rgb(79, 115, 224); color: rgb(255, 255, 255); font-family: Calibri,Helvetica,sans-serif,Arial; font-size: 25px; font-style: normal; font-weight: normal; height: 60px; left: 72px; right: 10px; top: 24px; position: absolute; text-align: justify; vertical-align: middle; width: 864px; letter-spacing: 2px;word-spacing: 4px;» value Javalea Blog de Informática«/>
<ice:panelGrid
idpanel_central» styleborder-width: 1px; border-style: solid; border-color: rgb(204, 204, 204) rgb(204, 204, 204) rgb(204, 204, 204) rgb(204, 204, 204); height: 170px; left: 72px; top: 95px; position: absolute» visibletrue» width456«/>
<ice:outputText
escapefalse» idtitulo_interno»
styleborder-right: solid rgb(204, 204, 204) 1px; border-bottom: solid rgb(204, 204, 204) 1px; border-left: solid #cccccc 1px; background-color: rgb(255, 255, 204); color: rgb(51, 51, 51); font-family: cursive; font-size: X-small; font-variant: small-caps; font-weight: normal; left: 72px; top: 96px; position: absolute; text-align: left; vertical-align: middle; visibility: visible; width: 250px»
value Votación mejor futbolista Chileno» visibletrue«/>
<ice:outputText
idtxtEquipo» style=«font-family: ‘Calibri’; font-size: 14px; font-weight: lighter; left: 120px; top: 142px; position: absolute» valueSeleccione un Equipo«/>
<ice:outputText
idtxtJugador» stylefont-family: ‘Calibri’; font-size: 14px; left: 120px; top: 166px; position: absolute» valueSeleccione un Jugador«/>
</ice:form>

image Ilustración 3: Diseño pagina de inicio.

A continuación ingresaremos los SelectOneMenu, los cuales tendrán y los CommandButton.

image Ilustración 4: Estructura de página de inicio.

En el explorador del proyecto, abrimos el nodo llamado Source Packages y en su interior abrimos la clase ApplicationBean1.java. Esta clase contendrá todas las variables que se usarán en toda la aplicación. Para nuestro caso, aquí colocaremos la lista de equipos, jugadores,  y el contador por cada opción marcada.

Ingresamos los siguientes import al comenzar la clase:

import com.sun.rave.web.ui.appbase.AbstractApplicationBean;
import com.sun.webui.jsf.model.Option;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.faces.FacesException;

Posteriormente ingresaremos las variables en la clase:

private com.sun.webui.jsf.model.Option[] equipos;
private Map<String,String> hm = new HashMap<String,String>();
private Iterator it = hm.entrySet().iterator();
private java.util.HashMap votos;
private String[] UC;
private String[] CC;
private String[] UE;
private String[] UCH;

Crearemos los métodos set y get para cada una de las variables, podemos hacer esto haciendo clic con el botón derecho sobre una variable y seleccionando la opción Reestructurar > Encapsular.

imageIlustración 5: Creacion métodos set y get.

Ahora, vamos al método init de la misma clase, y en la última línea del cuerpo del método escribiremos la inicialización de los valores de las propiedades que acabamos de crear:

setEquipos(new Option[]{
new Option(«UC«, «U. Católica«),
new Option(«CC«, «Colo Colo«),
new Option(«UCH«, «U. de Chile«),
new Option(«UE«, «Unión Española«)
});

hm.put(«Cristopher Toselli«,»U. Católica«);
hm.put(«Hans Martínez«,»U. Católica«);
hm.put(«Milovan Mirosevic«,»U. Católica«);
hm.put(«Luis Núñez«,»U. Católica«);
hm.put(«Francisco Prieto«,»Colo Colo«);
hm.put(«Luis Mena«,»Colo Colo«);
hm.put(«Arturo Sanhueza«,»Colo Colo«);
hm.put(«Emilio Hernández«,»U. de Chile«);
hm.put(«Cristián Limenza«,»Unión Española«);

setUC(new String[]{
new String(«Cristopher Toselli«),
new String(«Hans Martínez«),
new String(«Milovan Mirosevic«),
new String(«Luis Núñez«)
});
setCC(new String[]{
new String(«Francisco Prieto«),
new String(«Luis Mena«),
new String(«Arturo Sanhueza«)
});
setUCH(new String[]{
new String(«Emilio Hernández«)
});
setUE(new String[]{
new String(«Cristián Limenza«)
});

votos = new HashMap();
while (it.hasNext()) {
Map.Entry e = (Map.Entry)it.next();
votos.put(e.getKey().toString(), 0);
}

También necesitamos hacer una pequeña lógica de negocio para incrementar los votos a alguna opción seleccionada y un método para obtener los votos de una opción en particular. Así que crearemos los siguientes métodos:

public void votoPara(String votoHecho) {
Integer cuenta = (Integer) votos.get(votoHecho);
if (cuenta == null) {
cuenta = 0;
}
cuenta++;
votos.put(votoHecho, cuenta);
}

public int votosDe(String votoHecho) {
Integer cuenta = (Integer) votos.get(votoHecho);
if (cuenta == null) {
cuenta = 0;
}
return cuenta;
}

Ya tenemos las variables que son visibles desde toda la aplicación. Ahora haremos la variable que durará la sesión del usuario, así que abrimos la clase SessionBean1.java y agregamos la variable boolean haVotado con sus respectivos set/get.

private boolean haVotado;

public boolean isHaVotado() { return haVotado;}

public void setHaVotado(boolean haVotado) { this.haVotado = haVotado;}

Y la última variable de nivel de requerimiento será la hora en que se accede al resultado de los votos. Así que abriremos la clase RequestBean1.java y agregamos la propiedad java.util.Date hora con su respecto set/get.

private java.util.Date hora;

public Date getHora() { return hora;}

public void setHora(Date hora) { this.hora = hora;}

Manejando los valores de los controles.

Ahora colocaremos los valores que creamos en el array equipos de la clase ApplicationBean1 en el formulario.

Vayamos al modo diseño visual de Page1.jsp, hagamos clic derecho sobre el objeto equipoMenu y seleccionamos Bind to data.

Seleccionamos el objeto equipo que se encuentra bajo el objeto ApplicationBean1.

image Ilustración 6: Seleccion datos de equipoMenu.

Como las opciones solo se verán en tiempo de ejecución, no se pueden visualizar en el modo de edición los datos de este objeto.

Ahora hacemos clic derecho en el mismo menú y seleccionamos Add Binding Attribute como se ve en la siguiente imagen:

image Ilustración 7: Creacion objeto equipoMenu.

Hacemos doble clic en equipoMenu y agregamos los siguientes métodos:

public void equipoMenu_processValueChange(ValueChangeEvent vce) {

if (equipoMenu.getValue().toString().equals(«UC«)) {

selectOneMenu2DefaultItems.setItems(getApplicationBean1().getUC());

} else if (equipoMenu.getValue().toString().equals(«CC«)) {

selectOneMenu2DefaultItems.setItems(getApplicationBean1().getCC());

} else if (equipoMenu.getValue().toString().equals(«UE«)) {

selectOneMenu2DefaultItems.setItems(getApplicationBean1().getUE());

} else if (equipoMenu.getValue().toString().equals(«UCH«)) {

selectOneMenu2DefaultItems.setItems(getApplicationBean1().getUCH());

}

}

protected ApplicationBean1 getApplicationBean1() {

return (ApplicationBean1) getBean(«ApplicationBean1«);

}

protected RequestBean1 getRequestBean1() {

return (RequestBean1) getBean(«RequestBean1«);

}

protected SessionBean1 getSessionBean1() {

return (SessionBean1) getBean(«SessionBean1«);

}

Y en el método init() agregamos:

selectOneMenu2DefaultItems.setItems(getApplicationBean1().getUC());

Ahora, debemos establecer que cuando el usuario haya hecho clic en el botón Votar, ya no puede volver a votar. Para ello necesitamos desactivar el botón. Así que el estado de este control depende del valor de la propiedad haVotado que está en la clase SessionBean1.

Haremos clic derecho sobre el botón, y seleccionamos Properties binding y seleccionamos en el panel izquierdo la propiedad disabled y en el panel derecho seleccionamos de SessionBean1.haVotado.

image Ilustración 8: Deshabilitar botón al realizar voto.

Hacemos clic en el botón superior Design para ver el modo diseño de Page1.jsp y seleccionamos Add Binding Attribute en el menú de jugadores.

Luego hacemos doble-clic sobre el botón Votar, esto creará el método btnVotar_action() en la clase Page1.java.

Aquí obtendremos el valor seleccionado y lo incrementaremos en el contador de votos:

public String btnVotar_action() {

String votoHecho = jugadorMenu.getValue().toString();

getApplicationBean1().votoPara(votoHecho);

getSessionBean1().setHaVotado(true);

Date hora = new Date();

getRequestBean1().setHora(hora);

return null;

}

Regresamos al modo diseño de Page1.jsp y hacemos doble clic en el botón btnResultados y hacemos que devuelva la cadena mostrar_resultados.

public String btnResultados_action() {

return «mostrar_resultados«;

}

Página de respuesta.

Creamos una nueva página de la categoría JavaServer Faces y el tipo ICEfaces Visual Web JSF Page.

image Ilustración 9: Creacion nueva página.

A la nueva página le agregamos el siguiente código:

<ice:form idform1«>

<ice:outputText idcabecera«styleborder-color: rgb(204, 204, 204); background-color: rgb(79, 115, 224); color: rgb(255, 255, 255); font-family: Calibri,Helvetica,sans-serif,Arial; font-size: 25px; font-style: normal; font-weight: normal; height: 60px; left: 72px; right: 10px; top: 24px; position: absolute; text-align: justify; vertical-align: middle; width: 864px; letter-spacing: 2px;word-spacing: 4px;» value Javalea Blog de Informática«/>

<ice:panelGrid idpanel_central«styleborder-width: 1px; border-style: solid; border-color: rgb(204, 204, 204) rgb(204, 204, 204) rgb(204, 204, 204) rgb(204, 204, 204); height: 457px; left: 72px; top: 120px; position: absolute«visibletrue» width600«/>

<ice:outputText escapefalse» idtitulo_interno«styleborder-right: solid rgb(204, 204, 204) 1px; border-bottom: solid rgb(204, 204, 204) 1px; border-left: solid #cccccc 1px; background-color: rgb(255, 255, 204); color: rgb(51, 51, 51); font-family: cursive; font-size: X-small; font-variant: small-caps; font-weight: normal; left: 72px; top: 96px; position: absolute; text-align: left; vertical-align: middle; visibility: visible; width: 250px«value=»  Resultados de los votos» visibletrue«/>

<ice:commandButton action=»#{Page2.inicioButton_action}» idinicioButton«stylebackground-color: rgb(0, 51, 153); color: rgb(255, 255, 255); font-size: X-small; left: 96px; top: 144px; position: absolute» valueInicio«/>

<ice:commandButton action=»#{Page2.cargarButton_action}» idcargarButton«stylebackground-color: rgb(0, 51, 153); color: rgb(255, 255, 255); font-size: X-small; left: 480px; top: 144px; position: absolute» valueRecargar«/>

<ice:outputText binding=»#{Page2.resultadoText}» escapefalse» idresultadoText» styleheight: 258px; left: 96px; top: 168px; position: absolute; width: 454px«/>

<ice:outputText binding#{Page2.fechaText}» idfechaText» style=»left: 96px; top: 504px; position: absolute; width: 456px«/>

</ice:form>

Tanto para resultadoText como para fechaText hacemos clic derecho sobre el control y seleccionamos Add Binding Attribute.

Hagamos doble en el botón Inicio, se abrirá el editor del código de Page2.java, y se creará el método inicioButton_action(), modificamos el código para que tenga el siguiente contenido:

public String inicioButton_action() {

return «inicio«;

}

Estando en el archivo Page2.java, buscamos el método prederender() y lo editamos con el siguiente código:

ApplicationBean1 appBean = getApplicationBean1();

Map hm = appBean.getHm();

Iterator it = hm.entrySet().iterator();

StringBuilder sb = new StringBuilder();

sb.append(«<br>«);

sb.append(«<table border=’1′ cellpadding=’5′>«);

sb.append(«<tr>«);

sb.append(«<td>EQUIPO</td>«);

sb.append(«<td>JUGADOR</td>«);

sb.append(«<td>VOTOS</td>«);

sb.append(«</tr>«);

while (it.hasNext()) {

Map.Entry e = (Map.Entry)it.next();

int cuenta = appBean.votosDe(e.getKey().toString());

sb.append(«<tr>«);
sb.append(«<td>» + e.getValue() + «</td>«);

sb.append(«<td>» + e.getKey()   + «</td>«);

sb.append(«<td>» + cuenta + «</td>«);

sb.append(«</tr>«);
}

sb.append(«</table>«);
resultadoText.setValue(sb);

RequestBean1 reqBean=getRequestBean1();
Date hora=reqBean.getHora();

if (hora!=null){

fechaText.setValue(«Su voto fue realizado el «

+(String)DateFormat.getTimeInstance(DateFormat.FULL).format(hora));

}

Navegación entre las páginas.

Abrimos el archivo faces-config.xml, hacemos clic en el botón superior que dice PageFlow para entrar al modo visual de la navegación de las páginas de JSF.

Modificamos el Diseño de la navegación de las páginas para que quede de la forma que se ve a continuación:

image Ilustración 10: Diseño de PageFlow.

Ejecutando la aplicación.

Ejecutamos la aplicación presionando la tecla F6, se nos mostrará el navegador con la primera página (iPage1.jsp) que contiene lo que se ve a continuación:

image Ilustración 11: Votación de futbolista.

Después de seleccionar un jugador de futbol perteneciente a un equipo de acuerdo al menú superior, votamos y vemos los resultados parciales de la votacion:

image Ilustración 12: Resultado de la votacion.

Código del Proyecto.

El código fuente del proyecto utilizado en este tutorial se encuentra aquí https://javalea.wordpress.com/descarga-codigos/

Ejemplo básico de Servlet en Netbeans.

En el siguiente ejemplo crearemos una aplicación que realice conversión de tipo de monedas en una página JSP utilizando Servlet.

Creación de proyecto.

Presionamos CTRL+Mayúsculas+N para crear un nuevo proyecto Web de tipo Web Application asignándole como nombre conversionMoneda.

image Ilustración 1: Seleccionar tipo de proyecto.

Seleccionamos cono server para nuestro proyecto GlassFish V2 y presionamos en Finish.

image Ilustración 2: Seleccionar tipo de server para el proyecto web.

Modificación de páginas JSP.

Ingresamos en nuestro archivo de inicio haciendo doble clic en el y ingresamos el siguiente código en su interior.

<html>
<head>
<meta
http-equivContent-Type» contenttext/html; charset=UTF-8«>
<title>
Página de conversión de monedas</title>
</head>
<body>
<H1>
Equivalencia de Monedas</H1>
Conozca la tasa de cambio de las diferentes monedas del mundo.Ingrese la cantidad de dinero a convertir en la primera ventana.Luego elija las monedas de cuales desea conocer la equivalencia.
<form actionconvServlet» methodpost«>
<fieldset>

Convertir esta cantidad:  <input typetext» namevalor» value=»${param.valor}»/>
<br><br>
DESDE
<select nametipoA» size4«>
<option
valueUSD«>Estados Unidos Dólares</option>
<option
valueEUR«>Europa Euros</option>
<option
valueJPY«>Japón Yenes</option>
<option
valueCLP«>Chile Pesos</option>
</select>
A: <select nametipoB» size4«>
<option valueUSD«>Estados Unidos Dólares</option>
<option
valueEUR«>Europa Euros</option>
<option
value=»JPY«>Japón Yenes</option>
<option
valueCLP«>Chile Pesos</option>
</select>
<br><br>
<input
typesubmit» valueConversión«/>
</fieldset>
</form>
</body>
</html>

También crearemos una página llamada respuesta.jsp, la cual servirá para recibir los datos de la conversion y mostrarlos en el navegador.

Para crear una nueva página presionamos CTRL+N y seleccionamos el tipo de página JSP.

image Ilustración 3: Creación pagina respuesta.jsp.

El código de la pagina será el que se muestra a continuación:

<html>
<head>
<meta
http-equivContent-Type» contenttext/html; charset=UTF-8«>
<title>
JSP Page</title>
</head>
<body>
<h2>
Conversión</h2>
<h3>
${inicial} ${tipoA} equivalen a: ${final} ${tipoB}</h3>
</body>
</html>

Creación Servlet de la aplicación.

Creamos un nuevo archivo de tipo Servlet al que llamaremos convServlet y lo ingresaremos en un package llamado web.

image Ilustración 4: Creacion del servlet que regresa la conversion.

En el método llamado processRequest del servlet ingresaremos el siguiente código  en el interior de su bloque try.

double CLP_USD=600.299, CLP_EUR=761.310, CLP_JPY=6.37478;
double JPY_CLP=0.156998, JPY_EUR=119.358, JPY_USD=94.1549;
double EUR_CLP=0.00131361, EUR_JPY=0.00836902, EUR_USD=0.788451;
double USD_CLP=0.00166592, USD_JPY=0.0106158, USD_EUR=1.26787;
double valor = Integer.parseInt(request.getParameter(«valor«));
String tipoA = request.getParameter(«tipoA«);
String tipoB = request.getParameter(«tipoB«);
double inicial = valor;
ifUSD«.equals(tipoA)){
ifEUR«.equals(tipoB)){
valor = valor*EUR_USD;
}else ifJPY«.equals(tipoB)){
valor = valor*JPY_USD;
}else ifCLP«.equals(tipoB)){
valor = valor*CLP_USD;
}
}else ifEUR«.equals(tipoA)){
ifUSD«.equals(tipoB)){
valor = valor*USD_EUR;
}else ifJPY«.equals(tipoB)){
valor = valor*JPY_EUR;
}else ifCLP«.equals(tipoB)){
valor = valor*CLP_EUR;
}
}else ifJPY«.equals(tipoA)){
ifUSD«.equals(tipoB)){
valor = valor*USD_JPY;
}else ifEUR«.equals(tipoB)){
valor = valor*EUR_JPY;
}else ifCLP«.equals(tipoB)){
valor = valor*CLP_JPY;
}
}else ifCLP«.equals(tipoA)){
ifUSD«.equals(tipoB)){
valor = valor*USD_CLP;
}else ifEUR«.equals(tipoB)){
valor = valor*EUR_CLP;
}else ifJPY«.equals(tipoB)){
valor = valor*JPY_CLP;
}
}
request.setAttribute(«final«, valor);
request.setAttribute(«inicial«,inicial);
request.setAttribute(«tipoA«, tipoA);
request.setAttribute(«tipoB«, tipoB);
RequestDispatcher rd = request.getRequestDispatcher(«respuesta.jsp»);
rd.forward(request, response);

Ejecutando la aplicación.

Ejecutamos la aplicación presionando la tecla F6, se nos mostrará el navegador con la primera página (index.jsp) que contiene lo que se ve a continuación:

image Ilustración 5: Seleccionar tipo cambio.

Después de seleccionar los datos se mostrara la conversion de moneda:

image Ilustración 6: Conversión de moneda.

Código del Proyecto.

El código fuente del proyecto utilizado en este tutorial se encuentra aquí https://javalea.wordpress.com/descarga-codigos/

Navegación de Páginas usando Visual JSF.

Este tutorial muestra como realizar una navegación de páginas usando NetBeans 6.0/6.1. Primero crearemos una aplicación web con el IDE y tendrá una simple navegación entre dos páginas.

Creando la primera página.

Para comenzar crearemos un nuevo proyecto de tipo Web Application llamado NavegarJSF o el nombre que Ud. prefiera, seleccionamos el servidor GlassFish V2 y el framework Visual Web JavaServer Faces.

image Ilustración 1: Creación del proyecto.

De la sección Basic de la paleta de componentes, arrastremos el componente Static Text y lo soltamos en la página que acabamos de crear, le cambiamos el valor del texto a Página uno.

image Ilustración 2: Diseño page1.jsp.

Ahora arrastremos el componente Button al costado del Static Text que hemos creado, escribimos el texto Ir a página 2.

image Ilustración 3: Diseño page1.jsp.

Navegando entre dos páginas.

A continuación crearemos una segunda página en la aplicación y especificaremos un enlace que permita un desplazamiento entre ambas páginas del proyecto.

Hacemos clic derecho en una zona en blanco del editor visual de Page1.jsp y seleccionamos Page Navegation del menú desplegable. El editor de flujo de páginas mostrará un ícono para Page1.jsp.

image Ilustración 4: Page Flow Editor.

Este ícono tiene varias partes:

image Ilustración 5: Componentes de un Page Flow Editor.

Crearemos una segunda página haciendo Clic con el botón derecho en área de edición y seleccionamos New File. En el asistente de New File, seleccionamos debajo de Categorías JavaServer Faces y debajo de File Types seleccionamos Visual Web JSF Page.

image Ilustración 6: Creación segunda página.

Clic en Next y aceptamos el nombre propuesto Page2.jsp haciendo clic en Finish. La página Page2.jsp se mostrará en el diseñador visual. Hacemos clic en la ficha faces-config.xml para reabrir la ventana de edición de navegación de páginas.

Hacemos clic en el signo + del ícono Page1.jsp para mostrar sus componentes, veremos que aparece el botón button1.

A continuación, presionamos el ícono de button1, lo arrastramos y lo soltamos sobre el ícono de Page2.jsp. Cuando soltamos el ratón, se muestran los íconos de las páginas unidos por un conector.

image Ilustración 7: Conector entre páginas.

Agregando componentes en la segunda página.

Abriremos Page2.jsp y pegaremos en esta página un componente Static Text en el que escribiremos Bienvenidos a la Página 2.

Así debería lucir en el editor visual de diseño:

image Ilustración 8: Diseño page2.jsp.

Ejecutando la aplicación.

Ejecutamos la aplicación presionando la tecla F6, se nos mostrará el navegador con la primera página (Page1.jsp) que contiene el texto y el botón:

imageIlustración 9: Ejecución de la aplicación.

Y cuando hacemos clic en el botín Ir a página 2, nos mostrará Page2.jsp.

image Ilustración 10: Ejecución de la aplicación.

Código del Proyecto.

El código fuente del proyecto utilizado en este tutorial se encuentra aquí https://javalea.wordpress.com/descarga-codigos/