Action详解
一、简介
Action 是用于处理请求操作的,它是由 StrutsPrepareAndExecuteFilter 分发过来的。
在 Struts2 框架中,Action 是框架的核心类,被称为业务逻辑控制器,主要用于实现对用户请求的处理。
一个 Action 类代表一次请求或调用,每个请求的动作都对应一个相应的 Action 类。也就是说,用户的每次请求,都会转到一个相应的 Action 类中,由这个 Action 类进行处理。
简而言之,Action 就是用于处理一次用户请求的对象。
二、Action的创建
注意:action类的全路径(即包名)必须含有”action”的词汇。
① 创建一个POJO类 - hibernate自动会封装成PO类

public class DefaultAction { public String execute() throws Exception { System.out.println("DefaultAction...run"); return ""; } }
② 创建一个类实现一个实现Action接口

import com.opensymphony.xwork2.Action; public class ImplAction implements Action { public String execute() throws Exception { System.out.println("ImplAction...run"); return "defaultAction"; } }
Action 接口位于 com.opensymphony.xwork2 包中,并且接口中只定义了五个字符串常量和一个 execute() 方法。
其中,execute() 方法是 Action 类的默认请求处理方法,该方法返回一个字符串,而上面五个字符串常量的作用是统一 execute() 方法的返回值。
③ 创建一个类继承ActionSupport类★

import com.opensymphony.xwork2.ActionSupport; public class ExtAction extends ActionSupport { @Override public String execute() throws Exception { System.out.println("ExtAction...run"); return ""; } }
ActionSupport 是 Action 接口的默认实现类,所以继承 ActionSupport 就相当于实现了 Action 接口。
除 Action 接口以外,ActionSupport 类还实现了 Validateable、ValidationAware、TextProvider、LocaleProvider 和 Serializable 等接口,这为用户提供了更多的功能。
ActionSupport 类中提供了许多默认方法,这些默认方法包括数据校验的方法、默认的处理用户请求的方法等。
如果开发者的 Action 类继承 ActionSupport 类,会大大简化 Action 的开发
三、配置Action
配置 Action 主要就是配置 struts.xml 文件中 Action 的映射信息。
Action 映射是指将一个请求的 URL 映射到一个 Action 类,当一个请求匹配某个 Action 名称时,Struts2 框架就使用这个 Action 确定如何处理请求。

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <constant name="struts.devMode" value="true"></constant> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> <!-- name:配置包名 ;namespace:给action的访问路径定义一个命名空间;extends:固定形式继承struts-default --> <package name="MyPackage" namespace="/" extends="struts-default"> <global-allowed-methods>regex:.*</global-allowed-methods> <action name="LoginAction_*" class="com.sikiedu.web.UserAction" method="{1}"> <!-- 重定向 --> <result name="success" type="redirect">/index.html</result> <!-- 默认为转发 --> <result name="error">/login.jsp</result> </action> <action name="LoginActionDefault" class="com.sikiedu.web.DefaultAction" method="execute"></action> <action name="LoginActionImpl_*" class="com.sikiedu.web.ImplAction" method="{1}"> <!-- 转发到LoginActionDefault --> <result name="defaultAction" type="chain">LoginActionDefault</result> <!-- 重定向到Action(LoginAction_*) --> <result name="toLogin" type="redirectAction"> <param name="actionName">LoginAction_login</param> <param name="username">${username}</param> <param name="password">${password}</param> </result> </action> </package> </struts>
action常用属性说明:
① package标签(strust.xml只存在一个package相当于一个struts的项目)
● name:定义一个包的名称,用来指定包名,它必须唯一;建议跟namespace保持一致
● namespace:用来action的访问路径定义一个命名空间;与URL中的路径保持一致;
● extends:指定继承自哪个包。一般值是struts-default,struts-default包是 在struts-default.xml文件中声明的。
● abstruct:它代表当前包是一个抽象的,主要是用于被继承。
② action标签(对应相应的以action结尾的类,一个package可以有多个action)
● name:action访问的资源路径,与package的namespace联合使用。对应Servlet中的:url-pattern;
● class:表示当前action的完整类名。
● method:表示调用action类中的哪个方法处理请求。
③ result标签(用于显示视图的结果)
● name:与action中的的method方法的返回值进行匹配,来确定跳转路径。默认是"success"
● type:是用于指定打开结果对应页面或资源的方式。默认是"dispatch"
1)动态方法调用
由于在一个 Action 类中可能有多个业务逻辑处理方法,在配置 Action 时,就需要使用多个 <action> 元素。在实现同样功能的情况下,为了减少 struts.xml 配置文件的代码量,可以借助于通配符映射信息。
<constant name="struts.devMode" value="true"></constant> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> <package name="MyPackageName" namespace="/" extends="struts-default"> <global-allowed-methods>regex:.*</global-allowed-methods> <action name="LoginActionImpl_*" class="com.sikiedu.web.ImplAction" method="{1}"> ... </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 页面。
四、参数传递
1)接收参数:
- 属性驱动:
1.在 Action 类中创建与请求参数匹配的属性,
2.为属性提供get/set方法
- 模型驱动:
1.让 Action 类要实现一个指定接口 ModelDriven;
2.实例化模型对象(就是要new出来javaBean);
3.重写getModel方法将实例化的模型返回。
2)传递参数:ActionContext★、ServletActionContext
① ActionContext生命周期是一次请求,每次请求都会创建一个对应的ActionContext对象,请求结束时销毁ActionContext对象。
就和request一样,它本身也具备了request域的功能,可以从后台携带数据到前台。
② 通过ActionContext的子类ServletActionContext可以直接获得session和application等多个域对象,操作方便。
③ ActionContext本身也是一个map,它存储了很多对象例如request、response等多个对象。
//通过 ActionContext 类中的方法调用,分别在 request、application 和 session 中放入了("name","akai")键值对。 ActionContext.getContext().put("name", "akai"); ActionContext.getContext().getSession().put("name", "akai"); ActionContext.getContext().getApplication().put("name", "akai"); //得到原生的Request、Response等域。 ServletActionContext.getRequest().setAttribute("message","通过ServletActionContext类访问Servlet API"); ServletActionContext.getRequest().setAttribute("message","通过ServletActionContext类访问Servlet API"); ServletActionContext.getResponse().setAttribute("message","通过ServletActionContext类访问Servlet API");
- ActionContext:常见方法
方法声明 | 功能描述 |
void put(String key,Object value) | 将key-value键值对放入ActionContext中,模拟Servlet API中的HttpServletRequest的setAttribute()方法 |
Object get(String key) | 通过参数key查找当前ActionContext中的值 |
Map<String,Object> getApplicatin() | 返回一个Application级的Map对象 |
static ActionContext getContext() | 获取当前线程的ActionContext对象 |
Map<String,Object> getParameter() | 返回一个包含所有HttpServletRequest参数信息的Map对象 |
Map<String,Object> getSession() | 返回一个Map类型的HttpSession对象 |
- ServletActionContext:常见方法
方法声明 | 功能描述 |
static PageContext getPageContext() | 获取Web应用的 PageContext 对象 |
static HttpServletRequest getResponse() | 获取Web应用的 HttpServletRequest 对象 |
static HttpServletResponse getResponse() | 获取Web应用的 HttpServletResponse 对象 |
static ServletContext getServletContext() | 获取Web应用的 ServletContext 对象 |