前言
之前已經給大家介紹了關於Struts2的入門教程,本文接著上次的內容我繼續分享我所學到的知識,和自己在學習過程中所遇到問題以及解決方案。當然,如果讀者發現任何問題均可以在下方評論告知我,先謝
在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 對象來保存和讀取數據
public Object get(Object key)方法傳遞request 參數實現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" rel="external nofollow" >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" 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" rel="external nofollow" >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" method="print2"> <result name="success">/showPage.jsp</result> </action></package>
showPage.jsp (同上,一點都沒變)
選用建議
通過對上述兩種獲取WEB 資源的方法,我們可以知道第一種方法假若有好多的action 方法需要調用域對像那麼每個方法都必須實現,而第二種方法只需實現一次,所以在實際開發中視情況而選擇對應的方法去實現。
和ServletAPI 耦合的方式:可以訪問到更多的ServletAPI ,且可以調用原生的方法
此中實現方式類似於上述實現方式,我就不在嗦。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。