Skip to content

2. La aplicación strutspersonne

Hemos abordado, mediante el método clásico (servlet y páginas JSP), una aplicación de gestión de usuarios. Nos proponemos introducir Struts con esta misma aplicación.

2.1. El funcionamiento de la aplicación

Recordemos aquí el funcionamiento de la aplicación «persona» que hemos desarrollado. Está compuesta por:

  • un servlet principal. Este es el que se encarga de toda la lógica de la aplicación.
  • de tres páginas JSP: formulaire.personne.jsp, reponse.personne.jsp, erreurs.personne.jsp

El funcionamiento de la aplicación es el siguiente. Se puede acceder a ella a través de la URL http://localhost:8080/personne/main. En esta URL, se obtiene un formulario proporcionado por la página formulaire.personne.jsp:

Image

El usuario llena el formulario y presiona el botón [Envoyer], que es de tipo «submit». El botón [Rétablir] es de tipo «reset», c.a.d, y restablece el documento al estado en que se recibió. El botón [Effacer] es de tipo «button». El usuario debe ingresar un nombre y una edad válidos. Si no es así, se le envía una página de errores mediante la página JSP erreurs.personne.jsp. A continuación se muestran algunos ejemplos:

Intercambio n.º 1

demande
réponse

Si seguimos el enlace [Retour au formulaire], lo encontramos tal como lo dejamos:

Intercambio n.º 2

demande
réponse

Si el usuario envía datos correctos, la aplicación le envía una respuesta a través de la página JSP reponse.personne.jsp.

Intercambio n.º 1

demande
réponse

Si seguimos el enlace [Retour au formulaire], lo encontramos tal como lo dejamos:

Intercambio n.º 2

demande
réponse

2.2. La arquitectura Struts de la aplicación

Adoptaremos la siguiente arquitectura Struts:

  • Habrá tres vistas
  • el controlador será el que proporciona Struts
  • FormulaireBean es la clase encargada de almacenar los valores del formulario presentado por la vista formulaire.personne.jsp
  • FormulaireAction es la clase encargada de procesar los valores de FormulaireBean e indicar la página de respuesta que se debe enviar:
    • la vista erreurs.personne.jsp si los datos del formulario son incorrectos
    • la vista reponse.personne.jsp en caso contrario

Para el desarrollador, el trabajo consiste en escribir el código:

  • de las tres vistas
  • del bean FormulaireBean asociado al formulario
  • de la clase FormulaireAction encargada de procesar el formulario

2.3. Compilar las clases necesarias para la aplicación Struts

Para compilar las clases necesarias para nuestra aplicación, utilizaremos JBuilder. Este programa trabaja con un JDK en el que no se encuentran las clases necesarias para las aplicaciones Struts. Podemos configurar JBuilder de la siguiente manera:

  • opción Tools (Herramientas) /Configure JDKs (Configurar JDK)

Image

  • Utilice el botón [Add/Ajouter] para agregar a los archivos de clases de JBuilder los archivos .jar proporcionados por Struts. Si ha descomprimido el archivo de Struts en el disco, puede agregar a JBuilder todos los archivos .jar de la carpeta <struts>/lib:

Image

Se pueden agregar a los archivos de JBuilder todos los archivos .jar mencionados anteriormente. Ya hemos visto que Tomcat también necesita tener acceso a los archivos de Struts. Para Tomcat 4.x, se pueden colocar los archivos .jar de Struts en <tomcat4>\common\lib. Para Tomcat 5.x, se pueden colocar en <tomcat5>\shared\lib. Luego, podemos configurar que JBuilder encuentre los archivos .jar de Struts en el mismo lugar que Tomcat. Esto es lo que se hizo en la captura de pantalla que muestra un poco más arriba los archivos .jar de JBuilder. Se tomaron de <tomcat5>\shared\lib.

Por lo tanto, si al compilar una clase, JBuilder indica que no encuentra una clase de Struts, revisa dos cosas:

  • la ortografía de la clase
  • los archivos .jar que utiliza JBuilder. Todos los archivos .jar de Struts deben estar incluidos.

2.4. Las vistas de la aplicación strutspersonne

Las tres vistas de la aplicación son las siguientes:

  • formulaire.personne.jsp: muestra el formulario para ingresar el nombre y la edad de una persona
  • reponse.personne.jsp: muestra los valores ingresados si son válidos
  • erreurs.personne.jsp: muestra los errores, si los hay

2.4.1. La vista erreurs.personne.jsp

Esta vista, que muestra una lista de errores, se definirá de la siguiente manera:

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<html>
    <head>
      <title>Personne</title>
  </head>
  <body>
      <h2>Les erreurs suivantes se sont produites</h2>
        <html:errors/>
    <html:link page="/formulaire.do">
            Retour au formulaire
        </html:link>    
  </body>
</html>

Hay dos novedades en este código:

  1. la presencia de etiquetas <html:XX/> que no son etiquetas HTML. De hecho, se pueden crear bibliotecas de etiquetas JSP que, al transformar la página JSP en un servlet, se convierten en código Java.
  2. La página JSP debe declarar las bibliotecas de etiquetas que utiliza. Lo hace aquí con la línea
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

Esta línea proporciona dos datos:

  • uri: la ubicación del archivo que rige las reglas de uso de la biblioteca. El archivo struts-html.tld se incluye en la distribución de Struts. En el ejemplo anterior, se colocará en la carpeta WEB-INF.
  • prefijo: el identificador que se usa en el código para anteponer a las etiquetas de la biblioteca. Esto permite evitar conflictos de nombres que podrían surgir al usar varias bibliotecas de etiquetas al mismo tiempo. Podría darse el caso de que hubiera dos etiquetas con el mismo nombre en dos bibliotecas diferentes. Al asignar un prefijo distinto a cada biblioteca, se elimina cualquier ambigüedad.
  • La etiqueta <html:errors> muestra la lista de errores que le envía el controlador Struts.
  • La etiqueta <html:link> genera un enlace que apunta a /C/page, donde
    • C es el contexto de la aplicación
    • «page» es el URL indicado en el atributo «page» de la etiqueta

La etiqueta

    <html:link page="/formulaire.do">
            Retour au formulaire
        </html:link>

generará el siguiente código HTML:

<a href="/C/formulaire.do">Retour au formulaire</a>

donde C es el contexto de la aplicación

2.4.2. Prueba de la vista erreurs.personne.jsp

  • El archivo erreurs.personne.jsp se coloca en la carpeta «vistas» de la aplicación strutspersonne:

Image

  • El archivo struts-html.tld se toma de la distribución de Struts (<struts>/lib) y se coloca en WEB-INF:

Image

  • El archivo struts-config.xml se modifica de la siguiente manera:
<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>
    <action-mappings>
      <action
          path="/main"
          parameter="/vues/main.html"
          type="org.apache.struts.actions.ForwardAction"
      />
      <action
          path="/erreurs"
          parameter="/vues/erreurs.personne.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />
    </action-mappings>
</struts-config>

Creamos en el archivo de configuración una nueva URL /errores destinada a ser procesada por el controlador Struts. El archivo URL /erreurs.do será redirigido a la vista /vistas/erreurs.personne.jsp. El archivo struts-config.xml se coloca en la carpeta WEB-INF.

  • Reiniciamos Tomcat para que se tenga en cuenta el nuevo archivo struts-config.xml y, a continuación, accedemos a la URL http://localhost:8080/strutspersonne/erreurs.do:

Image

La etiqueta <html:errors/> no generó nada. Esto es normal, ya que la acción ForwardAction no generó la lista de errores que esperaba la etiqueta. Sin embargo, la respuesta anterior muestra que nuestra vista JSP es, al menos, sintácticamente correcta; de lo contrario, habríamos obtenido una página de errores. Verifiquemos el código HTML recibido por el navegador (Ver/Fuente):

<html>
    <head>
      <title>Personne - erreurs</title>
  </head>
  <body>
      <h2>Les erreurs suivantes se sont produites</h2>        
    <a href="/strutspersonne/formulaire.do">Retour au formulaire</a>    
  </body>
</html>

Cabe destacar el enlace generado por la etiqueta <html:link>. El contexto /strutspersonne se ha incluido automáticamente en el enlace. Esto permite trasladar la aplicación de un contexto a otro (por ejemplo, al cambiar de máquina) sin tener que modificar los enlaces generados por <html:link>.

2.4.3. La vista reponse.personne.jsp

Esta vista, que confirma los valores ingresados en el formulario, es la siguiente:

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<%
     // se recuperan los datos nombre, edad
  //String nombre = (String)request.getAttribute("nombre");
  String nom="jean";

   //String edad = (String)request.getAttribute("edad"); 
  String age="24"; 
%>

<html>
    <head>
      <title>Personne</title>
  </head>
  <body>
      <h2>Personne - réponse</h2>
    <hr>
    <table>
        <tr>
          <td>Nom</td>
        <td><%= nom %>
      </tr>
        <tr>
          <td>Age</td>
        <td><%= age %>
      </tr>
    </table>      
    <br>
    <html:link page="/formulaire.do">
            Retour au formulaire
        </html:link>    
  </body>
</html>

La página muestra dos datos: [nom] y [age], que le serán pasados por el controlador en el objeto predefinido request. Aquí realizamos una prueba en la que el controlador no tendrá la oportunidad de establecer los valores de [nom] y [age]. Por lo tanto, inicializamos estos dos datos con valores arbitrarios. Además, aquí también el enlace de regreso al formulario se genera mediante una etiqueta <html:link>.

2.4.4. Prueba de la vista reponse.personne.jsp

  • El archivo reponse.personne.jsp se coloca en la carpeta «vistas» de la aplicación strutspersonne:

Image

  • El archivo struts-config.xml se modifica de la siguiente manera:
<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>
    <action-mappings>
      <action
          path="/main"
          parameter="/vues/main.html"
          type="org.apache.struts.actions.ForwardAction"
      />
      <action
          path="/erreurs"
          parameter="/vues/erreurs.personne.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />
      <action
          path="/reponse"
          parameter="/vues/reponse.personne.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />
    </action-mappings>
</struts-config>

Creamos en el archivo de configuración una nueva respuesta URL destinada a ser procesada por el controlador Struts. La respuesta URL /reponse.do será redirigida a la vista /vistas/reponse.personne.jsp. El archivo struts-config.xml se coloca en la carpeta WEB-INF.

  • Reiniciamos Tomcat para que se tenga en cuenta el nuevo archivo struts-config.xml y, a continuación, accedemos a la URL http://localhost:8080/strutspersonne/erreurs.do:

Image

Obtenemos exactamente lo que esperábamos.

2.4.5. La vista formulaire.personne.jsp

Esta vista muestra el formulario para ingresar el nombre y la edad del usuario. Su código JSP es el siguiente:

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<html>
    <meta http-equiv="pragma" content="no-cache"> 
    <head>
      <title>Personne - formulaire</title>
    <script language="javascript">
        function effacer(){
          with(document.frmPersonne){
            nom.value="";
          age.value="";
        }
      }
    </script>
  </head>

  <body>
      <center>
        <h2>Personne - formulaire</h2>
      <hr>
      <html:form action="/main" name="frmPersonne" type="istia.st.struts.personne.FormulaireBean">
          <table>
            <tr>
              <td>Nom</td>
            <td><html:text property="nom" size="20"/></td>
          </tr>
          <tr>
              <td>Age</td>
            <td><html:text property="age" size="3"/></td>
          </tr>
            <tr>
        </table>
        <table>
            <tr>
              <td><html:submit value="Envoyer"/></td>
            <td><html:reset value="Rétablir"/></td>
            <td><html:button property="btnEffacer" value="Effacer" onclick="effacer()"/></td>
          </tr>
        </table>
      </html:form>
    </center>
  </body>
</html>

Vemos nuevamente la biblioteca de etiquetas struts-html.tld utilizada en la vista de errores. Aparecen nuevas etiquetas:

html:form
sirve tanto para generar la etiqueta HTML <form> como para proporcionar información al controlador que deberá procesar este formulario:
action
URL a la que se enviarán los valores del formulario
name
nombre del formulario HTML. También es el nombre del bean que almacenará los valores del mismo
type
nombre de la clase que deberá instanciarse para obtener el bean de almacenamiento del formulario
Cabe señalar que no se especifica el método para enviar los parámetros del formulario (GET/POST) al controlador. Esto se podría hacer con el atributo method. A falta de este, se utiliza por defecto el método POST.
html:text
sirve para generar la etiqueta <input type="text" value="...">:
property
nombre del campo del bean del formulario que se asociará al campo de entrada. Al enviar el formulario al servidor (cliente → servidor), el campo del bean tomará el valor del campo de entrada. Al mostrar el formulario (servidor → cliente), el valor contenido en el campo del bean se muestra en el campo de entrada.
html:submit
sirve para generar la etiqueta HTML <input type="submit"...>
html:reset
sirve para generar la etiqueta HTML <input type="reset"...>
html:button
sirve para generar la etiqueta HTML <input type="button"...>

2.4.6. El bean asociado al formulario formulaire.personne.jsp

  • Con Struts, todo formulario debe estar asociado a un bean encargado de almacenar los valores del formulario y conservarlos en la sesión actual. Un bean es una clase Java que debe respetar una sintaxis específica. El bean asociado a un formulario debe derivarse de la clase ActionForm definida en las bibliotecas de Struts:
public class FormulaireBean extends ActionForm {
  • Los nombres de los atributos del bean deben coincidir con los campos del formulario (atributos «property» de las etiquetas `html:text` del formulario). Según el código del formulario anterior, el bean debe tener dos campos llamados «nombre» y «edad».
  • Para cada campo XX del formulario, el bean debe definir dos métodos:
    • public void setXX(Type valor): para asignar un valor al atributo XX
    • Type getXX(): para obtener el valor del campo XX

El bean asociado al formulario anterior podría ser el siguiente:

package istia.st.struts.personne;

import org.apache.struts.action.ActionForm;

public class FormulaireBean extends ActionForm {
   // nombre
  private String nom = null;
  public String getNom() {
    return nom;
  }
  public void setNom(String nom) {
    this.nom = nom;
  }

   // edad
  private String age = null;
  public String getAge() {
    return age;
  }
  public void setAge(String age) {
    this.age = age;
  }
}

Compilaremos estas clases con JBuilder.

2.4.7. Prueba de la vista formulaire.personne.jsp

El archivo formulaire.personne.jsp se coloca en la carpeta «vistas» de la aplicación StrutsPersonne:

Image

  • El archivo struts-config.xml se modifica de la siguiente manera:
<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>
    <action-mappings>
      <action
          path="/main"
          parameter="/vues/main.html"
          type="org.apache.struts.actions.ForwardAction"
      />
      <action
          path="/erreurs"
          parameter="/vues/erreurs.personne.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />
      <action
          path="/reponse"
          parameter="/vues/reponse.personne.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />
      <action
          path="/formulaire"
          parameter="/vues/formulaire.personne.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />
    </action-mappings>
</struts-config>

Creamos en el archivo de configuración un nuevo formulario URL destinado a ser procesado por el controlador Struts. El /URL /formulaire.do será redirigido a la vista /vistas/formulaire.personne.jsp. El archivo struts-config.xml se coloca en la carpeta WEB-INF.

  • Colocamos la clase FormulaireBean en WEB-INF/classes:

Image

  • Reiniciamos Tomcat para que se tenga en cuenta el nuevo archivo struts-config.xml y, a continuación, accedemos a la URL http://localhost:8080/strutspersonne/formulaire.do:

Image

Efectivamente, aparece el formulario. Quizás nos dé curiosidad ver cómo se han «traducido» las etiquetas <html:XX> que salpicaban el código JSP del formulario:

<html>
    <meta http-equiv="pragma" content="no-cache"> 
    <head>
      <title>Personne - formulaire</title>
    <script language="javascript">
        function effacer(){
          with(document.frmPersonne){
            nom.value="";
          age.value="";
        }
      }
    </script>
  </head>

  <body>
      <center>

        <h2>Personne - formulaire</h2>
      <hr>
      <form name="frmPersonne" method="post" action="/strutspersonne/main.do">
          <table>
            <tr>
              <td>Nom</td>
            <td><input type="text" name="nom" size="20" value=""></td>
          </tr>

          <tr>
              <td>Age</td>
            <td><input type="text" name="age" size="3" value=""></td>
          </tr>
            <tr>
        </table>
        <table>
            <tr>

              <td><input type="submit" value="Envoyer"></td>
            <td><input type="reset" value="Rétablir"></td>
            <td><input type="button" name="btnEffacer" value="Effacer" onclick="effacer()"></td>
          </tr>
        </table>
      </form>
    </center>
  </body>
</html>

En el formulario obtenido, los botones [Restaurar] y [Effacer] funcionan. El botón [Envoyer], de tipo «submit», redirige a la página URL /strutspersonne/main.do. Según el archivo web.xml de la aplicación, el controlador Struts se encargará de ello. Según el archivo struts-config.html, el controlador debe redirigir la solicitud a la vista /vistas/main.html. Probemos:

Image

Todo funciona como se esperaba. Ahora nos queda procesar realmente los valores del formulario, c.a.d. Escribamos la clase de tipo Action que recibirá los datos del formulario en un objeto FormulaireBean.