11.Result 配置詳解
說明
:在前面的許多案例中我們所用到的
Action
基本都繼承自
ActionSupport
這個類,而在這個類中我們定義了五個字段:
SUCCESS
,
NONE
,
ERROR
,
INPUT
,
LOGING
。我們可以直接返回這些字段值,這些字段值實質(zhì)是被定義成:
String SUCCESS=”success”
這樣的形式,所以我們只要在
Result
元素中用它們的小寫即可。
<result>
標(biāo)準完整形式如下:
< result name = "success" type = "dispatcher" >
?????? < param name = "location" > /default.jsp </ param >
</ result >
如果我們都采用默認的形式,最終可以簡寫成: < result > /default.jsp </ result >
探討 type 類型 :
Type 類型值 |
作用說明 |
對應(yīng)類 |
chain |
用來處理 Action 鏈 |
com.opensymphony.xwork2.ActionChainResult |
dispatcher |
用來轉(zhuǎn)向頁面,通常處理 JSP |
org.apache.struts2.dispatcher.ServletDispatcherResult |
redirect |
重定向到一個 URL |
org.apache.struts2.dispatcher.ServletRedirectResult |
redirectAction |
重定向到一個 Action |
org.apache.struts2.dispatcher.ServletActionRedirectResult |
plainText |
顯示源文件內(nèi)容,如文件源碼 |
org.apache.struts2.dispatcher.PlainTextResult |
freemarker |
處理 FreeMarker 模板 |
org.apache.struts2.views.freemarker.FreemarkerResult |
httpheader |
控制特殊 http 行為的結(jié)果類型 |
org.apache.struts2.dispatcher.HttpHeaderResult |
stream ? |
向瀏覽器發(fā)送 InputSream 對象,通常用來處理文件下載,還可用于返回 AJAX 數(shù)據(jù)。 ? |
org.apache.struts2.dispatcher.StreamResult ? |
velocity |
處理 Velocity 模板 |
org.apache.struts2.dispatcher.VelocityResult |
xslt ?? |
?? 處理 XML/XLST 模板 |
?org.apache.struts2.views.xslt.XSLTResult |
以上對
type
類型作簡要的說明,下面來看實例:當(dāng)一個
Action
處理后要返回的
Result
是另一個
Action
時,作如何配置,關(guān)鍵就是配置
type
類型。下面建立
struts2result
項目
說明
步驟一:建立兩個
Action:TestAction
、
Test2Action
步驟二:
web.xml
配置省略。
struts.xml
主要配置內(nèi)容如下:
<
struts
>
??? < package name = "resultTest" extends = "struts-default" >
?????? < action name = "test" class = "com.asm.TestAction" >
?????????? < result name = "success" type = "chain" >
????????????? < param name = "actionName" > test2 </ param >
?????????? </ result >
?????? </ action >
?
?????? < action name = "test2" class = "com.asm.Test2Action" >
?????????? < result name = "success" > /test2Suc.jsp </ result >
?????? </ action > ?
??? </ package >
</
struts
>
說明
:在名為“
test
”的
action
中,我們配置
result
元素的
type
類型值為
chain
,意為將繼續(xù)把
Action
傳遞到下一個名為
test2
的
Action
中去,在
test2.action
中會把頁面轉(zhuǎn)向到
test2Suc.jsp
中去。在
type
類型為
chain
時,它的
param
有
4
個值可配,除了這里用到的
name=”actionName”
外(必須配置,否則報錯),還有
name=namespace|method|skipActions
。其中
namespace
指定要轉(zhuǎn)向到
action
的名字空間,由于此處是轉(zhuǎn)到
Action
位于同一個
namespace
下,而
namesapace
的默認值
the current namespace
,所以可以省略不寫
(
需要說明的是如果要跳到別的名稱空間的
action
中去,除了使用
namespace
指定外,還可以用:
/
要跳去
action
所在名稱空間的值
/
要跳去的
action
的
name
值
)
。
Method
用于指定轉(zhuǎn)向到一個目標(biāo)
action
所調(diào)用的方法,默認是調(diào)用下一個
action
的
execute
方法,所以此處仍可以省略。
SkipActions
是一個可選的屬性,一般不用。具體可以參看
chain
所對應(yīng)類的
api
幫助。
在本實例中,我們還在
TestAction
中設(shè)定一個
username
字段,并在
execute
方法執(zhí)行為它賦了值,并在
test2Suc.jsp
中引用了此值。其實這種做法在
web
開發(fā)中還是很有用處,比如可以代替隱藏域。需要注意的是之所以在
action
的傳遞中能把設(shè)定的這個值保存下去,主要是因為轉(zhuǎn)向都是服務(wù)器跳轉(zhuǎn)。如果我們跳轉(zhuǎn)時采取了客戶端跳轉(zhuǎn),比如在
test2 action
的
result
中指定
type
類型為
redirect
,要想傳遞參數(shù)可以在
result
指向的
jsp
頁面中附加參數(shù)即可,我們可以在
test2 action
的
result
中寫成:
<
result
name
=
"success"
type
=
"redirect"
>
/test2Suc.jsp?username=${username}
</
result
>
??
隨后在
test2Suc.jsp
頁面中引用時會出現(xiàn)三個問題:
1.EL
表達式引用失效,(
EL
表達式應(yīng)該使用
${param.username}
形式)。我們也可以使用
<%=request.getParameter("username")%>
獲取參數(shù)值。
?
2.
由于在前面的
TestAction
中設(shè)定的值為中文,而附加到這里的
uri
請求的參數(shù)后面時會出現(xiàn)亂碼問題。(可以使用
URI
編碼再解碼解決此問題)
3.
值棧取值失效:因為
每一次
request
共享同一個值棧,所以服務(wù)器端的
forward
跳轉(zhuǎn)也是能共享同一值棧得。但是著當(dāng)
test action
執(zhí)行后把請求交由
test2 action
時,
test2 action
采取的是
redirect
重定向到
test2Suc.jsp
頁面,這時其實就是重發(fā)的一次
request,
所以在
test action
保存的值棧內(nèi)容全部失效。這也就是為什么我們要附加參數(shù)的原因。而參數(shù)是保存在
actionContext
中,所以采用了
#
的方式來取出值。圖示說明:
步驟三,編寫鏈接頁面 index.jsp 。發(fā)布測試:
全局 result :
如果我們所有的 action 均有可能跳到相同的頁面,則不防使用全局 result 。為了方便引用我們專門建立一個 package 來存放公共的 result 。在會用到個全局的跳轉(zhuǎn)時,只需要把繼承自這個公共的 package 即可。
建立公共包,代碼如下:
< package name = "pubResult" extends = "struts-default" abstract = "true" >
?????? < global-results >
?????????? < result name = "error" > /error.jsp </ result >
?????? </ global-results >
</ package >
由于它下面沒的 action 配置,所以我們可以像默認的 struts-default 包一樣,聲明 abstract=true ,這樣聲明表示此 packgage 下不會有 action ,它一般是用來讓別的 package 繼承。隨后再在要用到全局 result 中引用這個公共的 package 。代碼如下:
< package name = "testGlobal" extends = "pubResult" >
??? < action name = "error" class = "com.asm.ErrorAction" ></ action >
??? < action name = "error2" class = "com.asm.Error2Action" ></ action >
</ package > 這樣操作相當(dāng)于把全局的 result 加到了此 package 下的所有 action 中去。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
