国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ActionContext

2019-11-08 20:06:56
字體:
來源:轉載
供稿:網友

ActionContext ActionContext是Action的上下文,Struts2自動在其中保存了一些在Action執行過程中所需的對象,比如session, parameters, locale等。Struts2會根據每個執行HTTP請求的線程來創建對應的ActionContext,即一個線程有一個唯一的ActionContext。因此,使用者可以使用靜態方法ActionContext.getContext()來獲取當前線程的ActionContext,也正是由于這個原因,使用者不用去操心讓Action是線程安全的。

無論如何,ActionContext都是用來存放數據的。Struts2本身會在其中放入不少數據,而使用者也可以放入自己想要的數據。ActionContext本身的數據結構是映射結構,即一個Map,用key來映射value。所以使用者完全可以像使用Map一樣來使用它,或者直接使用Action.getContextMap()方法來對Map進行操作。Struts2本身在其中放入的數據有ActionInvocation、application(即ServletContext)、conversionErrors、Locale、action的name、request的參數、HTTP的Session以及值棧等。完整的列表請參考它的javadoc(本文附錄有對它包含內容的討論)。由于ActionContext的線程唯一和靜態方法就能獲得的特性,使得在非Action類中可以直接獲得它,而不需要等待Action傳入或注入。需要注意的是,它僅在由于request而創建的線程中有效(因為request時才創建對應的ActionContext),而在服務器啟動的線程中(比如fliter的init方法)無效。由于在非Action類中訪問其的方便性,ActionContext也可以用來在非Action類中向jsp傳遞數據(因為JSP也能很方便的訪問它)。

ValueStack與ActionContext的聯系和區別: 相同點:它們都是在一次HTTP請求的范圍內使用的,即它們的生命周期都是一次請求。 不同點:值棧是棧的結構,ActionContext是映射(Map)的結構。 聯系:ValueStack.getContext()方法得到的Map其實就是ActionContext的Map。查看Struts2的源代碼可知(Struts2.3.1.2的org.apache.struts2.dispatcher.ng.PRepareOperations的第79行,createActionContext方法),在創建ActionContext時,就是把ValueStack.getContext()作為ActionContext的構造函數的參數。所以,ValueStack和ActionContext本質上可以互相獲得。 注意:在一些文檔中,會出現把對象存入“stack‘s context”的字樣,其實就是把值存入了ActionContext。所以在閱讀這些文檔時,要看清楚,到底是放入了棧結構(即值棧),還是映射結構(值棧的context,即ActionContext)。 如何獲得ActionContext: 在自定義的攔截器中:使用ActionInvocation.getInvocationContext()或者使用ActionContext.getContext()。 在Action類中:讓攔截器注入或者使用ActionContext.getContext()。 在非Action類中:讓Action類傳遞參數、使用注入機制注入或者使用ActionContext.getContext()。注意:只有運行在request線程中的代碼才能調用ActionContext.getContext(),否則返回的是null。 在JSP中:一般不需要獲得ActionContext本身。 如何向ActionContext中存入值: 在攔截器、Action類、非Action類等Java類中:使用ActionContext.put(Object key, Object value)方法。 在JSP中:標簽默認將值存入ActionContext中(當然,標簽還可以把值存到其他地方)。另外,許多標簽都有var屬性(以前用的是id屬性,現在id屬性已被棄用),這個屬性能向ActionContext存入值,key為var屬性的值,value為標簽的value屬性的值。(有些文檔寫的是向ValueStack的context存入值,其實是一樣的) 如何從ActionContext中讀取值: 在攔截器、Action類、非Action類等Java類中:使用ActionContext.get(Object key)方法。 在JSP中:使用#開頭的Ognl表達式,比如會調用ActionContext.get(“name”)方法。注意:如果某標簽的屬性默認不作為Ognl表達式解析,則需要使用%{}把表達式括起來,于是就會出現類似“%{#name}的表達式”。(“#”的更多用途參見這里) 總之,在JSP中使用ActionContext一方面是由于它是映射結構,另一方面是能讀取Action的一些配置。當你需要為許多Action提供通用的值的話,可以讓每個Action都提供getXXX()方法,但更好的方法是在攔截器或JSP模板中把這些通用的值存放到ActionContext中(因為攔截器或JSP模板往往通用于多個Action)。

一些例子:

Java代碼 // 本類將演示攔截器中對ActionContext的操作 publicclass MyInterceptor extends AbstractInterceptor {

public String intercept(ActionInvocation invocation) throws Exception { // 獲得ActionContext ActionContext actionContext = invocation.getInvocationContext(); // 存入值 Person person = new Person(); actionContext.put("person", person); // 獲取值 Object value = actionContext.get("person"); // 獲取HttpServletRequest HttpServletRequest request = (HttpServletRequest) actionContext.get(StrutsStatics.HTTP_REQUEST); // 獲取request的Map,即HttpServletRequest.getAttribute(...)和HttpServletRequest.setAttribute(...)所操作的值 Map requestMap = (Map) actionContext.get("request"); // 其他代碼 // ...... return invocation.invoke(); }

}

Java代碼 // 本類將演示在Action中對ActionContext進行操作 publicclass MyAction extends ActionSupport {

@Override public String execute() throws Exception { // 獲得值棧 ActionContext actionContext = ActionContext.getContext(); // 存入值 Person person = new Person();// 這是之前例子中定義的類 actionContext.put("person", person); // 獲取值 Object object = actionContext.get("person"); // 其他代碼 // ...... return SUCCESS; }

}

Html代碼


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凤翔县| 临安市| 阿拉善右旗| 抚远县| 贵南县| 子洲县| 游戏| 左权县| 彭州市| 方山县| 白银市| 金阳县| 景谷| 濮阳市| 衡南县| 富源县| 汝南县| 衡山县| 调兵山市| 南汇区| 左云县| 甘泉县| 宜昌市| 大同县| 彭阳县| 突泉县| 丽江市| 马关县| 红原县| 定西市| 万载县| 江陵县| 甘洛县| 稻城县| 安丘市| 辉南县| 手机| 额尔古纳市| 和林格尔县| 盘山县| 华安县|