Struts2 Action配置详解 图片看不了?点击切换HTTP 返回上层
Action 是用于处理请求操作的,它是由 StrutsPrepareAndExecuteFilter 分发过来的。这一节主要详细的介绍 action 的配置。
一个 Action 类代表一次请求或调用,每个请求的动作都对应一个相应的 Action 类。也就是说,用户的每次请求,都会转到一个相应的 Action 类中,由这个 Action 类进行处理。简而言之,Action 就是用于处理一次用户请求的对象。
实现 Action 控制类通常采用两种方式,分别是实现 Action 接口和继承 ActionSupport 类。接下来分别对它们进行讲解,具体如下。
为了让用户更规范地创建 Action 类,Struts2 提供了一个 Action 接口,该接口定义了 Action 类应该实现的规范,用户在创建 Action 时,可以实现这个接口。Action 接口中的具体代码如下所示:
ActionSupport 类中提供了许多默认方法,这些默认方法包括数据校验的方法、默认的处理用户请求的方法等。如果开发者的 Action 类继承 ActionSupport 类,会大大简化 Action 的开发。
需要注意的是,由于自定义的 Action 类继承了 ActionSupport 类,因此必须定义一个变量 serialVersionUID。这是因为 ActionSupport 类实现了 Serializable 接口,任何实现了 Serializable 接口的类都必须声明变量 serialVersionUID,如下所示:
struts.xml 文件是通过 <action> 元素对请求的 Action 和 Action 类进行配置的,其示例代码如下所示:
下面以一段 Action 的配置代码为例,说明如何使用通配符进行配置,如下所示:
另外,对 <result> 元素也可以采用通配符配置,代码如下所示:
实现Action控制类
在 Struts2 框架中,Action 是框架的核心类,被称为业务逻辑控制器,主要用于实现对用户请求的处理。一个 Action 类代表一次请求或调用,每个请求的动作都对应一个相应的 Action 类。也就是说,用户的每次请求,都会转到一个相应的 Action 类中,由这个 Action 类进行处理。简而言之,Action 就是用于处理一次用户请求的对象。
实现 Action 控制类通常采用两种方式,分别是实现 Action 接口和继承 ActionSupport 类。接下来分别对它们进行讲解,具体如下。
1)实现 Action 接口
当 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() 方法的返回值。
2)继承 ActionSupport 类
由于 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,如下所示:
private static final long serialVersionUID = 1L;
在学习过程中,细心的读者可能会发现,即使不加上述代码,程序也可以正常执行。但是在实际项目开发中,必须加上上述代码。配置Action
配置 Action 主要就是配置 struts.xml 文件中 Action 的映射信息。Action 映射是指将一个请求的 URL 映射到一个 Action 类,当一个请求匹配某个 Action 名称时,Struts2 框架就使用这个 Action 确定如何处理请求。struts.xml 文件是通过 <action> 元素对请求的 Action 和 Action 类进行配置的,其示例代码如下所示:
<action name="userAction" class="com.mengma.action.UserAction" method="add">
...
</action>
名 称 | 可选/必填 | 说 明 |
---|---|---|
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> 元素也可以采用通配符配置,代码如下所示:
<result>/(1).jsp</result>
当客户端发送 userAction_login 这样的请求时,<result> 元素被设置成跳转到 login.jsp 页面。当客户端发送 userAction_register 这样的请求时,<result> 元素被设置成跳转到 register.jsp 页面。