增加表单验证,首先要实现一个表单,想要操作表单我们需要将控制器类继承SimpleFormController类,现在我们创建一个注册表单来理解它的工作过程,这个SimpleFormController在Spring3.0以后已经不推荐使用了,如果使用3.0后以上版本建议使用annotation来代替。
首先定义我们的控制器类:
package com.zcl.spring.validation;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
@SuppressWarnings("deprecation")
public class UserController extends SimpleFormController {
private UserService userService ;
public UserController(){
setCommandClass(User.class) ;
setCommandName("user") ;
}
public void setUserService(UserService userService){
this.userService = userService ;
}
@Override
protected ModelAndView onSubmit(Object command) throws Exception{
User user = (User)command ;
userService.add(user) ;
return new ModelAndView("userSuccess","user",user) ;
}
}
定义User的域对象:
package com.zcl.spring.validation;
public class User {
private String name ;
private String password ;
private String gender ;
private String country ;
private String aboutYou ;
private String[] community ;
private boolean mailingList ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getAboutYou() {
return aboutYou;
}
public void setAboutYou(String aboutYou) {
this.aboutYou = aboutYou;
}
public String[] getCommunity() {
return community;
}
public void setCommunity(String[] community) {
this.community = community;
}
public boolean isMailingList() {
return mailingList;
}
public void setMailingList(boolean mailingList) {
this.mailingList = mailingList;
}
}
UserService接口:
package com.zcl.spring.validation;
public interface UserService {
public void add(User user) ;
}
实现UserService接口类:
package com.zcl.spring.validation;
public class UserServiceImpl implements UserService {
@Override
public void add(User add) {
System.out.println("User add Success") ;
}
}
基本工作做完了,现在我们要验证表单域,此时我们需要一个单独的实现了Validator接口的 UserValidator 类。并覆写validate()方法执行所有的验证操作。在jsp页面我们需要增加form:errors 标签来显示错误。你需要一个单独存取错误信息的文件,并在配置文件中关联上。
package com.zcl.spring.validation;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
public class UserValidator implements Validator {
@Override
public boolean supports(Class<?> arg0) {
return User.class.isAssignableFrom(arg0);
}
@Override
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "name.required") ;
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "password.required") ;
ValidationUtils.rejectIfEmpty(errors, "gender", "gender.required") ;
ValidationUtils.rejectIfEmpty(errors, "country", "country.required") ;
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "aboutYou", "aboutYou.required") ;
User user = (User)target ;
if(user.getCommunity().length==0){
errors.rejectValue("community", "community.required") ;
}
}
}
存取错误信息文件message.properties在src目录下,信息如下:
name.required = User Name is required
password.required = Password is required
gender.required = Gender is required
country.required = Country is required
aboutYou.required = About You is required
community.required = Select at least one community
配置dispatcher-servlet.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans">
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"
p:basename="message" />
<bean id="userService" class="com.zcl.spring.validation.UserServiceImpl" />
<bean id="userValidator" class="com.zcl.spring.validation.UserValidator" />
<bean name="/userRegistration.html" class="com.zcl.spring.validation.UserController"
p:userService-ref="userService" p:formView="userForm"
p:successView="userSuccess" p:validator-ref="userValidator" />
</beans>
注册页面如下:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Registration Page</title>
<style>
.error {
color: #ff0000;
font-style: italic;
}
</style>
</head>
<body>
<form:form method="POST" commandName="user">
<table>
<tr>
<td>User Name :</td>
<td><form:input path="name" /></td>
<td><form:errors path="name" cssClass="error" /></td>
</tr>
<tr>
<td>Password :</td>
<td><form:password path="password" /></td>
<td><form:errors path="password" cssClass="error" /></td>
</tr>
<tr>
<td>Gender :</td>
<td><form:radiobutton path="gender" value="M" label="M" />
<form:radiobutton path="gender" value="F" label="F" /></td>
<td><form:errors path="gender" cssClass="error" /></td>
</tr>
<tr>
<td>Country :</td>
<td><form:select path="country">
<form:option value="" label="Select" />
<form:option value="1" label="India" />
<form:option value="2" label="USA" />
<form:option value="3" label="UK" />
</form:select></td>
<td><form:errors path="country" cssClass="error" /></td>
</tr>
<tr>
<td>About you :</td>
<td><form:textarea path="aboutYou" /></td>
<td><form:errors path="aboutYou" cssClass="error" /></td>
</tr>
<tr>
<td>Community :</td>
<td><form:checkbox path="community" value="Spring"
label="Spring" /> <form:checkbox path="community" value="Hibernate"
label="Hibernate" /> <form:checkbox path="community" value="Struts"
label="Struts" /></td>
<td><form:errors path="community" cssClass="error" /></td>
</tr>
<tr>
<td colspan="3"><form:checkbox path="mailingList"
label="Would you like to join our mailinglist?" /></td>
</tr>
<tr>
<td colspan="3"><input type="submit" value="Register"></td>
</tr>
</table>
</form:form>
</body>
</html>
显示信息页面:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Success Page</title>
</head>
<body>
User Details
<hr>
User Name : ${user.name} <br/>
Gender : ${user.gender} <br/>
Country : ${user.country} <br/>
About You : ${user.aboutYou} <br/>
Community : ${user.community[0]} ${user.community[1]} ${user.community[2]}<br/>
Mailing List: ${user.mailingList}
</body>
</html>
加入我们输入不符合要求将显示如下: