Перевірка даних форми за допомогою анотацій (@Size, @Email та ін) в Spring MVC

червня
21
2012

Зміст

Ця стаття є продовженням статті про форми в Spring і про перевірку введених користувачем даних. Будуть розглянуті анотації, що замінюють валідатор.

Щоб вказати параметри перевірки ім'я користувача будемо використовувати наступні анотації:


@NotBlank
@Size(min=3, max=16)
private String username;

Анотація @Email використовується для перевірки правильності введеного email'у:


@Email
private String email;

На жаль, немає стандартної анотації, яка перевіряє, що значення двох полів однакові (в нашому випадку - password і confirmPassword). Таку анотацію ми створимо в наступній статті.

Тобто, остаточний варіант класу SignupForm буде виглядати наступним чином:


package com.seostella.springfa.form;

import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotBlank;

public class SignupForm {
	@NotBlank
	@Size(min=3, max=16)
	private String username;
	
	@NotBlank
	private String password;
	
	@NotBlank
	private String confirmPassword;
	
	@Email
	private String email;
	
	public String getUsername() {
		return username;
	}
	
	public void setUsername(String username) {
		this.username = username;
	}
	
	public String getPassword() {
		return password;
	}
	
	public void setPassword(String password) {
		this.password = password;
	}
	
	public String getConfirmPassword() {
		return confirmPassword;
	}
	
	public void setConfirmPassword(String confirmPassword) {
		this.confirmPassword = confirmPassword;
	}
	
	public String getEmail() {
		return email;
	}
	
	public void setEmail(String email) {
		this.email = email;
	}
}

У класі SignupValidator вже немає ніякої необхідності, тому він виключений з проекту.

Необхідно внести ще одну правку в контролер SignupController. Так як ми використовуємо анотації, які будуть перевіряти значення полів класу, необхідно описати анотацією @Valid параметр методу SignupForm. Нижче наведено повний лістинг класу SignupController:


package com.seostella.springfa.controller;

import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.seostella.springfa.form.SignupForm;

@Controller
@RequestMapping("/signup")
public class SignupController {

	@RequestMapping(method = RequestMethod.GET)
	public String signup(ModelMap model) {
		SignupForm signupForm = new SignupForm();
		model.put("signupForm", signupForm);
		return "signup";
	}

	@RequestMapping(method = RequestMethod.POST)
	public String processSignup(@Valid final SignupForm signupForm, final BindingResult result) {
		if (result.hasErrors()) {
			return "signup";
		}
		return "signup-success";
	}
}

Решта файлів проекту залишаються без змін.

У класі SignupForm використовувалися анотації з двох пакетів: javax.validation.constraints і org.hibernate.validator.constraints. Розглянемо інші анотації з цих пакетів.

Пакет javax.validation.constraints:

Пакет org.hibernate.validator.constraints:

Код проекту Ви можете завантажити за наступним посиланням - Завантажити spring-fa.zip.

< Форми та валідація форм в Spring Анотація для перевірки рівності двох полів форми в Spring MVC >

Коментарі (5)

arazei
31 жовтня 2012 р. 17:59
Почему у меня не работает это условие
if (result.hasErrors()) {
return "signup";
}
у меня всегда result.hasErrors() равен нулю, даже если я нарошно делаю ошибку?
arazei
16 листопада 2012 р. 13:22
Разобрался
pyadmitriy
11 січня 2013 р. 00:41
А как проверить поле
private Date year;
pyadmitriy
11 січня 2013 р. 00:48
Нужно задать первый вопрос!
Есть поле на форме для ввода даты 15.01.2012. Ка с ним правильно работать?
При регистрации его нужно записать в БД, пр чтение извлечь!
pyadmitriy
11 січня 2013 р. 02:30
Как провалидировать
@RequestMapping(value = "/useradd", method = RequestMethod.POST)
public String addUserSubmit(@Valid final User user, HttpServletRequest request, final BindingResult result,
Model model)
{
Role role = roleService.readRole(Integer.parseInt(request.getParameter("roleId")));
if(role.getName().equals("student"))
{
Group group = groupService.readGroup(Integer.parseInt(request.getParameter("groupId")));
user.setGroup(group);
}
user.getRoles().add(role);
if(result.hasErrors())
return "useradd";
userService.addUser(user);
foldersService.createFolders(user);
model.addAttribute("addeduser", user);
return "redirect:/useradd";
}
Ви повинні увійти під своїм аккаунтом щоб залишати коментарі