java - Liferay 6.2 上 Spring MVC 表单中的 Portlet 命名空间

标签 java spring spring-mvc liferay portlet

有没有办法让 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/

相关文章:

json - 我应该如何在 Spring Message Converters Objectmapper 上设置功能?

java - 复选框在选中时不会禁用,android studio

javascript - 如何使用 android studio 创建一个带有存储在网络服务器上的数组的 android 应用程序?

spring - 使用 Spring 的 JSR-303 bean 验证没有启动

java - HTTP 状态 404 - Servlet 调度程序不可用

javascript - 如何使用POST方法处理JSON数据?

java - 数据结构获取特定位置的所有元素

Java:Collections.unmodifiableXYZ(...) 在特殊情况下是否使集合对象成为享元?

java - 在spring Controller 中获取_csrf

java - Spring MVC RequestMapping 发布方法