亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Struts2訪問Servlet的三種方式

發布時間:2020-10-24 11:30:45 來源:腳本之家 閱讀:162 作者:Switch_vov 欄目:編程語言

基本介紹

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

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的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

龙南县| 沛县| 承德市| 怀集县| 玉林市| 乐都县| 鄢陵县| 磴口县| 中江县| 襄垣县| 舞钢市| 北流市| 西和县| 饶阳县| 泗水县| 甘孜县| 岳普湖县| 濉溪县| 西充县| 玉树县| 广宗县| 尚志市| 嘉善县| 铜陵市| 龙井市| 宣汉县| 仪陇县| 田东县| 东宁县| 石柱| 兴业县| 南京市| 海淀区| 青川县| 岱山县| 台北市| 仪征市| 阿克苏市| 河源市| 稻城县| 阳城县|