Skip to content

3. Przykład 02 – Wstrzykiwanie parametrów do akcji

3.1. Projekt NetBeans

  • w [1,2], pliki konfiguracyjne
  • w [3], akcja
  • w [4], widok
  • w [5], biblioteki projektu

3.2. Pliki konfiguracyjne

Plik [web.xml] ma następującą treść:


<?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-pattern>
  </filter-mapping>
  <session-config>
    <session-timeout>
            30
    </session-timeout>
  </session-config>
</web-app>

Omówiliśmy już ten plik. Nie będziemy tego powtarzać. Należy jedynie pamiętać, że zapewnia on, aby wszystkie URL (wiersz 15) przechodziły przez filtr Struts (wiersz 10).

Plik [struts.xml] ma następującą treść:


<?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>
  • wiersze 7–15: definiują pakiet [default], który jest używany, gdy nie udało się znaleźć akcji w innym pakiecie.
  • wiersz 8: definiuje domyślną akcję dla tego pakietu o nazwie index.
  • wiersze 9–14: konfigurują akcję o nazwie index. Widać, że nie jest ona powiązana z żadną klasą (brak atrybutu class w wierszu 9).
  • wiersz 10: wynik dotyczy klucza success (brak atrybutu name). Jest on typu redirectAction (atrybut type). Ten typ umożliwia przekierowanie jednej akcji do innej. W tym przypadku, gdy klient zażąda akcji /index, zostanie przekierowany do akcji /actions/Action1 (wiersze 11–12).
  • wiersze 16–20: definiują pakiet akcji (name) powiązany z akcjami URL i /actions/Action (class).
  • wiersze 17–19: konfigurują akcję /actions/Action1 (nazwa). Po wywołaniu tej akcji Struts utworzy instancję klasy actions.Action1 (class), a następnie zostanie wykonana metoda execute tej klasy. Metoda ta musi zwrócić klucz success, ponieważ jest to jedyny klucz zdefiniowany w wierszu 18.
  • wiersz 18: dla klucza success wyświetlanym widokiem będzie strona JSP [vues/Action1.JSP].

Ostatecznie należy zapamiętać, że projekt Struts potrafi wykonać jedynie akcję URL [actions/Action1].

3.3. L'action

Akcja Action1 jest reprezentowana przez następującą klasę:


package actions;

import com.opensymphony.xwork2.ActionSupport;

public class Action1 extends ActionSupport{
  
  // szablon akcji
  private String param1="valeur1";
  private String param2="valeur2";
  
  @Override
  public String execute(){
    return SUCCESS;
  }
  
  // metody pobierające i ustawiające

  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;
  }
  
}
  • wiersze 8–9: dwa pola dostępne za pomocą metod get / set (wiersze 18–32)
  • wiersze 12–14: metoda execute zwraca klucz success, zgodnie z oczekiwaniami. Nie wykonuje żadnych innych czynności.

3.4. Widok JSP

Widok Action1.JSP wygląda następująco:


<%@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>

Ten widok jest wyświetlany po wykonaniu metody [Action1].execute. Wyświetla wartości pól param1 (wiersz 11) i param2 (wiersz 19) klasy [Action1].

3.5. Testy

Uruchommy projekt [exemple-02]:

  • w [1], żądany plik URL. Należy zauważyć, że początkowo żądany plik URL to [/exemple-02] bez żadnej akcji. Następnie wykorzystano pliki [web.xml] i [struts.xml]. Stwierdzono, że plik [web.xml] przekazywał obsługę wszystkich żądań do Struts 2. Następnie wykorzystano plik [struts.xml]:

<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>

Plik URL, który nie zawierał akcji, został przetworzony przez pakiet default w wierszach 2–10. Wobec braku akcji w URL akcja została zmieniona na index zgodnie z wierszem 3 (akcja domyślna). Wiersze 4–8 spowodowały, że Struts zwrócił klientowi URL z przekierowaniem do [/exemple-02/actions/Action1], jak pokazano w [1].

Następnie akcja [Action1] została wykonana zgodnie z konfiguracją w wierszach 12–14. Wykonano jej metodę execute. Zauważyliśmy, że zwracała ona kod success. Wiersz 13 pliku [struts.xml] spowodował, że strona [/vues/Action1.JSP] została zwrócona do przeglądarki:


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

Wiersze 9 i 10 wyświetliły wartości pól param1 i param2 z pliku [Action1]. Pokazuje to plik [2].

Poprośmy o kolejny plik URL:

W pliku [1] akcja [Action1] jest wywoływana z parametrami param1 i param2. Wróćmy do schematu wykonania akcji Struts:

Kontroler [FilterDispatcher] uruchamia metodę execute akcji. Przepływ wykonania przechodzi przez interceptory. Jeden z nich przetwarza ciąg parametrów param1=qqchose&param2=autrechose. Następnie wykorzystuje metody setParam1 i setParam2 akcji Action1:


package actions;

import com.opensymphony.xwork2.ActionSupport;

public class Action1 extends ActionSupport{
  
  // szablon akcji
  private String param1="valeur1";
  private String param2="valeur2";
  
  @Override
  public String execute(){
    return SUCCESS;
  }
  
  // metody pobierające i ustawiające

  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;
  }
  
}

Interceptor params wykonuje następujące metody:

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

Muszą one więc istnieć. Należy pamiętać o następującej kwestii: aby pobrać parametry parami z żądania HTTP, wywołana akcja Struts musi posiadać pola o nazwach identycznych z nazwami parametrów oraz powiązane metody get / set.

Gdy wykonywana jest metoda execute z [Action1], pola param1 i param2 zostały zainicjowane przez interceptor params:

param1="qqchose"
param2="autrechose"

Metoda execute zwraca klucz success, a strona [Action1.JSP]wyświetla się z nowymi wartościami param1, param2 i [2].