Spring MVC 表单校验 (七)
完整的项目案例: springmvc.zip
目录
实例
除了依赖spring-webmvc还需要依赖jackson-databind(用于转换json数据格式)和hibernate-validator(表单验证)
<!--表单验证-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.13.Final</version>
</dependency>
<!--json-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
项目结构:
web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 请求总控器 --> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:dispatcher-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
配置dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="edu.nf.ch07.controller"/> <mvc:annotation-driven/> <mvc:default-servlet-handler/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
请求控制器UserController:
package edu.nf.ch07.controller; import entity.Users; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; import vo.ResponseVO; import javax.validation.Valid; import java.util.ArrayList; import java.util.List; /** * @author wangl * @date 2018/11/1 */ @Controller public class UserController { /** * 使用@Valid注解对Bean进行校验, * 当校验不通过的时候,会有异常和相应的提示信息返回, * 这些信息回绑定到一个BindingResult的对象中,因此 * 我们可以从这个对象中获取校验信息 * @param user * @return */ @PostMapping("/add") @ResponseBody public ResponseVO add(@Valid Users user, BindingResult result){ //如果有错误消息,则获取字段的message的信息 ResponseVO vo = new ResponseVO(); if(result.hasErrors()){ List<String> messages = new ArrayList<>(); List<FieldError> list = result.getFieldErrors(); for (FieldError fieldError : list) { System.out.println(fieldError.getDefaultMessage()); messages.add(fieldError.getDefaultMessage()); } vo.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value()); vo.setValue(messages); return vo; } vo.setMessage("success"); return vo; } }
vo响应视图:
package vo; import org.springframework.http.HttpStatus; /** * @author wangl * @date 2018/11/1 * 统一视图响应对象 */ public class ResponseVO { /** * 响应状态码 */ private Integer code = HttpStatus.OK.value(); /** * 提示消息 */ private String message; /** * 响应数据 */ private Object value; public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } @Override public String toString() { return "ResponseVO{" + "code=" + code + ", message='" + message + '\'' + ", value=" + value + '}'; } }
前台页面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/jquery-3.3.1.min.js"></script> </head> <body> <h1>注册用户</h1> <div id="msg" style="color: red"></div> <form id="f1"> Name:<input type="text" name="userName"/><br> Age:<input type="text" name="age"/><br> Email:<input type="text" name="email"/><br> <input type="button" value="submit"/> </form> <script> $(function(){ $(':button').on('click',function(){ $.ajax({ url: 'add', type: 'post', data: $('#f1').serialize(), success: function(data){ if(data.code == 200) { alert(data.message); }else{ $.each(data.value, function(index,val){ $('#msg').append(val+"<br>"); }); } } }); }) }); </script> </body> </html>
实体类Users
package entity; import javax.validation.constraints.Email; import javax.validation.constraints.Min; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; /** * @author wangl * @date 2018/11/1 * 使用相应的注解来制定校验规则 */ public class Users { /** * 内容不能为空,字符串或集合的内容不允许为空 */ @NotEmpty(message = "请输入用户名") private String userName; /** * 引用或值不能为null */ @NotNull(message = "请输入年龄") @Min(value = 18, message = "年龄不得小于18岁") private Integer age; @NotEmpty(message = "请填写Email地址") @Email(message = "请填写有效的Email地址") private String email; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }