首页 > 编程 > Java > 正文

Struts2访问Servlet的三种方式

2019-11-26 12:10:11
字体:
来源:转载
供稿:网友

基本介绍

在Struts2中,Action并没有直接和Servlet API耦合。虽然Struts2 中的Action访问Servlet API麻烦一些,但是这却是Struts2中Action的重要改良之一,方便Action进行单元测试。

尽管Action和Servlet API解耦会带来很多好处,然而在Action中完全不访问Servlet API几乎是不可能的,在实现业务逻辑时,经常要访问Servlet中的对象,如request、session和application等 。

在Struts2中,访问Servlet API有3种方法,分别是实现特定接口,通过ServletActionContext类,通过ActionContext类。

思维导图

实现特定接口访问

package com.pc.web.action; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;  import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.ServletResponseAware; import org.apache.struts2.util.ServletContextAware;  import com.opensymphony.xwork2.ActionSupport;  /**  * 使用特定接口访问Servlet对象  * @author Switch  *  * org.apache.struts2.dispatcher.StrutsRequestWrapper@461aa2  * org.apache.catalina.connector.ResponseFacade@7e83df  * org.apache.catalina.core.ApplicationContextFacade@3b102  * org.apache.catalina.session.StandardSessionFacade@5a214b  * 是由一个名称为servletConfig的拦截器为我们封装的  */ public class ActionTest7 extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware {    private HttpServletRequest request;   private HttpServletResponse response;   private ServletContext application;    /**    * @return    */   public String demo(){     System.out.println(request);     System.out.println(response);     System.out.println(application);     System.out.println(request.getSession());     return SUCCESS;   }    @Override   public void setServletRequest(HttpServletRequest request) {     this.request = request;   }    @Override   public void setServletResponse(HttpServletResponse response) {     this.response = response;   }    @Override   public void setServletContext(ServletContext application) {     this.application = application;   } } 

通过ServletActionContext类

package com.pc.struts2.web.action;  import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;  import org.apache.struts2.ServletActionContext;  import com.opensymphony.xwork2.ActionSupport; /**  * 访问ServletAPI的方式  *  * 使用Struts2框架提供了一个工具类:  *     ServletActionContext  * 它里面提供了对应的静态方法,可以直接获取ServletAPI  *  * 有一个需要注意的问题:  *    org.apache.struts2.dispatcher.StrutsRequestWrapper@4637b3  *    org.apache.catalina.connector.ResponseFacade@1f2f2f7  *    org.apache.catalina.session.StandardSessionFacade@12d77c1  *    org.apache.catalina.core.ApplicationContextFacade@1133ff  *  *    requet对象已经不是原来tomcat提供的了,而是被struts2框架包装过了。  *     包装使用的是装饰者模式。  *    装饰者模式的作用是对方法进行增强。  *  * @author Switch  */ public class ActionAPITest extends ActionSupport {   /**    * 在Struts2框架中使用ServletAPI    * @return    */   public String useServletAPI() {     HttpServletRequest request = ServletActionContext.getRequest();     HttpServletResponse response = ServletActionContext.getResponse();     HttpSession session = request.getSession();     ServletContext application = ServletActionContext.getServletContext();     System.out.println(request);     System.out.println(response);     System.out.println(session);     System.out.println(application);     return "success";   } } 

通过ActionContext类

package com.pc.web.action;  import java.util.Map;  import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;  import org.apache.struts2.ServletActionContext; import org.apache.struts2.StrutsStatics;  import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport;  /**  * ActionContext类介绍  *   它是Struts2框架为我们提供的一个工具类。  *   该类可以通过方法直接获取request,response,servletContext对象  * @author Switch  *  * context.getParameters(); == request.getParameterMap(); 获取的是请求参数  */ public class ActionTest8 extends ActionSupport implements StrutsStatics {    private HttpServletRequest request;   private HttpServletResponse response;   private ServletContext application;    /**    * 使用ActionContext访问ServletAPI    * @return    */   public String demo(){     ActionContext context = ActionContext.getContext();      request = (HttpServletRequest) context.get(HTTP_REQUEST);     response = (HttpServletResponse) context.get(HTTP_RESPONSE);     application = (ServletContext) context.get(SERVLET_CONTEXT);     System.out.println(request);     System.out.println(response);     System.out.println(application);     System.out.println(request.getSession());     /*org.apache.struts2.dispatcher.StrutsRequestWrapper@112e422     org.apache.catalina.connector.ResponseFacade@13f8b4c     org.apache.catalina.core.ApplicationContextFacade@d244dd     org.apache.catalina.session.StandardSessionFacade@a711cb*/      return SUCCESS;   }    /**    * 使用原始ServletAPI对象,往session域和application域中存入数据    * session域中存入     key=sessionAttr     value=hello session attr    * application域中存入 key=applicationAttr   value=hello application attr    * @return    */   public String demo2(){     //1.获取session对象     HttpSession session = ServletActionContext.getRequest().getSession();     //存入数据     session.setAttribute("sessionAttr", "hello session attr");     session.getId();     //2.获取ServletContext     ServletContext application = ServletActionContext.getServletContext();     application.getRealPath("/WEB-INF/uploads");     //存入数据     application.setAttribute("applicationAttr", "hello application attr");     return SUCCESS;   }     /**    * 使用ActionContext类中的getSession()和getApplication()获取到的map来往map中存入数据    * sessionMap中存入     key=sessionAttr     value=hello session map    * applicationMap中存入 key=applicationAttr   value=hello application map    * @return    */   public String demo3(){     //1.获取ActionContext对象     ActionContext context = ActionContext.getContext();     //2.获取sessionMap     Map<String,Object> sessionMap = context.getSession();     sessionMap.put("sessionAttr", "hello session map");     //3.获取applicationMap     Map<String,Object> applicationMap = context.getApplication();     applicationMap.put("applicationAttr", "hello application map");     return SUCCESS;   }  } 

ActionContext类访问Servlet API的常用方法

方法声明
功能描述
void put(String key, Object value)
将 key-value键值对放入ActionContext 中,模拟Servlet API中的HttpServletRequest的setAttributeO方法。
Object get(String key)
通过参数key来查找当前ActionContext中的值。
Map<String, Object> getApplication()
返回一个Application级的Map对象。
static ActionContext getContext()
获取当前线程的ActionContext对象。
Map<String, Object> getParameters()
返回一个包含所有HttpServletRequest参数信息的Map对象。
Map<String, Object> getSession()
返回一个Map类型的HttpSession对象。
void setApplication(Map<String, Object> application)
 设置Application上下文。
void setSession(Map<String, Object> session)
设置一个Map类型的Session值 。

PS:通过对这三种方式的使用,可以发现通过实现特定接口和使用ServletActionContext类,Action是与Servlet API进行直接耦合的,这样并不利于程序解耦。所以开发中建议优先使用ActionContext。

PS:虽然这样,在控制器与Servlet API解耦了,但是在Struts2中肯定有一部分代码还是和Servlet API有耦合,这是毋庸置疑的。如果我们只是需要使用Servlet API中域对象中的域(键值对,存放数据的),那么就使用ServletContext,如果需要使用除了域之外的其他东西,那么还是要使用ServletActionContext的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表