Manual - Programacion - Java - Struts
Manual - Programacion - Java - Struts
STRUTS
Implementación del patrón MVC
en aplicaciones Web
(Actualizaciones y ejemplos en http://ciberia.ya.com/pxai/ma.html)
1
http://www.javahispano.com
INDICE
1. INTRODUCCIÓN..................................................................................................... 3
2. MVC: Model View Controller................................................................................... 4
3. STRUTS..................................................................................................................... 7
ESTUCTURA .......................................................................................................................... 8
UN EJEMPLO SENCILLO DE STRUTS .......................................................................... 12
UN EJEMPLO DE STRUTS MÁS COMPLEJO............................................................... 15
Errores comunes con Struts.................................................................................................. 29
2
STRUTS:Implementación del patrón MVC en aplicaciones Web
1. INTRODUCCIÓN
Este documento describe el patrón de diseño MVC (Model View Controller). Como
ejemplo de implementación se utiliza el framework Struts, que facilita el desarrollo de
aplicaciones web en Java basadas en MVC.
En al ámbito del desarrollo web se siguen unas pautas que tratan más o menos de
conseguir un desarrollo estructurado de las aplicaciones, donde la verificación de
sesión se centraliza y cada caso de uso se distingue claramente. Utilizando Struts ese
“más o menos” se convierte en una arquitectura completamente estructurada que
divide perfectamente lógica de negocio (Model), presentación (View) y control de flujo
de aplicaciones(Controller). En muchos desarrollos web se diseña consciente o
inconscientemente siguiendo este patrón, por tanto la adopción del modelo Struts no
debiera suponer un quebradero de cabeza.
Además hay que tener en cuenta que Struts nos da parte del trabajo hecho, funciona
correctamente, y nos da ciertos extras. Teniendo en cuenta además las aportaciones
de grupos de desarrollo (taglibs nuevos, etc..), la adopción de esta plataforma puede
resultar muy interesante.
3
http://www.javahispano.com
• Controlador
• Modelo
• Vistas.
Vemos las diferencias que supone el modelo con los modelos convencionales.
4
STRUTS:Implementación del patrón MVC en aplicaciones Web
En el caso del patrón MVC el procesamiento se lleva a cabo entre sus tres
componentes. El controller recibe una orden y decide quien la lleva a cabo en el
modelo. Una vez que el modelo (la lógica de negocio) termina sus operaciones
devuelve el flujo vuelve al controller y este envía el resultado a la capa de
presentación.
5
http://www.javahispano.com
El Controller en cierta forma debe tener un registro de la relación entre ordenes que le
pueden llegar y la lógica de negocio que le corresponde (Es como una operadora de
teléfono que recibe una petición y une dos lineas). En el siguiente gráfico se
representa ese funcionamiento:
¿Que ventajas obtenemos de este modelo? Obviamente una separación total entre
lógica de negocio y presentación. A esto se le pueden aplicar opciones como el
multilenguaje, distintos diseños de presentación,.. etc sin alterar la lógica de negocio.
En el lenguaje Java disponemos de una clases muy sencillas para implantar el modelo
MVC: la clase Observer, Observable del paquete util.
Aunque esa implementación del MVC con esas clases se podría hacer a un nivel muy
simple de interacción entre unas pocas clases.
En este caso, mediante Struts se aplica el MVC en toda una aplicación Web
convencional.
6
STRUTS:Implementación del patrón MVC en aplicaciones Web
3. STRUTS
7
http://www.javahispano.com
ESTUCTURA
Supongamos que tenemos una aplicación Web que consiste en un formulario que recoge datos
y los manda al servidor para su proceso. Este ejemplo tan simple necesitaría implementar unos
6 ficheros (2 de ellos jsps). ¿Suena mal eh? Es el precio que hay que pagar por una aplicación
bien estructurada.
Utilizando Struts nunca se llega a una pagina de la capa de presentación directamente. Esto
es, en la url nunca se llega a una pagina jsp o html a traves de su nombre. De eso se trata el
MVC, la presentación esta separada en otra capa.
En este entorno, se debe invocar una acción o aplicación que debe estar mapeada en Struts:
una acción se corresponderá con una clase Java (heredera de la clase Action de Struts). El
mapeo de acciones y clases se especifica en un fichero de importancia vital: struts-
config.xml. Ahí se especifican todas las relaciones entre acciones y clases, formularios y
clases, acciones y jsps de presentación, que globalmente conforman el “mapa” de la
aplicación.
Si quisieramos crear la aplicación Struts más simple posible, por ejemplo una página con un
saludo, debiéramos hacer lo siguiente:
1. -Una página JSP (la presentación)
2. -Una clase Action (componente del controlador)
3. -La clase Action debe definirse en el struts-config.xml correctamente
Diagrama de clases
En el caso más simple este sería el conjunto de clases utilizadas y sus relaciones.
Como se puede ver, no tendríamos más que dos ficheros, una clase que hereda de
struts.Action y una JSP con la presentación. La clase Action se configura en el strtus-config.xml
y se convierte en parte del controlador. Cuando la aplicación recibe una petición, Struts
decidirá que debe cargar esa clase y través de ella cargará la JSP. Así se puede ver en el
siguente diagrama:
Diagrama de colaboración
Esta sería la manera de interactuar entre la clases y Struts
8
STRUTS:Implementación del patrón MVC en aplicaciones Web
Una petición llega a struts (una URL); este mira en su “mapa” (el fichero struts-config.xml), y
deduce que tiene que cargar la ClaseAction. Esta clase esta configurada para que cargue una
pagina JSP.
Como se puede observar,no se carga la JSP directamente, hay que pasar por el controlado
Diagrama de secuencia.
Obviamente, este no es el ejemplo más clásico de una acción de Struts. Por lo general, en
cualquier aplicación web siempre se sigue un mismo esquema:
1. se muestra un formulario
2. se rellena
3. se validase
4. se manda a una página que realiza la lógica de negocio
5. se muestra el resultado.
Todo esto se podría hacer con dos JSPs o dos ASPs, o dos CFM, o dos PHP o con un CGI,
etc…
En Struts necesitaríamos lo siguiente:
1. -Una clase Action (su nombre podría empezar por Edit) encargada de cargar el formulario.
2. -Un Bean tipo Form cuyos campos u atributos de instancia coinciden con los campos del
formulario. (al ser tipo JavaBean tendrá los correspondientes métodos set y get para los
atributos) . Este form y sus atributos son un requisito imprescindible.
3. -Una JSP que contiene el formulario citado. Los campos deben coincidir con los definidos
en el Bean de formulario
4. -Una clase Action (su nombre podría empezar por Save) encargada de pasar la instancia
del formulario al Bean de Logica de Negocio, esperar su resultado y redirigir el flujo a una
JSP de error o de éxito.
5. -Un Bean de lógica de negocio (El que hace algo con los datos del formulario)
6. -Una JSP para mostrar un mensaje en caso de éxito (o puede ser la misma del principio)
7. -Una JSP para mostrar los errores en caso de error (o puede usarse una genérica).
Struts permite cierta flexibilidad en cuanto a nombres, pero conviene especificar cual es
Action, cual es Form, cual es Bean de negocio, etc.. así como meterlos en subpaquetes con
ese nombre.
9
http://www.javahispano.com
Diagrama de clases
Este sería el conjunto de clases utilizadas y sus relaciones.
La clase edit también podría usar el formulario, pero en principio no tiene porqué.
Sería interesante ver como interactúan las clases entre ellas, y eso se ve en el siguiente
gráfico.
Diagrama de colaboración
Esta sería la manera de interactuar entre las clases y Struts
10
STRUTS:Implementación del patrón MVC en aplicaciones Web
Diagrama de secuencia.
11
http://www.javahispano.com
Bien, veamos ahora el ejemplo mítico de HelloWorld por el que se suele empezar cuando no se
tiene ni idea de algo.
Vamos a crear una aplicación que muestra una página con el saludo Kaixo! que significa hola
en euskera. Es fácil de narices.
Diagrama de clases
• Clase EditKaixoAction
/**
* EditKaixoAction.java
* Pello Xabier Altadill Izura
*/
package pxai.struts.kaixo.action;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Locale;
import java.util.Vector;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.util.MessageResources;
import org.apache.struts.util.PropertyUtils;
import com.jazztel.numeracionip.comun.Log;
/**
* EditKaixoAction.java
* Maneja las peticiones enviadas por el browser
* en el url se pondra: /kaixo.do y struts cargara esta clase
* que redirigira el flujo a una jsp: Kaixo.jsp
*
* @author Pello Xabier Altadill Izura
* @version 1.0 ,date 13/2/02
*/
public final class EditKaixoAction extends Action {
/**
* Procesa la peticion HTTP (request) especificada y genera su correspondiente
12
STRUTS:Implementación del patrón MVC en aplicaciones Web
try {
if (action == null)
action = "Create";
if (servlet.getDebug() >= 1)
servlet.log("EditKaixoAction: Procesando action " + action);
/***** Logica segun el parametro action (no
imprescindible)**************/
/************************************ fin de logica
*********************/
// Redirige el control en caso de exito a la pagina espcificada en
struts-config.xml
if (servlet.getDebug() >= 1)
servlet.log(" Redirigiendo a pagina 'success'");
return (mapping.findForward("success"));
} catch (Exception e) {
e.printStackTrace(System.out);//Escribe en el fichero de log del
servidor de aplicaciones
errors = new ActionErrors();
errors.add("action",new
ActionError("action.perform.carga.error"));//Se incluye un mensaje de error que se
encuentra en el fichero especificado especificado en las propiedades de Struts
saveErrors(request,errors);
return (mapping.findForward("failure"));
}
}
<html:html>
<head>
<title>STRUTS :: ejemplo</title>
</head>
<body>
<H1>
<%
out.println("Kaixo!!");
%>
</H1>
13
http://www.javahispano.com
</body>
</html:html>
El resultado:
14
STRUTS:Implementación del patrón MVC en aplicaciones Web
Diagrama de clases
Aquí se puede contemplar las clases que serán necesarias para este ejemplo
15
http://www.javahispano.com
Diagrama de colaboración
Esta sería la manera de interactuar entre las clases action, form, bean, jsp y Struts .
Diagrama de secuencia
Aquí podemos ver como interactúan las clases en el tiempo.
16
STRUTS:Implementación del patrón MVC en aplicaciones Web
El código
EditAltaAction
/**
* EditAltaAction.java
* Pello Xabier Altadill Izura
*/
package pxai.struts.alta.action;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Locale;
import java.util.Vector;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.util.MessageResources;
import org.apache.struts.util.PropertyUtils;
import com.jazztel.numeracionip.comun.Log;
import com.jazztel.numeracionip.bean.MigracionNumeracionBean;
/**
* EditAltaAction.java
* Maneja las peticiones enviadas por el browser
* @author Pello Xabier Altadill Izura
* @version 1.0 ,date 13/2/02
*/
public final class EditAltaAction extends Action {
/**
* Procesa la peticion HTTP (request) especificada y genera su correspondiente
* respuesta HTTP (response) (o lo redirige a otro componente web que podria
crear).
* Devuelve una instancia code>ActionForward</code> que describe a DONDE y COMO
* se redirige el control, o sino, si la respuesta se ha completado se devolveria
* <code>null</code>
*
* @param mapping El mapeo utilizado para seleccionar esta instancia
* @param request El request que estamos procesando
* @param actionForm La instancia ActionForm que estamos utilizando (si la hay)
* @param response La respuesta HTTP que creamos.
*
* @exception IOException en caso de error de entrada/salida (i/o)
* @exception ServletException en caso de error de servlet
*/
public ActionForward perform(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
try {
if (action == null)
action = "Create";
if (servlet.getDebug() >= 1)
servlet.log("EditAltaAction: Procesando action " + action);
17
http://www.javahispano.com
/************************************
*******************************************/
// En este caso unicamente cargamos la JSP
/************************************
*******************************************/
// Redirige el control en caso de exito a la pagina espcificada en
struts-config.xml
if (servlet.getDebug() >= 1)
servlet.log(" Redirigiendo a pagina 'success'");
return (mapping.findForward("success"));
} catch (Exception e) {
e.printStackTrace(System.out);//Escribe en el fichero de log del
servidor de aplicaciones
// Creamos un error y lo salvamos para mostrarlo por pantalla
errors = new ActionErrors();
errors.add("alta",new ActionError("alta.edit.error"));
saveErrors(request,errors);
return (mapping.findForward("failure"));
}
}
alta.jsp
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/app.tld" prefix="app" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html:html>
<head>
<title>STRUTS :: ejemplo de ALTA</title>
</head>
<body>
<html:form action="/saveAlta.do" >
<b>ALTA de USUARIO</b><hr>
</body>
</html:html>
AltaForm
/**
* AltaForm.java
* Pello Xabier Altadill Izura
*/
package pxai.struts.alta.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
18
STRUTS:Implementación del patrón MVC en aplicaciones Web
import com.jazztel.numeracionip.comun.IP;
import com.jazztel.numeracionip.comun.Log;
import java.sql.Date;
/**
* AltaForm
*
* Implementa el formulario de ALTA que se muestra en html
* @author Pello Xabier Altadill Izura
* @version 1.0
* date 13/2/02
*/
public final class AltaForm extends ActionForm {
/**
* @field Mantenimiento de la accion que estamos procesando (Create or Edit).
* atributo IMPRESCINDIBLE para STRUS
*/
private String action = "Create";
/**
* Devuelve la accion.
*
* @return String la accion
*/
public String getAction() {
return (this.action);
}
/**
* Establece la accion
*
* @param action La nueva accion
*/
public void setAction(String action) {
this.action = action;
}
/**
* getUsername
* Devuelve nombre de usuario
* @return String
*/
public String getUsername() {
return (this.username);
}
/**
* setUsername
* Establece el nombre de usuario
* @param String
*/
public void setUsername(String username) {
this.username = username;
}
/**
* getPassword
* Devuelve el password
* @return String
*/
public String getPassword() {
return (this.password);
}
/**
* setPassword
* Establece el password
19
http://www.javahispano.com
* @param String
*/
public void setPassword(String password) {
System.out.println("Aqui estamos: " +password);
this.password = password;
}
/**
* getEdad
* Devuelve edad
* @return Integer
*/
public Integer getEdad() {
return (this.edad);
}
/**
* setEdad
* Establece la edad
* @param Integer
*/
public void setEdad(Integer edad) {
this.edad = edad;
}
/**
* getFechanacimiento
* Devuelve la fecha de nacimiento dd/mm/aaaa
* @return String
*/
public String getFechanacimiento() {
return (this.fechanacimiento);
}
/**
* setFechanacimiento
* Establece la fechanacimiento
* @param String
*/
public void setFechanacimiento(String fechanacimiento) {
this.fechanacimiento = fechanacimiento;
}
/**
* getProfesion
* Devuelve la profesion
* @return String
*/
public String getProfesion() {
return (this.profesion);
}
/**
* setProfesion
* Establece la profesion
* @param String
*/
public void setProfesion(String profesion) {
this.profesion = profesion;
}
/**
* Resetea todas las propiedades a sus valores por defecto.
*
* @param mapping El mapping utilizado por la instancia.
* @param request El servlet request que estamos procesando.
*/
public void reset(ActionMapping mapping, HttpServletRequest request) {
this.action = "Create";
20
STRUTS:Implementación del patrón MVC en aplicaciones Web
/**
* Valida las propiedades asignadas desde el HTTP request
* y devuelve un objeto <code>ActionErrors</code> que encapsula cualquier
* validación de error que haya sido encontrada. Si no se han encontrado errores
* , devuelve <code>null</code> o un objeto <code>ActionErrors</code> sin mensajes
* de error grabados.
*
* @param mapping El mapping utilizado por la instancia.
* @param request El servlet request que estamos procesando.
*/
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request) {
return errors;
}//class
SaveAltaAction
/**
* SaveAltaAction.java
* Pello Xabier Altadill Izura
*/
package pxai.struts.alta.action;
import java.io.IOException;
import java.util.Locale;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.util.MessageResources;
import pxai.struts.alta.bean.AltaBean;
import com.jazztel.numeracionip.comun.Log;
import com.jazztel.numeracionip.comun.Data;
/**
* Invoca al bean de lógica de negocio para procesar la migracion
* en caso de encontrar datos validos devuelve un objeto data en
* la sesión.
* @author Pello Xabier Altadill Izura
* @version 1.0 , date 13/2/02
*/
public final class SaveAltaAction extends Action {
/**
* Procesa la peticion HTTP (request) especificada y genera su correspondiente
* respuesta HTTP (response) (o lo redirige a otro componente web que podria
crear).
* Devuelve una instancia code>ActionForward</code> que describe a DONDE y COMO
* se redirige el control, o sino, si la respuesta se ha completado se devolveria
* <code>null</code>
*
* @param mapping El mapeo utilizado para seleccionar esta instancia
* @param request El request que estamos procesando
21
http://www.javahispano.com
try {
/********************** LOGICA DE NEGOCIO
*****************************/
}catch (Exception e) {
e.printStackTrace(System.out);//Escribe en el fichero de log del
servidor de aplicaciones
errors = new ActionErrors();
errors.add("action",new ActionError("alta.save.error"));
saveErrors(request,errors);
return (mapping.findForward("failure"));
}
AltaBean
/**
* AltaBean.java
* Pello Xabier Altadill Izura
*/
package pxai.struts.alta.bean;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.ServletException;
import com.jazztel.numeracionip.comun.Log;
import com.jazztel.numeracionip.comun.Propiedades;
import com.jazztel.numeracionip.comun.DataService;
import com.jazztel.numeracionip.comun.Data;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
22
STRUTS:Implementación del patrón MVC en aplicaciones Web
import pxai.struts.alta.form.AltaForm;
/**
* Implementa la lógica de negocio para el proceso Alta
* @author Pello Xabier Altadill Izura, AXPE
* @version 1.0
* date 23/1/02
*/
public class AltaBean {
/**
* @field Constante que identifica el estado libre en la tabla de estados
*/
private static final Integer _ESTADO = new Integer(1);
/**
* alta
*
* Da el alta de un usuario
* @param formulario con los datos a guardar
*
* @return null si no hay errores o ActionErrors con los
* errores capturados en caso de error.
*/
public synchronized ActionErrors alta (ActionForm theActionForm) {
try {
// Casting de ActionForm a nuestro FORM concreto
AltaForm form = (AltaForm)theActionForm;
// CREAMOS la SENTENCIA
stmn = conn.createStatement();
// Siii, ya se que es una forma poco elegante de alterar
// la BBDD, pero se trata de simplificar el ejemplo.
stmn.executeUpdate("INSERT INTO USUARIOS VALUES
('"+form.getUsername()+"','"+form.getPassword()+"',"+form.getEdad()+",'"+form.getFechana
cimiento()+"','"+form.getProfesion()+"')");
} catch(Exception e){
e.printStackTrace(System.out);//Escribe en el fichero de log del
servidor de aplicaciones
theActionErrors = new ActionErrors();
theActionErrors.add("alta",new ActionError("alta.bean.error"));
return theActionErrors;
}
} //Logica de Negocio
} // Fin class
23
http://www.javahispano.com
confirmacionalta.jsp
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/app.tld" prefix="app" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html:html>
<head>
<title>STRUTS :: ejemplo de ALTA :: Confirmacion ALTA</title>
</head>
<body>
<!-- mensaje de confirmación recuperando el nombre de usuario -->
<h3>Alta de usuario <bean:write name="altaForm" property="username"/>
correcta</h3>
</body>
</html:html>
errorAlta.jsp
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/app.tld" prefix="app" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html:html>
<head>
<title>Error en el proceso de alta de usuario</title>
</head>
<body>
<table cellspacing="8" cellpadding="8" border="0" align="center">
<tr>
<td colspan ="3">
<H3><b>Se ha producido un error en la operacion.</b></H3>
</td>
</tr>
<td align="center">
<input type="button" name="volver" value="Volver"
onclick="javascript:history.back()">
</td>
</tr>
</table>
</body>
<!-- Esta etiqueta de struts devuelve TODOS los mensajes de error guardados
en ActionErrors con el nombre "alta" a lo largo del request -->
<h3><center><html:errors property="alta" /><center><h3>
</html:html>
24
STRUTS:Implementación del patrón MVC en aplicaciones Web
Este sería el formulario de alta, al que accedemos a través de la url “editAlta.do”, tal como se
especifica en struts-config.xml. Al invocar editAlta.do, según el “mapa” de acciones de Struts,
se invoca la clase EditAltaAction y esta a su vez carga la JSP alta.jsp.
25
http://www.javahispano.com
26
STRUTS:Implementación del patrón MVC en aplicaciones Web
TIPS
A continuación se explican una serie de soluciones para ciertas necesidades
frecuentes en la programación Web; básicamente se trata de modos de comunicar las
clases de la capa de negocio con los JSP.
Entre la logica de negocio y un JSP de presentación media una clase de la capa
Controller. Lo que las une a las tres es el la instancia actual de
javax.servlet.http.HttpServletRequest; En ese request se pueden cargar resultados que
podemos presentar mas tarde en JSP. Struts lo hace implicitamente con el las
instancias de lal clases Formulario.
red2.setNombre("SuperRed");
red2.setCodigo(747);
red2.setTipo("Red IP de telefonica");
red2.setIp("166.166.166.100");
request.setAttribute("red2",red2);
...
// en el JSP
<bean:write name="red2" property="nombre"
scope="request"/>
//eso sacaria por pantalla: SuperRed
..
// Al igual que antes, en un Bean de negocio cargamos un objeto
// en el request para poder recuperarlo mas tarde.
// Creamos el objeto Redes, le asignamos valores, y lo añadimos a las
// propiedades del request, para poder recuperarlo en la JSP.
Redes redes = new Redes();
redes.addElement("www.el-mundo.es");
redes.addElement("www.elpais.es");
redes.addElement("www.cisco.com");
redes.addElement("www.a3n.tv");
request.setAttribute("misredes",redes);
...
// en el JSP utilizamos el tag logic:iterate
27
http://www.javahispano.com
// donde:
//lista: bean en el que se guarda cada elemento de iteracion
//type: el tipo Java de ese elemento
//name: nombre del atributo que contiene los valores
// que debe coincidir con el que usamos en "setAttribute"
<logic:iterate id="lista" name="misredes"
type="java.lang.String">
<bean:write name="lista" /><br>
</logic:iterate>
// Lo cual mostrara por pantalla:
www.cisco.com
www.el-mundo.es
www.elpais.es
www.jazztel.com
www.a3n.tv
En el fichero de AplicationResources.properties
alta.error=Se ha producido un error al dar de alta.
28
STRUTS:Implementación del patrón MVC en aplicaciones Web
- java.lang.NullPointerException
Este error será el pan nuestro de cada día en el desarrollo de Struts ya que los datos de los
formularios deben viajar desde una jsp pasando por 3 clases, y es fácil que no todos los datos
lleguen cargados. Lo que se recomienda es que cuando se desarrolle el Bean de lógica de
negocio, en principio solo se haga una traza de los valores del formulario, para comprobar que
llegan como se espera. Una vez depurado el paso de datos, conviene tener la costumbre
(como en cualquier otra aplicación, en cualquier otro lenguaje), de comprobar los objetos
para ver si realmente traen un valor distinto de nulo, y en caso afirmativo asignarlo. En una
sola linea se puede comprobar y asignar:
El formulario puede traer valores vacíos (Strings “”) o nulos. Dependiendo de nuestra lógica de
negocio habrá que comprobar lo que llega desde la jsp y transformarlo. Por ejemplo, en el caso
de una cadena de caracteres, en caso de venir vacía o con espacios quizá nos interese
convertirla a null:
29