1. 程式人生 > >Struts中ActionContext和ServletActionContext的比較

Struts中ActionContext和ServletActionContext的比較

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

一、ActionContext
在Struts2開發中除了將請求引數自動設定到Action的欄位中,往往也需要在Action裡直接獲取請求(Request)或會話(Session)的一些資訊,甚至需要直接對JavaServlet Http的請求(HttpServletRequest)和響應(HttpServletResponse)操作。


ActionContext(com.opensymphony.xwork.ActionContext)是Action執行時的上下文,上下文可以看作是一個容器(其實我們這裡的容器就是一個Map而已),它存放的是Action在執行時需要用到的物件。一般情況我們的ActionContext都是通過:ActionContext context = (ActionContext) actionContext.get()來獲取的。


actionContext物件的建立過程是static ThreadLocal actionContext = new ActionContextThreadLocal()。

ActionContextThreadLocal是實現ThreadLocal的一個內部類。ThreadLocal可以命名為"執行緒區域性變數",它為每一個使用該變數的執行緒都提供一個變數值的副本,使每一個執行緒都可以獨立地改變自己的副本,而不會和其它執行緒的副本衝突。這樣ActionContext裡的屬性只會在對應的當前請求執行緒中可見,從而保證它是執行緒安全的。

 

通過ActionContext取得相關物件
取得session:Map session = ActionContext.getContext().getSession();
取得request:Map request = (Map)ActionContext.getContext().get("request");
在Action中取得request請求引數"username"的值:
若有一個提交過來的username,那麼通過param.get("username")可以取值。值得注意的是param.get("username")是一個String陣列,Struts就是這樣設計的。既然是String陣列就需要這樣取值:
String value[] = (String[])param.get("username");
String username = "";
for(int i=0;i<value.length;i++)
{
 username +=value[i];
}


二 、ServletActionContext
ServletActionContext(com.opensymphony.webwork.ServletActionContext),該類直接繼承了ActionContext提供直接與Servlet相關物件訪問的功能,故ServletActionContext也執行緒安全。可取得物件:
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裡取得Servlet的相關物件
取得HttpServletRequest物件: HttpServletRequest request = ServletActionContext. getRequest();
取得HttpSession物件: HttpSession session = ServletActionContext. getRequest().getSession();


三 、ServletActionContext和ActionContext聯絡
ServletActionContext和ActionContext有著一些重複的功能,該如何去抉擇?
遵循的原則是:ActionContext能夠實現我們的功能,最好就不要使用ServletActionContext,讓Action儘量不要直接去訪問Servlet的相關物件。


四 、注意點
不要在Action的建構函式裡使用ActionContext.getContext(),因為此時ActionContext裡的一些值也許沒有設定,這時通過ActionContext取得的值也許是null。同樣HttpServletRequest req = ServletActionContext.getRequest()也不要放在建構函式中,也不要直接將req作為類變數給其賦值。

原因是static ThreadLocal actionContext = new ActionContextThreadLocal()可以看出ActionContext是執行緒安全的,而ServletActionContext繼承自ActionContext故ServletActionContext也執行緒安全。執行緒安全要求每個執行緒都獨立進行,故req的建立也要求獨立進行,故ServletActionContext.getRequest()不要放在建構函式中,也不要直接放在類中,而應放在每個具體方法體中如login(),queryAll(),insert()等,才能保證每次產生物件時獨立的建立了一個req。


原帖地址:http://blog.sina.com.cn/s/blog_680e2f5b01015bkq.html


           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述