Struts 2.3表单带有多个提交标签和action属性

时间:2013-10-02 12:26:43

标签: forms jsp struts2 dmi

这非常简单,与Struts 2.1.x完美配合。但我们最近升级到2.3.15.2并且它破了。基本上我们有一个表格(实际上,很多表格)有多个提交:

<s:form>
 <s:submit action="save"  />
 <s:submit action="resetPassword"  />
</s:form>

如果我坚持标签中的动作一切都很好。但如果相反它在标签中,我会收到404错误。这是同样的行动!

我一直在调试并发现当你使用&#34;动作&#34;标签中的属性,生成的html为:

<input type="submit" name="action:save">
<input type="submit" name="action:resetPassword">

据说Struts应该采取这种行动&#34;前缀并说&#34; A-ha!这是一个动作!&#34;并执行它。它或多或少都是这样。或至少尝试。我发现的是,在非常低的级别,DefaultActionMapper.handleSpecialParameters()方法遍历所有参数并尝试为每个参数创建一个ParameterAction,如果它不为null,则执行。大多数参数产生一个&#34; null&#34; ParameterAction,但不是&#34;动作:&#34;。

在我发现的有关ParameterAction的文档中:

Defines a parameter action prefix.  This is executed when the configured prefix key is
matched in a parameter name, allowing the implementation to manipulate the action mapping 
accordingly.  For example, if the "action:foo" parameter name was found, and a 
ParameterAction implementation was registered to handle the "action" prefix, the execute 
method would be called, allowing the implementation to set the "method" value on the 
ActionMapping

所以它的作用是将映射的结果设置为一个名为Action的新ServletDispatcherResult:

mapping.setResult(new ServletDispatcherResult(actionName));

另一方面,当在s:form标签中指定动作时,映射的结果为null。

因此,当终于时,我们将进入Dispatcher.serviceAction():

if (mapping.getResult() != null) {
 Result result = mapping.getResult();
 result.execute(proxy.getInvocation());
} else {
 proxy.execute();
}

因此,当在标记中指定动作时,会调用proxy.execute(),它只调用Action /方法本身。 应该发生的是什么!但是当在标记中指定了动作时,由于映射有结果,因此代理的调用将传递给result.execute(),它调用ServletDispatcherResult ...最后,我得到一个404. / p>

这似乎是为了获得具有动作属性的多个提交按钮的大量工作。这是Struts 2.3的已知问题吗?我是否需要为&#34; action&#34;实现一个ParameterAction?如文档中所述的前缀?

修改

好的,已知的bug,几天前刚刚开通。与此同时,我可以降级到2.3.15.1或使用&#34;方法&#34;属性而不是&#34;动作&#34;属性。

希望很快就会修好......

2 个答案:

答案 0 :(得分:5)

这是struts2.3.16中的b / c。

禁用对操作的支持:前缀

默认情况下struts.mapper.action.prefix.enabled = false

设置

<constant name="struts.mapper.action.prefix.enabled" value="true"/> 
struts.xml中的

struts2-core 2.3.16的内部变化

操作:和方法:默认情况下排除前缀并更改顺序,首先检查excludeParams,然后在ParametersInterceptor中接受Acceptara

答案 1 :(得分:2)

这应该是在修复2.3.15.3。

具体的jira是:

https://issues.apache.org/jira/browse/WW-4204