基本介紹
創(chuàng)新互聯(lián)公司是一家專業(yè)提供徐匯企業(yè)網(wǎng)站建設(shè),專注與做網(wǎng)站、網(wǎng)站建設(shè)、html5、小程序制作等業(yè)務(wù)。10年已為徐匯眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
在Struts2中,Action并沒有直接和Servlet API耦合。雖然Struts2 中的Action訪問Servlet API麻煩一些,但是這卻是Struts2中Action的重要改良之一,方便Action進(jìn)行單元測試。
盡管Action和Servlet API解耦會帶來很多好處,然而在Action中完全不訪問Servlet API幾乎是不可能的,在實現(xiàn)業(yè)務(wù)邏輯時,經(jīng)常要訪問Servlet中的對象,如request、session和application等 。
在Struts2中,訪問Servlet API有3種方法,分別是實現(xiàn)特定接口,通過ServletActionContext類,通過ActionContext類。
思維導(dǎo)圖
實現(xiàn)特定接口訪問
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 * 它里面提供了對應(yīng)的靜態(tài)方法,可以直接獲取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對象已經(jīng)不是原來tomcat提供的了,而是被struts2框架包裝過了。 * 包裝使用的是裝飾者模式。 * 裝飾者模式的作用是對方法進(jìn)行增強(qiáng)。 * * @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(); 獲取的是請求參數(shù) */ 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域中存入數(shù)據(jù) * 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(); //存入數(shù)據(jù) session.setAttribute("sessionAttr", "hello session attr"); session.getId(); //2.獲取ServletContext ServletContext application = ServletActionContext.getServletContext(); application.getRealPath("/WEB-INF/uploads"); //存入數(shù)據(jù) application.setAttribute("applicationAttr", "hello application attr"); return SUCCESS; } /** * 使用ActionContext類中的getSession()和getApplication()獲取到的map來往map中存入數(shù)據(jù) * 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 MapsessionMap = context.getSession(); sessionMap.put("sessionAttr", "hello session map"); //3.獲取applicationMap Map 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) |
通過參數(shù)key來查找當(dāng)前ActionContext中的值。 |
Map |
返回一個Application級的Map對象。 |
static ActionContext getContext() |
獲取當(dāng)前線程的ActionContext對象。 |
Map |
返回一個包含所有HttpServletRequest參數(shù)信息的Map對象。 |
Map |
返回一個Map類型的HttpSession對象。 |
void setApplication(Map |
設(shè)置Application上下文。 |
void setSession(Map |
設(shè)置一個Map類型的Session值 。 |
PS:通過對這三種方式的使用,可以發(fā)現(xiàn)通過實現(xiàn)特定接口和使用ServletActionContext類,Action是與Servlet API進(jìn)行直接耦合的,這樣并不利于程序解耦。所以開發(fā)中建議優(yōu)先使用ActionContext。
PS:雖然這樣,在控制器與Servlet API解耦了,但是在Struts2中肯定有一部分代碼還是和Servlet API有耦合,這是毋庸置疑的。如果我們只是需要使用Servlet API中域?qū)ο笾械挠颍ㄦI值對,存放數(shù)據(jù)的),那么就使用ServletContext,如果需要使用除了域之外的其他東西,那么還是要使用ServletActionContext的。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。