您好,登錄后才能下訂單哦!
基本介紹
在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的。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。