ActionContext和ServletActionContext

來源:互聯網
上載者:User
Struts2.1 ActionContext上下文
(如何擷取request session等對象)


struts2.1
2010-06-07 20:56:13
閱讀9

評論0


字型大小:大

js-fcurrent fc05">小

ActionContext(Action上下文)

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”);

為了實現這個功能,我們用了三個步驟:

1、取得我們當前的ActionContext對象
context,ActionContext是個什麼冬冬?

2、從context對象裡擷取我們所有的請求參數,取得的卻是一個Map對象
params?

3、居然可以從我們的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);

}

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相關對
象訪問的功能,它可以取得的對象有:

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

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

3、javax.servlet.ServletContext:Servlet
上下文資訊

4、javax.servlet.ServletConfig:Servlet設定物件

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

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

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

1、取得
HttpServletRequest對象:

HttpServletRequest
request = ServletActionContext. getRequest();

2、取得HttpSession對象:

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

ServletActionContext和ActionContext有著一些重複的功
能,在我們的Action中,該如何去抉擇呢?我們遵循的原則是:如果ActionContext能夠實現我們的功能,那最好就不要使用
ServletActionContext,讓我們的Action盡量不要直接去訪問JavaServlet的相關對象。在使用
ActionContext時有一點要注意:不要在Action的建構函式裡使用ActionContext.getContext(),因為這個時候
ActionContext裡的一些值也許沒有設定,這時通過ActionContext取得的值也許是null。

 

轉自: http://hi.baidu.com/ljmybfq/blog/item/45549c00884f5f16738b651a.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.