Skip to content

7. Esempio 05B – Navigazione in un modulo di inserimento dati

Esaminiamo un modulo che presenta diversi pulsanti per inviare (submit) i dati inseriti a un'azione.

 

7.1. Il progetto NetBeans

Il progetto NetBeans è il seguente:

  

Gli elementi del progetto sono i seguenti:

  • [DoSomething.JSP]: l'unica vista dell'applicazione che presenta i tre pulsanti di navigazione e un link.
  • [DoSomething.java] e [DoSomethingElse.java]: le due azioni del progetto
  • [messages.properties]: il file dei messaggi internazionalizzati
  • [struts.xml]: il file di configurazione di Struts 2

7.2. Configuration

Il seguente file [struts.xml] configura l'applicazione:


<!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>
  • l'azione [/actions/DoSomething] provocherà l'istanziazione della classe [actions.DoSomething] e il suo metodo execute verrà eseguito per impostazione predefinita. Questo comportamento predefinito può essere sovrascritto se i parametri passati all’azione [Something] specificano un altro metodo. Qualunque sia il metodo eseguito, dovrà restituire la chiave di navigazione success poiché è stata definita solo questa chiave. Verrà quindi visualizzata la vista [DoSomething.JSP].
  • La configurazione dell'azione [/actions/DoSomethingElse] è identica.

7.3. Il file dei messaggi

Il file dei messaggi [messages.properties] è il seguente:


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. La vista [DoSomething.JSP]

La vista [DoSomething.JSP] è la seguente:

 

Il suo codice è il seguente:


<%@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>
  • riga 11: il modulo verrà inviato all'azione [DoSomething]. Ciò non significa necessariamente che sarà questa l'azione che verrà attivata. Dipende dal pulsante submit utilizzato per il POST.
  • riga 12: il pulsante submit non specifica né l’azione né il metodo. Verrà istanziata l’azione [DoSomething] specificata dal tag <form>. Il metodo eseguito sarà quello definito nel file [struts.xml], ovvero il metodo execute.
  • riga 13: il pulsante submit specifica un metodo. Verrà istanziata l’azione [DoSomething] specificata dal tag <form>. Il metodo eseguito sarà il metodo action1.
  • riga 14: il pulsante submit specifica un'azione e un metodo. Verrà istanziata l'azione [DoSomethingElse]. Il metodo eseguito sarà il metodo action2.
  • righe 16-17: un collegamento all’azione [DoSomething] e al metodo action3. Verrà istanziata l’azione [DoSomething] e verrà eseguito il relativo metodo action3. A differenza dei pulsanti submit, cliccando sul link non viene generato un POST, bensì un GET. Non viene quindi inviato alcun parametro.

Il codice HTML generato da questo codice, quando si richiede l’URL [http://localhost:8084/exemple-05B/actions/DoSomething.action], è il seguente:

<!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>
  • riga 9: il tag form del modulo HTML. L’attributo action indica l’URL a cui verranno inviati i parametri del modulo. Questa URL è quella dell’azione [DoSomething].
  • righe 11, 13, 15: gli attributi name dei pulsanti verranno inviati all’azione di destinazione del pulsante submit. È questo che permette a Struts di determinare l’azione da istanziare e il metodo da eseguire.
  • riga 13: l'attributo name=method:action1 indica che deve essere eseguito il metodo DoSomething.action1.
  • riga 15: l'attributo name= action:DoSomethingElse!action2 indica che deve essere eseguito il metodo DoSomethingElse.action2.
  • riga 11: l'attributo name= formulaire.execute non specifica né l'azione né il metodo. Verrà quindi eseguito il metodo DoSomething.execute.
  • riga 19: il link richiede esplicitamente l'esecuzione del metodo DoSomething.action3

7.5. Le azioni

L'azione [DoSomething] è la seguente:


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;
  }
}
  • i metodi execute, action1 e action3 scrivono sulla console del server web e restituiscono la chiave di navigazione success.
  • riga 8: il costruttore scrive anche sulla console del server web

I diversi messaggi visualizzati sulla console consentono di sapere quali metodi vengono eseguiti durante una richiesta.

L’azione [DoSomethingElse] è simile:


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. I test

I test mostrano i seguenti risultati (sulla console del server web):

  • quando si fa clic sul pulsante [DoSomething.execute], viene istanziata l'azione [DoSomething] e viene eseguito il suo metodo execute.
  • quando si fa clic sul pulsante [DoSomething.action1], viene istanziata l'azione [DoSomething] e viene eseguito il suo metodo action1.
  • Quando si fa clic sul pulsante [DoSomethingElse.action2], l'azione [DoSomethingElse] viene istanziata e il suo metodo action2 viene eseguito.
  • Quando si fa clic sul link [DoSomething.action3], viene istanziata l'azione [DoSomething] e viene eseguito il suo metodo action3.