Struts 2.3 表单,具有多个具有操作属性的提交标记



这是非常简单的事情,可以完美地与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

相关内容

  • 没有找到相关文章

最新更新