Формы и валидация форм в 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 >

Напишите первое сообщение!

Вы должны войти под своим аккаунтом чтобы оставлять комментарии