3. Приклад 02 — Введення параметрів у дію
3.1. Проєкт NetBeans
![]() |
- у [1,2], конфігураційні файли
- у [3], дія
- у [4], представлення
- у [5], бібліотеки проекту
3.2. Файли конфігурації
Файл [web.xml] має такий вигляд:
<?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>
Ми вже коментували цей файл. Більше цього робити не будемо. Слід лише пам’ятати, що він забезпечує проходження всіх URL (рядок 15) через фільтр Struts (рядок 10).
Файл [struts.xml] має такий вигляд:
<?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>
- рядки 7–15: визначають пакет [default], який використовується, коли дію не вдалося знайти в іншому пакеті.
- рядок 8: визначає дію за замовчуванням для цього пакета з назвою index.
- рядки 9–14: налаштовують дію з назвою index. Бачимо, що вона не пов’язана з класом (відсутність атрибута class у рядку 9).
- рядок 10: результат стосується ключа success (відсутність атрибута name). Він має тип redirectAction (атрибут type). Цей тип дозволяє перенаправити дію на іншу дію. У цьому випадку, коли клієнт запросить дію /index, він буде перенаправлений на дію /actions/Action1 (рядки 11–12).
- рядки 16–20: визначають пакет дій (name), пов’язаний з діями URL та /actions/Action (class).
- рядки 17–19: налаштовують дію /actions/Action1 (name). При виклику цієї дії Struts створить екземпляр класу actions.Action1 (class), після чого буде виконано метод execute цього класу. Цей метод повинен повернути ключ success, оскільки це єдиний ключ, визначений у рядку 18.
- рядок 18: для ключа success відображатиметься сторінка JSP [vues/Action1.JSP].
У підсумку слід зауважити, що проект Struts може виконати лише дію URL [actions/Action1].
3.3. L'action
Дія Action1 представлена наступним класом:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class Action1 extends ActionSupport{
// шаблон дії
private String param1="valeur1";
private String param2="valeur2";
@Override
public String execute(){
return SUCCESS;
}
// методи getter та setter
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;
}
}
- рядки 8–9: два поля, доступ до яких здійснюється за допомогою методів get / set (рядки 18–32)
- рядки 12–14: метод execute повертає ключ success, як і очікувалося. Більше він нічого не робить.
3.4. Вигляд JSP
Вигляд Action1.JSP такий:
<%@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>
Цей вигляд відображається після виконання методу [Action1].execute. Вона відображає значення полів param1 (рядок 11) та param2 (рядок 19) класу [Action1].
3.5. Тестування
Виконаємо проект [exemple-02]:
![]() |
- у [1], запитуваний URL. Слід зазначити, що початковий запитуваний URL був [/exemple-02] без дій. Потім були використані файли [web.xml] та [struts.xml]. Було виявлено, що файл [web.xml] доручав обробку всіх запитів Struts 2. Після цього було використано файл [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>
URL [/exemple-02] без дії оброблявся пакетом default у рядках 2–10. За відсутності дії в URL дія стала index завдяки рядку 3 (дія за замовчуванням). Рядки 4–8 призвели до того, що Struts повернув клієнту URL з перенаправленням на [/exemple-02/actions/Action1], як показано у [1].
Дія [Action1] була виконана відповідно до налаштувань у рядках 12–14. Був виконаний її метод execute. Ми бачили, що вона повертала код success. Рядок 13 у [struts.xml] призвів до того, що сторінка [/vues/Action1.JSP] була повернута браузеру:
...
<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>
У рядках 9 і 10 відображено значення полів param1 та param2 з [Action1]. Саме це показує [2].
Запросимо ще один файл URL:
![]() |
У [1] дія [Action1] викликається з параметрами param1 та param2. Повернімося до схеми виконання дії Struts:
![]() |
Контролер [FilterDispatcher] запускає метод execute дії. Потік виконання проходить через інтерцептори. Один із них обробляє рядок параметрів param1=qqchose¶m2=autrechose. При цьому він використовує методи setParam1 та setParam2 дії Action1:
package actions;
import com.opensymphony.xwork2.ActionSupport;
public class Action1 extends ActionSupport{
// модель дії
private String param1="valeur1";
private String param2="valeur2";
@Override
public String execute(){
return SUCCESS;
}
// методи getter та setter
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;
}
}
Перехоплювач params виконує такі методи:
Отже, вони повинні існувати. Слід запам’ятати наступне: щоб отримати параметри parami із HTTP-запиту, викликана дія Struts повинна мати поля з тими самими іменами, що й параметри, та відповідні методи get / set.
Під час виконання методу execute з [Action1] поля param1 та param2 були ініціалізовані перехоплювачем params:
Метод execute повертає ключ success, і сторінка [Action1.JSP]відображається з новими значеннями param1, param2 та [2].



