1. 程式人生 > >Struts2 之 Action 類訪問 WEB 資源

Struts2 之 Action 類訪問 WEB 資源

PV response 一個 pac work 避免 title xtend 發送請求

接著上次博客的內容我繼續分享我所學到的知識,和自己在學習過程中所遇到問題以及解決方案。當然,如果讀者發現任何問題均可以在下方評論告知我,先謝!

在 Action 中訪問 WEB 資源

web 資源

  • 所謂的 WEB 資源是指 HttpServletRequest、HttpServletResponse、ServletContext 等原生的 API,作為 B/S 應用開發的 Controller 必須可以訪問 WEB 資源,比如向域對象中讀寫屬性等操作。

如何訪問 WEB 資源

  • 和 ServletAPI 解耦的方式 為了避免與 ServletAPI 耦合在一起,方便 Action 做單元測試,Struts2 對 HttpServletRequest,HttpSession 和 ServletContext 進行了封裝,構造了 3 個 Map對象來替代這 3 個對象,在Action 中可以使用 HttpServletRequest,HttpServletSession,HttpServletContext 對應的 Map 對象來保存和讀取數據
    • 使用 ActionContext(方法 1)
      : ActionContext 是 Action 執行的上下文對象,在 ActionContext 中保存了 Action 執行所需要的所有對象,Parameters,request,session 等。如獲取 HttpSession 對應的 Map 對象使用 public Map getSession() 方法,Context,Params 對應的方法也一樣,但對於 request 需要使用 public Object get(Object key) 方法傳遞 request 參數實現
    • 實現 XxxAware 接口(方法 2):比如實現 RequestAware 接口並實現其 setRequest()
      方法,這樣就可以在所有的 action 方法中去調用該 requestMap。
  • 使用 ActionContext 獲取域對象的代碼演示
    • 從 index.jsp 頁面發送請求到 showPage.jsp,並將該請求交由 Struts 的 Action 類ObjectAction.java 處理請求
    • 在 ObjectAction.java 中由 ActionContext 獲取域對象並為其添加屬性值,將請求轉發到 showPage.jsp
    • 在 showPage.jsp 頁面我們可以獲取到各個域對象的值
    • index.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>Handle</title>
      </head>
      <body>
      -- 傳遞 name 參數,可以在 Action 類中由 Params 域對象獲得其值,以測試 Params 域對象
        <a href="showPage.action?name=bgZyy">Application</a>
      </body>
      </html>
    • ObjectAction.java

      package com.request.test;
      import com.opensymphony.xwork2.ActionContext;
      import java.util.Map;
      public class ObjectAction {
      
          public String print() {
      //        獲取 ActionContext
              ActionContext actionContext = ActionContext.getContext();
      //        獲取 action 域對象對應的 Map
              Map<String, Object> applicationMap = actionContext.getApplication();
      //        為 application 賦值
              applicationMap.put("applicationMap", "applicationMapValue");
      //        獲取 Session 對應的 Map
              Map<String, Object> sessionMap = actionContext.getSession();
      //        為 sessionMap 賦值
              sessionMap.put("sessionMap", "sessionMapValue");
      //        獲取 request 對應的 Map,沒有對應的 getRequest() 方法,所以使用 get("request") 方法
              Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
      //        為 requestMap 賦值
              requestMap.put("requestMap", "requestMapValue");
      //        獲取 params 對應的 Map
              Map<String, Object> paramsMap = actionContext.getParameters();
      //        獲取 params 的參數值
              String[] params = (String[]) paramsMap.get("name");
      //        將參數值打印到控制臺
              System.out.println(params[0]);
              return "success";
          }
      }
    • struts.xml (只展示 package 節點即可)

      <package name="showValue" extends="struts-default">
          <action name="showPage" class="com.request.test.ObjectAction" method="print">
              <result name="success">/showPage.jsp</result>
          </action>
      </package>
    • showPage.jsp(只展示 body 標簽內容)

      <%--獲取到 application 域對象的值--%>
      ${applicationScope.applicationMap}<br>
      <%--獲取到 session 域對象的值--%>
      ${sessionScope.sessionMap}<br>
      <%--獲取 request 域對象的值--%>
      ${requestScope.requestMap}
    • 細節以及需要註意(可將圖片拖至瀏覽器新的標簽頁查看大圖)

    • 技術分享圖片

  • 使用 XxxAware 接口訪問 WEB 資源
    • 和使用 ActionContext 一樣,在 index.jsp 頁面發送請求到 ObjectAction.java 由 print2() 方法處理
    • 在 ObjectAction.java 中的 print2() 方法中給域對象賦值,並獲取傳入的 parameter 的值
    • 最後在 showPage.jsp 中獲得域對象的值,為了和上一個區分我們給每個輸出的值加上符號以區分。
    • index.jsp(展示 body 標簽部分)

      <a href="showPage2.action?name=smZyy">ToPage2</a>
    • ObjectAction.java

      package com.request.test;
      
      import com.opensymphony.xwork2.ActionContext;
      import org.apache.struts2.interceptor.ApplicationAware;
      import org.apache.struts2.interceptor.ParameterAware;
      import org.apache.struts2.interceptor.RequestAware;
      import org.apache.struts2.interceptor.SessionAware;
      
      import java.util.Map;
      
      public class ObjectAction implements RequestAware, SessionAware, ApplicationAware, ParameterAware{
      
          private Map<String, Object> requestMap;
          private Map<String, Object> sessionMap;
          private Map<String, Object> applicationMap;
          private Map<String, String[]> parameterMap;
      
      //    showPage.action 執行所需的方法
          public String print2() {
              applicationMap.put("applicationMap", "applicationMapVal===");
              requestMap.put("requestMap", "requestMapVal===");
              sessionMap.put("sessionMap", "sessionMapVal===");
              String[] name = parameterMap.get("name");
              System.out.println(name[0] + "====");
              return "success";
          }
      
          @Override
          public void setApplication(Map<String, Object> map) {
              this.applicationMap = map;
          }
      
          @Override
          public void setParameters(Map<String, String[]> map) {
              this.parameterMap = map;
          }
      
          @Override
          public void setRequest(Map<String, Object> map) {
              this.requestMap = map;
          }
      
          @Override
          public void setSession(Map<String, Object> map) {
              this.sessionMap = map;
          }
      }
    • struts.xml(展示 package 節點部分)

      <package name="showValue" extends="struts-default">
          <action name="showPage2" class="com.request.test.ObjectAction" method="print2">
              <result name="success">/showPage.jsp</result>
          </action>
      </package>
    • showPage.jsp (同上,一點都沒變)

選用建議

  通過對上述兩種獲取 WEB 資源的方法,我們可以知道第一種方法假若有好多的 action 方法需要調用域對象那麽每個方法都必須實現,而第二種方法只需實現一次,所以在實際開發中視情況而選擇對應的方法去實現。

  • 和 ServletAPI 耦合的方式 可以訪問到更多的 ServletAPI ,且可以調用原生的方法
    • 使用 ServletActionContext
    • 實現 ServletXxxAware 接口

  此中實現方式類似於上述實現方式,我就不在啰嗦。

Struts2 之 Action 類訪問 WEB 資源