zoukankan      html  css  js  c++  java
  • Struts2 Action 动态传参数

    Struts2的两个Action之间传参的问题。       

      需求功能是这样:Action1 获取数据库配置内容,得到相应Model的 动态URL ,这里的URL 有的是Action有的是JSP页面。

      1.使用result 类型中的  redirect 类型,如下:           

     <result name="success" type="redirect">${dynamicUrl}?objectId=${objectId}&amp;param1=${param1}</result>          

      这样传参才能达到Action取参数的需要,如果要是加上 :          

    <param name="param1">${param1}</param>          <param name="items">${items}</param>            

     那么 param1 和 items 这两个参数都无法从目标Action里得到,如果想得到的话只能用  objectId=${objectId}&param1=${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动态传参的问题时总结的心得,希望对个位同仁有所帮助,不当之处,请多指教。  

     

    struts2配置文件中参数的传递    

    在Action中我们经常会从这个Action跳转到另一个Action中,如果只是简单的跳转那么很容易,只需在struts配置文件中添加一个result,如:

    <result name="index">/manager/managerInfo/account.jsp</result>.    

     result有一个type属性,这里的type默认是dispatcher,但这种情况下action之间是不能发送请求的,这时我们就要用到redirect、redirect-action、chain,

    当要请求一个action时,可设定type的值为以上三个中的一个(他们的区别请参见blog.sina.com.cn/s/blog_56b7aaa10100eqs4.html),如:<result name="reload" type="redirectAction" >/manager/managerInfo/account.action</result>.    

     如果想在请求的过程中添加参数可以像超链接传值一样在最后用"xx?xx=xx"的形式来传递参数.

    如:<result name="reload" type="redirectAction">/manager/ managerInfo/account.action?参数名=参数值</result>,

    如果这里的参数值不是一个固定值可以用"${参数值}"这种形式,需要注意的是这里的"参数值"在相应的Action中一定要提供get/set方法,

    否则将无法获得参数值,当然这里也同样可以取一个对象的某个属性值即:${对象名.属性名},假如我想取得一个帐户的帐号:<result name="reload" type="redirectAction" >/manager/managerInfo/account.action?account.accountNO=${account.accountNO}</result>. 

     如果想传递多个参数用"&"符号来连接吗?NO,因为用"&"会在XML语法检查中报错,所以将"&"用"&amp;"来替换就行了!如:

    <result name="reload" type="redirectAction" >/manager/managerInfo/account.action?account.accountNO=${account.accountNO}&amp;account.balance=${account.balance}</result>. 

    注:当使用type="redirectAction"时,result中的.action可要可不要,但是当你要传递参数里,而且参数中含有中文字符时一定不要加.action,

    否则你的参数值是无法传递的,这是自己后来才发现的,大家有兴趣的可以去试试...

  • 相关阅读:
    setTimeout()和setInterval()的区别
    iOS开发小技巧
    iOS应用跳转到App Store评分
    前端小技巧-定位的活学活用之仿淘宝列表
    前端CSS
    用c# 开发html5的尝试,试用bridge.net
    Faster数据库研习,一
    五一劳动节,讲讲NEO智能合约的调试
    NEO GUI 多方签名使用
    NEO智能合约开发(二)再续不可能的任务
  • 原文地址:https://www.cnblogs.com/jym-sunshine/p/5740187.html
Copyright © 2011-2022 走看看