3. 示例 02 – 向 Action 注入参数
3.1. NetBeans 项目
![]() |
- 在 [1,2] 中,配置文件
- 在 [3] 中,Action
- 位于 [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的操作。可以看出该操作未关联任何类(第9行缺少class属性)。
- 第10行:结果对应键success(缺少name属性)。其类型为redirectAction(type属性)。 此类型允许将一个操作重定向到另一个操作。在此,当客户端请求操作 /index 时,将被重定向到操作 /actions/Action1(第 11-12 行)。
- 第16-20行:定义与URL操作/actions/Action(class)关联的操作包(name)。
- 第 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;
}
// 获取器和设置器
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 方法后显示。 它显示了类 [Action1] 中字段 param1(第 11 行)和 param2(第 19 行)的值。
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] 由第 2-10 行中的 default 包处理。由于 URL 中未指定操作,根据第 3 行 (默认操作)。第4-8行导致Struts向客户端返回了一个重定向URL [/exemple-02/actions/Action1],如[1]所示。
随后,[Action1] 动作按第 12-14 行配置执行。其方法 execute 被调用。 我们看到它返回了代码 success。[struts.xml] 的第 13 行导致页面 [/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 行显示了 [Action1] 中 param1 和 param2 字段的值。这就是 [2] 所显示的内容。
让我们请求另一个URL:
![]() |
在 [1] 中,通过 [Action1] 动作调用了 param1 和 param2 参数。让我们回到 Struts 动作的执行流程图:
![]() |
控制器 [FilterDispatcher] 会调用该操作的 execute 方法。执行流会经过拦截器。 其中一个拦截器处理参数字符串 param1=qqchose¶m2=autrechose。随后,它调用操作Action1中的方法setParam1和setParam2:
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;
}
// 获取器和设置器
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 执行以下方法:
因此这些方法必须存在。需注意以下要点:要从 Http 请求中获取 parami 参数,被调用的 Struts 操作必须包含与参数同名的字段,并具备相应的 get / set 方法。
当 [Action1] 的 execute 方法执行时,param1 和 param2 字段已被 params 拦截器初始化:
方法 execute 返回键 success,页面 [Action1.jsp]显示,其中 param1、param2 和 [2] 采用了新值。



