动作类的概念及作用
Struts2中的动作类就是普通的Java类
创建各种动作是Struts2应用程序开发工作中最重要的任务
动作类需遵守的规则
1. 遵守JavaBeans属性名的命名规则
2. 必须有一个不带任何参数的构造器(默认的构造器也行!!!!)
3. 每个动作类至少有一个方法供Struts在执行这个动作时调用(通常默认为execute方法)
4. 同一个动作类可以包含多个方法(动作)
5. 编写动作类可以不考虑线程安全的问题
Action的要求
1.把数据拿到(组装页面数据)
2.调用逻辑
3.返回到哪个页面(控制页面跳转)
Struts2的Action并不带有任何Web容器相关的对象,Action又是如何工作在Web容器中的呢?
1. Struts2为Action的执行,准备了完整的数据环境和执行环境
数据环境成为Action获取Web容器的基础
2. 控制器Filter,就会针对每个请求,创建出一个代码的执行环境
优点:易测试,丰富的执行层次,易管理
Action中的一些重要元素
在Struts2的Action周围,为Action进行服务的一些重要元素
ActionContext - 数据环境 需要为每个Action准备一个数据环境来获取与Web容器相关的对象
Interceptor - 丰富的层次结构 使用类似责任链的设计模式对Action的职责进行分类并串联起来
Result - 执行结果 执行结果被抽象成一个层次,可以定义任意类型的View层的结构
ActionProxy - 执行环境 需要一个类似调度器的产品将上面的元素整合起来
ActionInvocation - 调度者 ActionProxy接口中有一个比较特殊的变量:ActionInvocation,它就是Action的调用者
负责一系列元素的调度,解读Struts2源码的一个重要入手点
实现Action接口
public abstract String execute()
throws Exception;
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";
动作可以继承以下5个静态字段
SUCCESS: 表示动作执行成功并应该把结果视图显示给用户
NONE: 动作执行成功但不返回视图给用户
ERROR: 动作执行失败把报错视图显示给用户
INPUT: 输入验证失败并把输入页面重新显示给用户
LOGIN: 表示动作没有执行,把登录视图显示给用户
class Login implements Action{ 。。。。。。 @Override public String execute() throws Exception { if ("liu".equals(username) && "liu".equals(password)) return SUCCESS; // 继承自Anction mess = "登录失败"; return INPUT; } 。。。。。。 }
ActionSupport类
默认的动作类
实现了Action接口
提供了默认的execute方法的实现
对ActionSupport类进行扩展有助于编写动作类
ServletActionContext对象
ServletActionContext提供以下静态方法
getRequest(): 返回HttpServletRequest对象,用HttpServletRequest对象的getSession()方法返回HttpSession对象
getResponse(): 取HttpServletResponse对象
getServletContext(): 返回ServletContext对象
注意
不能从动作类的构造器中调用ServletActionContext类的方法,因为此时底层的ActionContext对象还没有被传递给它。
在动作类的构造器中调用将返回null
第一种方法 ( 继承SessionAware类来取得session,然后用invalidate()方法清理 ) public class ExitAction extends ActionSupport implements SessionAware{ @Override public String execute() throws Exception { HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session1 = request.getSession(); session1.invalidate();
return super.execute(); }
public void setSession(Map arg0) {
}
|
Aware接口
在调用动作时,Struts先检查动作是否实现了Aware接口,如果是,将先调用动作对应的set方法传递相应对象
ServletContextAware 在动作类内部访问ServletContext对象
ServletRequestAware 在动作类内部访问HttpServletRequest对象
ServletResponseAware 在动作类内部访问HttpServletResponse对象
如:implements ServletRquestAware之后
private HttpServletRequest request; // 自己实现的Action中新建一个request 成员,用来保存HttpServletRequest 对象
@Override
public void setServletRequest(HttpServletRequest arg0) {// 在调用动作时,Struts先检查动作实现了Aware接口,先调用动作对应的set方法传递 HttpServletRequest 对象
this.request = arg0;
}
SessionAware
并不将HttpSession实例提供出来,而是得到一个Map,该Map是HttpSession对象的包装器,调用setSession(Map map)方法时,Struts将传递一个SessionMap实例
此SessionMap方法有以下方法:
invalidate(): 验证HttpSession对象
clear(): 清除HttpSession对象的所有属性
get()、put()、remove()