Зміст
Динамічне взаємодія користувача і веб-сайту з використанням форм є однією з найважливіших деталей сайту. У цій статті буде розказано про створення форм та перевірки даних форми з використанням 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 | > |