Skip to content

3. Voorbeeld 02 – Parameterinjectie in de actie

3.1. Het NetBeans-project

  • in [1,2], de configuratiebestanden
  • in [3], de actie
  • in [4], de weergave
  • in [5], de bibliotheken van het project

3.2. De configuratiebestanden

Het bestand [web.xml] ziet er als volgt uit:


<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     version="3.0">
 
  <display-name>Struts tuto-001</display-name>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <URL-pattern>/*</URL-patroon>
  </filter-mapping>
  <session-config>
    <session-timeout>
            30
    </session-timeout>
  </session-config>
</web-app>

We hebben dit bestand al eerder besproken. We zullen dat niet nogmaals doen. Het is voldoende om te onthouden dat het ervoor zorgt dat alle URL (regel 15) door het Struts-filter (regel 10) worden geleid.

Het bestand [struts.xml] is als volgt:


<?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>
 <package name="default" namespace="/" extends="struts-default">
    <default-action-ref name="index" />
    <action name="index">
      <result type="redirectAction">
        <param name="actionName">Action1</param>
        <param name="namespace">/actions</param>
      </result>
    </action>
  </package>
  <package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1" class="actions.Action1">
      <result name="success">/vues/Action1.JSP</result>
    </action>
  </package>
</struts>
  • regels 7-15: definiëren het pakket [default], dat wordt gebruikt wanneer een actie niet in een ander pakket kon worden gevonden.
  • regel 8: definieert een standaardactie voor dit pakket met de naam index.
  • regels 9-14: configureren de actie met de naam index. We zien dat deze niet aan een klasse is gekoppeld (het attribuut class ontbreekt op regel 9).
  • regel 10: het resultaat betreft de sleutel success (het attribuut name ontbreekt). Het is van het type redirectAction (attribuut type). Met dit type kan een actie naar een andere actie worden omgeleid. Wanneer de klant hier de actie /index opvraagt, wordt hij omgeleid naar de actie /actions/Action1 (regels 11-12).
  • regels 16-20: definiëren het actiespakket (name) dat is gekoppeld aan de acties URL en /actions/Action (class).
  • regels 17-19: configureren de actie /actions/Action1 (name). Wanneer deze actie wordt aangeroepen, zal Struts de klasse actions.Action1 (class) instantiëren, waarna de methode execute van deze klasse wordt uitgevoerd. Deze methode moet de sleutel success retourneren, aangezien dit de enige sleutel is die op regel 18 is gedefinieerd.
  • regel 18: voor de sleutel success is de weer te geven weergave de pagina JSP [vues/Action1.JSP].

Uiteindelijk onthouden we dat het Struts-project alleen de actie van URL [actions/Action1] kan uitvoeren.

3.3. L'action

De actie Action1 wordt vertegenwoordigd door de volgende klasse:


package actions;

import com.opensymphony.xwork2.ActionSupport;

public class Action1 extends ActionSupport{
  
  // actiesjabloon
  private String param1="valeur1";
  private String param2="valeur2";
  
  @Override
  public String execute(){
    return SUCCESS;
  }
  
  // getters en setters

  public String getParam1() {
    return param1;
  }

  public void setParam1(String param1) {
    this.param1 = param1;
  }

  public String getParam2() {
    return param2;
  }

  public void setParam2(String param2) {
    this.param2 = param2;
  }
  
}
  • regels 8-9: twee velden die via get/set toegankelijk zijn (regels 18-32)
  • regels 12-14: de methode execute retourneert de sleutel success, zoals verwacht. Ze doet verder niets.

3.4. De weergave JSP

De weergave Action1.JSP ziet er als volgt uit:


<%@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>Action1</title>
  </head>
  <body>
    <h1>Action1</h1>
    param1=<s:property value="param1"/><br/>
    param2=<s:property value="param2"/><br/>
  </body>
</html>

Deze weergave wordt getoond na het uitvoeren van de methode [Action1].execute. Het toont de waarden van de velden param1 (regel 11) en param2 (regel 19) van de klasse [Action1].

3.5. De tests

Laten we het project [exemple-02] uitvoeren:

  • in [1], het gevraagde URL. Merk op dat het aanvankelijk gevraagde URL [/exemple-02] was, zonder actie. Vervolgens werden de bestanden [web.xml] en [struts.xml] geëxploiteerd. We hebben gezien dat het bestand [web.xml] de verwerking van elk verzoek aan Struts 2 toevertrouwde. Vervolgens werd het bestand [struts.xml] misbruikt:

<struts>
 <package name="default" namespace="/" extends="struts-default">
    <default-action-ref name="index" />
    <action name="index">
      <result type="redirectAction">
        <param name="actionName">Action1</param>
        <param name="namespace">/actions</param>
      </result>
    </action>
  </package>
  <package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1" class="actions.Action1">
      <result name="success">/vues/Action1.JSP</result>
    </action>
  </package>
</struts>

Het bestand URL, dat geen actie bevatte, werd verwerkt door het pakket default in de regels 2-10. Omdat er geen actie was in het URL, werd de actie index vanwege regel 3 (standaardactie). Regels 4-8 zorgden ervoor dat Struts een URL-omleidingsbericht naar de client stuurde voor [/exemple-02/actions/Action1], zoals weergegeven in [1].

De actie [Action1] werd vervolgens uitgevoerd zoals geconfigureerd in de regels 12-14. De bijbehorende methode execute werd uitgevoerd. We hebben gezien dat deze de code success retourneerde. Regel 13 van [struts.xml] zorgde ervoor dat de pagina [/vues/Action1.JSP] naar de browser werd teruggestuurd:


...
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Action1</title>
  </head>
  <body>
    <h1>Action1</h1>
    param1=<s:property value="param1"/><br/>
    param2=<s:property value="param2"/><br/>
  </body>
</html>

De regels 9 en 10 hebben de waarden van de velden param1 en param2 van [Action1] weergegeven. Dit is te zien in [2].

Laten we nog een URL opvragen:

In [1] wordt de actie [Action1] aangevraagd met de parameters param1 en param2. Laten we teruggaan naar het uitvoeringsschema van een Struts-actie:

De controller [FilterDispatcher] laat de methode execute van de actie uitvoeren. De uitvoeringsstroom loopt door interceptors. Een daarvan verwerkt de parameterreeks param1=qqchose&param2=autrechose. Daarbij maakt hij gebruik van de methoden setParam1 en setParam2 van de actie Action1:


package actions;

import com.opensymphony.xwork2.ActionSupport;

public class Action1 extends ActionSupport{
  
  // actiemodel
  private String param1="valeur1";
  private String param2="valeur2";
  
  @Override
  public String execute(){
    return SUCCESS;
  }
  
  // getters en setters

  public String getParam1() {
    return param1;
  }

  public void setParam1(String param1) {
    this.param1 = param1;
  }

  public String getParam2() {
    return param2;
  }

  public void setParam2(String param2) {
    this.param2 = param2;
  }
  
}

De interceptor params voert de volgende methoden uit:

[Action1].setParam1("qqchose") ;
[Action1].setParam2("autrechose") ;

Deze moeten dus bestaan. Onthoud het volgende: om de parameters parami van een HTTP-verzoek op te halen, moet de aangeroepen Struts-actie velden hebben met dezelfde namen als de parameters en bijbehorende get-/set-methoden.

Wanneer de methode execute van [Action1] wordt uitgevoerd, zijn de velden param1 en param2 geïnitialiseerd door de params-interceptor:

param1="qqchose"
param2="autrechose"

De methode execute retourneert de sleutel success en de pagina [Action1.JSP]met de nieuwe waarden van param1, param2 en [2].