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 URL (linha 15) passam pelo filtro do 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 não é possível encontrar uma ação noutro pacote.
- linha 8: define uma ação por predefinição para este pacote, denominada index.
- linhas 9-14: configuram a ação denominada index. Verifica-se que não está associada a uma classe (ausência do atributo class na linha 9).
- linha 10: o resultado diz respeito à chave success (ausência do atributo name). É do tipo redirectAction (atributo type). Este tipo permite redirecionar uma ação para outra ação. Neste caso, 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 URL e /actions/Action (class).
- linhas 17-19: configuram a ação /actions/Action1 (name). Quando esta ação for solicitada, o Struts instanciará a classe actions.Action1 (class) e, em seguida, será executado o método execute dessa classe. Este método deverá devolver a chave success, pois é a única chave definida na linha 18.
- linha 18: para a chave success, a vista a apresentar será a página JSP [vues/Action1.JSP].
Em suma, fica a saber-se que o projeto Struts só consegue executar a ação de URL [actions/Action1].
3.3. L'action
A ação Action1 é representada pela seguinte classe:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class Action1 extends ActionSupport{
// modelo da ação
private String param1="valeur1";
private String param2="valeur2";
@Override
public String execute(){
return SUCCESS;
}
// getters e 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 de get / set (linhas 18-32)
- linhas 12-14: o método execute devolve a chave success, 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. Os testes
Vamos executar o projeto [exemple-02]:
![]() |
- em [1], o URL solicitado. Note-se que o URL inicial solicitado era o [/exemple-02], sem ação. Os ficheiros [web.xml] e [struts.xml] foram então explorados. Verificou-se que o ficheiro [web.xml] delegava o tratamento de todas as solicitações ao Struts 2. O ficheiro [struts.xml] foi então explorado:
<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>
O ficheiro URL, sem ação, foi processado pelo pacote default nas linhas 2 a 10. Na ausência de ação no URL, a ação passou a ser index devido à linha 3 (ação por predefinição). As linhas 4 a 8 fizeram com que o Struts devolvesse ao cliente um URL de redirecionamento para o [/exemple-02/actions/Action1], tal como é apresentado no [1].
A ação [Action1] foi então executada conforme configurado nas linhas 12 a 14. O seu método execute foi executado. Verificou-se que esta devolvia o código success. A linha 13 de [struts.xml] fez com que a página [/vues/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 de [Action1]. É isso que mostra [2].
Vamos solicitar outro URL:
![]() |
No [1], a ação [Action1] é solicitada com os parâmetros param1 e param2. Voltemos ao esquema de execução de uma ação Struts:
![]() |
O controlador [FilterDispatcher] faz com que o método execute da ação seja executado. O fluxo de execução passa por interceptores. Um deles processa a cadeia de parâmetros param1=qqchose¶m2=autrechose. 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{
// modelo da ação
private String param1="valeur1";
private String param2="valeur2";
@Override
public String execute(){
return SUCCESS;
}
// getters e 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:
Portanto, estes têm de existir. É importante reter o seguinte: para recuperar os parâmetros parami de um pedido HTTP, é necessário que a ação Struts chamada tenha 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 foram inicializados pelo interceptor «params»:
O método execute devolve a chave success e a página [Action1.JSP]é apresentada com os novos valores de param1, param2 e [2].



