Nuestra primera acción con Struts 1.3.8
Bueno, ya sabemos preparar un proyecto web dinámico para utilizarlo con Struts, sabemos descomprimir el struts-blank.war que viene con la distrigución jejeje y utilizarlo como base, nos hemos empollado bien la teoría y sabemos lo que es el patrón MVC, sabemos cómo funciona el Framework de Struts, cómo implementa el patrón MVC y cómo se diseña una aplicación en Struts.
Nuestra primera acción
Partimos de nuestro anterior proyecto, holamundoStruts138, que dejamos a punto para comenzar a ser implementado con Struts.
Crearemos una acción que recibirá unos datos de entrada introducidos por el cliente (dos cadenas de caracteres, identificador y contraseña), los procesará (comprobará si está autorizado) y decidirá la siguiente acción. Fácil ? Pensemos en cómo implementarlo.
Necesitamos dos jsp's : una jsp de entrada donde introducir los datos (identificar.jsp) y otra para a la que se accederá si se tiene éxito al identificarse (indexIdentificado.jsp).
Necesitamos una acción que recibirá los datos, procesará los datos (los enviará al negocio), y en función del resultado decidirá si dirigir al cliente a la zona que necesita identificación (indexIdentificado.jsp) (si son correctos los datos), o dirigir a la pantalla de identificación (identificar.jsp) (si no son correctos los datos) mostrando un mensaje. Si durante el proceso se detecta un error (una excepción, por ejemplo si la base de datos está caída) también se dirigirá a la pantalla de identificación con un mensaje de error interno.
Sabemos que la acción necesitará un formulario para comunicarse con las jsp's.
Necesitamos una clase de negocio, que en este ejemplo tan simple será muy sencilla. Y necesitamos una clase de persistencia que sería la que accedería a la base de datos para obtener los datos. Con esos datos el negocio decidirá el resultado que pasar a la acción. En este ejemplo tan sencillo no utilizaremos bbdd y los datos estarán a fuego.
Utilizaremos un objeto de modelo (bean Usuario) como apoyo para facilitar y simplificar el código.
Y aunque me gustaría volver a las catacumbas y utilizar únicamente html y scriptles para en otro manual introducir las librerías de etiquetas (taglibs), seamos prácticos y utilicémoslas desde ya.
identificar.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Identificación</title>
<script>
function enviar (){
document.identificarForm.submit();
}
</script>
</head>
<body>
<div>
Por favor, identifíquese.
</div>
<html:form action="identificar">
<div>
<span style="text-aling:rigth">Identificador </span>
<span> <html:text property="usuario.identificador" /></span>
</div>
<div>
<span style="text-aling:rigth">Contraseña </span>
<span> <html:password property="usuario.contrasenna" /></span>
</div>
<div> </div>
<div>
<input type="button" value="Identificar" onclick="javascript:enviar();" />
</div>
</html:form>
<logic:present name="mensaje">
<div>
<span style="color: red;">
<fieldset>
<bean:write name="mensaje" />
</fieldset>
</span>
</div>
</logic:present>
</body>
</html>
indexIdentificado.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Zona Identificada</title>
</head>
<body>
Bienvenido a la zona de administración.
<bean:write scope="session" name="usuario" property="identificador" />
</body>
</html>
es.lycka.holamundoStruts138.model.Usuario
package es.lycka.holamundoStruts138.model;
public class Usuario {
private String identificador;
private String contrasenna;
public Usuario () {
}
public Usuario (String identificador, String contrasenna) {
this.identificador = identificador;
this.contrasenna = contrasenna;
}
public String getContrasenna() {
return contrasenna;
}
public void setContrasenna(String contrasenna) {
this.contrasenna = contrasenna;
}
public String getIdentificador() {
return identificador;
}
public void setIdentificador(String identificador) {
this.identificador = identificador;
}
}
es.lycka.holamundoStruts138.action.IdentificarAction
package es.lycka.holamundoStruts138.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 es.lycka.holamundoStruts138.form.IdentificarForm;
import es.lycka.holamundoStruts138.negocio.IdentificarBO;
public class IdentificarAction extends Action {
public ActionForward execute (ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
IdentificarForm identificarForm = (IdentificarForm) form;
String destino = "ERROR";
try {
if (IdentificarBO.esUsuarioAutorizado(identificarForm.getUsuario())) {
request.getSession().setAttribute("usuario", identificarForm.getUsuario());
destino = "SUCCESS";
} else {
request.setAttribute("mensaje", "El usuario introducido no está autorizado.");
}
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("mensaje", "Error interno. Por favor, inténtelo otra vez en unos minutos.");
}
return mapping.findForward(destino);
}
}
es.lycka.holamundoStruts138.form.IdentificarForm
package es.lycka.holamundoStruts138.form;
import org.apache.struts.action.ActionForm;
import es.lycka.holamundoStruts138.model.Usuario;
public class IdentificarForm extends ActionForm {
private Usuario usuario = new Usuario ();
public Usuario getUsuario() {
return usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
}
es.lycka.holamundoStruts138.negocio.IdentificarBO
package es.lycka.holamundoStruts138.negocio;
import es.lycka.holamundoStruts138.model.Usuario;
import es.lycka.holamundoStruts138.persistencia.IdentificarDAO;
public class IdentificarBO {
public static boolean esUsuarioAutorizado (Usuario usuario) throws Exception {
IdentificarDAO identificarDAO = new IdentificarDAO ();
boolean esAutorizado = false;
try {
if (identificarDAO.consultarUsuario (usuario) != null ) {
esAutorizado = true;
}
} catch (Exception e) {
throw e;
}
return esAutorizado;
}
}
es.lycka.holamundoStruts138.persistencia.IdentificarDAO
package es.lycka.holamundoStruts138.persistencia;
import es.lycka.holamundoStruts138.model.Usuario;
public class IdentificarDAO {
/**
* Simulamos una consulta a bbdd.
* Si existiese un usuario en bbdd con el identificador y la contraseña introducidas nos devolvería
* un objeto usuario. Si no nos devolvería null.
*/
public Usuario consultarUsuario (Usuario usuario) throws Exception {
Usuario resultado = null;
if (usuario != null
&& usuario.getIdentificador() != null
&& usuario.getContrasenna() != null
&& usuario.getIdentificador().equals("lycka")
&& usuario.getContrasenna().equals("lycka")) {
resultado = usuario;
}
return resultado;
}
}
struts-config.xml
Me gustaría empezar a hacer las cosas "mejor". Para empezar, las jsp's las agrupamos dentro de un directorio "jsp" debajo de WebContent. Y para seguir, la configuración de struts yo la suelo colgar debajo de un directorio "struts" en WebContent > WEB-INF. Por tanto, debemos indicar en el web.xml la nueva ruta de nuestro struts-config.xml.
…
<!– Standard Action Servlet Configuration –>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts/struts-config.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
…
Ahora muestro el struts-config.xml donde declaramos nuestro formulario y nuestra acción con sus dos posibles salidas (forwards)
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<!– === Form Bean Definitions –>
<form-beans>
<form-bean name="identificarForm" type="es.lycka.holamundoStruts138.form.IdentificarForm" />
</form-beans>
<global-exceptions />
<global-forwards />
<!– === Action Mapping Definitions –>
<action-mappings>
<action path="/identificar" type="es.lycka.holamundoStruts138.action.IdentificarAction"
name="identificarForm" scope="request" validate="false">
<forward name="SUCCESS" path="/jsp/indexIdentificado.jsp" />
<forward name="ERROR" path="/jsp/identificar.jsp" />
</action>
</action-mappings>
</struts-config>
Probamos con un login erróneo, con un login correcto, y todo debería de ir bien. Puedes depurar la ejecución para ver por donde pasa el flujo y entenderlo un poco mejor. Bienvenido a Struts !
Como observación, me gusta utilizar sólo caracteres ASCII para nombres de proyectos, paquetes, clases, métodos y variables, para evitar problemas. Por eso, nada de mi querida ñ ni de acentos. En mensajes y trazas no hay problemas.
Podemos cambiar el anterior index.jsp para adecuarlo a la nueva acción:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Hola Mundo</title>
</head>
<body>
<h1>Lycka te da la bienvenida!</h1>
<p>Bienvenido a nuestra aplicación de Hola Mundo</p>
<p>
Usted puede :
<ul>
<li>Ingresar en la zona privilegiada <html:link href="jsp/identificar.jsp">aquí</html:link>.</li>
</ul>
</p>
</body>
</html>
Ver también




























Lycka Bonita » Integrar Struts con Spring - TeorÃa dijo
21 de July del 2008 a las 9:03 am
[...] ya tenemos un proyecto con Spring - MVC (holamundo) y otro con Struts (holamundoStruts138). Cuál utilizaremos para desarrollar ? Eso lo dejo para otra [...]
Pedro dijo
22 de April del 2009 a las 12:05 pm
Hola!
Ante todo, gracias por el tutorial.
Vengo del tutorial de Struts2, el cual, funciona.
(holamundoStruts2014).
Importas el war y funciona.
Sin embargo, no aparecen los .java, sólo los .class.
Si creo las clases y simplemente copio y pego el código… no funciona. :S
Salu2.
yoyoooyoy dijo
23 de April del 2009 a las 8:02 am
Hola Pedro,
le echaré un ojo esta tarde y te digo algo. Pero vamos, el código que he pegado en el tutorial lo he sacado del war
Juan Pedro dijo
19 de May del 2009 a las 12:23 pm
Buenas:
Tengo un problemilla:
He seguido todo en tutorial, pero en el fichero indexIdentificado.jsp en la linea de
me da un error: Cannot find the tag library descriptor for “/struts-bean”
Me he descargado struts-1.3.10-all.zip y he metido todas las librerias del directorio lib al proyecto.
Haber si tu me puedes decir algo
juan dijo
11 de June del 2009 a las 12:13 am
Yo tengo el mismo problema que Juan Pedro.
Pudieron solucionarlo?
juan dijo
11 de June del 2009 a las 12:29 am
Ahi me anduvo. Lo que hice fue agregar la libreria struts-taglib-1.3.5.jar en la carpeta “/WEB-INF/lib”
Saludos,
carolina dijo
8 de October del 2009 a las 12:40 am
Hola:
Me parece un muy buen tutorial felicidades, he hecho todos los pasos desde primeros pasos con struts y este de nuestra primera accion con struts pero tuve problemas ya que en primer lugar no me reconocio los tags de text ni de password ya que no me mostraba nada en pantalla y los cambie por un input text y password, pero al momento de dar enviar me marca error de java script que dice que document.identificarForm es nulo o no es un objeto ¿podrÃan ayudarme con este problema?
Mil gracias y saludos.
yoyoooyoy dijo
8 de October del 2009 a las 8:22 am
Hola Carolina, hola a los anteriores
gracias, pero serÃa mejor tutorial si no hubieses tenido problemas
Siento no haber respondido hsta ahora, estaba de vacaciones y acabo de ver los mensajes. Creo que vuestro problema es con las taglib, si no las reconoce el servidor puede que sea o porque no estén declaradas en tu página jsp, < %@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> , o porque no encuentra la taglib en la uri declarada (porque no tengas las librerÃas correctas y por eso no encuentra la tld(si tenéis el -all no será eso), o podéis probar a declarar en vuestro web.xml una location para la uri /tags/struts-html /WEB-INF/struts-html.tld , asegurándoos de que está la tld en la ruta que le indiquéis y luego en la jsp < %@ taglib uri="/tags/struts-html" prefix="html" %>)
Espero servir de ayuda
José Antonio dijo
3 de March del 2010 a las 2:46 pm
Hola Jerónimo, como estas. Me gustaria pedirte un gran favor, estoy intentando seguir con el ejemplo que has propuesto pero me esta costando mucho, he de decir que soy nuevo en esto de java y no entiendo na de na, no se si antes de meterme con struts, seria bueno meterme primero con servlet y jsp. ¿Te importaria ayudarme? te lo pido porque me es necesario por mi trabajo, ya que si no me reciclo, ya sabes donde acabo. Por cierto, yo tambien soy salmantino, y no hay dia que no este desando volver a mi tierra.
Recibe un cordial saludo.
P.D.: Si puede ser aconsejame un manual, porque estoy demasiado espeso con esto.
yoyoooyoy dijo
3 de March del 2010 a las 4:15 pm
Hola José Antonio,
no hay problema en echarte una mano aunque ando muy liado. Mándame un correo con tus dudas.
No sé cómo de nuevo eres en java, te recomiendo los cursos del ceim (gratuitos y online, asà que no tienes excusa:P). Respecto a Struts, Spring y Struts 2 tienes más que documentación suficiente en la red. Lo único que necesitas es un poco de tiempo y mucha determinación.
Hablamos
Avalon dijo
3 de March del 2010 a las 7:54 pm
Bueno Jeronimo, antes de nada tuve mala educación, gracias por compartir tus conocimientos y por tu blog. En Java soy de la categoria Novato el mas nuevo, el tema es que unos me dicen que empieze por servlets y jsp, otros por struts, otros que me meta directamente con spring que es lo que se hace ahora etc, etc, y aunque actualmente trabajo en c# .net, no se porque el java se me esta resistiendo, y es muy importante para mi, porque de el depende, sinceramente, que me renueven los proyectos y por tanto el contrato de trabajo. Entonces, Jeronimo, por donde empiezo, struts? spring? no se. Por favor ayudame.
Una cosa mas, me alegra saber que eres salmantino siempre es agradable saber de un paisano.
Muchas gracias por todo y perdona las molestias.
yoyoooyoy dijo
4 de March del 2010 a las 11:47 am
Pues como todo, depende del tiempo del que dispongas.
Creo que los fundamentos son importantes, esto es java, servlets, html y jsp.
Si prefieres empezar por el tejado para salir del paso, Struts, Struts2, Spring… y otros tantos son frameworks que te automatizan el trabajo sucio (te recomiendo Struts 1, Spring y Struts 2 por ese orden temporal), pero no te olvides de los fundamentos!
Para más cosas, paisano, al mail, aunque te advierto que tengo 4 incidencias en producción pendientes de resolver hoy