Action 是用于处理请求操作的,它是由 StrutsPrepareAndExecuteFilter 分发过来的。这一节主要详细的介绍 action 的配置。
在 Struts2 框架中,Action 是框架的核心类,被称为业务逻辑控制器,主要用于实现对用户请求的处理。
一个 Action 类代表一次请求或调用,每个请求的动作都对应一个相应的 Action 类。也就是说,用户的每次请求,都会转到一个相应的 Action 类中,由这个 Action 类进行处理。简而言之,Action 就是用于处理一次用户请求的对象。
实现 Action 控制类通常采用两种方式,分别是实现 Action 接口和继承 ActionSupport 类。接下来分别对它们进行讲解,具体如下。
当 Action 类处理用户请求成功后,有人习惯返回 index 字符串,有人习惯返回 success 字符串,这会导致在一个 Action 中可能会返回各种不同的值,十分不利于项目的统一管理。
为了让用户更规范地创建 Action 类,Struts2 提供了一个 Action 接口,该接口定义了 Action 类应该实现的规范,用户在创建 Action 时,可以实现这个接口。Action 接口中的具体代码如下所示:
public interface Action {
//定义Action接口中包含的一些结果字符串
public static final String SUCCESS="success";
public static final String NONE="none";
public static final String ERROR="error";
public static final String INPUT="input";
public static final String LOGIN="login";
//定义处理用户请求的execute()方法
public String execute() throws Exception;
}
从上述代码中可以看出,Action 接口位于 com.opensymphony.xwork2 包中,并且接口中只定义了五个字符串常量和一个 execute() 方法。其中,execute() 方法是 Action 类的默认请求处理方法,该方法返回一个字符串,而上面五个字符串常量的作用是统一 execute() 方法的返回值。
由于 Xwork 的 Action 接口十分简单,为开发者提供的帮助较小,所以在实际开发过程中,通常都是采用继承 ActionSupport 类的方式创建 Action。其示例代码如下所示:
public class LoginAction extends ActionSupport{
private static final long serialVersionUID = 1L;
@Override
public String execute() throws Exception{
return super.execute();
}
}
ActionSupport 是 Action 接口的默认实现类,所以继承 ActionSupport 就相当于实现了 Action 接口。除 Action 接口以外,ActionSupport 类还实现了 Validateable、ValidationAware、TextProvider、LocaleProvider 和 Serializable 等接口,这为用户提供了更多的功能。
ActionSupport 类中提供了许多默认方法,这些默认方法包括数据校验的方法、默认的处理用户请求的方法等。如果开发者的 Action 类继承 ActionSupport 类,会大大简化 Action 的开发。
需要注意的是,由于自定义的 Action 类继承了 ActionSupport 类,因此必须定义一个变量 serialVersionUID。这是因为 ActionSupport 类实现了 Serializable 接口,任何实现了 Serializable 接口的类都必须声明变量 serialVersionUID,如下所示:
在学习过程中,细心的读者可能会发现,即使不加上述代码,程序也可以正常执行。但是在实际项目开发中,必须加上上述代码。
配置 Action 主要就是配置 struts.xml 文件中 Action 的映射信息。Action 映射是指将一个请求的 URL 映射到一个 Action 类,当一个请求匹配某个 Action 名称时,Struts2 框架就使用这个 Action 确定如何处理请求。
struts.xml 文件是通过 <action> 元素对请求的 Action 和 Action 类进行配置的,其示例代码如下所示:
在上述代码中,包含了 <action> 元素的三个常用属性 name、class 和 method,这三个属性的具体说明如下表所示。
名 称 | 可选/必填 | 说 明 |
---|---|---|
name | 必填属性 | 表示 Action 的名称(该名称必须唯一),它指定了 Action 所处理请求的 URL。该属性将在其他地方被引用,如作为 JSP 页面 form 表单的 action 属性值。 |
class | 可选属性 | 用于指定 Action 的实现类,如果没有指定 class 属性值,则其默认值为 com.opensymphony.xwork2.ActionSupport 类。 |
method | 可选属性 | 指定请求 Action 时调用的方法。如果指定了 method 属性,则该 Action 会调用 method 属性中指定的方法,如果不指定 method 属性,则 Action 会调用 execute() 方法。 |
由于在一个 Action 类中可能有多个业务逻辑处理方法,在配置 Action 时,就需要使用多个 <action> 元素。在实现同样功能的情况下,为了减少 struts.xml 配置文件的代码量,可以借助于通配符映射信息。
下面以一段 Action 的配置代码为例,说明如何使用通配符进行配置,如下所示:
<package name="user" namespace="/user" extends="struts-default">
<action name="userAction_*" class="com.mengma.action.UserAction" method="{1}">
<result>/index.jsp</result>
</action>
</package>
在上述代码中,method 属性值中的数字 1 表示匹配第 1 个 *。当客户端发送 /user/userAction_login.action 这样的请求时,<action> 元素的 name 属性值就被设置成 userAction_login,method 属性值就被设置成 login。当客户端发送 /user/userAction_register.action 这样的请求时,<action> 元素的 name 属性值就被设置为 userAction_register,method 属性值也被设置成 register。
另外,对 <result> 元素也可以采用通配符配置,代码如下所示:
当客户端发送 userAction_login 这样的请求时,<result> 元素被设置成跳转到 login.jsp 页面。当客户端发送 userAction_register 这样的请求时,<result> 元素被设置成跳转到 register.jsp 页面。