Struts中ActionContext和ServletActionContext的比較


一、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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM