Struts2 之 Action 類訪問 WEB 資源
阿新 • • 發佈:2018-03-30
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)
public Map getSession()
方法,Context,Params 對應的方法也一樣,但對於 request 需要使用public Object get(Object key)
方法傳遞 request 參數實現 - 實現 XxxAware 接口(方法 2):比如實現 RequestAware 接口並實現其
setRequest()
- 使用 ActionContext(方法 1)
- 使用 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 資源