6. Exemplo 05 – O formulário de preenchimento
Apresentamos, por meio de um exemplo simples, o conceito de formulário de entrada.
6.1. O projeto NetBeans
![]() |
No [1], o projeto:
- as visualizações [Saisie.JSP], [Confirmation.JSP]
- o arquivo de configuração [struts.xml]
- o arquivo de mensagens [messages.properties]
- a ação [Confirmer.java]
Em [2], a página de entrada
6.2. Configuration
O arquivo [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>
<!-- internacionalização -->
<constant name="struts.custom.i18n.resources" value="messages" />
<!-- pacote padrão -->
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">Saisir</param>
<param name="namespace">/actions</param>
</result>
</action>
</package>
<!-- pacote de ações -->
<package name="actions" namespace="/actions" extends="struts-default">
<action name="Saisir">
<result name="success">/vues/Saisie.JSP</result>
</action>
<action name="Confirmer" class="actions.Confirmer">
<result name="success">/vues/Confirmation.JSP</result>
</action>
</package>
</struts>
- linha 20: o pacote de ações de URL /actions/Action.
- linhas 21-23: definem a ação [Saisir]. Nenhuma classe está associada a ela. A resposta é sempre a visualização [/vues/Saisie.JSP]
- linhas 24-26: definem a ação [Confirmer]. A classe [actions.Confirmer] está associada a ela. A resposta é sempre a visualização [/vues/Confirmation.JSP]
6.3. A ação [Confirmer]
Seu código é o seguinte:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class Confirmer extends ActionSupport{
// modelo
private String nom;
// getters e setters
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
}
A classe possui apenas um campo, o da linha 8, com seus métodos get e set.
6.4. O arquivo de mensagens
O conteúdo de [messages.properties] é o seguinte:
saisie.texte=Formulaire de saisie
saisie.titre1=Saisie
saisie.titre2=Saisie
saisie.libelle=Tapez votre nom
saisie.valider=Valider
confirm.titre1=Confirmation
confirm.titre2=Confirmation
confirm.texte=Bonjour
confirm.retour=Retour au formulaire de saisie
Essas chaves de mensagens são utilizadas nas duas visualizações [Saisie.JSP] e [Confirmation.JSP].
6.5. As visualizações
6.5.1. A visualização [Saisie.JSP]
Visualmente, é a seguinte:
![]() |
Seu código-fonte é 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="saisie.titre1"/></title>
</head>
<body>
<h1><s:text name="saisie.titre2"/></h1>
<s:form action="Confirmer">
<s:textfield key="saisie.libelle" name="nom"/>
<s:submit key="saisie.valider" action="Confirmer"/>
</s:form>
</body>
</html>
- linha 7: exibe a mensagem da chave saisie.titre1 (Entrada) [1].
- linha 10: exibe a mensagem de chave saisie.titre2 (Entrada) [2].
- linhas 11, 14: a tag <s:form> insere um formulário HTML. Todas as entradas dentro desse formulário serão enviadas ao servidor web. Diz-se que são postées, pois a operação HTTP envolvida nesse envio de dados ao servidor é chamada de POST. Os dados enviados são na forma de uma sequência de caracteres param1=valeur1¶m2=valeur2&... Já nos deparamos com essa sequência no parágrafo 3.5 do exemplo 02. Em ambos os casos, a sequência de parâmetros é tratada da mesma forma pelo Struts 2. Os valores valeuri dos parâmetros parami são injetados na ação executada, em campos com os mesmos nomes que os parâmetros parami. Para quem os dados enviados são direcionados? Por padrão, para a ação que exibiu o formulário, neste caso, a ação Saisir [5]. Também é possível usar o atributo action para especificar outra ação, neste caso, a ação [Confirmer].
- linha 12: a tag <s:textfield ...> exibe o campo de entrada [3]. Seu atributo key indica a chave do texto descritivo a ser exibido à esquerda do campo de entrada. O rótulo é, portanto, buscado no arquivo [messages.properties]. O atributo name é o nome do parâmetro que será enviado. O valor associado a esse parâmetro será o texto digitado no campo de entrada.
- linha 13: a tag <s:submit ...> exibe o botão [4]. Seu atributo key indica a chave do texto a ser exibido no botão. O texto do botão é, portanto, buscado no arquivo [messages.properties]. Um botão do tipo submit aciona o envio do formulário para uma ação. Mencionamos anteriormente que essa ação era a [Confirmer] devido ao atributo action da tag <s:form>. O atributo action da tag <s:submit> permite especificar, se necessário, outra ação. Aqui, definimos a ação [Confirmer]. O botão possui um nome de parâmetro padrão: action:nom_action; neste caso, action:Confirmer. O valor associado a esse parâmetro é o texto do botão. Por fim, a sequência de parâmetros enviada para a ação [Confirmer] quando o usuário clicar no botão [Valider] será:
?nom=xx&action:Confirmer=Valider.
onde xx é o texto digitado pelo usuário no campo de entrada.
6.5.2. A visualização [Confirmation.JSP]
Visualmente, é a seguinte:
![]() |
Digitamos um nome e confirmamos a página de entrada. Obtemos então a resposta [1], que corresponde à visualização [Confirmation.JSP]. O URL exibido em [2] é o da ação [Confirmer]. No exemplo acima, a seguinte sequência de caracteres foi enviada:
O parâmetro action:Confirmer permite que o Struts 2 direcione a solicitação para a ação correta, neste caso, a ação [Confirmer]. O valor do parâmetro nom será, então, injetado no campo nom da ação [Confirmer].
O código-fonte da ação [Confirmation.JSP] é 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="confirm.titre1"/></title>
</head>
<body>
<h1><s:text name="confirm.titre2"/></h1>
<s:text name="confirm.texte"/>
<s:property value="nom"/> !
<br/><br/>
<a href="<s:url action="Saisir"/>"><s:text name="confirm.retour"/></a>
</body>
</html>
- linha 7: exibe o nome da chave confirm.titre1 encontrado no arquivo de mensagens [1]
- linha 10: exibe o nome da chave confirm.titre2 encontrado no arquivo de mensagens [3]
- linha 12: exibe a propriedade nom da ação [Confirmer] que foi executada.
- linha 14: cria um link para a ação [Saisir]. A tag <s:url>,, já encontrada, será gerada a partir das tags URL e [2] do navegador. O caminho será o de [2] http://localhost:8084/exemple-05/actions e a ação será a do atributo action, neste caso, Saisir. O URL do link será, portanto, http://localhost:8084/exemple-05/actions/Saisir.action. O texto do link será a descrição associada à chave confirm.retour [4].
6.6. Os testes
Aqui estão duas consultas:
![]() |
Em [1], insere-se um nome e clica-se em “Validar”. Em [2], a página de confirmação.
![]() |
Em [3], clica-se no link de retorno ao formulário. Em [4], o resultado. Tudo foi explicado, exceto a transição de [3] para [4]. Por que não encontramos em [4] o nome que havíamos digitado?
O link em [3] é um link para o URL [http://localhost:8084/exemple-05/actions/Saisir.action]. A ação [Saisir] é, portanto, executada. Vamos dar uma olhada na configuração dela no [struts.xml]:
<package name="actions" namespace="/actions" extends="struts-default">
<action name="Saisir">
<result name="success">/vues/Saisie.JSP</result>
</action>
<action name="Confirmer" class="actions.Confirmer">
<result name="success">/vues/Confirmation.JSP</result>
</action>
</package>
A ação [Saisir] não está associada a nenhuma ação. Portanto, a visualização [Saisie.JSP] é exibida imediatamente. Vejamos o código dessa visualização:
<%@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="saisie.titre1"/></title>
</head>
<body>
<h1><s:text name="saisie.titre2"/></h1>
<s:form>
<s:textfield key="saisie.libelle" name="nom"/>
<s:submit key="saisie.valider" action="Confirmer"/>
</s:form>
</body>
</html>
Na linha 12, o campo de entrada é exibido. Seu conteúdo é inicializado com a propriedade nom (name). Vamos relembrar o que foi escrito anteriormente sobre o funcionamento da tag <s:property>:
A tag <s:property name="propriedade"> permite escrever o valor de uma propriedade de um objeto chamado ActionContext. Nesse objeto, encontram-se:
- as propriedades da classe associada à ação que foi executada.
- os atributos da solicitação atual, indicados como <s:property name="#request['clé']">
- os atributos da sessão do usuário, indicados como <s:property name="#session['clé']">
- os atributos do próprio aplicativo, indicados como <s:property name="#application['clé']">
- os parâmetros enviados pelo navegador do cliente, indicados por <s:property name="#parameters['clé']">
- a notação <s:property name="#attr['clé']"> exibe o valor de um objeto procurado na página, na solicitação, na sessão e no aplicativo, nessa ordem.
Estamos aqui no caso 1. A ação [Saisir] não possui uma classe associada. A propriedade nom, portanto, não existe. Uma string vazia é então exibida no campo de entrada.
Para exibir em [4] o nome que foi inserido em [1], utilizaremos a sessão do usuário.




