Si vis pacem para bellum

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

22 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

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

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

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

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

  13. yo dijo

    28 de October del 2010 a las 6:08 pm

    para el taglib que no encuentra la biblioteca, poned:

    Saludos.

  14. yo dijo

    28 de October del 2010 a las 6:09 pm

    taglib uri=”http://struts.apache.org/tags-bean” prefix=”bean”

  15. Cumpleaños del Blog – II | Lycka Bonita dijo

    17 de February del 2011 a las 3:11 pm

    [...] (NUEVO) Nuestra primera acción con Struts 1.3.8. [...]

  16. Integrar Struts con Spring – holamundoStruts138Spring | Lycka Bonita dijo

    17 de February del 2011 a las 3:45 pm

    [...] un nuevo proyecto web dinámico, holamundoStruts138Spring. Copiamos todo lo que tenemos en holamundoStruts138 sobre este nuevo proyecto para no partir de [...]

  17. Generar ficheros PDF – iReport sobre Struts | Lycka Bonita dijo

    17 de February del 2011 a las 3:54 pm

    [...] este ejemplo vamos a partir de otro ejemplo previo, el código que generamos en el tutorial sobre Struts 1.3.8. Puedes obtener el war del proyecto en mi cuenta de hordit si no quieres montárlo tú [...]

  18. viki dijo

    22 de September del 2011 a las 11:24 am

    Felicitarte por tu blog. Tengo un problema he hecho todo lo que dice pero me da los siguientes errores:

    GRAVE: El Servlet /holamundoStruts138 lanzó excepción de load()
    javax.servlet.UnavailableException: Missing configuration resource for path /WEB-INF/struts-config.xml
    .
    .
    .
    .

    GRAVE: Servlet.service() para servlet jsp lanzó excepción
    java.lang.NullPointerException: Module ‘null’ not found.
    at org.apache.struts.taglib.TagUtils.getModuleConfig(TagUtils.java:755)
    at org.apache.struts.taglib.TagUtils.computeURLWithCharEncoding(TagUtils.java:364)
    at org.apache.struts.taglib.TagUtils.computeURLWithCharEncoding(TagUtils.java:285)
    at org.apache.struts.taglib.html.LinkTag.calculateURL(LinkTag.java:445)
    at org.apache.struts.taglib.html.LinkTag.doEndTag(LinkTag.java:353)
    at org.apache.jsp.jsp.index_jsp._jspx_meth_html_005flink_005f0(index_jsp.java:136)
    at org.apache.jsp.jsp.index_jsp._jspService(index_jsp.java:86)

    ¿Me podrías decir en que fallo? Gracias

  19. yoyoooyoy dijo

    26 de September del 2011 a las 8:02 am

    Gracias viki.

    Ya tengo un poco oxidado esto, pero por si aún estás atascada en este problema te está lanzando una excepción porque Struts2 no encuentra el módulo, seguramente porque en la JSP no le has indicado qué módulo utilizar (está buscando el módulo ‘null’). Estoy todavía con la resaca postvacacional, si no lo resuelves mándame un correo y lo vemos.

    Saludos.

  20. viki dijo

    28 de September del 2011 a las 9:44 am

    Según he investigado el problema lo tengo en la jsp index, en la siguiente linea:

    Ingresar en la zona privilegiada aquí.

    Soy nueva en esto y no sé que le puede pasar. Gracias.

  21. viki dijo

    28 de September del 2011 a las 11:08 am

    Ya esta arreglado, el fallo lo tenia en el fichero web.xml que no puse bien la ruta de donde se encontraba el fichero struts-config.xml.

  22. Primeros Pasos con Struts2 | Lycka Bonita dijo

    10 de November del 2011 a las 3:48 pm

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

Comentarios RSS · TrackBack URI

Dejanos tu Comentario

Nombre: (Requerido)

E-Mail: (Requerido)

Sitio WEB:

Comentario:

Comenta