Валидация формы Spring 3 MVC

В этой статье я бы хотел вам показать как реализовать валидацию данных формы средствами Spring.

И так начнем со скриншота:

Так будет выглядеть наша форма до проверки на валидность данных

А так в случае если пользователь ввел не валидные данные (пустые поля)
 

Шаг 1.

Начнем с POJO:

package com.devcolibri.model;

public class User {
    private String email;
    private String password;

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

 Шаг 2.

Создадим UserValidator:

package com.devcolibri.validator;

import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import com.devcolibri.model.User;

@Component
public class UserValidator implements Validator {

    @Override
    public boolean supports(Class<?> aClass) {
        return User.class.isAssignableFrom(aClass);
    }

    @Override
    public void validate(Object o, Errors errors) {
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "label.validate.emailEmpty");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "label.validate.passwordEmpty");
    }

}

В первую очередь нужно реализовать интерфейс Validator:

1. метод supports(Class<?> aClass) регистрирует какие классы должны поддерживать данную валидацию;

2. метод validate(Object o, Errors errors) собственно и осуществляет валидацию, тут мы описываем правила валидации, а точней в каком случае данные будут считаться не валидными.

Шаг 3.

Рассмотрим следующую строку:

ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "label.validate.emailEmpty");

Тут вы видите что мы используем ValidationUtils это утилита позволяющая осуществлять валидацию данных.

Метод rejectIfEmptyOrWhitespace(errors, "email", "label.validate.emailEmpty"); позволяет нам указать поле которое надо валидировать ("email") и сообщение ("label.validate.emailEmpty"), где «label.validate.emailEmpty» — это сообщение из property файла:

label.validate.emailEmpty = Email is required
label.validate.passwordEmpty = Password is required

Шаг 4.

Создаем контроллер:

@Controller
@RequestMapping(value = "/index")
public class UserController {

    private RegistrationValidator validator;

    @Autowired
    public RegistrationUserController(RegistrationValidator validator){
        this.validator = validator;
    }

    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView addUser(@ModelAttribute("command") User user,
                                   BindingResult result,
                                   SessionStatus status) {

        validator.validate(user, result);

        if(result.hasErrors()){
            return new ModelAndView("index", "command", user);
        }else {
            status.setComplete();
        }

        return new ModelAndView("index", "command", user);
    }

    @RequestMapping(method = RequestMethod.GET)
    public String welcome(ModelMap model) {
        model.addAttribute("command", new User());
        return "index";
    }
}

И проперти для вывода сообщений:

label.validate.emailEmpty = Email is required
label.validate.passwordEmpty = Password is required

Шаг 5.

Создаем валидатор:

@Component
public class RegistrationValidator implements Validator {

    @Override
    public boolean supports(Class<?> aClass) {
        return User.class.isAssignableFrom(aClass);
    }

    @Override
    public void validate(Object o, Errors errors) {
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "label.validate.emailEmpty");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "label.validate.passwordEmpty");
    }

}

Шаг 6.

Теперь создадим jsp страницу:

<div class="white-block" style="width: 500px;">
    <h3 align="center"><spring:message code="label.reg.getStartedNow"/></h3>
    <form:form method="post" action="index.html" cssClass="form-horizontal" cssStyle="margin: 0 auto;" >
        <div class="control-group">
            <form:label path="email" cssClass="control-label"><spring:message code="label.reg.textEmail"/></form:label>
            <div class="controls">
                <form:errors path="email" cssClass="label label-important" />
                <div>
                    <form:input path="email" placeholder="e-mail" cssClass="reg-input" size="64" />
                </div>
            </div>
        </div>

        <div class="control-group">
            <form:label path="password" cssClass="control-label"><spring:message code="label.reg.textPassword"/></form:label>
            <div class="controls">
                <form:errors path="password" cssClass="label label-important" />
                <div>
                    <form:password path="password" placeholder="password" cssClass="reg-input" size="30" />
                </div>
            </div>
        </div>

        <div class="control-group">
            <div class="controls">
                <button type="submit" class="btn large btn-success">Registration</button>
            </div>
        </div>
    </form:form>

</div>

Шаг 7.

В mvc-dispatcher-servlet.xml нужно добавить следующую строку:

<context:component-scan base-package = "com.devcolibri" />
Урок создан: 04 декабря 2012 | Просмотров: 16830 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 15 июня 2013 в 21:04

    Михаил

    А можно код проекта?

    • 16 июня 2013 в 16:34

      Александр Барчук

      К сожалению не могу найти… Но по описанному должно все получится, попробуйте сделать.

      • 16 марта 2014 в 17:41

        mm

        Тема полностью не раскрыта, наверно это было написано чисто для себя .
        Наприкмер где файл label.properties?
        где mvc-dispatcher-servlet.xml ?

        • 17 марта 2014 в 00:08

          Александр Барчук

          Согласен с вами, Урок был написан давно, и тогда еще не совсем понимал как правильно их писать. Данный урок будет переписан, в новой версии Devcolibri.

          • 29 ноября 2014 в 02:42

            Дмитрий

            Ну так что мешает вам создать по написанному проект и приложить сюда?

            • 04 октября 2015 в 17:32

              Айдын

              Уже скоро будет год…

              • 05 августа 2016 в 13:51

                Юрий

                Прошло 3 года. Обещанного, как известно, 3 года ждут. Мы подождали.

                • 22 апреля 2017 в 09:31

                  Aleksei Mironov

                  уже 2017 ребят