有没有办法让 Spring MVC 表单为 portlet 命名空间?我不想设置
<requires-namespaced-parameters>false</requires-namespaced-parameters>
为了让 spring mvc 表单在 Liferay 6.2 下工作。
我正在考虑覆盖 Spring form-taglib,以便它将 portlet-namespace 前缀放在表单字段名称/id 的前面,而不实际尝试将它们绑定(bind)到具有 namespace 的 bean-properties(这显然不起作用) 但这似乎非常耗时。
有人知道解决这个问题的另一种方法吗?
这是一个显示确切问题的表单示例:
<portlet:actionURL var="actionURL">
<portlet:param name="action" value="search"/>
</portlet:actionURL>
<form:form action="${actionURL}" commandName="searchSettings">
<form:input path="textField"/>
<form:input path="anotherTextField"/>
<input type="submit" value="Search"/>
</form:form>
它对应的 bean 是:
public class SearchSettings {
private String textField;
private String anotherTextField;
// .. getters & setters
}
这在 Liferay 6.2 下不起作用,因为表单输入没有命名空间。它们应该像这样命名:
<c:set var="ns"><portlet:namespace/></c:set>
<form:input path="${ns}textField"/>
但是这将不起作用,因为现在 Spring 将尝试将表单域绑定(bind)到属性
SearchSettings._namespace_portlet_textField
这当然不存在。
有没有人遇到过这个问题并找到了除了重写 Spring MVC Form-Taglib 之外的解决方案?我看到它已经记录在 Spring 的 JIRA ( https://jira.springsource.org/browse/SPR-11176 ) 上,但我找不到更多关于它的信息。
提前致谢。
最佳答案
我现在已经设法覆盖 Spring 表单标签库 (3.0.7.RELEASE) 以支持 portlet 命名空间。如果你想这样做,你必须在标签类中寻找这个方法(例如 InputTag):
protected void writeDefaultAttributes(TagWriter tagWriter) throws JspException
您需要重写它以便它在命名空间中工作,如下所示:
@Override
protected void writeDefaultAttributes(TagWriter tagWriter) throws JspException {
writeOptionalAttribute(tagWriter, "name", getNamespace() + getName());
writeOptionalAttribute(tagWriter, "id", getNamespace() + resolveId());
super.writeDefaultAttributes(tagWriter);
}
当然,您需要自己的标签描述符才能获得命名空间。此外,您还需要覆盖
protected int writeTagContent(TagWriter tagWriter) throws JspException;
方法,因为这是调用您的 writeDefaultAttributes 方法的方法。
这暂时可行,但我仍在寻找更好的方法来解决这个问题。
编辑:
您可以使用 jQuery 更快地完成此操作:
$(document).ready(function() {
// Alle inputs
$('input').each(function() {
var pnamespace = '<portlet:namespace/>';
$(this).attr('id', pnamespace + this.id);
$(this).attr('name', pnamespace + this.name);
});
// alle selects
$('select').each(function() {
var pnamespace = '<portlet:namespace/>';
$(this).attr('id', pnamespace + this.id);
$(this).attr('name', pnamespace + this.name);
});
});
这会将命名空间前缀放在每个输入和选择对象上。现在您的 portlet 表单已正确命名空间。
关于java - Liferay 6.2 上 Spring MVC 表单中的 Portlet 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21832537/