Skip to content

7. Voorbeeld 05B – Navigeren in een invoerformulier

We bekijken een formulier met verschillende knoppen om de ingevoerde gegevens naar een actie te verzenden (submit).

 

7.1. Het NetBeans-project

Het NetBeans-project ziet er als volgt uit:

  

De onderdelen van het project zijn als volgt:

  • [DoSomething.JSP]: de enige weergave van de applicatie die de drie navigatieknoppen en een link toont.
  • [DoSomething.java] en [DoSomethingElse.java]: de twee acties van het project
  • [messages.properties]: het bestand met geïnternationaliseerde berichten
  • [struts.xml]: het Struts 2-configuratiebestand

7.2. Configuration

Het volgende bestand [struts.xml] configureert de applicatie:


<!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>
  • De actie [/actions/DoSomething] zorgt ervoor dat de klasse [actions.DoSomething] wordt geïnstantieerd en dat de methode execute standaard wordt uitgevoerd. Deze standaardinstelling kan worden overschreven als de parameters die aan de actie [Something] worden doorgegeven, een andere methode specificeren. Welke methode ook wordt uitgevoerd, deze moet de navigatiesleutel success retourneren, aangezien alleen deze sleutel is gedefinieerd. De weergave [DoSomething.JSP] wordt dan weergegeven.
  • De configuratie van de actie [/actions/DoSomethingElse] is identiek.

7.3. Het berichtenbestand

Het berichtenbestand [messages.properties] ziet er als volgt uit:


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. De weergave [DoSomething.JSP]

De weergave [DoSomething.JSP] ziet er als volgt uit:

 

De code ervan is als volgt:


<%@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>
  • regel 11: het formulier wordt verzonden naar de actie [DoSomething]. Dit betekent niet noodzakelijkerwijs dat deze actie ook daadwerkelijk wordt geactiveerd. Dit hangt af van de knop submit die wordt gebruikt voor POST.
  • regel 12: de knop submit specificeert noch een actie, noch een methode. De actie [DoSomething], gespecificeerd door de tag <form>, zal worden geïnstantieerd. De uitgevoerde methode is de methode die is gedefinieerd in het bestand [struts.xml], namelijk de methode execute.
  • regel 13: de knop submit specificeert een methode. De actie [DoSomething], gespecificeerd door de tag <form>, zal worden geïnstantieerd. De uitgevoerde methode is de methode action1.
  • regel 14: de knop submit specificeert een actie en een methode. De actie [DoSomethingElse] zal worden geïnstantieerd. De methode die wordt uitgevoerd, is de methode action2.
  • regels 16-17: een link naar de actie [DoSomething] en de methode action3. De actie [DoSomething] wordt geïnstantieerd en de bijbehorende methode action3 wordt uitgevoerd. In tegenstelling tot de knoppen submit leidt het klikken op de link niet tot een POST, maar tot een GET. Er worden dus geen parameters verzonden.

De HTML-code die door deze code wordt gegenereerd wanneer URL [http://localhost:8084/exemple-05B/actions/DoSomething.action] wordt aangevraagd, is als volgt:

<!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>
  • regel 9: de tag form van het HTML-formulier. Het attribuut action geeft de URL aan waarnaar de parameters van het formulier worden verzonden. Deze URL is die van de actie [DoSomething].
  • regels 11, 13, 15: de name-attributen van de knoppen worden verzonden naar de doelactie van de knop submit. Hierdoor kan Struts bepalen welke actie moet worden geïnstantieerd en welke methode moet worden uitgevoerd.
  • regel 13: het attribuut name=method:action1 geeft aan dat de methode DoSomething.action1 moet worden uitgevoerd.
  • regel 15: het attribuut name= action:DoSomethingElse!action2 geeft aan dat de methode DoSomethingElse.action2 moet worden uitgevoerd.
  • regel 11: het attribuut name= formulaire.execute specificeert noch een actie, noch een methode. Daarom wordt de methode DoSomething.execute uitgevoerd.
  • regel 19: de link vraagt expliciet om de uitvoering van de methode DoSomething.action3

7.5. De acties

De actie [DoSomething] is als volgt:


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;
  }
}
  • De methoden execute, action1 en action3 schrijven naar de console van de webserver en geven de navigatiesleutel success weer.
  • regel 8: de constructor schrijft ook naar de console van de webserver

Aan de hand van de verschillende berichten op de console kun je zien welke methoden bij een verzoek worden uitgevoerd.

De actie [DoSomethingElse] werkt op dezelfde manier:


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. De tests

De tests laten de volgende resultaten zien (op de console van de webserver):

  • wanneer op de knop [DoSomething.execute] wordt geklikt, wordt de actie [DoSomething] geïnstantieerd en wordt de bijbehorende methode execute uitgevoerd.
  • wanneer er op de knop [DoSomething.action1] wordt geklikt, wordt de actie [DoSomething] geïnstantieerd en wordt de bijbehorende methode action1 uitgevoerd.
  • wanneer er op de knop [DoSomethingElse.action2] wordt geklikt, wordt de actie [DoSomethingElse] geïnstantieerd en wordt de methode action2 ervan uitgevoerd.
  • Bij een klik op de link [DoSomething.action3] wordt de actie [DoSomething] geïnstantieerd en wordt de methode action3 ervan uitgevoerd.