这非常简单,与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;属性。
希望很快就会修好......
答案 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)