與獲取 session 的方法相類似,ActionContext 物件同樣為獲取 Map 型別的 application 提供了單獨的方法。
語法:
public Map getApplication()
ActionContext 類的 getApplication() 方法返回的是 Map 物件,這個 Map 物件的範圍將作用於 ServletContext 範圍之中。
範例
本範例應用 getApplication() 方法獲取 Map 型別的 application,關鍵程式碼如下:
//Map型別的application
private Map<String,Object>application; //獲取Map型別的application
application = context.getApplication();
典型應用
建立 Web 專案,通過 ActionContext 物件獲取 Map 型別的 request、session、application 分別為這 3 個物件設定一個 info 屬性並賦值,然後在 JSP 頁面中驗證 info 屬性的作用域。
在 web.xml 檔案中註冊 Struts2 提供的過濾器,類名為 org.apache.struts2.dispatcher.ng.filter.StrutsPrepare AndExecuteFilter,關鍵程式碼如下:
<!--Struts2過濾器-->
<filter>
<!--過濾器名稱-->
<filter-name>struts2</filter-name>
<!--過濾器類-->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilt
er</filter-class>
</filter>
<!--Struts2過濾器對映-->
<filter-mapping>
<!--過濾器名稱-->
<filter-name>struts2</filter-name>
<!--過濾器對映-->
<url-pattern>/*</url-pattern>
</filter-mapping>
建立名為 TestAction 的類,此類繼承於 ActionSupport 類,是一個 Action 物件。在這個類中分別建立 Map 型別的 request、session、application 並在 execute() 方法中對其進行操作,關鍵程式碼如下:
package com.lyq.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;/**
*@author zs
*Map型別的request、session、application
*/
public class TestAction extends ActionSupport{
private static final long serialVersionUID = 1L; //Map型別的request
private Map<String,Object>request; //Map型別的session
private Map<String,Object>session; //Map型別的application
private Map<String,Object>application; //構造方法
@SuppressWarnings("unchecked")
public TestAction(){ //獲取ActionContext物件
ActionContext context = ActionContext.getContext(); //獲取Map型別的request
request = (Map<String,Object>)context.get("request"); //獲取Map型別的session
session = context.getSession(); //獲取Map型別的application
application = context.getApplication();
}/**
*請求處理方法
*@return String
*/
public String execute()throws Exception{ //字串資訊
String info = "C語言中文網"; //向request新增資訊
request.put("info",info); //向session新增資訊
session.put("info",info); //向application新增資訊
application.put("info",info); //成功返回
return SUCCESS;
}
}
在 TestAction 類中建立了 Map 型別的 request、session、application 的屬性,並在 TestAction 類的構造方法中對其進行範例化,在 TestAction 類的構造方法中,首先通過 ActionContext 自身範例化一個 ActionContext 範例,然後通過這個範例物件建立獲取 Map 型別的 request 物件、session 物件、application 物件。
技巧:本範例在定義 Map 型別的 request 屬性時使用了泛型,由於 ActionContext.getContext() 的返回值並不與範例中定義的相一致,所以,開發工具會在"(Map<String,Object>)context.get("request")"程式碼處提示警告資訊。由於這些警告並不是錯誤,此時,可以通過 "@SuppressWarnings("unchecked")" 程式碼忽略這些警告。
在請求處理 execute() 方法中,本範例定義了一個字串物件 info,然後將這個物件儲存到 Map 型別的 request 屬性、session 屬性、application 屬性中,其賦值方式通過 Map 物件的 key 與 value 進行賦值,在賦值後返回 SUCCESS。
在 Web 專案的原始碼資料夾(MyEclipse 中預設為 src 目錄)中建立名為 struts.xml 的組態檔,在此組態檔中設定 TestAction,關鍵程式碼如下:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.devMode"value="true"/>
<!--宣告包-->
<package name="myPackage"extends="struts-default">
<!--定義action-->
<action name="testAction"class="com.lyq.action.TestAction">
<!--處理成功的對映頁面-->
<result>success.jsp</result>
</action>
</package>
</struts>
組態檔 struts.xml 的設定非常簡單,將 TestAction 的 URL 對映為 "testAction",其處理成功的返回結果將對映到 success.jsp 頁面。
建立 TestAction 處理成功的返回頁面 success.jsp,在此頁面中分別從 JSP 內建物件 request、session、application 中獲取 info 屬性的值,並將這些值輸出到 JSP 頁面中,關鍵程式碼如下:
<body>
request範圍內的info值:
<font color="red"><%=request.getAttribute("info"));%></font>
<br>
session範圍內的info值:
<font color="red"><%=session.getAttribute("info"));%></font>
<br>
application範圍內的info值:
<font color="red"><%=application.getAttribute("info"));%></font>
<br>
</body>
說明:可以使用 getAttribute() 方法從 JSP 內建物件 request、session、application 中獲取資訊。
建立程式的首頁 index.jsp,在此頁面中編寫一個超級連結,將這個超級連結指向 testAction,關鍵程式碼如下:
<body>
<a href="testAction.action">Map型別的request、session、application</a>
<br>
</body>
執行範例後,進入程式首頁index.jsp。
單擊頁面中的“Map 型別的 request、session、application”超級連結後,請求交給 TestAction 進行處理,在處理後返回 success.jsp 頁面,執行效果如下:
request範圍內的info值:C語言中文網
session範圍內的info值:C語言中文網
application範圍內的info值:C語言中文網
雖然 TestAction 的處理成功,結果返回 success.jsp 頁面,但由於 Struts2 預設返回結果的型別是請求轉發,而不是重定向,所以,瀏覽器位址列中依然為 "testAction.action",而不是 "success.jsp"。
我們知道 request 的作用範圍在兩個頁面之中,當再次開啟其他頁面後,request 的生命週期結束。此時,將瀏覽器位址列中的 "testAction.action" 更改為 "success.jsp" 單擊“轉到”按鈕後,由於瀏覽器已經開啟了第三個頁面,所以,request 的生命週期結束,可以看到 request 物件中的 info 屬性值為 "null",如下所示。
request範圍內的info值:null
session範圍內的info值:C語言中文網
application範圍內的info值:C語言中文網
session 的生命週期位於整個 session 之中,只有在 session 超時或瀏覽器關閉時,session 的生命週期才會結束,此時,重新開啟一個瀏覽器,並在瀏覽器位址列中輸入 success.jsp 頁面的存取地址,驗證 session 生命週期,如下所示: session 的生命週期結束,session 範圍內的 info 值為 "null"。
request範圍內的info值:null
session範圍內的info值:null
application範圍內的info值:C語言中文網
雖然 request 與 session 中的值都變成了 "null",但 application 中的值依然存在,原因是由於 application 的生命週期作用於伺服器應用之中,只有 Web 服務在重新啟動或關閉的情況下它的生命週期才會結束。
從上面這個範例可以看出,Struts2 中所使用 Map 型別的 request 物件、session 物件與 application 物件能夠與 Servlet API 進行互動,而且經過 Struts2 的內部處理,它的 Servlet API 中的 HttpServletRequest、HttpSession 與 ServletContext 是同步的。
技巧:在應用 Struts2 的專案開發之中,盡量使用 Struts2 中提供的 Map 型別的 request 物件、session 物件與 application 物件,原因是它與 Servlet API 是一種鬆耦合的狀態,可以獨立於 Web 容器執行,方便測試程式。