Форми та валідація форм в Spring

червня
20
2012
Мітки: form java spring validation

Зміст

Динамічне взаємодія користувача і веб-сайту з використанням форм є однією з найважливіших деталей сайту. У цій статті буде розказано про створення форм та перевірки даних форми з використанням Spring MVC.

Відразу перейдемо до створення основних компонентів програми. Як приклад будемо використовувати спрощену форму реєстрації, що буде містити лише 4 поля: ім'я користувача, його email, пароль і повторно введений пароль:


package com.seostella.springform.form;

public class SignupForm {
	private String username;
	private String password;
	private String confirmPassword;
	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;
	}
}

Як видно з лістингу, клас максимально простий і містить тільки приватні властивості, геттери і сетери.

Для перевірки правильності введених даних будуть використовуватися наступні умови:

Для перевірки правильності даних буде використовуватися наступний Validator:


package com.seostella.springform.form.validator;

import org.apache.commons.validator.routines.EmailValidator;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import com.seostella.springform.form.SignupForm;

@Component
public class SignupValidator implements Validator{
	public boolean supports(Class<?> clazz) {
		return SignupForm.class.isAssignableFrom(clazz);
	}

	public void validate(Object target, Errors errors) {
		SignupForm signupForm = (SignupForm) target;
		
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "username", "username.empty", "Username must not be empty.");
		String username = signupForm.getUsername();
		if ((username.length()) > 16) {
			errors.rejectValue("username", "username.tooLong", "Username must not more than 16 characters.");
		}
		
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "password.empty", "Password must not be empty.");
		if (!(signupForm.getPassword()).equals(signupForm
				.getConfirmPassword())) {
			errors.rejectValue("confirmPassword", "confirmPassword.passwordDontMatch", "Passwords don't match.");
		}
		
		if( !EmailValidator.getInstance().isValid( signupForm.getEmail() ) ){
			errors.rejectValue("email", "email.notValid", "Email address is not valid.");
		}
	}
}

Зверніть увагу, що цей валідатор реалізує інтерфейс org.springframework.validation.Validator, що є обов'язковим, але рекомендованим.

Для перевірки правильності email'а використовувався клас org.apache.commons.validator.routines.EmailValidator. Щоб підключити бібліотеку з цим класом, скористайтеся наступною maven-залежністю:


<dependency>
	<groupId>commons-validator</groupId>
	<artifactId>commons-validator</artifactId>
	<version>1.4.0</version>
</dependency>

Контролер, який буде обробляти поведінку програми при реєстрації користувача:


package com.seostella.springform.controller;

import org.springframework.beans.factory.annotation.Autowired;
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.springform.form.SignupForm;
import com.seostella.springform.form.validator.SignupValidator;

@Controller
@RequestMapping("/signup")
public class SignupController {
	@Autowired
	private SignupValidator signupValidator;

	@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(SignupForm signupForm, BindingResult result) {
		signupValidator.validate(signupForm, result);
		if (result.hasErrors()) {
			return "signup";
		}
		return "signup-success";
	}
}

Зверніть увагу на атрибут BindingResult методу processSignup. Цей атрибут повинен бути останнім, інакше метод не працюватиме.

Також варто відзначити метод signup. У тілі цього методу в модель додається властивість signupForm, яка буде використана в jsp-файлі.

І, нарешті, файл signup.jsp, в якому оголошена форма:


<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ page session="false"%>
<html>
<head>
<title>Sign Up</title>
<style type="text/css">
span.error {
	color: red;
}
</style>
</head>
<body>
	<h1>Sign Up</h1>

	<form:form method="post" commandName="signupForm">
		<table>
			<tr>
				<td>Username:</td>
				<td><form:input path="username" /></td>
				<td><span class="error"><form:errors path="username" /></span></td>
			</tr>

			<tr>
				<td>Password:</td>
				<td><form:password path="password" /></td>
				<td><span class="error"><form:errors path="password" /></span></td>
			</tr>

			<tr>
				<td>Confirm Password:</td>
				<td><form:password path="confirmPassword" /></td>
				<td><span class="error"><form:errors
							path="confirmPassword" /></span></td>
			</tr>

			<tr>
				<td>Email:</td>
				<td><form:input path="email" /></td>
				<td><span class="error"><form:errors path="email" /></span></td>
			</tr>

			<tr>
				<td colspan="3"><input type="submit" value="Submit" /></td>
			</tr>
		</table>
	</form:form>

	<a href="${pageContext.request.contextPath}/" title="Home">Home</a>
</body>
</html>

Рядком commandName="signupForm" відбувається зв'язування даних форми контролера і jsp-файлу.

У контролері також згадується відображення signup-success. Нижче наведено код файлу signup-success.jsp:


<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page session="false"%>
<html>
<head>
<title>Successfull Sign Up</title>
</head>
<body>
	<h1>Successfull Sign Up</h1>

	<p>Congratulations! Your signup was successful</p>

	<a href="${pageContext.request.contextPath}/" title="Home">Home</a>
</body>
</html>

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

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

Напишіть перше повідомлення!

Ви повинні увійти під своїм аккаунтом щоб залишати коментарі