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 Actividades...10 Resumen...9
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
DESARROLLO WEB CON JAVA DESDE CERO 3 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
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 );
DESARROLLO WEB CON JAVA DESDE CERO 5 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ña: <html:password property= clave size= 30 /><br/> <h3>igualdades</h3> <%-- Dos checkboxes fijos --%>
6 APÉNDICE A. EJEMPLO INTEGRADOR DEL CAPÍTULO 7 <html:checkbox property= e_i_pi />e<sup>i π</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 />
DESARROLLO WEB CON JAVA DESDE CERO 7 </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:
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.
DESARROLLO WEB CON JAVA DESDE CERO 9 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.
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 Modifi que 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: profesor@redusers.com.