Struts2的Action控制类的实现及Action访问Servlet API

Struts2的Action控制类的实现

Struts2的应用开发中,Action作为框架的核心类,实现对用户请求的处理,Action类被称为业务逻辑控制器。一个Action类代表一次请求或调用,每个请求的动作都对应于一个相应的Action类,一个Action类是一个独立的工作单元。

实现Action控制类共有3种方式:
(1)POJO的实现
不继承任何父类,也不实现任何借口,仅仅是一个POJO类。只要具有一部分getter/setter方法的类就可以称作POJO。一般在这个POJO类中,要有一个公共的无参的构造方法(采用默认的构造方法就可以)和一个execute()方法。execute()方法是Action类的默认请求处理方法。

execute()方法的要求如下:
1、方法的权限修饰符为public
2、返回一个字符串,就是指示的下一个页面的Result
3、方法没有参数

(2)实现Action接口
Action接口规范如下:

package com.opensymphony.xwork2;

public interface 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";

    public String execute() throws Exception;

}

实现Action接口后只需要实现execute()方法即可

(3)继承ActionSupport类
继承ActionSupport类重写execute()方法,ActionSupport实现了Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable 等接口。ActionSupport类里面包含很多方法,具体看源码。

在实际开发中,一般会继承ActionSupport类,同时,一个action类一般也会包含很多业务逻辑处理方法,具体需要调用某个action类的哪个方法,可以在配置Action的时候再method属性指定。

Action访问Servlet API
在Struts2中,Action并没有直接和Servlet API进行耦合,即,在Struts2的Action中不能直接访问Servlet API。但是在实际应用中,完全不用Servlet是不可能的。在实际业务逻辑中,经常要访问Servlet中的对象,如session、request和application等。在Struts2中,访问Servlet API有3种方法。
(1)通过ActionContext类访问
ActionContext是Action执行的上下文对象,在ActionContext中保存了Action执行所需要的所有对象,包括parameters、request、session、application等。
ActionContext类访问Servlet API常用方法:
1、获得当前线程的ActionContext对象:

static ActionContext getContext();

2、一个ActionContext对象就相当于Servlet中的HttpServletRequest对象,即,ActionContext request = ActionContext.getContext();

3、根据第2点,如何向ActionContext对象中的属性赋值呢?也就是模拟Servlet API中的HttpServletRequest的setAttribute()方法:

void put(String key, Object value);

4、根据第2、3点,模拟Servlet API中的HttpServletRequest的getAttribute()方法:

Object get(String key);

5、模拟获取Servlet API中的HttpServletRequest,获取request里面参数的Map:

Map<String, Object> getParameters();

6、获取session和application,这两个对象都是Map对象:

Map<String, Object> getSession();
Map<String, Object> getApplication();

7、设置一个session的值和设置一个application的值:

void setSession(Map<String, Object>);
void setApplication(Map<String, Object>);

(2)通过特定接口访问
上面通过ActionContext类访问Servlet API,但并没有直接操控Servlet实例,而只是通过ActionContext实例操作Servlet 实例。为了可以操作Servlet实例,Struts2提供了4个借口:
1、ServletRequestAware:直接访问HttpServletRequest实例。

    @Override
    public void setServletRequest(HttpServletRequest arg0) {
        // TODO Auto-generated method stub

    }

2、ServletResponseAware:直接访问HttpServletResponse实例。

    @Override
    public void setServletResponse(HttpServletResponse arg0) {
        // TODO Auto-generated method stub

    }

3、SessionAware:直接访问HttpSession实例。

    @Override
    public void setSession(Map<String, Object> arg0) {
        // TODO Auto-generated method stub

    }

4、SevletContextAware:直接访问ServletContext实例。

    @Override
    public void setServletContext(ServletContext arg0) {
        // TODO Auto-generated method stub

    }

使用这四个接口的时候,先在方法里面定义相应的变量,然后在这些set方法中做(比如)this.request = request

(3)通过ServletActionContext访问
这里写图片描述

参照图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值