Статьи

Java EE MVC: обработка проверки формы

В этом посте мы рассмотрим проверку формы в Java EE MVC.

Java EE MVC интегрируется с Java Bean Validation API ( JSR 303 ), что значительно упрощает добавление ограничений проверки.

Валидация с использованием способа JAX-RS

Предположим, у нас есть небольшая HTML-форма, которую можно использовать для отправки контактных сообщений. Для представления данных формы мы создаем небольшой компонент ContactMessage, содержащий поля формы и ограничения проверки:

1
2
3
4
5
6
7
8
9
public class ContactMessage {
 
    @FormParam("message")
    @NotBlank
    @Size(max = 1000)
    private String message;
 
    // getters / setters
}

В нашем контроллере MVC мы используем аннотацию @BeanParam для преобразования данных формы в объект ContactMessage:

1
2
3
4
5
6
7
8
9
@Controller
@Path("/")
public class ContactController {
 
    @POST
    public String formSubmit(@Valid @BeanParam ContactMessage message) {
        ...
    }
}

(Для получения более подробной информации об аннотации @BeanParam, посмотрите сообщение в блоге Работа с параметрами bean )

Добавляя аннотацию @Valid к параметру ContactMessage, мы включаем проверку. Если форма отправлена ​​и проверка объекта ContactMessage завершается неудачно, создается ConstraintViolationException. Метод контроллера не будет вызываться в этом случае. Вместо этого исключение может быть обработано с использованием универсального JAX-RS ExceptionMapper, как показано в другом посте: Глобальная обработка исключений в Java EE MVC .

Этот подход обычно подходит для стандартных конечных точек REST JAX-RS. Здесь мы часто хотим вернуть общий код состояния HTTP 400 (неверный запрос), если недопустимые данные были переданы на сервер.

В среде MVC мы можем использовать это поведение для отображения стандартной страницы ошибки для пользователя, когда бы ни были переданы недопустимые данные. Однако это часто недостаточно гибко. Часто мы хотим вернуть более конкретную страницу, которая показывает сообщение об ошибке пользователю.

Проверка с использованием @MvcBinding и BindingResult

Java EE MVC предоставляет аннотацию @MvcBinding, которая обеспечивает альтернативный механизм обработки исключений. @MvcBinding может быть помещен в поля и параметры метода вместе с аннотациями привязки JAX-RS (например, @FormParam):

01
02
03
04
05
06
07
08
09
10
public class ContactMessage {
 
    @MvcBinding
    @FormParam("message")
    @NotBlank
    @Size(max = 1000)
    private String message;
 
    // getters / setters
}

Это говорит Java EE MVC вызывать метод контроллера вместо универсального обработчика исключений в случае сбоя привязки аннотированного поля. Чтобы получить доступ к информации о привязке, мы можем внедрить объект BindingResult в наш класс контроллера:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
@Controller
@Path("/")
public class ContactController {
 
    @Inject
    private Models models;
 
    @Inject
    private BindingResult bindingResult;
 
    @POST
    public String formSubmit(@Valid @BeanParam ContactMessage message) {
        if (bindingResult.isFailed()) {
            models.put("bindingResult", bindingResult);
            return "/WEB-INF/jsp/contact.jsp";
        }
        return "/WEB-INF/jsp/success.jsp";
    }
}

Как следует из названия, мы можем использовать внедренный объект BindingResult для доступа к информации о привязке в методе контроллера. В этом примере мы просто проверяем, была ли проблема с привязкой, вызывая isFailed (). Добавив bindingResult к модели, мы можем получить к нему доступ позже, чтобы показать пользователю сообщение об ошибке.

Простое представление JSP, которое отображает все ошибки проверки под кнопкой отправки, выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<form action="${mvc.contextPath}/contact" method="post">
    <label>Message:</label>
    <textarea name="message"></textarea>
    <br/>
 
    <input type="submit"/>
 
    <c:if test="${bindingResult.isFailed()}">
        <p>Form validation failed. Reasons:</p>
        <ul>
            <c:forEach items="${bindingResult.allValidationErrors}" var="validationError">
                <li>
                    <c:out value="${validationError.paramName}: ${validationError.message}"/>
                </li>
            </c:forEach>
        </ul>
    </c:if>
</form>

Вывод

Проверка формы довольно проста с Java EE MVC. Ограничения проверки могут быть добавлены к bean-компонентам с помощью аннотаций проверки bean-компонента JSR 303. @MvcBinding позволяет обрабатывать ошибки валидации в методах контроллера вместо использования универсальных ExceptionMappers. BindingResult дает нам доступ к проверочной информации.

Как всегда, вы можете найти пример кода на GitHub .

Опубликовано на Java Code Geeks с разрешения Михаэля Шаргага, партнера нашей программы JCG. См. Оригинальную статью здесь: Java EE MVC: обработка проверки формы

Мнения, высказанные участниками Java Code Geeks, являются их собственными.