7. Exemplo 05B – Navegação num formulário de introdução de dados
Estamos a analisar um formulário com vários botões para enviar os dados introduzidos para uma ação.

7.1. O projeto NetBeans
O projeto NetBeans é o seguinte:

Os componentes do projeto são os seguintes:
- [DoSomething.jsp]: a única vista da aplicação, que apresenta os três botões de navegação e um link.
- [DoSomething.java] e [DoSomethingElse.java]: as duas ações do projeto
- [messages.properties]: o ficheiro de mensagens internacionalizadas
- [struts.xml]: o ficheiro de configuração do Struts 2
7.2. Configuração
O seguinte ficheiro [struts.xml] configura a aplicação:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="messages" />
<package name="actions" namespace="/actions" extends="struts-default">
<action name="DoSomething" class="actions.DoSomething">
<result name="success">/vues/DoSomething.jsp</result>
</action>
<action name="DoSomethingElse" class="actions.DoSomethingElse">
<result name="success">/vues/DoSomething.jsp</result>
</action>
</package>
</struts>
- A ação [/actions/DoSomething] irá instanciar a classe [actions.DoSomething], e o seu método execute será executado por predefinição. Este comportamento predefinido pode ser substituído se os parâmetros passados para a ação [DoSomething] especificarem um método diferente. Independentemente do método executado, este deve devolver a chave de navegação "success", uma vez que apenas esta chave foi definida. A vista [DoSomething.jsp] será então apresentada.
- A configuração da ação [/actions/DoSomethingElse] é idêntica.
7.3. O ficheiro de mensagens
O ficheiro de mensagens [messages.properties] é o seguinte:
formulaire.titre1=Actions et M\u00e9thodes
formulaire.titre2=Actions et M\u00e9thodes
formulaire.execute=DoSomething.execute
formulaire.action1=DoSomething.action1
formulaire.action2=DoSomethingElse.action2
formulaire.action3=DoSomething.action3
7.4. A vista [DoSomething.jsp]
A vista [DoSomething.jsp] é a seguinte:

O seu código é o 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><s:text name="formulaire.titre1"/></title>
</head>
<body>
<h1><s:text name="formulaire.titre2"/></h1>
<s:form action="DoSomething">
<s:submit key="formulaire.execute"/>
<s:submit key="formulaire.action1" method="action1"/>
<s:submit key="formulaire.action2" action="DoSomethingElse" method="action2"/>
</s:form>
<s:url id="url" action="DoSomething" method="action3"/>
<s:a href="%{url}"><s:text name="formulaire.action3"/></s:a>
</body>
</html>
- Linha 11: O formulário será enviado para a ação [DoSomething]. Isto não significa necessariamente que esta ação será acionada. Depende do botão de envio utilizado para o POST.
- Linha 12: O botão de envio não especifica nem uma ação nem um método. A ação [DoSomething] especificada pela tag <form> será instanciada. O método executado será aquele definido no ficheiro [struts.xml], o método execute.
- Linha 13: O botão de envio especifica um método. A ação [DoSomething] especificada pela tag <form> será instanciada. O método executado será o método action1.
- Linha 14: O botão de envio especifica uma ação e um método. A ação [DoSomethingElse] será instanciada. O método executado será action2.
- Linhas 16–17: Um link para a ação [DoSomething] e o método action3. A ação [DoSomething] será instanciada e o seu método action3 executado. Ao contrário dos botões de envio, clicar no link aciona um pedido GET em vez de um pedido POST. Portanto, não são enviados parâmetros.
O código HTML gerado por este código, quando a URL [http://localhost:8084/exemple-05B/actions/DoSomething.action] é solicitada, é o seguinte:
- Linha 9: A tag form para o formulário HTML. O atributo action especifica o URL para o qual os parâmetros do formulário serão enviados. Este URL é o da ação [DoSomething].
- Linhas 11, 13, 15: Os atributos name dos botões serão enviados para a ação de destino do botão submit. É isto que permite ao Struts determinar qual a ação a instanciar e qual o método a executar.
- Linha 13: O atributo name=method:action1 indica que o método DoSomething.action1 deve ser executado.
- Linha 15: O atributo name=action:DoSomethingElse!action2 indica que o método DoSomethingElse.action2 deve ser executado.
- Linha 11: O atributo name="form.execute" não especifica nem uma ação nem um método. Portanto, o método DoSomething.execute será executado.
- Linha 19: O link solicita explicitamente a execução do método DoSomething.action3
7.5. Ações
A ação [DoSomething] é a seguinte:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class DoSomething extends ActionSupport {
public DoSomething() {
System.out.println("DoSomething");
}
@Override
public String execute() {
System.out.println("DoSomething.execute");
return SUCCESS;
}
public String action1() {
System.out.println("DoSomething.action1");
return SUCCESS;
}
public String action3() {
System.out.println("DoSomething.action3");
return SUCCESS;
}
}
- Os métodos execute, action1 e action3 escrevem na consola do servidor web e devolvem a chave de navegação de sucesso.
- Linha 8: O construtor também escreve na consola do servidor web
As várias saídas da consola permitem-lhe ver quais os métodos que são executados durante um pedido.
A ação [DoSomethingElse] é semelhante:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class DoSomethingElse extends ActionSupport {
public DoSomethingElse() {
System.out.println("DoSomethingElse");
}
@Override
public String execute() {
System.out.println("DoSomethingElse.execute");
return SUCCESS;
}
public String action2() {
System.out.println("DoSomethingElse.action2");
return SUCCESS;
}
}
7.6. Os testes
Os testes apresentam os seguintes resultados (na consola do servidor web):
- Quando o botão [DoSomething.execute] é clicado, a ação [DoSomething] é instanciada e o seu método execute é executado.
- Quando o botão [DoSomething.action1] é clicado, a ação [DoSomething] é instanciada e o seu método action1 é executado.
- Quando o botão [DoSomethingElse.action2] é clicado, a ação [DoSomethingElse] é instanciada e o seu método action2 é executado.
- Quando o link [DoSomething.action3] é clicado, a ação [DoSomething] é instanciada e o seu método action3 é executado.