真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Struts2訪問Servlet的三種方式

基本介紹

創(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)圖

Struts2訪問Servlet的三種方式

實現(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 
    Map sessionMap = 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 getApplication()
返回一個Application級的Map對象。
static ActionContext getContext()
獲取當(dāng)前線程的ActionContext對象。
Map getParameters()
返回一個包含所有HttpServletRequest參數(shù)信息的Map對象。
Map getSession()
返回一個Map類型的HttpSession對象。
void setApplication(Map application)
 設(shè)置Application上下文。
void setSession(Map session)
設(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)。


當(dāng)前名稱:Struts2訪問Servlet的三種方式
本文網(wǎng)址:http://weahome.cn/article/poedjs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部