ActionContext和ServletActionContext小結(jié)1. ActionContext 在Struts2開發(fā)中,除了將請(qǐng)求參數(shù)自動(dòng)設(shè)置到Action的字段中,我們往往也需要在Action里直接獲取請(qǐng)求(Request)或會(huì)話 (Session)的一些信息,甚至需要直接對(duì)JavaServlet Http的請(qǐng)求(HttpServletRequest),響應(yīng)(HttpServletResponse)操作. 我們需要在Action中取得request請(qǐng)求參數(shù)"username"的值: ActionContext context = ActionContext.getContext(); static ThreadLocal actionContext = new ActionContextThreadLocal(); ActionContextThreadLocal是實(shí)現(xiàn)ThreadLocal的一個(gè)內(nèi)部類.ThreadLocal可以命名為"線程局部變 量",它為每一個(gè)使用該變量的線程都提供一個(gè)變量值的副本,使每一個(gè)線程都可以獨(dú)立地改變自己的副本,而不會(huì)和其它線程的副本沖突.這樣,我們 ActionContext里的屬性只會(huì)在對(duì)應(yīng)的當(dāng)前請(qǐng)求線程中可見,從而保證它是線程安全的. 通過ActionContext取得HttpSession: Map session = ActionContext.getContext().getSession(); 2. ServletActionContext ServletActionContext(com.opensymphony.webwork. ServletActionContext),這個(gè)類直接繼承了我們上面介紹的ActionContext,它提供了直接與Servlet相關(guān)對(duì)象訪問的 功能,它可以取得的對(duì)象有: (1)javax.servlet.http.HttpServletRequest : HTTPservlet請(qǐng)求對(duì)象 (2)javax.servlet.http.HttpServletResponse : HTTPservlet相應(yīng)對(duì)象 (3)javax.servlet.ServletContext : Servlet上下文信息 (4)javax.servlet.ServletConfig : Servlet配置對(duì)象 (5)javax.servlet.jsp.PageContext : Http頁面上下文 如何從ServletActionContext里取得Servlet的相關(guān)對(duì)象: <1>取得HttpServletRequest對(duì)象: HttpServletRequest request = ServletActionContext. getRequest(); <2>取得HttpSession對(duì)象: HttpSession session = ServletActionContext. getRequest().getSession(); 3. ServletActionContext和ActionContext聯(lián)系 ServletActionContext和ActionContext有著一些重復(fù)的功能,在我們的Action中,該如何去抉擇呢?我們遵循的 原則是:如果ActionContext能夠?qū)崿F(xiàn)我們的功能,那最好就不要使用ServletActionContext,讓我們的Action盡量不要 直接去訪問Servlet的相關(guān)對(duì)象. 注意:在使用ActionContext時(shí)有一點(diǎn)要注意: 不要在Action的構(gòu)造函數(shù)里使用ActionContext.getContext(),因?yàn)檫@個(gè)時(shí)候ActionContext里的一些值也許沒有 設(shè)置,這時(shí)通過ActionContext取得的值也許是null;同樣,HttpServletRequest req = ServletActionContext.getRequest()也不要放在構(gòu)造函數(shù)中,也不要直接將req作為類變量給其賦值。至于原因,我想是因 為前面講到的static ThreadLocal actionContext = new ActionContextThreadLocal(),從這里我們可以看出ActionContext是線程安全的,而 ServletActionContext繼承自ActionContext,所以ServletActionContext也線程安全,線程安全要求每 個(gè)線程都獨(dú)立進(jìn)行,所以req的創(chuàng)建也要求獨(dú)立進(jìn)行,所以ServletActionContext.getRequest()這句話不要放在構(gòu)造函數(shù) 中,也不要直接放在類中,而應(yīng)該放在每個(gè)具體的方法體中(eg:login()、queryAll()、insert()等),這樣才能保證每次產(chǎn)生對(duì)象 時(shí)獨(dú)立的建立了一個(gè)req。 4. struts2中獲得request、response和session (1)非IoC方式 方法一:使用org.apache.struts2.ActionContext類,通過它的靜態(tài)方法getContext()獲取當(dāng)前Action的上下文對(duì)象。 ActionContext ctx = ActionContext.getContext(); ctx.put("liuwei", "andy"); //request.setAttribute("liuwei", "andy"); HttpServletRequest request = ctx.get(org.apache.struts2.StrutsStatics.HTTP_REQUEST); 方法二:使用org.apache.struts2.ServletActionContext類 public class UserAction extends ActionSupport { public String login() { (2)IoC方式(即使用Struts2 Aware攔截器) 要使用IoC方式,我們首先要告訴IoC容器(Container)想取得某個(gè)對(duì)象的意愿,通過實(shí)現(xiàn)相應(yīng)的接口做到這點(diǎn)。 public class UserAction extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware { private HttpServletRequest request; public void setServletRequest(HttpServletRequest request) { public void setServletResponse(HttpServletResponse response) { public String execute() { |
|
|