技术员联盟提供win764位系统下载,win10,win7,xp,装机纯净版,64位旗舰版,绿色软件,免费软件下载基地!

当前位置:主页 > 教程 > 服务器类 >

Struts2访问Servlet的三种方法

来源:技术员联盟┆发布时间:2017-08-12 18:06┆点击:

  在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类。

  思维导图

Struts2访问Servlet的三种方法

实现特定接口访问

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; } }