天天看點

Struts2 ActionContext與ServletActionContext

    我們知道struts2接受用戶端請求,在Action中進行處理後,将視圖結果傳回。struts2容器自身不依賴于web容器,不用和servlet對象中的請求(request)、響應(response)進行關聯,對于請求的參數,通過paramerInterceptor将參數封裝在Action中,然後通過調用get、set方法将參數值設定進Action之中。如果僅僅擷取參數,可能有時候滿足不了開發的需求,有時我們要擷取request或者response中的資訊,要對其進行設定、處理。

一、ActionConext(Action執行的上下文,通過它可以擷取參數、會話、local資訊、servletContext等)

   它是儲存在ThreadLocal中,線程是安全的,每次執行Action之前就會建立唯一的ActionContext執行個體,由于Action是運作在多線程中,那麼就可以在任意Action中調用它。

 擷取session:

  Map session=ActionContext.getContext().getSession();

request擷取頁面參數:  

  Map map=ActionContext.getContext().getParameters();//擷取用戶端參數并封裝成MAP

  String username=map.get("username");//這裡就獲得了用戶端參數;

   提示:這裡的session資訊以及用戶端參數都被封裝成了Map類型,struts2考慮不與底層servlet API打交道,那麼對很多web的相關對象進行封裝,這樣可以達到Action與web層解耦。                         

 二、ServletActionContext(ActionContext的子類,提供直接與servlet中Session、response、request、config、pageContext對象通路,當然也有父類的一些特性在可以通路Action中的資訊、以及值棧中的資訊)

  擷取HttpRequest對象:HttpServletRequest request = ServletActionContext. getRequest();

  擷取HttpSession對象:HttpSession session = ServletActionContext. getRequest().getSession();

總結:不難看出,兩者之間還是存在很多共同功能,那麼我們還是根據自己的需求進行選擇,能用ActionContext對象滿足就盡量使用ActionContext,避免讓我們直接去通路Servlet對象。另外,不要在Action還沒執行個體化的時候去通過ActionContext調用方法,因為Action執行個體在ActionContext執行個體之前建立,ActionContext中一些值還沒有設定,會傳回null。