Download Ejemplo integrador del capítulo 7

Document related concepts
no text concepts found
Transcript
Ejemplo integrador
del capítulo 7
En esta sección, complementaria de todo lo visto en el Capítulo 7,
realizaremos un ejemplo integrador: crearemos una página de ingreso
de usuarios al sistema, donde tendremos que ingresar, además,
una serie de combinaciones de datos en diferentes formatos.
▼
Un ejemplo integrador .................2
▼
Resumen .......................................9
B#_Ejemplo_integrador_Cap_7.indd 1
▼
Actividades .................................10
08/09/2014 10:05
2
APÉNDICE A. EJEMPLO INTEGRADOR DEL CAPÍTULO 7
Un ejemplo integrador
Después de tantos tags, tantos atributos, tantas configuraciones y modos
de uso, es menester presentar un ejemplo integrador donde usemos todas
las etiquetas y, además, veamos cómo acceder a los datos desde el servidor.
Vamos a crear una página de ingreso de usuarios al sistema. Estamos
acostumbrados a tener que ingresar nombre de usuario y contraseña
para acceder a muchos de ellos. Aquí vamos a tener que ingresar, además, una serie de combinaciones de datos en diferentes formatos, sin
perder de vista la seguridad! Como primer paso, vamos a declarar el
form del tipo LazyValidatorForm que vamos a usar:
<form-bean
name=”loginForm”
type=”org.apache.struts.validator.LazyValidatorForm”>
<form-property name=”seleccionAves” type=”java.lang.String[]” />
</form-bean>
Solo un atributo será de selección múltiple, y lo definimos como
arreglo. Luego, declaramos las dos acciones: la que prepara el formulario y, también, la que lo procesa:
<action path=”/login”
type=”capitulo7.action.VerLoginAction”
name=”loginForm” scope=”request”>
<forward name=”ok” path=”/jsp/capitulo7/login.jsp” />
</action>
<action path=”/procesarLogin”
type=”capitulo7.action.ProcesarLoginAction”
www.redusers.com
B#_Ejemplo_integrador_Cap_7.indd 2
08/09/2014 10:05
3
DESARROLLO WEB CON JAVA DESDE CERO
name=”loginForm” scope=”request”>
<forward name=”ok” path=”/jsp/capitulo7/portada.jsp” />
<forward name=”denegado” path=”/jsp/capitulo7/denegado.jsp” />
</action>
La primera acción nos envía a la página que muestra el formulario
de ingreso; la segunda acción tiene dos posibilidades, dependiendo
de si el usuario ingresó correctamente los datos o no.
Veamos la primera acción, VerLoginAction:
package capitulo7.action;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Vector;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.LabelValueBean;
import org.apache.struts.validator.LazyValidatorForm;
public class VerLoginAction extends Action {
public ActionForward execute(ActionMapping map, ActionForm form,
HttpServletRequest req, HttpServletResponse res) throws Exception {
// Cast al tipo específico de objeto
www.redusers.com
B#_Ejemplo_integrador_Cap_7.indd 3
08/09/2014 10:05
4
APÉNDICE A. EJEMPLO INTEGRADOR DEL CAPÍTULO 7
LazyValidatorForm dyna = (LazyValidatorForm) form;
// Una colección de bailes
Collection bailes = new HashSet();
bailes.add(new LabelValueBean(“Tango”, “t”));
bailes.add(new LabelValueBean(“Merengue”, “m”));
bailes.add(new LabelValueBean(“Vals”, “v”));
bailes.add(new LabelValueBean(“Swing”, “s”));
// Una colección de aves
Collection aves = new Vector();
aves.add(new LabelValueBean(“Zorzal”, “z”));
aves.add(new LabelValueBean(“Colibri”, “c”));
aves.add(new LabelValueBean(“Golondrina”, “g”));
aves.add(new LabelValueBean(“Bencejo”, “b”));
aves.add(new LabelValueBean(“Chucao”, “ch”));
// Una colección de letras griegas
Collection letras = new ArrayList();
letras.add(new LabelValueBean(“alfa”, “a”));
letras.add(new LabelValueBean(“beta”, “b”));
letras.add(new LabelValueBean(“gama”, “c”));
letras.add(new LabelValueBean(“delta”, “d”));
letras.add(new LabelValueBean(“epsilon”, “e”));
dyna.set(“bailes”, bailes);
dyna.set(“aves”, aves);
dyna.set(“letras”, letras);
// Queremos ir a la vista de nombre “ok”
return map.findForward(“ok”);
}
}
www.redusers.com
B#_Ejemplo_integrador_Cap_7.indd 4
08/09/2014 10:05
5
DESARROLLO WEB CON JAVA DESDE CERO
Esta acción simplemente guarda unas colecciones en el formulario.
En una aplicación más realista, estos datos seguramente estarían guardados en una base de datos o, al menos, en un archivo de propiedades
y nunca en el código, pero, a los efectos del ejemplo, sirve.
Notemos un detalle importante: las tres colecciones son implementadas por distintos tipos: HashSet, Vector y ArrayList. A la hora de mostrar
las opciones o iterar, Struts itera sobre el tipo Collection sin importar
qué clase específica es la que lo implementa. Este enfoque, sin embargo, necesita una precaución. En el primer caso, estamos usando un
HashSet, que implementa un conjunto. La iteración sobre los elementos
es desordenada, lo que implica que, en diferentes accesos a la página,
podremos obtener los elementos en diverso orden. Esto puede confundir al usuario o ser proclive a errores si nuestra acción asume que los
datos estaban en determinado orden.
Veamos ahora la página JSP, donde hacemos extenso uso de los tags JSP
que aprendimos en el capítulo.
<%@ taglib uri=”/tags/struts-html” prefix=”html” %>
<%@ taglib uri=”/tags/struts-bean” prefix=”bean” %>
<%@ taglib uri=”/tags/struts-logic” prefix=”logic” %>
<html:html>
<html:form action=”procesarLogin”>
<%-- Un campo de texto --%>
Nombre de usuario: <html:text property=”usuario” size=”10” /><br/>
<%-- Un campo de texto de tipo contraseña --%>
Contrase&ntilde;a: <html:password property=”clave” size=”30” /><br/>
<h3>Igualdades</h3>
<%-- Dos checkboxes fijos --%>
www.redusers.com
B#_Ejemplo_integrador_Cap_7.indd 5
08/09/2014 10:05
6
APÉNDICE A. EJEMPLO INTEGRADOR DEL CAPÍTULO 7
<html:checkbox property=”e_i_pi” />e<sup>i &middot; &pi;</sup> = -1<br/>
<html:checkbox property=”abc” />A<sup>2</sup>
+ B<sup>2</sup> = C<sup>2</sup><br/>
<%-- Botones radio --%>
<h3>Baile</h3>
<logic:iterate indexId=”i” id=”baileBean”
name=”loginForm” property=”bailes”>
<html:radio property=”baile” idName=”baileBean” value=”value” />
<bean:write name=”baileBean” property=”label” />
<%-- Un salto de línea luego del segundo elemento solamente --%>
<logic:equal name=”i” value=”1”>
<br/>
</logic:equal>
</logic:iterate>
<%-- Un conjunto de checkboxes en base a una colección --%>
<h3>Aves</h3>
<logic:iterate id=”ave” name=”loginForm” property=”aves”>
<html:multibox property=”seleccionAves”>
<bean:write name=”ave” property=”value” />
</html:multibox>
<%-- Escribimos el nombre del ave --%>
<bean:write name=”ave” property=”label” />
</logic:iterate>
<%-- Una lista de selección simple --%>
<h3>Letras griegas</h3>
<html:select property=”letra” size=”3” multiple=”false”>
<html:optionsCollection name=”loginForm”
property=”letras” label=”label” value=”value” />
www.redusers.com
B#_Ejemplo_integrador_Cap_7.indd 6
08/09/2014 10:05
7
DESARROLLO WEB CON JAVA DESDE CERO
</html:select><br/>
<br/>
<html:submit value=”Enviar” />
</html:form>
</html:html>
El resultado de esta página lo vemos en la Figura 1.
Figura 1. Todos los tipos de ingreso de datos
posibles en una página, usando tags de Struts.
Por último, la clase que obtiene los datos del formulario los procesa
y redirige la acción según estos:
www.redusers.com
B#_Ejemplo_integrador_Cap_7.indd 7
08/09/2014 10:05
8
APÉNDICE A. EJEMPLO INTEGRADOR DEL CAPÍTULO 7
package capitulo7.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.validator.LazyValidatorForm;
public class ProcesarLoginAction extends Action {
public ActionForward execute(ActionMapping map, ActionForm form,
HttpServletRequest req, HttpServletResponse res) throws Exception {
// Cast al tipo específico de objeto
LazyValidatorForm dyna = (LazyValidatorForm) form;
// Obtenemos todos los datos del formulario
String usuario = (String) dyna.get(“usuario”);
TABLAS AVANZADAS
El proyecto DisplayTag provee un paquete de tags muy poderosos para usar
en las páginas JSP. Con ellos podremos crear tablas y manejar las columnas
a mostrar, el ordenamiento, la paginación, los estilos y demás. Es un proyecto
de código abierto. Su dirección web: http://displaytag.sourceforge.net.
www.redusers.com
B#_Ejemplo_integrador_Cap_7.indd 8
08/09/2014 10:05
9
DESARROLLO WEB CON JAVA DESDE CERO
String clave = (String) dyna.get(“clave”);
boolean e_i_pi = “on”.equals(dyna.get(“e_i_pi”));
boolean abc = “on”.equals(dyna.get(“abc”));
String baile = (String) dyna.get(“baile”);
String[] aves = (String[]) dyna.get(“seleccionAves”);
String letra = (String) dyna.get(“letra”);
// Comparamos los datos
if (usuario.equals(“juan”) && clave.equals(“perez”) && e_i_pi && !abc
&& baile.equals(“s”) && letra.equals(“b”) && aves.length == 2
&& aves[0].equals(“z”) && aves[1].equals(“g”)) {
// Ingreso correcto
return map.findForward(“ok”);
}
else {
// Acceso denegado
return map.findForward(“denegado”);
}
}
}
RESUMEN
En esta sección, complementaria e integradora de todo lo visto en el Capítulo 7,
creamos una página web de ingreso de usuarios al sistema.
www.redusers.com
B#_Ejemplo_integrador_Cap_7.indd 9
08/09/2014 10:05
10
APÉNDICE A. EJEMPLO INTEGRADOR DEL CAPÍTULO 7
Actividades
TEST DE AUTOEVALUACIÓN
1
Complete el ejemplo integrador creando las páginas de salida correspondientes.
2
Modifique el ejemplo integrador para que tome los textos de un archivo de recursos.
PROFESOR EN LÍNEA
Si tiene alguna consulta técnica relacionada con el contenido, puede contactarse
con nuestros expertos: [email protected].
www.redusers.com
B#_Ejemplo_integrador_Cap_7.indd 10
08/09/2014 10:05