Struts2中ActionContext介绍
來源:http://blog.csdn.net/alex197963/article/details/2219912
在Web應用程序開發中,除了將請求參數自動設置到Action的字段中,我們往往也需要在Action里直接獲取請求(Request)或會話(Session)的一些信息,甚至需要直接對JavaServlet Http的請求(HttpServletRequest),響應(HttpServletResponse)操作。
我們需要在Action中取得request請求參數"username"的值:
一般情況,我們的ActionContext都是通過:
來獲取的(詳細見ActionContext.class)。我們再來看看這里的actionContext對象的創建:
static ThreadLocal actionContext = new ActionContextThreadLocal();ActionContextThreadLocal是實現ThreadLocal的一個內部類。ThreadLocal可以命名為“線程局部變量”,它為每一個使用該變量的線程都提供一個變量值的副本,使每一個線程都可以獨立地改變自己的副本,而不會和其它線程的副本沖突。這樣,我們ActionContext里的屬性只會在對應的當前請求線程中可見,從而保證它是線程安全的。
下面我們看看怎么通過ActionContext取得我們的HttpSession:
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里取得JavaServlet的相關對象:
1, 取得HttpServletRequest對象:
HttpSession session = ServletActionContext. getRequest().getSession();ServletActionContext和ActionContext有著一些重復的功能,在我們的Action中,該如何去抉擇呢?
我們遵循的原則是:如果ActionContext能夠實現我們的功能,那最好就不要使用ServletActionContext,讓我們的Action盡量不要直接去訪問JavaServlet的相關對象。
在使用ActionContext時有一點要注意:不要在Action的構造函數里使用ActionContext.getContext(),因為這個時候ActionContext里的一些值也許沒有設置,這時通過ActionContext取得的值也許是null。
如果我要取得Servlet API中的一些對象,如request,response或session等,應該怎么做?這里的execute不像Struts 1.x的那樣在參數中引入。開發Web應用程序當然免不了跟這些對象打交道。在Strutx 2.0你可以有兩種方式獲得這些對象:非IoC(控制反轉Inversion of Control)方式和IoC方式。
非IoC方式
要獲得上述對象,關鍵Struts 2.0中com.opensymphony.xwork2.ActionContext類。我們可以通過它的靜態方法getContext()獲取當前Action的上下文對象。另外,org.apache.struts2.ServletActionContext 作為輔助類(Helper Class),可以幫助您快捷地獲得這幾個對象。
NonIoCServlet.java
IoC方式
要使用IoC方式,我們首先要告訴IoC容器(Container)想取得某個對象的意愿,通過實現相應的接口做到這點。具體實現,請參 IocServlet.java。
IoCServlet.java
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>Hello World!</title> </head> <body> <h2> <s:property value="message" escape="false"/> <br>Message from session: <s:property value="#session.msg"/> </h2> </body> </html> struts.xml中NonIocServlet和IoCServlet Action的配置
<action name="NonIoCServlet" class="tutorial.NonIoCServlet"> <result>/Servlet.jsp</result> </action> <action name="IoCServlet" class="tutorial.IoCServlet"> <result>/Servlet.jsp</result> </action>
運行Tomcat,在瀏覽器地址欄中鍵入http://localhost:8080/Struts2_Action/NonIoCServlet.action?msg=Hello%20World! 或http://localhost:8080/Struts2_Action/IoCServlet.action?msg=Hello%20World!
在Servlet.jsp中,我用了兩次property標志,第一次將escape設為false為了在JSP中輸出<br>轉行,第二次的value中的OGNL為"#session.msg",它的作用與session.getAttribute("msg")等同.
總結
以上是生活随笔為你收集整理的Struts2中ActionContext介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线程WAITING--BlockingQ
- 下一篇: 查找N个数中第K大的数