这是非常简单的事情,可以完美地与Struts 2.1.x配合使用。但是我们最近升级到 2.3.15.2 它坏了。基本上,我们有一个表单(实际上,许多表单(有多个提交:
<s:form>
<s:submit action="save" />
<s:submit action="resetPassword" />
</s:form>
如果我将动作粘贴在标签中,一切都很好。但如果它在标签中,我会收到 404 错误。这是同样的动作!
我一直在调试,发现当您在标签中使用"action"属性时,生成的 html 是:
<input type="submit" name="action:save">
<input type="submit" name="action:resetPassword">
据说支柱应该采取这个"行动"前缀并说"啊哈!这是一个动作!"并执行它。它或多或少地做到了这一点。或者至少尝试这样做。我发现,在非常低的级别上,DefaultActionMapper.handleSpecialParameters(( 方法遍历所有参数并尝试为每个参数创建一个 ParameterAction,如果它不为 null,则执行它。大多数参数生成"null"参数操作,但不生成"操作:"。
在文档中,我发现了有关参数操作的内容:
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
因此,它所做的是将映射的结果设置为具有操作名称的新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。
这似乎需要做很多工作,只是为了让多个具有操作属性的提交按钮正常工作。这是 Struts 2.3 的已知问题吗?我是否需要按照文档中所述为"操作"前缀实现参数操作?
编辑
好的,已知的错误,几天前刚刚开放。同时,我可以降级到 2.3.15.1 或使用"方法"属性而不是"操作"属性。
希望它能很快修复...
这是struts2.3.16中的b/c。
禁用对操作的支持:前缀
默认情况下struts.mapper.action.prefix.enabled = false
设置
<constant name="struts.mapper.action.prefix.enabled" value="true"/>
在支柱中.xml
支柱内部变化2核2.3.16
操作: 和方法: 前缀默认被排除并更改顺序以首先检查排除参数,然后在参数拦截器中接受参数
这应该正在为 2.3.15.3 修复。
具体的 jira 是:
https://issues.apache.org/jira/browse/WW-4204