Skip to content

3. Exemplo 02 – Injeção de parâmetros na ação

3.1. O projeto NetBeans

  • em [1,2], os ficheiros de configuração
  • em [3], a ação
  • em [4], a vista
  • em [5], as bibliotecas do projeto

3.2. Os ficheiros de configuração

O ficheiro [web.xml] é o seguinte:


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

Já comentámos este ficheiro. Não o faremos novamente. Basta lembrar que ele garante que todos os URLs (linha 15) passem pelo filtro Struts (linha 10).

O ficheiro [struts.xml] é o seguinte:


<?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>
  • Linhas 7–15: definem o pacote [default], que é utilizado quando uma ação não pode ser encontrada noutro pacote.
  • linha 8: define uma ação padrão para este pacote chamada index.
  • Linhas 9–14: configuram a ação denominada index. Note-se que não está associada a uma classe (o atributo class está em falta na linha 9).
  • linha 10: o resultado é para a chave success (o atributo name está em falta). É do tipo redirectAction (atributo type). Este tipo permite que uma ação seja redirecionada para outra ação. Aqui, quando o cliente solicitar a ação /index, será redirecionado para a ação /actions/Action1 (linhas 11-12).
  • Linhas 16–20: definem o pacote de ações (name) associado às ações na URL /actions/Action (class).
  • Linhas 17–19: configuram a ação /actions/Action1 (nome). Quando esta ação é invocada, o Struts instanciará a classe actions.Action1 (classe) e, em seguida, o método execute dessa classe será executado. Este método deve devolver a chave «success», uma vez que é a única chave definida na linha 18.
  • Linha 18: Para a chave «success», a vista a ser exibida será a página JSP [vues/Action1.jsp].

Por fim, devemos notar que o projeto Struts só pode executar a ação na URL [actions/Action1].

3.3. A ação

A ação Action1 é representada pela seguinte classe:


package actions;
 
import com.opensymphony.xwork2.ActionSupport;
 
public class Action1 extends ActionSupport{
 
  // action model
  private String param1="valeur1";
  private String param2="valeur2";
 
  @Override
  public String execute(){
    return SUCCESS;
  }
 
  // getters and 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;
  }
 
}

  • linhas 8-9: dois campos acessíveis através dos métodos get/set (linhas 18-32)
  • linhas 12–14: O método execute devolve a chave, tal como esperado. Não faz mais nada.

3.4. A vista JSP

A vista Action1.jsp é a seguinte:


<%@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 é apresentada após a execução do método [Action1].execute. Apresenta os valores dos campos param1 (linha 11) e param2 (linha 19) da classe [Action1].

3.5. Testes

Vamos executar o projeto [example-02]:

  • em [1], o URL solicitado. Note-se que o URL inicialmente solicitado era [/example-02] sem uma ação. Os ficheiros [web.xml] e [struts.xml] foram então utilizados. Vimos que o ficheiro [web.xml] confiou o processamento de todos os pedidos ao Struts 2. O ficheiro [struts.xml] foi então utilizado:

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

A URL [/example-02] sem uma ação foi tratada pelo pacote padrão nas linhas 2–10. Como não havia nenhuma ação na URL, a ação tornou-se «index» devido à linha 3 (ação padrão). As linhas 4–8 fizeram com que o Struts devolvesse uma URL de redirecionamento [/example-02/actions/Action1] ao cliente, conforme mostrado em [1].

A ação [Action1] foi então executada conforme configurado nas linhas 12–14. O seu método execute foi executado. Vimos que devolveu o código de sucesso. A linha 13 do [struts.xml] fez com que a página [/views/Action1.jsp] fosse devolvida ao 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>

As linhas 9 e 10 exibiram os valores dos campos param1 e param2 da [Ação1]. Isto é mostrado em [2].

Vamos solicitar outro URL:

Em [1], a ação [Action1] é solicitada com os parâmetros param1 e param2. Vamos voltar ao fluxo de execução de uma ação Struts:

O controlador [FilterDispatcher] executa o método execute da ação. O fluxo de execução passa por interceptores. Um deles processa a string de parâmetros param1=something&param2=somethingelse . Em seguida, utiliza os métodos setParam1 e setParam2 da ação Action1:


package actions;
 
import com.opensymphony.xwork2.ActionSupport;
 
public class Action1 extends ActionSupport{
 
  // action model
  private String param1="valeur1";
  private String param2="valeur2";
 
  @Override
  public String execute(){
    return SUCCESS;
  }
 
  // getters and 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;
  }
 
}

O interceptor params executa os seguintes métodos:

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

Portanto, estes devem existir. Note o seguinte: para recuperar os parâmetros de um pedido HTTP, a ação Struts chamada deve ter campos com os mesmos nomes que os parâmetros e métodos get/set associados.

Quando o método execute de [Action1] é executado, os campos param1 e param2 já foram inicializados pelo interceptor de parâmetros:

param1="qqchose"
param2="autrechose"

O método execute retorna a chave de sucesso, e a página [Action1.jsp] é exibida com os novos valores para param1 e param2 [2].