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¶m2=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:
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:
Metoda execute zwraca klucz success, a strona [Action1.JSP]wyświetla się z nowymi wartościami param1, param2 i [2].



