您的位置:首页 > 编程语言 > Java开发

Struts2中 Action获得servletAPI的三种方式

2018-01-11 17:24 387 查看

Action获得servletAPI方式一

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

获得直接和servlet耦合的API:

ServletActionContext.getRequest()对应javax.servlet.http.HttpServletRequest
ServletActionContext.getResponse()对应javax.servlet.http.HttpServletResponse
ServletActionContext.getServletContext()[/b]对应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方式二

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

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

而Struts2的Action已经脱离了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对象,被封装为Map的web对象
       
 *
完成和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;
    }

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Struts2 初学