¿Qué importa que algún capitán me ordene coger la escoba y barrer la cubierta?¿Quién no es un esclavo? Decídmelo.
Ismael, en Moby Dick

Archivos del día 5 de January del 2009

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 ?

Comenta