Spring表单元素,多个nestedPath和使用Javascript引用输入

时间:2012-11-27 13:15:13

标签: spring spring-mvc

我有复杂的表单对象,深度不受限制,我正在尝试使用spring form标签在jsp上编辑它们。

Main modelAttribute绑定到spring表单,当我迭代childs时,我使用nestedPath和everithing工作正常。结果我生成了输入名称,如:

name="elements['secondColumn'][0].elements[0].removed"

问题是我无法知道生成的名称。为什么我需要它?假设我有删除按钮,我想将相应字段“删除”设置为1.

更新 它是如何工作的?我正在使用递归调用它们的标记文件。

container.tag

<c:forEach items="${elements}" var="element" varStatus="index">
 <spring:nestedPath path="elements[${index.count - 1}]">
   <my:elementConfig element="${element}">
    <my:container elements="${element.elements}"/>
   </my:elementConfig>
 </spring:nestedPath>
</c:forEach>

elementConfig.tag

...
<form:hidden path="removed"/>
...
<button onclick="delete('howToGetNameOfRemovedHidden')">Delete</button>
...
<jsp:doBody/>
...

最近的匹配我已经找到了一个“nestedPath”pageContext属性,但它也包含了modelAttribute(form)名称的名称。

是否有官方方式获取生成的名称?

由于

2 个答案:

答案 0 :(得分:0)

我猜您可以使用其他属性,例如HTML5 data-*一个:

<c:set var="i" value="0" />
<c:foreach [...]>
    <form:input path="[...].remove" data-inputid="input${i}" />
    <button class="removebutton" data-inputid="input${i}">Remove</button>
    <c:set var="i" value="${i + 1}" />
</c:foreach>

然后,以jQuery为例:

$(function() {
    $(".removebutton").click(function() {
        var dataInputId = $(this).data("inputid");
        $("input[data-inputid='" + dataInputId + "']").val(1);
    });
});

但不要忘记:如果你有嵌套循环,data-input应该在整个文档中都是唯一的。

答案 1 :(得分:0)

由于似乎没有官方支持获取生成的输入名称,所以我已经创建了一个处理它的函数。它基于我在Spring表单标记库中找到的功能。

静态方法:

public class JspUtils {

    public static String escapeJS( String value) {
        return StringEscapeUtils.escapeJavaScript( value);
    }

    public static String getPath( PageContext pageContext, String name) {

        String path =   (String)pageContext.getRequest().getAttribute( "nestedPath");
        if (path == null)
            path    =   (String)pageContext.getAttribute( "nestedPath");
        if (path == null)
            return name;

        path        =   path.substring( path.indexOf( ".") + 1);
        path        +=  name;
        return path;
    }

    public static String getPathJsEscaped( PageContext pageContext, String name) {
        return StringEscapeUtils.escapeJavaScript( getPath(pageContext, name));
    }
}

tld定义:

<function>
    <description>
        Get nested path value as string
    </description>
    <name>getPath</name>
    <function-class>com.pathfix.JspUtils</function-class>
    <function-signature>java.lang.String getPath(javax.servlet.jsp.PageContext, java.lang.String)</function-signature>
</function>
<function>
    <description>
        Get nested path value as javascript escaped string
    </description>
    <name>getPathJsEscaped</name>
    <function-class>com.pathfix.JspUtils</function-class>
    <function-signature>java.lang.String getPathJsEscaped(javax.servlet.jsp.PageContext, java.lang.String)</function-signature>
</function>

使用示例:

<%@ taglib prefix="pathfix" uri="http://pathfix.com"%>

Name: <form:input path="name"/>
<a href="javascript: alert('Generated name is ${pathfix:getPathJsEscaped( pageContext, 'name')}')">Test it!</a>