Struts2學(xué)習教程之Action類如何訪問WEB資源
前言
之前已經(jīng)給大家介紹了關(guān)于Struts2的入門教程,本文接著上次的內(nèi)容我繼續(xù)分享我所學(xué)到的知識,和自己在學(xué)習過程中所遇到問題以及解決方案。當然,如果讀者發(fā)現(xiàn)任何問題均可以在下方評論告知我,先謝
在 Action 中訪問 WEB 資源
web 資源
所謂的 WEB 資源是指 HttpServletRequest、HttpServletResponse、ServletContext 等原生的 API,作為 B/S 應(yīng)用開發(fā)的 Controller 必須可以訪問 WEB 資源,比如向域?qū)ο笾凶x寫屬性等操作。
如何訪問 WEB 資源
和 ServletAPI 解耦的方式 : 為了避免與 ServletAPI 耦合在一起,方便 Action 做單元測試,Struts2 對 HttpServletRequest,HttpSession 和 ServletContext 進行了封裝,構(gòu)造了 3 個 Map對象來替代這 3 個對象,在Action 中可以使用 HttpServletRequest,HttpServletSession,HttpServletContext 對應(yīng)的 Map 對象來保存和讀取數(shù)據(jù)
- 使用 ActionContext(方法 1): ActionContext 是 Action 執(zhí)行的上下文對象,在 ActionContext 中保存了 Action 執(zhí)行所需要的所有對象,Parameters,request,session 等。如獲取 HttpSession 對應(yīng)的 Map 對象使用 public Map getSession() 方法,Context,Params 對應(yīng)的方法也一樣,但對于 request 需要使用
public Object get(Object key)
方法傳遞 request 參數(shù)實現(xiàn) - 實現(xiàn) XxxAware 接口(方法 2):比如實現(xiàn) RequestAware 接口并實現(xiàn)其
setRequest()
方法,這樣就可以在所有的 action 方法中去調(diào)用該 requestMap。
使用 ActionContext 獲取域?qū)ο蟮拇a演示
從 index.jsp 頁面發(fā)送請求到 showPage.jsp,并將該請求交由 Struts 的 Action 類ObjectAction.java 處理請求
在 ObjectAction.java 中由 ActionContext 獲取域?qū)ο蟛槠涮砑訉傩灾担瑢⒄埱筠D(zhuǎn)發(fā)到 showPage.jsp
在 showPage.jsp 頁面我們可以獲取到各個域?qū)ο蟮闹?br />
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Handle</title> </head> <body> -- 傳遞 name 參數(shù),可以在 Action 類中由 Params 域?qū)ο螳@得其值,以測試 Params 域?qū)ο? <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 域?qū)ο髮?yīng)的 Map Map<String, Object> applicationMap = actionContext.getApplication(); // 為 application 賦值 applicationMap.put("applicationMap", "applicationMapValue"); // 獲取 Session 對應(yīng)的 Map Map<String, Object> sessionMap = actionContext.getSession(); // 為 sessionMap 賦值 sessionMap.put("sessionMap", "sessionMapValue"); // 獲取 request 對應(yīng)的 Map,沒有對應(yīng)的 getRequest() 方法,所以使用 get("request") 方法 Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request"); // 為 requestMap 賦值 requestMap.put("requestMap", "requestMapValue"); // 獲取 params 對應(yīng)的 Map Map<String, Object> paramsMap = actionContext.getParameters(); // 獲取 params 的參數(shù)值 String[] params = (String[]) paramsMap.get("name"); // 將參數(shù)值打印到控制臺 System.out.println(params[0]); return "success"; } }
struts.xml (只展示 package 節(jié)點即可)
<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 標簽內(nèi)容)
<%--獲取到 application 域?qū)ο蟮闹?-%> ${applicationScope.applicationMap}<br> <%--獲取到 session 域?qū)ο蟮闹?-%> ${sessionScope.sessionMap}<br> <%--獲取 request 域?qū)ο蟮闹?-%> ${requestScope.requestMap}
細節(jié)以及需要注意(可將圖片拖至瀏覽器新的標簽頁查看大圖)
使用 XxxAware 接口訪問 WEB 資源
和使用 ActionContext 一樣,在 index.jsp 頁面發(fā)送請求到 ObjectAction.java 由 print2()
方法處理
在 ObjectAction.java 中的 print2()
方法中給域?qū)ο筚x值,并獲取傳入的 parameter 的值
最后在 showPage.jsp 中獲得域?qū)ο蟮闹?,為了和上一個區(qū)分我們給每個輸出的值加上符號以區(qū)分。
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 執(zhí)行所需的方法 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 節(jié)點部分)
<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 方法需要調(diào)用域?qū)ο竽敲疵總€方法都必須實現(xiàn),而第二種方法只需實現(xiàn)一次,所以在實際開發(fā)中視情況而選擇對應(yīng)的方法去實現(xiàn)。
和 ServletAPI 耦合的方式 :可以訪問到更多的 ServletAPI ,且可以調(diào)用原生的方法
- 使用 ServletActionContext
- 實現(xiàn) ServletXxxAware 接口
此中實現(xiàn)方式類似于上述實現(xiàn)方式,我就不在啰嗦。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
- 詳解在Java的Struts2框架中配置Action的方法
- ajax交互Struts2的action(客戶端/服務(wù)器端)
- struts2 action跳轉(zhuǎn)調(diào)用另一個程序
- struts2中action實現(xiàn)ModelDriven后無法返回json的解決方法
- Struts2中Action中是否需要實現(xiàn)Execute方法
- 用js模擬struts2的多action調(diào)用示例
- 在Action中以Struts2的方式輸出JSON數(shù)據(jù)的實例
- Struts2之Action接收請求參數(shù)和攔截器詳解
- Struts2 ActionContext 中的數(shù)據(jù)詳解
- struts2通過action返回json對象
相關(guān)文章
SpringBoot實現(xiàn)連接nacos并支持多環(huán)境部署
這篇文章主要介紹了SpringBoot實現(xiàn)連接nacos并支持多環(huán)境部署方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06SpringBoot調(diào)用公共模塊的自定義注解失效的解決
這篇文章主要介紹了SpringBoot調(diào)用公共模塊的自定義注解失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02基于Java字符串 "==" 與 "equals" 的深入理解
本篇文章是對Java中的字符串"=="與"equals"進行了詳細的分析介紹,需要的朋友參考下2013-06-06