zoukankan      html  css  js  c++  java
  • 【转】两个Action 动态传参数

           研究了近两天的时间,终于把一个很简单的问题给搞定了,那它是什么问题呢?就是Struts2的两个Action之间传参的问题。 
           需求功能是这样:Action1 获取数据库配置内容,得到相应Model的 动态URL ,这里的URL 有的是Action有的是JSP页面。 


            1.使用result 类型中的  redirect 类型,如下: 
              <result name="success" type="redirect">${dynamicUrl}?objectId=${objectId}&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动态传参的问题时总结的心得,希望对个位同仁有所帮助,不当之处,请多指教。

     

    注:<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, 所以不用写太多配置,有getset就能取出来

     

    【转】

    例如 在执行完action1之后要直接跳转到action2,并且action1要传一些参数给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之间直接跳转而不用传参数,struts.xml文件可以和上面一样,只是没有param标签,还可以使用如下配置:
        <action name="action1" method="" class="">
            <result name="success" type="redirectAction">action2.action</result>              
        </action>
    即可


     

     

     

  • 相关阅读:
    自己开发网站全文检索系统
    中国摇滚二十年(经典100首歌曲)
    有一首歌
    Snoopy.class.php使用手册
    wp-Syntax 插件使用方法
    rabbitmq使用
    小程序相关功能的实现
    知识链接
    celery使用
    阿里云服务器部署项目注意事项
  • 原文地址:https://www.cnblogs.com/tiechui/p/1807232.html
Copyright © 2011-2022 走看看