Struts2中 Action获得servletAPI的三种方式

Action获得servletAPI方式一

/*第一篇博客,写得不好请见谅*/

获得直接和servlet耦合的API:

ServletActionContext.getRequest()对应javax.servlet.http.HttpServletRequest
ServletActionContext.getResponse()
对应javax.servlet.http.HttpServletResponse
ServletActionContext.getServletContext()
对应javax.servlet.ServletContext
它的方法全都是static的。另外它所获得的ServletContext对象,就相当于Application
因为它的生命周期与Application生命周期是一样的,只要服务器不关闭,就都是有效的
ServletActionContext
可以获得和容器绑定Request, Response, ServletContext对象
这里获得的都不是Map对象,所以在测试的时候,就必须要启动Tomcat服务器

 

/**

        * 方式一:通过ServletActionContext类提供的静态方法,获得原始的servletAPI

         *       直接和servlet耦合,测试需要依赖web容器

         *       需要设置响应头,需要获得原始的servletAPI

        */

        HttpServletRequest req=ServletActionContext.getRequest();

        HttpServletResponse resp=ServletActionContext.getResponse();

        HttpSession sin = req.getSession();

        ServletContext app = sin.getServletContext();

       

        req.setAttribute("req", "request---req");

        sin.setAttribute("sin", "session---sin");

        app.setAttribute("app", "app---app");

        req.setAttribute("list", list);


Action获得servletAPI方式二

单元测试在开发中是非常重要的一个环节
程序员在写完代码时,相应的单元测试也应写完整,否则你的代码就是不能让人信服的Struts2ActionServletAPI进行解耦之后,就使得单元测试变得非常容易了

比如HttpServletRequest对象,它是由Tomcat容器给我们提供的,我们自己产生不出来若Action中充斥者ServletAPI,哪怕仅一个,那么一般意义上的JUnit单元测试便无法进行。

Struts2Action已经脱离了ServletAPI,所以无需这两种方式,便可直接用JUnit测试

首先通过ActionContext的静态getContext()方法获得当前线程相关的一个ActionContext实例
然后就可以通过该实例调用它的众多方法得到Servlet的一些API
publicObject 
get(Object key)方法,就相当于HttpServletRequest.getAttribute()
publicvoid 
put(Object key, Object value)对应HttpServletRequest.setAttribute()
publicMap<String, Object> 
getParameters()对应HttpServletRequest.getParameterMap()
publicMap<String, Object> 
getSession()方法对应javax.servlet.http.HttpSession
session.put(Objectkey, Object value)
对应Servlet编程中的HttpSession.setAttribute(…)
也就是说,ActionContext能够获得三个Map类型的Request, Session, Application对象
ActionContext
有一个好处,就是它已经将底层的Servlet进行了转化,比如它将session转化成Map
这样在测试时,Struts2便可脱离Servlet容器进行单纯的JUnit测试

/***

         * 方式二:ActionContext 获得web对象,被封装为Mapweb对象

         * 完成和servlet的解耦合,获得的是被封装为Map的对象

         * **/

        ActionContext ac= ActionContext.getContext();

        Map<String,Object>sin=ac.getSession();

        Map<String,Object>app=ac.getApplication();

       

        ac.put("req", "req------req");

        sin.put("sin", "session---sin");

        app.put("app", "app---app");

Action获得servletAPI方式三

rg.apache.struts2.util.ServletContextAware接口它仅有个voidsetServletContext(javax.servlet.ServletContext context)方法通过该方法获得的ServletContext就相当于Application,二者生命周期都是相同的

以及org.apache.struts2.interceptor.ServletRequestAware接口同样有个voidsetServletRequest(javax.servlet.http.HttpServletRequest request)方法以及org.apache.struts2.interceptor.ServletResponseAware接口

同样有个void setServletResponse(javax.servlet.http.HttpServletRsponseresponse)方法使用方式及示例代码

此时需设置一个跟Servlet容器耦合的HttpServletRequest类型的request成员变量当执行完setServletRequest()方法,成员变量就被它的HttpServletRequest参数赋值了

该方法是由Struts2自动调用的,显然这是一种非常非常典型的依赖注入【DI】由Struts2自动将容器产生的HttpServletRequest对象set到我们应用中的变量上这样成员变量request就变成了容器所产生的HttpServletRequest对象了

接下来就可以正常的使用request了,使用方法与在Servlet中的使用方是一样的

 

 

publicclass UserAction2  implements RequestAware,

    SessionAware,ApplicationAware{

 

    private Map<String, Object>app;

    private Map<String, Object>sin;

    private Map<String, Object>req;

  

   @Override

    publicvoid setApplication(Map<String, Object> application) {

        // TODO Auto-generated method stub

        this.app=application;

       

    }

    @Override

    publicvoidsetSession(Map<String, Object> session) {

        // TODO Auto-generated method stub

        this.sin=session;

    }

    @Override

    publicvoid setRequest(Map<String, Object> request) {

        // TODO Auto-generated method stub

        this.req=request;

    }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值