0

我有复杂的表单对象,具有无限的深度,我试图在 jsp 上使用 spring 表单标签编辑它们。

主模型属性绑定到弹簧形式,当我遍历孩子时,我使用了nestedPath,一切正常。结果,我生成了类似于以下内容的输入名称:

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

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

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

容器标签

<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 属性,但它也包含模型属性(表单)名称的名称。

有官方的方法来获取生成的名称吗?

谢谢

4

2 回答 2

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整个文档应该是唯一的。

于 2012-11-27T14:13:20.770 回答
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));
    }
}

顶级域名定义:

<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>
于 2013-02-05T09:32:41.493 回答