我有复杂的表单对象,深度不受限制,我正在尝试使用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)名称的名称。
是否有官方方式获取生成的名称?
由于
答案 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>