Una era construye ciudades. Una hora las destruye.
Séneca

Archivos del día 17 de July del 2008

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

Primera Acción en Struts 1.3.8Partimos 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>&nbsp;&nbsp;&nbsp;<html:text property="usuario.identificador" /></span>

</div>

<div>

      <span style="text-aling:rigth">Contraseña </span>

      <span>&nbsp;&nbsp;&nbsp;<html:password property="usuario.contrasenna" /></span>

</div>

<div>&nbsp;</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