我很难找到关于List对象的Spring表单(包括验证)的好信息,尤其是当与选择框或复选框等无关时。
我想要一个表单对象,如:
public class MyForm {
private List<String> values;
public List<String> getValues() { return this.values; }
public void setValues(List<String> values) { this.values = values; }
}
JSP:
<form:form method="post" action="${pageContext.request.contextPath}/something" commandName="myForm">
...
<c:forEach var="unused" items="${myForm.values}">
<div><form:input path="values" /><form:errors path="values" /></div>
</c:forEach>
...
</form:form>
控制器:
...
for (String value : myForm.getValues()) {
if (! isValidCode(value)) {
bindingResult.rejectValue("values", "invalid.code", "Code unknown!");
}
}
...
当我提交表单时,我可以看到在java.util.List中输入的值是正确的。
当表单再次呈现时:a) 每个输入字段都具有相同的值(最后输入的值),并且b) 表单:errors为每个字段显示多条错误消息,包括有效值。
我在列表上的c:forEach循环导致每个输入字段获得相同的值,这有什么问题吗?
有可能做这样的事情吗:
if (! isValidCode(value)) {
bindingResult.rejectValue("values[" + i + "], "invalid.code", "Code unknown!");
}
和:
<c:forEach var="unused" items="${values}" varStatus="status">
<div><form:input path="values" /><form:errors path="values[${status.index}]" /></div>
</c:forEach>
这特别不起作用,我已经尝试了很多变体,但似乎都无法实现——任何想法/帮助都将不胜感激!
谢谢。
两个表单标签都应该有相同的路径:
<c:forEach items="${values}" varStatus="status">
<div><form:input path="values[${status.index}]" /><form:errors path="values[${status.index}]" /></div>
</c:forEach>