struts2 Action学习

来源:互联网 发布:js test方法 编辑:程序博客网 时间:2024/06/07 03:54

 

动作类的概念及作用

 

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: 表示动作没有执行,把登录视图显示给用户
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()

 

原创粉丝点击