Struts2 ActionContext.getApplication()方法:獲取Map型別的application物件

2020-07-16 10:04:58
與獲取 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 容器執行,方便測試程式。