Skip to content

2. La aplicación strutspersonne

Hemos tratado, mediante el método clásico, servlet y páginas JSP, una aplicación de personas. 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 URL http://localhost:8080/personne/main. En esta dirección, se obtiene un formulario proporcionado por la página:

Image

El usuario rellena el formulario y pulsa el botón [Envoyer] de tipo submit. El botón [Rétablir] es de tipo reset, c.a.d, y devuelve el documento al estado en el que se recibió. El botón [Effacer] es de tipo button. El usuario debe proporcionar 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 y 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 y 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 proporcionado por 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 erróneos
    • 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 trabaja con un JDK en el que no se encuentran las clases necesarias para las aplicaciones Struts. Podemos configurar JBuilder de la siguiente manera:

  • option Herramientas (Tools) /Configurar JDKs (Configurar JDK)

Image

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

Image

Se pueden añadir 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. A continuación, se puede decidir que JBuilder encuentre los archivos .jar de Struts en la misma ubicación que Tomcat. Esto es lo que se ha hecho en la captura de pantalla que muestra un poco más arriba los archivos .jar de JBuilder. Se han tomado de <tomcat5>\shared\lib.

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

  • la ortografía de la clase
  • los archivos .jar utilizados por 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 introducir el nombre y la edad de una persona
  • reponse.personne.jsp: muestra los valores introducidos 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.
  • prefix: el identificador utilizado en el código para prefijar las etiquetas de la biblioteca. Esto permite evitar los conflictos de nombres que podrían surgir al utilizar simultáneamente varias bibliotecas de etiquetas. Podrían encontrarse dos etiquetas con el mismo nombre en dos bibliotecas diferentes. Al asignar un prefijo diferente a cada biblioteca, se elimina cualquier ambigüedad.
  • La etiqueta <html:errors> muestra la lista de errores que le transmite el controlador Struts.
  • La etiqueta <html:link> genera un enlace que apunta a /C/page donde
    • Este es el contexto de la aplicación
    • página es URL, tal y como se indica 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. La ruta URL /erreurs.do se redirigirá 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, solicitamos el url http://localhost:8080/strutspersonne/erreurs.do :

Image

La etiqueta <html:errors/> no ha producido nada. Es normal, ya que la acción ForwardAction no ha generado la lista de errores esperada por la etiqueta. No obstante, 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. Comprobemos 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 introducidos en el formulario, es la siguiente:

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

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

  //String age=(String)request.getAttribute("age"); 
  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. Por otra parte, aquí también el enlace de retorno 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 se redirigirá a la vista /vues/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, solicitamos el url http://localhost:8080/strutspersonne/erreurs.do :

Image

Obtenemos efectivamente lo que esperábamos.

2.4.5. La vista formulaire.personne.jsp

Esta vista muestra el formulario para introducir 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>

Encontramos 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 tendrá que procesar este formulario:
action
url, donde se enviarán los valores del formulario
name
nombre del formulario HTML. Este es también 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 de envío de los parámetros del formulario (GET/POST) al controlador. 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 memorizar los valores del formulario y conservarlos en la sesión actual. Un bean es una clase Java que debe respetar una sintaxis particular. El bean asociado a un formulario debe derivar de la clase ActionForm definida en las bibliotecas de Struts:
public class FormulaireBean extends ActionForm {
  • los nombres de los atributos del bean deben corresponder a 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, por tanto, 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 {
  // nom
  private String nom = null;
  public String getNom() {
    return nom;
  }
  public void setNom(String nom) {
    this.nom = nom;
  }

  // age
  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 «vues» 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 se redirigirá a la vista /vues/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 luego solicitamos el url http://localhost:8080/strutspersonne/formulaire.do:

Image

Efectivamente, obtenemos el formulario. Quizás nos interese 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 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 /vues/main.html. Probemos:

Image

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