两个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>
即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#中,如果您需要将多个参数递给`Action`委托,有几种方法可以实现。 方法1:使用元组(Tuple) 您可以使用元组(Tuple)将多个参数打包,并将元组作为单个参数递给`Action`委托。以下是一个示例: ```csharp using System; using System.Threading.Tasks; class Program { static void Main() { // 创建一个委托实例,并将多个参数作为元组递给任务 Action<Tuple<int, string>> taskDelegate = new Action<Tuple<int, string>>(PrintValues); var values = Tuple.Create(10, "Hello"); Task task = Task.Factory.StartNew(taskDelegate, values); // 等待任务完成 task.Wait(); } static void PrintValues(Tuple<int, string> values) { int number = values.Item1; string message = values.Item2; Console.WriteLine("Number: " + number); Console.WriteLine("Message: " + message); } } ``` 在上面的示例中,我们创建了一个`Action<Tuple<int, string>>`委托实例`taskDelegate`,该委托接受一个元组作为参数。然后,我们使用`Tuple.Create`方法创建一个包含两个值的元组,并将其作为参数递给任务。任务将调用委托,并将元组解包为两个参数递给`PrintValues`方法。 方法2:使用自定义类或结构 另一种方法是定义一个自定义的类或结构,该类或结构包含多个属性来表示需要递的参数。然后,您可以使用该类或结构的实例作为参数递给`Action`委托。以下是一个示例: ```csharp using System; using System.Threading.Tasks; class Program { static void Main() { // 创建一个委托实例,并将自定义类的实例作为参数递给任务 Action<MyParameters> taskDelegate = new Action<MyParameters>(PrintValues); var parameters = new MyParameters { Number = 10, Message = "Hello" }; Task task = Task.Factory.StartNew(taskDelegate, parameters); // 等待任务完成 task.Wait(); } static void PrintValues(MyParameters parameters) { int number = parameters.Number; string message = parameters.Message; Console.WriteLine("Number: " + number); Console.WriteLine("Message: " + message); } } class MyParameters { public int Number { get; set; } public string Message { get; set; } } ``` 在上面的示例中,我们定义了一个名为`MyParameters`的类,该类具有`Number`和`Message`属性来表示要递的参数。我们还创建了一个`Action<MyParameters>`委托实例`taskDelegate`,该委托接受一个`MyParameters`实例作为参数。然后,我们创建了一个`MyParameters`实例并设置其属性值,然后将其作为参数递给任务。任务将调用委托,并将`MyParameters`实例作为参数递给`PrintValues`方法。 这些是在C#中使用`Action`委托递多个参数的两种常见方法。您可以根据您的需求选择适合您的情况的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值