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

有没有办法让
Spring MVC表单为portlet命名?我不想设置

<requires-namespaced-parameters>false</requires-namespaced-parameters>

为了让Spring mvc表格在Liferay 6.2下运行.

我正在考虑重写Spring form-taglib,以便它将portlet-namespace前缀放在表单字段名称/ ids之前,而不实际尝试将它们绑定到带有命名空间的bean属性(这显然不起作用)但是看起来非常耗时.

有没有人知道解决这个问题的另一种方法?

以下是显示确切问题的表单示例:

<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将尝试将formfield绑定到属性

SearchSettings._namespace_portlet_textField

这当然不存在.

有没有人遇到这个问题,并找到一个解决方案,而不是覆盖Spring MVC Form-Taglib?我看到它已经记录在Spring的JIRA(https://jira.springsource.org/browse/SPR-11176)上,但我找不到其他的东西.

提前致谢.

最佳答案 我现在设法覆盖Spring表单taglib(3.0.7.RELEASE)以支持portlet名称空间.如果你想这样做,你将不得不在Tag-classes中寻找这个方法(例如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);
}

当然,你需要自己的tagdescriptor来获取命名空间.你还需要覆盖

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表单已正确命名.

点赞