这里有新鲜出炉的精品教程,程序狗速度看过来!
Spring是什么呢?首先它是一个开源的项目,而且目前非常活跃;它是一个基于IOC和AOP的构架多层j2ee系统的框架,但它不强迫你必须在每一层 中必须使用Spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;它实现了很优雅的MVC,对不同的数据访问技术提供了统一的接口,采用IOC使得可以很容易的实现bean的装配,提供了简洁的AOP并据此实现Transcation Managment,等等
这篇文章主要介绍了详解SpringMVC学习系列(6) 之 数据验证 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
在系列(4)、(5)中我们展示了如何绑定数据,绑定完数据之后如何确保我们得到的数据的正确性?这就是我们本篇要说的内容 —> 数据验证。
这里我们采用Hibernate-validator来进行验证,Hibernate-validator实现了JSR-303验证框架支持注解风格的验证。首先我们要到http://hibernate.org/validator/下载需要的jar包,这里以4.3.1.Final作为演示,解压后把hibernate-validator-4.3.1.Final.jar、jboss-logging-3.1.0.jar、validation-api-1.0.0.GA.jar这三个包添加到项目中。
配置之前项目中的springservlet-config.xml文件,如下:
- <!-- 默认的注解映射的支持 -->
- <mvc:annotation-driven validator="validator" conversion-service="conversion-service" />
- <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
- <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
- <!--不设置则默认为classpath下的 ValidationMessages.properties -->
- <property name="validationMessageSource" ref="validatemessageSource"/>
- </bean>
- <bean id="conversion-service" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
- <bean id="validatemessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
- <property name="basename" value="classpath:validatemessages"/>
- <property name="fileEncodings" value="utf-8"/>
- <property name="cacheSeconds" value="120"/>
- </bean>
其中<property name="basename" value="classpath:validatemessages"/>中的classpath:validatemessages为注解验证消息所在的文件,需要我们在resources文件夹下添加。
在com.demo.web.controllers包中添加一个ValidateController.java内容如下:
- package com.demo.web.controllers;
- import java.security.NoSuchAlgorithmException;
- import javax.validation.Valid;
- import org.springframework.stereotype.Controller;
- import org.springframework.ui.Model;
- import org.springframework.validation.BindingResult;
- import org.springframework.web.bind.annotation.ModelAttribute;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import com.demo.web.models.ValidateModel;
- @Controller@RequestMapping(value = "/validate") public class ValidateController {
- @RequestMapping(value = "/test", method = {
- RequestMethod.GET
- }) public String test(Model model) {
- if (!model.containsAttribute("contentModel")) {
- model.addAttribute("contentModel", new ValidateModel());
- }
- return "validatetest";
- }
- @RequestMapping(value = "/test", method = {
- RequestMethod.POST
- }) public String test(Model model, @Valid@ModelAttribute("contentModel") ValidateModel validateModel, BindingResult result) throws NoSuchAlgorithmException {
- //如果有验证错误 返回到form页面
- if (result.hasErrors()) return test(model);
- return "validatesuccess";
- }
- }
其中@Valid @ModelAttribute("contentModel") ValidateModel validateModel的@Valid 意思是在把数据绑定到@ModelAttribute("contentModel") 后就进行验证。
在com.demo.web.models包中添加一个ValidateModel.java内容如下:
- package com.demo.web.models;
- import org.hibernate.validator.constraints.Email;
- import org.hibernate.validator.constraints.NotEmpty;
- import org.hibernate.validator.constraints.Range;
- public class ValidateModel{
- @NotEmpty(message="{name.not.empty}")
- private String name;
- @Range(min=0, max=150,message="{age.not.inrange}")
- private String age;
- @NotEmpty(message="{email.not.empty}")
- @Email(message="{email.not.correct}")
- private String email;
- public void setName(String name){
- this.name=name;
- }
- public void setAge(String age){
- this.age=age;
- }
- public void setEmail(String email){
- this.email=email;
- }
- public String getName(){
- return this.name;
- }
- public String getAge(){
- return this.age;
- }
- public String getEmail(){
- return this.email;
- }
- }
在注解验证消息所在的文件即validatemessages.properties文件中添加以下内容:
- name.not.empty=\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\u3002
- age.not.inrange=\u5E74\u9F84\u8D85\u51FA\u8303\u56F4\u3002
- email.not.correct=\u90AE\u7BB1\u5730\u5740\u4E0D\u6B63\u786E\u3002
- email.not.empty=\u7535\u5B50\u90AE\u4EF6\u4E0D\u80FD\u60DF\u6050\u3002
其中name.not.empty等分别对应了ValidateModel.java文件中message=”xxx”中的xxx名称,后面的内容是在输入中文是自动转换的ASCII编码,当然你也可以直接把xxx写成提示内容,而不用另建一个validatemessages.properties文件再添加,但这是不正确的做法,因为这样硬编码的话就没有办法进行国际化了。
在views文件夹中添加validatetest.jsp和validatesuccess.jsp两个视图,内容分别如下:
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
- <form:form modelAttribute="contentModel" method="post">
- <form:errors path="*"></form:errors><br/><br/>
- name:<form:input path="name" /><br/>
- <form:errors path="name"></form:errors><br/>
- age:<form:input path="age" /><br/>
- <form:errors path="age"></form:errors><br/>
- email:<form:input path="email" /><br/>
- <form:errors path="email"></form:errors><br/>
- <input type="submit" value="Submit" />
- </form:form>
- </body>
- </html>
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!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=UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
- 验证成功!
- </body>
- </html>
其中特别要指出的是validatetest.jsp视图中<form:form modelAttribute="contentModel" method="post">的modelAttribute="xxx"后面的名称xxx必须与对应的@Valid @ModelAttribute("xxx") 中的xxx名称一致,否则模型数据和错误信息都绑定不到。
<form:errors path="name"></form:errors>即会显示模型对应属性的错误信息,当path="*"时则显示模型全部属性的错误信息。
运行测试:
直接点击提交:
可以看到正确显示了设置的错误信息。
填写错误数据提交:
可以看到依然正确显示了设置的错误信息。
填写正确数据提交:
可以看到验证成功。
下面是主要的验证注解及说明:
数据验证的内容到此结束,代码下载:demo
更多信息请参考官方文档:http://docs.jboss.org/hibernate/validator/4.3/reference/en-US/html/validator-usingvalidator.html
来源: http://www.phperz.com/article/17/1204/359117.html