Struts2链接到同一类的相同方法的问题

时间:2014-02-14 12:07:58

标签: java jsp struts2 action chaining

我正在将我的软件从Strtus2版本2.0.11.1升级到版本2.3.15.3。 Chaining与之前的版本一起正常工作。但升级后,在以下情况下失败:

<action name="first_action" class="My_Same_Class">
    <result name="success" type="chain">second_action</result>
    <interceptor-ref name="servletConfig" />
    <interceptor-ref name="staticParams"/>
    <param name="A">37</param>
    <param name="B">1</param>
    <param name="C">0</param>
    <param name="result">result1</param>
</action>

<action name="second_action" class="My_Same_Class">
    <result name="success">/web/jsp/output.jsp</result>
    <interceptor-ref name="servletConfig" />
    <interceptor-ref name="staticParams"/>
    <param name="A">38</param>
    <param name="B">1</param>
    <param name="C">0</param>
    <param name="result">result2</param>
</action>

我在两个一个接一个地链接的动作中传递相同的类名。在output.jsp上它显示的是result1而不是result2。即使从日志中我也可以看到它只调用了一次'My_Action_Class'并且只获取了result1。

根据堆栈溢出的其他线程,我试图用'redirectAction'替换链接,但在这种情况下,这也没有按预期工作。

2 个答案:

答案 0 :(得分:1)

你可以为每个动作做一个方法

<action name="first_action" class="My_Same_Class" method="firts">
<result name="success" type="chain">second_action</result>
<interceptor-ref name="servletConfig" />
<interceptor-ref name="staticParams"/>
<param name="A">37</param>
<param name="B">1</param>
<param name="C">0</param>
<param name="result">result1</param>
</action>

<action name="second_action" class="My_Same_Class" method="second">
    <result name="success">/web/jsp/output.jsp</result>
    <interceptor-ref name="servletConfig" />
    <interceptor-ref name="staticParams"/>
    <param name="A">38</param>
    <param name="B">1</param>
    <param name="C">0</param>
    <param name="result">result2</param>
</action>

并在你的My_Same_Class中创建这些方法。

public String firts() throws Exception
{
   //your code 
   return SUCCESS;
 }
 public String second() throws Exception
{
   //your code 
   return SUCCESS;
 }

答案 1 :(得分:0)

我可以找到解决这个问题的方法。

我编写了自己的拦截器并将参数发送到拦截器而不是直接将它发送到类。然后通过拦截器我在valueStack上设置参数,然后将参数设置为类变量。只需确保为发送给拦截器的参数设置getter和setter。

因此,从struts.xml,我将参数发送到拦截器,如下所示:

<action name="first_action" class="My_Same_Class">
    <result name="success" type="chain">second_action</result>
    <interceptor-ref name="servletConfig" />
    <interceptor-ref name="staticParams"/>
    <interceptor-ref name="myParamsInterceptor">
        <param name="A">37</param>
        <param name="B">1</param>
        <param name="C">0</param>
        <param name="result">result1</param>
    </interceptor-ref>
</action>

在myParamsInterceptor中使用以下代码来推送valueStack上的参数,这些参数将被struts设置为操作类变量。

ActionContext.getContext().getValueStack().setValue("A",this.getA());

我在同一个班级使用同一个拦截器,它对我有用。