兩個Action 動態傳參數
研究了近兩天的時間,終於把一個很簡單的問題給搞定了,那它是什麼問題呢?就是Struts2的兩個Action之間傳參的問題。
需求功能是這樣:Action1 獲取數據庫配置內容,得到相應Model的 動態URL ,這裏的URL 有的是Action有的是JSP頁面。
1.使用result 類型中的 redirect 類型,如下:
<result name="success" type="redirect">${dynamicUrl}?objectId=${objectId}¶m1=${param1}</result>
這樣傳參才能達到Action取參數的需要,如果要是加上 :
<param name="param1">${param1}</param>
<param name="items">${items}</param>
那麼 param1 和 items 這兩個參數都無法從目標Action裏得到,如果想得到的話只能用 objectId=${objectId}¶m1=${param1} 這種方式,或者用 session來實現,這樣就有點複雜了,而且使用起來也相當的不方便。後來又嘗試了第二種方式:
2.使用result類型中的redirect-action類型 如下:
<result name="success" type="redirect-action">
<param name="actionName">${actionName}</param>
<param name="namespace">${namespace}</param>
</result>
此時,result之間不能再設其它的自定義的參數了,因爲 redirect-action對應的是 org.apache.struts2.dispatcher.ServletActionRedirectResult ,而actionName和namespace是它的兩個屬性,還有一個重要屬性就是methodName,如果要再加其它自己定的參數,只能擴展該類了。我在此基礎上,又在result 之外添加了幾個param 參數,如:
<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兩個參數傳到目標Action中。既然Struts2有這種機制,那麼它就一定能夠實現,兩個Action的動態傳參,只是我對它不瞭解而已,後來,我又翻出來Strut2的源碼和XWork的源碼,再結果網上的資料,又嘗試了第三種方式,終於可以了。
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>
這樣就可以實現傳參了,這裏的參數所有對象都可以傳,包括map,List,set 等集合也可以。同時這裏還需要注意一個小問題,chain這種類型是XWork中的result類型,它對應的類是:
com.opensymphony.xwork2.ActionChainResult . 這裏需要注意一個小問題, actionName,namespace都是他的屬性,所以對於傳過的URL參數要做一下處理。
actionName必須是Action的名稱,namespace是他命名空間,必須以"/"開頭,如:
/tab/getTemplate.action 則 namespace="/tab" ; actionName=”getTemplate“;
這是小弟在使用Struts2時,遇到兩個Action動態傳參的問題時總結的心得,希望對個位同仁有所幫助,不當之處,請多指教。
需求功能是這樣:Action1 獲取數據庫配置內容,得到相應Model的 動態URL ,這裏的URL 有的是Action有的是JSP頁面。
1.使用result 類型中的 redirect 類型,如下:
<result name="success" type="redirect">${dynamicUrl}?objectId=${objectId}¶m1=${param1}</result>
這樣傳參才能達到Action取參數的需要,如果要是加上 :
<param name="param1">${param1}</param>
<param name="items">${items}</param>
那麼 param1 和 items 這兩個參數都無法從目標Action裏得到,如果想得到的話只能用 objectId=${objectId}¶m1=${param1} 這種方式,或者用 session來實現,這樣就有點複雜了,而且使用起來也相當的不方便。後來又嘗試了第二種方式:
2.使用result類型中的redirect-action類型 如下:
<result name="success" type="redirect-action">
<param name="actionName">${actionName}</param>
<param name="namespace">${namespace}</param>
</result>
此時,result之間不能再設其它的自定義的參數了,因爲 redirect-action對應的是 org.apache.struts2.dispatcher.ServletActionRedirectResult ,而actionName和namespace是它的兩個屬性,還有一個重要屬性就是methodName,如果要再加其它自己定的參數,只能擴展該類了。我在此基礎上,又在result 之外添加了幾個param 參數,如:
<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兩個參數傳到目標Action中。既然Struts2有這種機制,那麼它就一定能夠實現,兩個Action的動態傳參,只是我對它不瞭解而已,後來,我又翻出來Strut2的源碼和XWork的源碼,再結果網上的資料,又嘗試了第三種方式,終於可以了。
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>
這樣就可以實現傳參了,這裏的參數所有對象都可以傳,包括map,List,set 等集合也可以。同時這裏還需要注意一個小問題,chain這種類型是XWork中的result類型,它對應的類是:
com.opensymphony.xwork2.ActionChainResult . 這裏需要注意一個小問題, actionName,namespace都是他的屬性,所以對於傳過的URL參數要做一下處理。
actionName必須是Action的名稱,namespace是他命名空間,必須以"/"開頭,如:
/tab/getTemplate.action 則 namespace="/tab" ; actionName=”getTemplate“;
這是小弟在使用Struts2時,遇到兩個Action動態傳參的問題時總結的心得,希望對個位同仁有所幫助,不當之處,請多指教。