一個提交到服務器的處理通常可以分為兩個階段,第一個階段查詢服務器狀態(查詢或者更新數據庫),第二個階段選擇一個合適的結果頁面其返回給用戶(這里要講的Result的內容)。
Struts2提供了對不同種類返回結果的支持,常見的有JSP,FreeMarker,Velocity等。
Struts2支持的不同類型的返回結果為:
名字 |
說明 |
---|---|
Chain Result |
用來處理Action鏈 |
Dispatcher Result |
用來轉向頁面,通常處理JSP |
FreeMarker Result |
處理FreeMarker模板 |
HttpHeader Result |
用來控制特殊的Http行為 |
Redirect Result |
重定向到一個URL |
Redirect Action Result |
重定向到一個Action |
Stream Result |
向瀏覽器發送InputSream對象,通常用來處理文件下載 |
Velocity Result |
處理Velocity模板 |
XLS Result |
處理XML/XLST模板 |
PlainText Result |
顯示原始文件內容,例如文件源代碼 |
S2PLUGINS:Tiles Result |
結合Tile使用 |
另外第三方的Result類型還包括JasperReports Plugin,專門用來處理JasperReport類型的報表輸出。
在struts-default.xml文件中已經有了對于所有類型Result的定義:
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
|
< result-types > < result-type name = "chain" class = "com.opensymphony.xwork2.ActionChainResult" /> < result-type name = "dispatcher" class = "org.apache.struts2.dispatcher.ServletDispatcherResult" default = "true" /> < result-type name = "freemarker" class = "org.apache.struts2.views.freemarker.FreemarkerResult" /> < result-type name = "httpheader" class = "org.apache.struts2.dispatcher.HttpHeaderResult" /> < result-type name = "redirect" class = "org.apache.struts2.dispatcher.ServletRedirectResult" /> < result-type name = "redirectAction" class = "org.apache.struts2.dispatcher.ServletActionRedirectResult" /> < result-type name = "stream" class = "org.apache.struts2.dispatcher.StreamResult" /> < result-type name = "velocity" class = "org.apache.struts2.dispatcher.VelocityResult" /> < result-type name = "xslt" class = "org.apache.struts2.views.xslt.XSLTResult" /> < result-type name = "plainText" class = "org.apache.struts2.dispatcher.PlainTextResult" /> <!-- Deprecated name form scheduled for removal in Struts 2.1.0. The camelCase versions are preferred. See ww-1707 --> < result-type name = "redirect-action" class = "org.apache.struts2.dispatcher.ServletActionRedirectResult" /> < result-type name = "plaintext" class = "org.apache.struts2.dispatcher.PlainTextResult" /> </ result-types > |
從上述代碼中可以看出在不指定Result類型的時候使用dispatcher類型。
定義一個Result值,
1
2
3
|
< result name = "success" type = "dispatcher" > < param name = "location" >/ThankYou.jsp</ param > </ result > |
由于type默認值是dispatcher,所以這里不需要定義,另外name的默認值為success所以這里也不需要定義。
上述代碼可以簡寫為:
1
2
3
4
|
< result > < param name = "location" >/ThankYou.jsp</ param > </ result > |
另外location參數也可以直接卸載result標簽內部,所以上述代碼的最簡單的寫法為:
1
|
< result >/ThankYou.jsp</ result > |
我們也可以定義多個不同的Result
1
2
3
4
5
|
< action name = "Hello" > < result >/hello/Result.jsp</ result > < result name = "error" >/hello/Error.jsp</ result > < result name = "input" >/hello/Input.jsp</ result > </ action > |
上述代碼的含義為,名字為Hello的Action有三個返回結果,并且都是dispatcher類型(默認類型), 這三個返回值的名字分別為 success(默認值),error,input,對應的頁面的路徑分別為/hello/Result.jsp,/hello/Error.jsp, /hello/Input.jsp。
有些時候我們需要一個定義在全局的Result,這個時候我們可以在package內部定義全局的Result,例如:
1
2
3
4
5
|
< global-results > < result name = "error" >/Error.jsp</ result > < result name = "invalid.token" >/Error.jsp</ result > < result name = "login" type = "redirect-action" >Logon!input</ result > </ global-results > |
動態返回結果
有些時候,只有當Action執行完璧的時候我們才知道要返回哪個結果,這個時候我們可以在Action內部定義一個屬性,這個屬性用來存儲Action執行完璧之后的Result值,例如:
1
2
3
4
|
private String nextAction; public String getNextAction() { return nextAction; } |
在strutx.xml配置文件中,我們可以使用${nextAction}來引用到Action中的屬性,通過${nextAction}表示的內容來動態的返回結果,例如:
1
2
3
|
< action name = "fragment" class = "FragmentAction" > < result name = "next" type = "redirect-action" >${nextAction}</ result > </ action > |
上述Action的execute方法返回next的時候,還需要根據nextAction的屬性來判斷具體定位到哪個Action。
如果想轉發到另外個action可以設置type=chain 同時結果不加shtml
以上就是Struts2 Result 參數詳解的全部內容,希望能給大家一個參考,也希望大家多多支持服務器之家。