Skip to content

3. 示例 02 – 向 Action 注入参数

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 的操作。请注意,它未与任何类相关联(第 9 行缺少 class 属性)。
  • 第 10 行:该配置针对成功键(缺少 name 属性)。其类型为 redirectActiontype 属性)。此类型允许将一个动作重定向到另一个动作。在此,当客户端请求 /index 动作时,将被重定向到 /actions/Action1 动作(第 11–12 行)。
  • 第 16–20 行:定义与 URL /actions/Actionclass)相关联的动作包(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. 该 Action

Action1 操作由以下类表示:


package actions;
 
import com.opensymphony.xwork2.ActionSupport;
 
public class Action1 extends ActionSupport{
 
  // action model
  private String param1="valeur1";
  private String param2="valeur2";
 
  @Override
  public String execute(){
    return SUCCESS;
  }
 
  // getters and 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;
  }
 
}

  • 第 8-9 行:两个可通过 get/set 方法访问的字段(第 18-32 行)
  • 12–14execute 方法如预期返回了该键。除此之外,它不执行任何其他操作。

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

让我们运行 [example-02] 项目:

  • 在 [1] 中,即请求的 URL。请注意,最初请求的 URL 是 [/example-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>

第 2–10 行中的默认包处理了未包含动作的 URL [/example-02]。由于 URL 中没有动作,根据第 3 行(默认动作)的规定,该动作被设为“index”。第 4–8 行导致 Struts 向客户端返回重定向 URL [/example-02/actions/Action1],如 [1] 所示。

随后,根据第12至14行的配置,执行了[Action1]操作。其execute方法被调用。我们看到它返回了成功代码。由于[struts.xml]文件的第13行配置,页面[/views/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] 的 param1param2 字段的值。如图 [2] 所示。

让我们请求另一个 URL:

在[1]中,使用参数 param1param2 请求了 [Action1] 操作。让我们回到 Struts 操作的执行流程:

[FilterDispatcher] 控制器执行该动作的 execute 方法。执行流程会经过一系列拦截器。其中一个拦截器处理参数字符串 param1=something&param2=somethingelse。随后,它调用 Action1 动作的 setParam1setParam2 方法:


package actions;
 
import com.opensymphony.xwork2.ActionSupport;
 
public class Action1 extends ActionSupport{
 
  // action model
  private String param1="valeur1";
  private String param2="valeur2";
 
  @Override
  public String execute(){
    return SUCCESS;
  }
 
  // getters and 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;
  }
 
}

params 拦截器会执行以下方法:

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

因此,这些参数必须存在。请注意:要从 HTTP 请求中获取参数,被调用的 Struts 动作必须包含与参数同名的字段以及相应的 get/set 方法。

当 [Action1] 的 execute 方法运行时,param1param2 字段已由 params 拦截器初始化

param1="qqchose"
param2="autrechose"

execute 方法返回成功键,并显示 [Action1.jsp] 页面,其中 param1param2 已更新为新值 [2]。