总结Struts2获取servletAPI的几种方式

struts2的Action放弃了request,response等ServletAPI,使得在业务层上更加独立,在有时候使用struts2进行Web开发的时候,不可避免的要在action中使用servletAPI,那么如何在Action中获取并使用servletAPI呢?
  1. 通过ActionContext类的静态方法获取(非IOC方式)
package com.hadwin.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
 * 通过actioncontext类访问并获取servletAPI
 * 其对象是一个map类型的
 * @author Hadwin.huang
 */
public class ContextAction extends ActionSupport{
    public String execute() throws Exception {
        String  name="XXXX";
        //获取seesion
        Map session =             ActionContext.getContext().getSession();
        //把想存的值放到session域中
        session.put("sessionName", name);

        //获取request
        Map request=(Map)ActionContext.getContext().get("request");
        //把想存的值存入request域中
        request.put("requestName", name);

        //获取application
        Map application = ActionContext.getContext().getApplication();
        //把需要的值存入application域中
        application.put("applicationName", name);
        return null;
    };
}

上面获取到的三大域都是Map类型的,比如对于request来说,我们通常喜欢获取HttpServletRequest类型的,因为这个类型的request功能要强大得多,用ActionContext也是可以获取的,而且也是我们更常用的一种方式,如下:

        //获取HttpServletRequest 
        HttpServletRequest request = (HttpServletRequest)ActionContext.getContext().get(StrutsStatics.HTTP_REQUEST);
        //通过request获取sesssion
        HttpSession session = request.getSession();

2.通过ServletActionContext的静态方法获取(非IOC方式)

package com.hadwin.action;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.dispatcher.ng.servlet.StrutsServlet;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
 (1) 通过ServletActionContext类访问并获取servletAPI
 (2) 虽然是使用了静态方法获取request,response,但仍能保证获取到当前用户,当前线程的request,response,
 (3) 不会反生混淆,因为struts2利用ThreadLocal来维护当前线程的servlet对象,是线程安全的
 (4) @author Hadwin.huang
 */
public class ContextAction2 extends ActionSupport{
    public String execute() throws Exception {
        String  name="XXXX";
        //获取HttpServletRequest
        HttpServletRequest request = ServletActionContext.getRequest();
        //获取session
        HttpSession session = request.getSession();
        return null;
    };

3.实现相关的Aware接口(IOC方式)
(1) request 对应ServletRequestAware接口
(2) response对应ServletResponseAware接口
(3) session 对应SessionAware接口
(4) application对应ServletContextAware接口

struts2在实例化一个action对象时,如果发现他实现了相关的Aware接口,就会把相应的资源通过Aware接口方法注入进去,所以叫做注入方式(IOC方式),以request为例,实现了ServletRequestAware接口,就会有一个setServletRequest()方法获取request对象,Aware接口实际上是一种拦截器,他会在执行Action前执行,把相关的servlet对象设置进来,代码如下:

package com.hadwin.action;

import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.dispatcher.ng.servlet.StrutsServlet;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class ContextAction1 extends ActionSupport implements ServletRequestAware {
    HttpServletRequest request;

    public String execute() throws Exception {
        String name="XXXX";
        request.setAttribute("name", name);
        return null;
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
        //通过该方法可直接获取到request对象
        this.request=request;

    };

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值