La primera vez que me engañes sera culpa tuya;la segunda vez sera mia.
Proverbio árabe

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

8 Comentarios hasta el momento »

  1. 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 [...]

  2. 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.

  3. 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 :)

  4. 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

  5. juan dijo

    11 de June del 2009 a las 12:13 am

    Yo tengo el mismo problema que Juan Pedro.
    Pudieron solucionarlo?

  6. 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,

  7. 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.

  8. 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

Comentarios RSS · TrackBack URI

Dejanos tu Comentario

Nombre: (Requerido)

E-Mail: (Requerido)

Sitio WEB:

Comentario:

Comenta