Primeros Pasos con Struts2
Struts2 es un framework para desarrollar aplicaciones web basadas en Java. Surge de la unión de las comunidades de Webwork y de Struts, en la que la base es de webwork y el nombre lo pone Struts.
En su sitio web nos informa de que es más simple y más completo. Aquí podemos encontrar la última versión disponible para descargar así como tutoriales, guías…
Herramientas necesarias
Necesitamos nuestras herramientas Java (JDK), un IDE (hoy por hoy Eclipse es el rey y yoxos su profeta) y un servidor de aplicaciones (Tomcat siempre es una buena elección).
Además descargaremos la distribución 2.0.14 de Struts. La distribución contiene el código, la documentación, y varias aplicaciones web de ejemplo (empaquetadas en formato .war), entre ellas struts-blank-2.0.14.war, que es una aplicación web vacía preparada para comenzar con Struts2, es decir, algo así como el hola mundo que vamos a construir en esta entrada.
holamundoStruts2014
Empezamos con el eclipse. Creamos un nuevo proyecto web dinámico, que llamaremos holamundoStruts2014.
En el fichero despcriptor de la aplicación web, el WebContent > WEB-INF > web.xml nos aseguramos que esté nuestro fichero en la lista de ficheros de bienvenida. El valor de <display-name> será el que se mostrará en la administración de nuestro servidor de aplicaciones.
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>holamundoStruts2014</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
Añadimos las librerías sobre las que vamos a trabajar:
- commons-logging.jar. Se trata de una librería genérica que nos posibilita el registro de sucesos (logging).
- freemarker.jar. Es un motor para trabajar con plantillas en nuestra parte de Vista.
- ognl.jar. Es una librería para trabajar con EL.
- struts2-core.jar. El núcleo de Struts2. Si lo abrís fijáos en el nombre de los paquetes.
- xwork.jar. Es un framework que nos proporcionaInversión de Control, EL, validaciones…
Ahora debemos capturar las llamadas al contenedor web para que las atienda Struts2. Para ello configuramos el fichero web.xml añadiendo:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
El resultado será que todas las URLs invocadas dentro del contexto de nuestra aplicación web serán interceptadas y atendidas por el filtro de Struts2.
Nuestra primera acción
Queremos crear 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 (jsp/identificar.jsp) y otra para a la que se accederá si se tiene éxito al identificarse (jsp/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.
Ahora toca los formularios… pero espera ! Struts2 NO TIENE FORMULARIOS ! Sus desarrolladores se muestran muy orgullosos con este punto.
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.
Como vemos hasta ahora es muy parecido a Struts 1.3.8, excepto en el tema de los formularios. Pasemos a ver cómo implementar nuestra aplicación.
Como somos muy buenos desarrollando y hemos hecho bien antes nuestro trabajo, podemos reutilizar el código que desarrollamos en el artículo sobre los primeros pasos en Struts 1.3.8 (únicamente renombramos el paquete de es.lycka.holamundoStruts138 -> es.lycka.holamundoStruts2014) para :
- es.lycka.holamundoStruts138.model.Usuario
- es.lycka.holamundoStruts138.negocio.IdentificarBO
- es.lycka.holamundoStruts138.persistencia.IdentificarDAO
index.jsp
Con respecto a Struts 1.3.8, únicamente cambia las taglibs. Ejemplos de los enlaces.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!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 :
</p>
<ul>
<li>Ingresar en la zona privilegiada <s:a href="jsp/identificar.jsp">aquí</s:a>.</li>
</ul>
</body>
</html>
jsp/identificar.jsp
Aquí podemos ver cómo se tratan los formularios.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!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>
</head>
<body>
<h2><s:property value="mensaje" /></h2>
<div>
Por favor, identifíquese.
</div>
<s:form action="identificar">
<s:textfield label="Identificador" name="usuario.identificador"/>
<s:password label="Contraseña" name="usuario.contrasenna" />
<s:submit value="Login" align="center"/>
</s:form>
</body>
</html>
jsp/indexIdentificado.jsp
Un ejemplo de cómo leer datos de la sesión.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!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.
<s:property value="#session.usuario.identificador" />
</body>
</html>
es.lycka.holamundoStruts138.action.IdentificarAction
package es.lycka.holamundoStruts2014.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import es.lycka.holamundoStruts2014.model.Usuario;
import es.lycka.holamundoStruts2014.negocio.IdentificarBO;
public class IdentificarAction extends ActionSupport {
private static final long serialVersionUID = 2228074990625416790L;
private static final String USUARIO_NO_AUTORIZADO = "El usuario introducido no está autorizado.";
private static final String ERROR_INTERNO = "Error interno. Por favor, inténtelo otra vez en unos minutos.";
private Usuario usuario;
private String mensaje;
public String execute () {
String destino = INPUT;
try {
if (IdentificarBO.esUsuarioAutorizado(usuario)) {
Map session = ActionContext.getContext().getSession();
session.put("usuario", usuario);
destino = SUCCESS;
} else {
setMensaje(USUARIO_NO_AUTORIZADO);
}
} catch (Exception e) {
e.printStackTrace();
setMensaje(ERROR_INTERNO);
}
return destino;
}
public Usuario getUsuario() {
return usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
public String getMensaje() {
return mensaje;
}
public void setMensaje(String mensaje) {
this.mensaje = mensaje;
}
}
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="es/lycka/holamundoStruts2014/properties/identificar.xml"/>
</struts>
es.lycka.holamundoStruts2014.properties.identificar.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="identificar" namespace="/jsp" extends="struts-default">
<action name="identificar" class="es.lycka.holamundoStruts2014.action.IdentificarAction">
<result name="input">/jsp/identificar.jsp</result>
<result>/jsp/indexIdentificado.jsp</result>
</action>
</package>
</struts>
La estructura del proyecto quedaría así :
He subido el war a hordit por si prefieres el código.
Fácil ? Bien explicado ? Más fácil que en Struts 1.3.8 ?




























lanz dijo
8 de January del 2009 a las 8:09 pm
Hola Jeronimo,
Quiero bajarme el Yoxos, pero cuando voy a su pagina , en la seccion de downloads http://www.innoopract.com/en/eclipse-downloads/
sólo habla del Eclipse, no encuentro nada sobre el Yoxos.
¿Realmente tiene alguna caracterÃstica diferenciadora sobre el Eclipse? ¿como puedo bajarme el Yoxos y no el Eclipse?
Un saludo
ricardo dijo
4 de March del 2009 a las 6:21 am
Hola.. muy interesante tu tutorial pero una pregunta las demas clases? usuario.java y las otras 2 mas?.. ahi dice que es de un proyecto anterior pero se me hace mas confuso. Me baje el war pero cuando lo importe en mi eclipse los paquetes action, model, negocio y persistencia estan vacios… el unico que tiene algo es el de persistencia… y es increible que veo referencias a clases dentro de los paquetes que te acabo de mencionar pero no hay absolutamente nada… te agradeceria mucho si me puedes ayudar.
Gracias
yoyoooyoy dijo
4 de March del 2009 a las 9:23 am
Hola Ricardo,
el proyecto anterior es el de holamundoStruts138, pero se me pasó enlazarlo. Mañana intentaré revisar los war de los proyectos, a ver si los he exportado sin fuentes
(en los war van los mismos archivos que pongo en los tutoriales, pero es más fácil de entender en el eclipse que en este chorizo de tutorial)
Pedro dijo
6 de April del 2009 a las 12:08 pm
Hola, he empezado con el tutorial de Struts2 y he llegado a este.
He descargado el WAR y aparantemente funciona.
Eso si, estan las clases, pero no las fuentes de estas.
Me uno a la petición de que postees, si eres tan amable con nosotros, las clases que faltan, más que nada, por tener el ejemplo completo y ver que somos capaces de reproducirlo.
Muchas gracias, un saludo.
Pedro dijo
6 de April del 2009 a las 12:10 pm
Pd: ricardo, el ejemplo funciona y el SRC esta vacio, ¿verdad?.
Es correcto, las clases estan en:
Libraries\Web App Libraries\ ImportedClasses
No sé si el autor lo hizo asà ó es eclipse el que las importa de esta manera.
Salu2
yoyoooyoy dijo
7 de April del 2009 a las 8:08 am
Joer, qué cabeza la mÃa, el war sin fuentes… Si tenéis paciencia intentaré (otra vez) compartirlo con fuentes. Si no el código que cuelgo es el mismo que el del war, y la estructura es la de la imagen (y la de las clases).
También podéis decompilar las clases con DJ Decompiler.
En cuanto a las clases, fÃsicamente están en WEB-INF > classes, pero Eclipse nos las coloca en Libraries > Web App Libraries > Imported Classes de la misma forma que las librerÃas fÃsicamente están en WEB-INF > lib y eclipse las coloca en Libraries
Antonio dijo
26 de May del 2009 a las 10:22 am
Hola
Segui todos tus pasos al pie de la letra y me funciona correctamente.
Hice un fichero JAVA apartae de lo que pusiste que se me conecta a una BD en MYSQL correctamente.
¿¿Como puedo hacer para que IdentificarDAO.java se una con mi MYSQL.java ?? En la BD tengo una tabla llamada usuarios y con unos campos de Login, Password y edad pa mostrarlo nada mas entrar.
Si me pudieras orientar te lo agradezco que hace años que no uso java y ahora estaba intentandolo recuperar con Struts2
GRACIAS por adelantado y muy grande la página.
Un cordial saludo
Luis Javier dijo
2 de June del 2009 a las 8:36 am
Podria alguien explicarme un poco como va esto del MVC ya que tenia entendido que esto son 3 partes Modelo-Vista-Controlador pero aqui veo que está estructurado en action-modelo-negocio-persistencia-propiedades-por otro lado los JSP….
Lei por ahi hablar del Controlador FilterDispatcher de las acciones y de los resultador…sigue este ejemplo eso ?? Si es asi no lo entiendo o no lo se ver.
Se agradece cualquier mÃnima explicación porque es la 1ª vez que sigo este esquema y me estoy volviendo loco xD
yoyoooyoy dijo
2 de June del 2009 a las 9:01 am
Hola Luis Javier,
lo de MVC (Modelo Vista Controlador) es un patrón para implementar tus aplicaciones en 3 capas en lugar de como se hacÃa hace más de 5 años en 2 capas. Actualmente utilizamos más capas, como la de negocio, persistencia y otras como para los informes…
Quizás estos dos enlaces te sirvan:
* framework struts
* Modelo Vista Controlador
Se sigue utilizando el concepto MVC para la parte “frontal” de la aplicación, la que implementas con Struts, Struts2 o Spring MVC. El resto de capas (negocio, persistencia…) deberÃan ser independientes del framework utilizado para implementar esta parte.
Espero te haya servido de ayuda.
TiToVaSSi dijo
17 de June del 2009 a las 12:08 pm
Hola, he seguido todos los pasos y una vez que lo compilo entra sin problemas en el index y en poner el login pero una vez que pulso para que “se loguee” salta un error 404 creo que lo que me esta pasando es que no me encuentra el action, tengo todo el codigo como tu asi que nose que es lo que me puede pasar. He probado con un Hola Mundo normal y me pasaba lo mismo con el action uso los jdk 1.5 hay que usar superiores? el tomcat es el 5.5
yoyoooyoy dijo
18 de June del 2009 a las 9:10 am
Hola TiToVaSSi,
te puedo decir cuál no es el problema, no es ni la versión de la jdk ni del tomcat ni del eclipse :).
Los frameworks en general tienen un “punto débil” para nosotros que contamos con el compilador, y eso son su archivos de configuración xml. Probablemente hayas escrito mal la dirección en el xml, yo empezarÃa por ahÃ. Si aún asà no lo encuentras, mándame por correo el código y le echo un vistazo cuando saque un rato.
Ciao