前言
之前已經給大家介紹了關于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 對象來保存和讀取數據
-
使用 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
1
2
3
4
5
6
7
8
9
10
|
<%@ 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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 節點即可)
1
2
3
4
5
|
< 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 標簽內容)
1
2
3
4
5
6
|
<%--獲取到 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 標簽部分)
1
|
<a href= "showpage2.action?name=smzyy" rel= "external nofollow" >topage2</a> |
objectaction.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
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 節點部分)
1
2
3
4
5
|
< 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 接口
此中實現方式類似于上述實現方式,我就不在啰嗦。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://www.cnblogs.com/bgzyy/p/8675082.html