声明,使用 JDK8 、spring5.0.7 、idea2018.2
Spring MVC 提供了两种数据校验的方式:
基于 Validator 接口
使用 Annotaion JSR-303 标准进行校验
基于 Validator 接口的方式需要自定义 Validator 验证器,每一条数据的验证规则需要自己手动完成;使用 Annotaion JSR-303 标准则不需要自定义验证器,通过注解的方式可以直接在实体类中添加每个属性的校验规则,这种方式更加方便,实际开发中推荐使用。
Annotaion JSR-303标准参考:
https://blog.csdn.net/weixin_42323802/article/details/84000994
基于 Validator 接口
主要步骤为:
1、自定义校验器 StudentValidation,实现 Validator 接口
2、编写Controller 、对业务逻辑判断;
3、jsp页面通过form表单的post发送请求;
子模块目录结构如下:
model实体类;
public class Student {
private String name;
private String password;
}
/**
* @auther SyntacticSugar
* @data 2018/11/16 0016下午 10:46
* 自定义 校验器StudentValidator;
*/
public class StudentValidator implements Validator{
@Override
public boolean supports(Class<?> clazz) {
return Student.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
// TODO Auto-generated method stub
ValidationUtils.rejectIfEmpty(errors, "name", null, "姓名不能为空");
ValidationUtils.rejectIfEmpty(errors, "password", null, "密码不能为空");
}
}
控制器 HelloHandler,业务方法 login 参数列表中的 @Validated 表示参数 student 是需要校验的对象,@BindingResult 用来存储错误信息,两者缺一不可,而且必须挨着写,中间不能有其他参数。
/**
* @auther SyntacticSugar
* @data 2018/11/16 0016下午 10:51
*/
@Controller
public class HelloHandler {
@GetMapping("/login")
public String login(Model model) {
model.addAttribute(new Student());
return "login";
}
// 校验结果 BindingResult
@PostMapping("/login")
public String login(@Validated Student student, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "login";
}
return "success";
}
}
springmvc-servlet.xml配置;
<!-- 配置bean , 开启注解扫描 controller ,配置mvc驱动 -->
<context:component-scan base-package="com.baidu"/>
<!-- 配置mvc 的视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--基于 validator配置 -->
<mvc:annotation-driven validator="studentValidator"/>
<bean id="studentValidator" class="com.baidu.validator.StudentValidator"/>
web.xml配置springmvc的入口、;
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>Archetype Created Web Application</display-name>
<!-- springmvc的入口 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
login.jsp页面;
<h1>学生登录</h1>
<form:form modelAttribute="student" action="login" method="post">
学生姓名:<form:input path="name" /><form:errors path="name"/><br/>
学生密码:<form:password path="password" /><form:errors path="password"/><br/>
<input type="submit" value="提交"/>
</form:form>
通过地址栏发送 GET 请求访问 login 方法,绑定模型数据,然后页面跳转到 login.jsp。
http://localhost:8080/springmvc_test_upload/login
直接单击“提交”按钮,form 表单发送 POST 请求访问 login 方法,完成数据校验,并将校验结果再次返回到 login.jsp。
Annotaion JSR-303 标准
使用 Annotation JSR-303 标准进行验证,需要导入支持这种标准的 jar 包,这里我们使用 Hibernate Validator。
主要使用@Valid绑定需校验的对象;
具体参见:
https://blog.csdn.net/weixin_42323802/article/details/84000994
pom.xml配置:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- JRS-303 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.3.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.1.1.GA</version>
</dependency>
<!-- 解决 JDK 9 以上版本没有 JAXB API jar 的问题,JDK 9 以下版本不需要配置 -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>