Struts2中的ActionContext

ActionContext介紹

經過上面用戶註冊例子的學習,咱們知道Xwork與Web無關性,咱們的Action不用去依賴於任何Web容器,不用和那些JavaServlet複雜的請求(Request)、響應(Response)關聯在一塊兒。對請求(Request)的參數(Param),可使用攔截器框架自動調用一些get()和set()方法設置到對應的Action的字段中。可是,僅僅取得請求參數的值就能徹底知足咱們的功能要求嗎?不,在Web應用程序開發中,除了將請求參數自動設置到Action的字段中,咱們每每也須要在Action裏直接獲取請求(Request)或會話(Session)的一些信息,甚至須要直接對JavaServlet Http的請求(HttpServletRequest)、響應(HttpServletResponse)操做。

帶着這些問題,咱們來看看下面的一個功能需求:

咱們須要在Action中取得request請求參數「username」的值:

ActionContext context = ActionContext.getContext();

Map params = context.getParameters();

String username = (String) params.get(「username」);

爲了實現這個功能,咱們用了三個步驟:



一、取得咱們當前的ActionContext對象context,ActionContext是個什麼鼕鼕?

二、從context對象裏獲取咱們全部的請求參數,取得的倒是一個Map對象params?

三、竟然能夠從咱們的Map對象params裏獲取咱們須要的request請求參數「username」的值。

ActionContext(com.opensymphony.xwork.ActionContext)是Action執行時的上下文,上下文能夠看做是一個容器(其實咱們這裏的容器就是一個Map而已),它存放放的是Action在執行時須要用到的對象,好比:在使用WebWork時,咱們的上下文放有請求的參數(Parameter)、會話(Session)、Servlet上下文(ServletContext)、本地化(Locale)信息等。

在每次執行Action以前都會建立新的ActionContext,ActionContext是線程安全的,也就是說在同一個線程裏ActionContext裏的屬性是惟一的,這樣個人Action就能夠在多線程中使用。

咱們能夠經過ActionContext的靜態方法:ActionContext.getContext()來取得當前的ActionContext對象,咱們看看這段代碼:

public static ActionContext getContext() {

ActionContext context = (ActionContext) actionContext.get();


if (context == null) {

OgnlValueStack vs = new OgnlValueStack();

context = new ActionContext(vs.getContext());

setContext(context);

}java

return context;

}

通常狀況,咱們的ActionContext都是經過:ActionContext context = (ActionContext) actionContext.get();來獲取的。咱們再來看看這裏的actionContext對象的建立:static ThreadLocal actionContext = new ActionContextThreadLocal();,ActionContextThreadLocal是實現ThreadLocal的一個內部類。ThreadLocal能夠命名爲「線程局部變量」,它爲每個使用該變量的線程都提供一個變量值的副本,使每個線程均可以獨立地改變本身的副本,而不會和其它線程的副本衝突。這樣,咱們ActionContext裏的屬性只會在對應的當前請求線程中可見,從而保證它是線程安全的。

下面咱們看看怎麼經過ActionContext取得咱們的HttpSession:

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

原來咱們取得的session倒是Map類型的對象,這是爲何?原來,咱們的WebWork框架將與Web相關的不少對象從新進行了包裝,好比這裏就將HttpSession對象從新包裝成了一個Map對象,供咱們的Action使用,而不用直接和底層的HttpSession打交道。也正是框架的包裝,讓咱們的Actoion能夠徹底的和Web層解藕。

若是咱們的Action須要直接與JavaServlet的HttpSession、HttpServletRequest等一些對象進行操做,咱們又該如何處理?請看下面的ServletActionContext。

ServletActionContext

ServletActionContext(com.opensymphony.webwork. ServletActionContext),這個類直接繼承了咱們上面介紹的ActionContext,它提供了直接與JavaServlet相關對象訪問的功能,它能夠取得的對象有:

一、javax.servlet.http.HttpServletRequest:HTTPservlet請求對象

二、javax.servlet.http.HttpServletResponse;:HTTPservlet相應對象

三、javax.servlet.ServletContext:Servlet 上下文信息

四、javax.servlet.ServletConfig:Servlet配置對象

五、javax.servlet.jsp.PageContext:Http頁面上下文

ServletActionContext除了提供了上面這些對象訪問,它固然也繼承了它父類ActionContex的不少功能,好比:對OgnlValueStack、Action名字等的訪問。

下面咱們看看幾個簡單的例子,讓咱們瞭解如何從ServletActionContext裏取得JavaServlet的相關對象:

一、取得HttpServletRequest對象:

HttpServletRequest request = ServletActionContext. getRequest();

二、取得HttpSession對象:web


HttpSession session = ServletActionContext. getRequest().getSession();

ServletActionContext和ActionContext有着一些重複的功能,在咱們的Action中,該如何去抉擇呢?咱們遵循的原則是:若是ActionContext可以實現咱們的功能,那最好就不要使用ServletActionContext,讓咱們的Action儘可能不要直接去訪問JavaServlet的相關對象。在使用ActionContext時有一點要注意:不要在Action的構造函數裏使用ActionContext.getContext(),由於這個時候ActionContext裏的一些值也許沒有設置,這時經過ActionContext取得的值也許是null。安全

相關文章
相關標籤/搜索