Содержание
Динамическое взаимодействие пользователя и веб-сайта с использованием форм является одной из важнейших деталей сайта. В этой статье будет рассказано о создании форм и проверки данных формы с использованием 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 | > |