| Registrar a un usuario en un sitio Web con Struts 1.2 |
| Paso 7: Operativa |
Utilizar las etiquetas <logic:iterate> y <html:multibox> para mantener el estado de las casillas de verificación (checkboxes)
La etiqueta <html:multibox> de Struts renderiza a la etiqueta <input type="checkbox"> de HTML.
Este es el funcinamiemto de las casillas de verificación o checkboxes
- cuando ninguna casilla de verificación no es seleccionada por el usuario, el navegador no envía información alguna al servidor referente a las casillas de verificación
- por el contrario si al menos una casilla de verificación es seleccionada por el usuario, el navegador envía información al servidor referente a las casillas de verificación
Esta forma de funcionar de las casillas de verificación hace que los estados de las casillas de verificación puedan ser inconsistentes entre peticiones de un mismo usuario a un mismo formulario. Es decir, si por ejemplo sólo tenemos seleccionadas dos casillas de verificación en una petición y entonces las desmarcamos para la siguiente petición, la respuesta del nuevo formulario que nos envía el servidor indicará que hay dos casillas de verificación seleccionadas en vez de ninguna.
Para evitar estas inconsistencias, tenemos que implementar el método reset() de la subclase ActionForm encargada de validar los datos del formulario en cuestión.
Ahora vamos a ver cómo se seleccionan las casillas de verificación de una página JSP con etiquetas de Struts sin utilizar Hojas de Estilio en Cascada (CSS) ni recursos para multilenguaje. El código correspondiente al ejercicio que estamos siguiendo lo veremos en el siguiente apartado.
<html:form action="registro">
<logic:iterate id="generoCine" name="RegistroActionForm" property="generoCinePosibles">
<html:multibox property="generoCineSeleccionados">
<bean:write name="generoCine"/>
</html:multibox>
<bean:write name="generoCine"/>
</logic:iterate>
</html:form>
|
Y estas es la Clase RegistroActionForm que hereda de ActionForm
package paqactionforms;
public class RegistroActionForm extends org.apache.struts.action.ActionForm {
private String[] generoCinePosibles = {"comedia","musical", "aventura", "policiaco", "clasico", "melodrama"};
private String[] generoCineSeleccionados = {};
public RegistroActionForm() {
super();
}
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
.
.
}
public void reset(ActionMapping mapping, HttpServletRequest request) {
generoCineSeleccionados = new String[0];
}
public String[] getGeneroCinePosibles() {
return generoCinePosibles;
}
public String[] getGeneroCineSeleccionados() {
return generoCineSeleccionados;
}
public void setGeneroCineSeleccionados(String[] generoCineSeleccionados) {
this.generoCineSeleccionados = generoCineSeleccionados;
}
}
|
- <logic:iterate id="generoCine" property="generoCinePosibles">
- como podemos observar la propiedad generoCinePosibles es una matriz que contiene objetos de tipo String
- esta matriz alberga todos los géneros de cine que se pueden seleccionar en el formulario
- cada elemento de esta matriz, en nuestro ejemplo generoCine, representa a una casilla de selección
- <html:multibox property="generoCineSeleccionados">
<bean:write name="generoCine"/>
</html:multibox>
- para cada iteración de la matriz generoCinePosibles se realiza un recorrido de la matriz generoCineSeleccionados que representa a todas aquellas casillas de verificación que han sido seleccionadas previamente por el usuario
- si el género de cine coincide en ambas matrices entonce la etiqueta <bean:write name="generoCine"/> se encarga de seleccionar el género de cine coincidente
- <bean:write name="generoCine"/>
- esta etiqueta cuando no está anidada en la etiqueta <html:multibox>, escribe en la página Web que recibe el usuario los literales de cada uno de los géneros de cine
- public void reset(ActionMapping mapping, HttpServletRequest request) {
generoCineSeleccionados = new String[0];
}
- el método reset() es invocado por el Framework Struts cada vez que se realiza una petición
- en nuestro ejemplo lo que hacemos es vaciar la matriz de géneros de cine seleccionados
- public void setGeneroCineSeleccionados(String[] generoCineSeleccionados) {
this.generoCineSeleccionados = generoCineSeleccionados;
}
- seguidamente el Framework Struts invoca a todos los setters de la Clase RegistroActionForm