Skip to content

6. Exemplo 05 – O formulário de introdução de dados

Apresentamos, através de um exemplo simples, o conceito de formulário de introdução de dados.

6.1. O projeto NetBeans

No [1], o projeto:

  • as vistas [Saisie.JSP], [Confirmation.JSP]
  • o ficheiro de configuração [struts.xml]
  • o ficheiro de mensagens [messages.properties]
  • a ação [Confirmer.java]

Em [2], a página de introdução de dados

6.2. Configuration

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>
  <!-- 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]. Não há nenhuma classe associada a esta ação. A resposta é sempre a vista [/vues/Saisie.JSP]
  • linhas 24-26: definem a ação [Confirmer]. A classe [actions.Confirmer] está-lhe associada. A resposta é sempre a vista [/vues/Confirmation.JSP]

6.3. A ação [Confirmer]

O 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 tem apenas um campo, o da linha 8, com os seus get / set.

6.4. O ficheiro 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

Estas chaves de mensagens são utilizadas nas duas vistas [Saisie.JSP] e [Confirmation.JSP].

6.5. As vistas

6.5.1. A vista [Saisie.JSP]

Visualmente, apresenta-se da seguinte forma:

O 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: apresenta a mensagem da chave saisie.titre1 (Introdução) [1].
  • linha 10: apresenta a mensagem de chave saisie.titre2 (Entrada) [2].
  • linhas 11, 14: a baliza <s:form> introduz um formulário HTML. Todas as entradas dentro deste formulário serão enviadas para o servidor web. Diz-se que são postées, porque a operação HTTP envolvida neste envio de dados para o servidor chama-se POST. Os dados enviados são transmitidos sob a forma de uma cadeia de caracteres param1=valeur1&param2=valeur2&... Já nos deparámos com esta cadeia no parágrafo 3.5 do exemplo 02. Em ambos os casos, a cadeia 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 onde são enviados os dados enviados? Por predefinição, para a ação que apresentou o formulário, neste caso a ação Saisir [5]. Também é possível utilizar o atributo «action» para especificar outra ação, neste caso a ação [Confirmer].
  • linha 12: a baliza <s:textfield ...> apresenta o campo de introdução [3]. O seu atributo key indica a chave do texto a apresentar à esquerda do campo de introdução. O rótulo é, portanto, procurado no ficheiro [messages.properties]. O atributo name é o nome do parâmetro que será enviado. O valor associado a este parâmetro será o texto introduzido no campo de introdução de dados.
  • linha 13: a baliza <s:submit ...> exibe o botão [4]. O seu atributo key indica a chave do texto a exibir no botão. O texto é, portanto, procurado no ficheiro [messages.properties]. Um botão do tipo submit desencadeia o envio do formulário para uma ação. Já referimos anteriormente que esta ação era a [Confirmer], devido ao atributo action da baliza <s:form>. O atributo action da baliza <s:submit> permite especificar, se necessário, outra ação. Aqui, definimos a ação [Confirmer]. O botão tem um nome de parâmetro por predefinição: action:nom_action, neste caso action:Confirmer. O valor associado a este parâmetro é o texto do botão. Por fim, a cadeia de parâmetros enviada para a ação [Confirmer] quando o utilizador clicar no botão [Valider] será:

?nom=xx&action:Confirmer=Valider.

onde xx é o texto introduzido pelo utilizador no campo de introdução.

6.5.2. A vista [Confirmation.JSP]

Apresenta-se visualmente da seguinte forma:

Introduzimos um nome e validamos a página de introdução de dados. Obtemos então a resposta [1], que corresponde à vista [Confirmation.JSP]. O URL apresentado em [2] corresponde à ação [Confirmer]. No exemplo acima, foi enviada a seguinte cadeia de caracteres:

nom=bernard&action:Confirmer=Valider

O parâmetro action:Confirmer permite que o Struts 2 encaminhe 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"/>&nbsp;
    <s:property value="nom"/> !
    <br/><br/>
    <a href="<s:url action="Saisir"/>"><s:text name="confirm.retour"/></a>
  </body>
</html>
  • linha 7: apresenta a descrição da chave confirm.titre1 encontrada no ficheiro de mensagens [1]
  • linha 10: apresenta o nome da chave confirm.titre2 encontrado no ficheiro de mensagens [3]
  • linha 12: apresenta a propriedade nom da ação [Confirmer] que foi executada.
  • linha 14: cria uma ligação para a ação [Saisir]. A baliza <s:url>,, já encontrada, será gerada a partir das balizas 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 designação associada à chave confirm.retour [4].

6.6. Os testes

Eis duas consultas:

Em [1], introduz-se um nome e confirma-se. Em [2], a página de confirmação.

Em [3], segue-se o link de regresso ao formulário. Em [4], o resultado. Tudo foi explicado, exceto a transição de [3] para [4]. Por que razão não se encontra em [4] o nome que se tinha introduzido?

O link em [3] é um link para o URL [http://localhost:8084/exemple-05/actions/Saisir.action]. A ação [Saisir] é, portanto, executada. Vejamos a sua configuração 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. Por isso, a vista [Saisie.JSP] é imediatamente apresentada. Vejamos o código desta vista:


<%@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 introdução de dados é apresentado. O seu conteúdo é inicializado com a propriedade nom (name). Recorde-se o que foi referido anteriormente sobre o funcionamento da baliza <s:property>:

A baliza <s:property name="propriedade"> permite escrever o valor de uma propriedade de um objeto denominado ActionContext. Neste objeto encontram-se:

  1. as propriedades da classe associada à ação que foi executada.
  2. os atributos do pedido atual, indicados como <s:property name="#request['clé']">
  3. os atributos da sessão do utilizador indicados por <s:property name="#session['clé']">
  4. os atributos da própria aplicação, indicados como <s:property name="#application['clé']">
  5. os parâmetros enviados pelo navegador do cliente, indicados por <s:property name="#parameters['clé']">
  6. a notação <s:property name="#attr['clé']"> apresenta o valor de um objeto procurado na página, na solicitação, na sessão e na aplicação, por esta ordem.

Estamos aqui no caso 1. A ação [Saisir] não tem nenhuma classe associada. A propriedade nom, portanto, não existe. É então exibida uma cadeia de caracteres vazia no campo de introdução de dados.

Para apresentar em [4] o nome que foi introduzido em [1], utilizaremos a sessão do utilizador.