Связывание форм Spring 3 MVC с помощью java.util.List, включая ошибки форм и проверку с помощью bindingResult. - PullRequest
4 голосов
/ 30 января 2012

Я изо всех сил пытаюсь найти хорошую информацию о формах Spring (включая проверку) с объектами List, особенно когда они не связаны с полями выбора или флажками и т. Д.

Мне нужен объект формы, такой как:

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>

Это специально не работает, и я попробовал несколько вариантов этого и, похоже, не могу заставить его работать - любые идеи / помощь будут очень полезныоценил!

Спасибо.

1 Ответ

0 голосов
/ 11 мая 2012

Оба тега формы должны иметь одинаковый путь:

<c:forEach items="${values}" varStatus="status">
    <div><form:input path="values[${status.index}]" /><form:errors path="values[${status.index}]"  /></div>
</c:forEach>
...