Skip to content

7. Exemplo 05B – Navegação em um formulário de preenchimento

Estamos analisando um formulário que apresenta vários botões para enviar (submit) os dados inseridos para uma ação.

 

7.1. O projeto NetBeans

O projeto NetBeans é o seguinte:

  

Os elementos do projeto são os seguintes:

  • [DoSomething.JSP]: a única visualização do aplicativo que apresenta os três botões de navegação, além de um link.
  • [DoSomething.java] e [DoSomethingElse.java]: as duas ações do projeto
  • [messages.properties]: o arquivo de mensagens internacionalizadas
  • [struts.xml]: o arquivo de configuração do Struts 2

7.2. Configuration

O seguinte arquivo [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] provocará a instanciação da classe [actions.DoSomething] e seu método execute será executado por padrão. Esse padrão pode ser alterado se os parâmetros passados para a ação [Something] especificarem outro método. Independentemente do método executado, ele deverá retornar a chave de navegação success, uma vez que apenas essa chave foi definida. A visualização [DoSomething.JSP] será então exibida.
  • A configuração da ação [/actions/DoSomethingElse] é idêntica.

7.3. O arquivo de mensagens

O arquivo 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 visualização [DoSomething.JSP]

A visualização [DoSomething.JSP] é a seguinte:

 

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]. Isso não significa necessariamente que essa ação será acionada. Isso depende do botão submit utilizado para o POST.
  • linha 12: o botão submit não especifica nem ação nem método. Será a ação [DoSomething], especificada pela tag <form>, que será instanciada. O método executado será aquele definido no arquivo [struts.xml], ou seja, o método execute.
  • linha 13: o botão submit especifica um método. Será a ação [DoSomething], especificada pela tag <form>, que será instanciada. O método executado será o método action1.
  • linha 14: o botão submit especifica uma ação e um método. Será a ação [DoSomethingElse] que será instanciada. O método executado será o método action2.
  • linhas 16-17: um link para a ação [DoSomething] e o método action3. A ação [DoSomething] será instanciada e seu método action3 será executado. Ao contrário dos botões submit, clicar no link não aciona um POST, mas sim um GET. Portanto, nenhum parâmetro é enviado.

O código HTML gerado por esse código, quando se solicita o URL [http://localhost:8084/exemple-05B/actions/DoSomething.action], é o seguinte:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Actions et Méthodes</title>
  </head>
  <body>
    <h1>Actions et Méthodes</h1>
    <form ... action="/exemple-05B/actions/DoSomething.action" method="post">
...
       <input type="submit" ... name="formulaire.execute" value="DoSomething.execute"/>
...
       <input type="submit" ... name="method:action1" value="DoSomething.action1"/>
...
        <input type="submit" ... name="action:DoSomethingElse!action2" value="DoSomethingElse.action2"/>
...
    </form>
    ...
    <a href="<a href="view-source:http://localhost:8084/exemple-05B/actions/DoSomething%21action3.action">/exemple-05B/actions/DoSomething!action3.action</a>">DoSomething.action3</a>
  </body>
</html>
  • linha 9: a tag form do formulário HTML. O atributo action indica a URL para a qual os parâmetros do formulário serão enviados. Essa URL é a 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. É isso que permite ao Struts determinar a ação a ser instanciada e o método a ser executado.
  • 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= formulaire.execute não especifica nem ação nem método. Portanto, será executado o método DoSomething.execute.
  • linha 19: o link solicita explicitamente a execução do método DoSomething.action3

7.5. As 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 no console do servidor web e retornam a chave de navegação success.
  • linha 8: o construtor também grava no console do servidor web

As diferentes mensagens exibidas no console permitem identificar quais métodos são executados durante uma solicitação.

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 mostram os seguintes resultados (no console do servidor web):

  • ao clicar no botão [DoSomething.execute], a ação [DoSomething] é instanciada e seu método execute é executado.
  • ao clicar no botão [DoSomething.action1], a ação [DoSomething] é instanciada e seu método action1 é executado.
  • Ao clicar no botão [DoSomethingElse.action2], a ação [DoSomethingElse] é instanciada e seu método action2 é executado.
  • Ao clicar no link [DoSomething.action3], a ação [DoSomething] é instanciada e seu método action3 é executado.