研究了近兩天的時間,終于把一個很簡單的問題給搞定了,那它是什么問題呢?就是Struts2的兩個Action之間傳參的問題。
需求功能是這樣:Action1 獲取數(shù)據(jù)庫配置內(nèi)容,得到相應(yīng)Model的 動態(tài)URL ,這里的URL 有的是Action有的是JSP頁面。
1.使用result 類型中的 redirect 類型,如下:
<result name="success" type="redirect">${dynamicUrl}?objectId=${objectId}¶m1=${param1}</result>
這樣傳參才能達(dá)到Action取參數(shù)的需要,如果要是加上 :
<param name="param1">${param1}</param>
<param name="items">${items}</param>
那么 param1 和 items 這兩個參數(shù)都無法從目標(biāo)Action里得到,如果想得到的話只能用 objectId=${objectId}¶m1=${param1} 這種方式,或者用session來實現(xiàn),這樣就有點復(fù)雜了,而且使用起來也相當(dāng)?shù)牟环奖?。后來又嘗試了第二種方式:
2.使用result類型中的redirect-action類型 如下:
<result name="success" type="redirect-action">
<param name="actionName">${actionName}</param>
<param name="namespace">${namespace}</param>
</result>
此時,result之間不能再設(shè)其它的自定義的參數(shù)了,因為 redirect-action對應(yīng)的是 org.apache.struts2.dispatcher.ServletActionRedirectResult,而actionName和namespace是它的兩個屬性,還有一個重要屬性就是methodName,如果要再加其它自己定的參數(shù),只能擴展該類了。我在此基礎(chǔ)上,又在result 之外添加了幾個param 參數(shù),如:
<param name="param1">${param1}</param>
<param name="param2">${param2}</param>
<result name="success" type="redirect-action">
<param name="actionName">${actionName}</param>
<param name="namespace">${namespace}</param>
</result>
但是還是不能將param1和param2兩個參數(shù)傳到目標(biāo)Action中。既然Struts2有這種機制,那么它就一定能夠?qū)崿F(xiàn),兩個Action的動態(tài)傳參,只是我對它不了解而已,后來,我又翻出來Strut2的源碼和XWork的源碼,再結(jié)果網(wǎng)上的資料,又嘗試了第三種方式,終于可以了。
3.使用reulst 類型中chain類型 如下:
<action name="getTemplate" class="tabAction" method="getTemplateByParas">
<param name="objectId">${objectId}</param>
<param name="param1">${param1}</param>
<param name="items">${items}</param>
<result name="success" type="chain">
<param name="actionName">${actionName}</param>
<param name="namespace">${namespace}</param>
</result>
</action>
這樣就可以實現(xiàn)傳參了,這里的參數(shù)所有對象都可以傳,包括map,List,set 等集合也可以。同時這里還需要注意一個小問題,chain這種類型是XWork中的result類型,它對應(yīng)的類是:
com.opensymphony.xwork2.ActionChainResult . 這里需要注意一個小問題, actionName,namespace都是他的屬性,所以對于傳過的URL參數(shù)要做一下處理。
actionName必須是Action的名稱,namespace是他命名空間,必須以"/"開頭,如:
/tab/getTemplate.action 則 namespace="/tab" ; actionName=”getTemplate“;
這是小弟在使用Struts2時,遇到兩個Action動態(tài)傳參的問題時總結(jié)的心得,希望對個位同仁有所幫助,不當(dāng)之處,請多指教。
注:<action name="getTemplate" class="tabAction" method="getTemplateByParas">
<param name="objectId">${objectId}</param>
<param name="param1">${param1}</param>
<param name="items">${items}</param>
<result name="success" type="chain">
<param name="actionName">${actionName}</param>
<param name="namespace">${namespace}</param>
</result>
</action>
可以改為
<action name="getTemplate" class="tabAction" method="getTemplateByParas">
<result name="success" type="chain">
<param name="actionName">${actionName}</param>
<param name="namespace">${namespace}</param>
</result>
</action>
對于對象,1-在前面Action 和后面Action中要寫 getter setter, 2-actionName,namespace 配置一定要寫,否則錯。
type為chain, 使兩個action共享httpServletRequest, 所以不用寫太多配置,有g(shù)etset就能取出來
【轉(zhuǎn)】
例如 在執(zhí)行完action1之后要直接跳轉(zhuǎn)到action2,并且action1要傳一些參數(shù)給action2,在struts.xml文件中的配置如下:
<action name="action1" method="" class="">
<result name="success" type="chain">
<param name="actionName">action2</param>
<param name="param1">${param1}</param>
<param name="param2">${param2}</param>
</result>
</action>
注意:
1. 若param1和param2是兩個變量,那么在兩個action中都要有他們的getter和setter
2. 若param1是常量,那么在action1中只要有一個param1的getter,在action2中要有param1的getter和setter
如果在兩個action之間直接跳轉(zhuǎn)而不用傳參數(shù),struts.xml文件可以和上面一樣,只是沒有param標(biāo)簽,還可以使用如下配置:
<action name="action1" method="" class="">
<result name="success" type="redirectAction">action2.action</result>
</action>
即可