Skip to content

3. Ejemplo 02 – Inyección de parámetros en la acción

3.1. El proyecto NetBeans

  • en [1,2], los archivos de configuración
  • en [3], la acción
  • en [4], la vista
  • en [5], las bibliotecas del proyecto

3.2. Los archivos de configuración

El archivo [web.xml] es el siguiente:


<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     version="3.0">
 
  <display-name>Struts tuto-001</display-name>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <session-config>
    <session-timeout>
            30
    </session-timeout>
  </session-config>
</web-app>

Ya hemos comentado este archivo. No lo volveremos a hacer. Basta con recordar que se encarga de que todas las URL (línea 15) pasen por el filtro de Struts (línea 10).

El archivo [struts.xml] es el siguiente:


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
 <package name="default" namespace="/" extends="struts-default">
    <default-action-ref name="index" />
    <action name="index">
      <result type="redirectAction">
        <param name="actionName">Action1</param>
        <param name="namespace">/actions</param>
      </result>
    </action>
  </package>
  <package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1" class="actions.Action1">
      <result name="success">/vues/Action1.jsp</result>
    </action>
  </package>
</struts>
  • líneas 7-15: definen el paquete [default], el que se utiliza cuando no se ha podido encontrar una acción en otro paquete.
  • línea 8: define una acción por defecto para este paquete denominado index.
  • líneas 9-14: configuran la acción denominada index. Se observa que no está asociada a ninguna clase (falta el atributo class en la línea 9).
  • línea 10: el resultado corresponde a la clave success (ausencia del atributo name). Es de tipo redirectAction (atributo type). Este tipo permite redirigir una acción a otra acción. En este caso, cuando el cliente solicite la acción /index, será redirigido a la acción /actions/Action1 (líneas 11-12).
  • líneas 16-20: definen el paquete de acciones (name) asociado a las acciones de URL /actions/Action (class).
  • Líneas 17-19: configuran la acción /actions/Action1 (name). Al solicitar esta acción, Struts instanciará la clase actions.Action1 (class) y, a continuación, se ejecutará el método execute de dicha clase. Este deberá devolver la clave success, ya que es la única clave definida en la línea 18.
  • Línea 18: para la clave success, la vista que se mostrará será la página JSP [vues/Action1.jsp].

En definitiva, hay que recordar que el proyecto Struts solo sabe ejecutar la acción de la URL [actions/Action1].

3.3. L'action

La acción Action1 está representada por la siguiente clase:


package actions;

import com.opensymphony.xwork2.ActionSupport;

public class Action1 extends ActionSupport{
  
  // patrón de la acción
  private String param1="valeur1";
  private String param2="valeur2";
  
  @Override
  public String execute(){
    return SUCCESS;
  }
  
  // getters y setters

  public String getParam1() {
    return param1;
  }

  public void setParam1(String param1) {
    this.param1 = param1;
  }

  public String getParam2() {
    return param2;
  }

  public void setParam2(String param2) {
    this.param2 = param2;
  }
  
}
  • líneas 8-9: dos campos accesibles mediante get / set (líneas 18-32)
  • líneas 12-14: el método execute devuelve la clave success tal y como se esperaba. No hace nada más.

3.4. La vista JSP

La vista Action1.jsp es la siguiente:


<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Action1</title>
  </head>
  <body>
    <h1>Action1</h1>
    param1=<s:property value="param1"/><br/>
    param2=<s:property value="param2"/><br/>
  </body>
</html>

Esta vista se muestra tras la ejecución del método [Action1].execute. Muestra los valores de los campos param1 (línea 11) y param2 (línea 19) de la clase [Action1].

3.5. Las pruebas

Ejecutemos el proyecto [exemple-02]:

  • en [1], la URL solicitada. Cabe señalar que la URL inicial solicitada era [/exemple-02] sin acción. A continuación, se utilizaron los archivos [web.xml] y [struts.xml]. Se observó que el archivo [web.xml] delegaba el procesamiento de todas las solicitudes a Struts 2. A continuación, se explotó el archivo [struts.xml]:

<struts>
 <package name="default" namespace="/" extends="struts-default">
    <default-action-ref name="index" />
    <action name="index">
      <result type="redirectAction">
        <param name="actionName">Action1</param>
        <param name="namespace">/actions</param>
      </result>
    </action>
  </package>
  <package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1" class="actions.Action1">
      <result name="success">/vues/Action1.jsp</result>
    </action>
  </package>
</struts>

La URL [/exemple-02] sin acción fue procesada por el paquete default de las líneas 2-10. Al no haber ninguna acción en la URL, la acción pasó a ser index debido a la línea 3 (acción por defecto). Las líneas 4-8 hicieron que Struts devolviera al cliente una URL de redireccionamiento [/exemple-02/actions/Action1], tal y como se muestra en [1].

A continuación, se ejecutó la acción [Action1] tal y como se configuró en las líneas 12-14. Se ejecutó su método execute. Se ha visto que devolvía la clave success. La línea 13 de [struts.xml] hizo que la página [/vues/Action1.jsp] se devolviera al navegador:


...
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Action1</title>
  </head>
  <body>
    <h1>Action1</h1>
    param1=<s:property value="param1"/><br/>
    param2=<s:property value="param2"/><br/>
  </body>
</html>

Las líneas 9 y 10 mostraron los valores de los campos param1 y param2 de [Action1]. Esto es lo que muestra [2].

Solicitemos otra URL:

En [1], se solicita la acción [Action1] con los parámetros param1 y param2. Volvamos al esquema de ejecución de una acción Struts:

El controlador [FilterDispatcher] ejecuta el método execute de la acción. El flujo de ejecución pasa a través de interceptores. Uno de ellos procesa la cadena de parámetros param1=qqchose&param2=autrechose. A continuación, utiliza los métodos setParam1 y setParam2 de la acción Action1:


package actions;

import com.opensymphony.xwork2.ActionSupport;

public class Action1 extends ActionSupport{
  
  // modelo de la acción
  private String param1="valeur1";
  private String param2="valeur2";
  
  @Override
  public String execute(){
    return SUCCESS;
  }
  
  // getters y setters

  public String getParam1() {
    return param1;
  }

  public void setParam1(String param1) {
    this.param1 = param1;
  }

  public String getParam2() {
    return param2;
  }

  public void setParam2(String param2) {
    this.param2 = param2;
  }
  
}

El interceptor params ejecuta los siguientes métodos:

[Action1].setParam1("qqchose") ;
[Action1].setParam2("autrechose") ;

Por lo tanto, deben existir. Hay que tener en cuenta lo siguiente: para recuperar los parámetros parami de una solicitud HTTP, es necesario que la acción Struts llamada tenga campos con los mismos nombres que los parámetros y métodos get / set asociados.

Cuando se ejecuta el método execute de [Action1], los campos param1 y param2 han sido inicializados por el interceptor params:

param1="qqchose"
param2="autrechose"

El método execute devuelve la clave success y la página [Action1.jsp]con los nuevos valores de param1, param2 y [2].