【Spring学习笔记-MVC-10】Spring MVC之数据校验
1.准备


<?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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"><!-- 扫描web包,应用Spring的注解 --><context:component-scan base-package="com.ll.web"/><!-- 配置视图解析器,将ModelAndView及字符串解析为具体的页面,默认优先级最低 --><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"p:viewClass="org.springframework.web.servlet.view.JstlView"p:prefix="/jsp/"p:suffix=".jsp" /><!-- 设置数据校验、数据转换、数据格式化 --><mvc:annotation-driven validator="validator" conversion-service="conversionService"/><!-- 数据转换/数据格式化工厂bean --><bean id="conversionService"class="org.springframework.format.support.FormattingConversionServiceFactoryBean" /><!-- 设置校验工厂bean-采用hibernate实现的校验jar进行校验-并设置国际化资源显示错误信息 --><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="validatemessageSource"class="org.springframework.context.support.ReloadableResourceBundleMessageSource"><property name="basename"><list><value>classpath:valideMessages</value></list></property><property name="fileEncodings" value="utf-8" /><property name="cacheSeconds" value="120" /></bean></beans>

package com.ll.model;import java.util.Date;import javax.validation.constraints.DecimalMax;import javax.validation.constraints.DecimalMin;import javax.validation.constraints.Past;import javax.validation.constraints.Pattern;import org.hibernate.validator.constraints.Length;import org.springframework.format.annotation.DateTimeFormat;import org.springframework.format.annotation.NumberFormat;public class Person {@Pattern(regexp="W{4,30}",message="{Pattern.person.username}")private String username;@Pattern(regexp="S{6,30}",message="{Pattern.person.passwd}")private String passwd;@Length(min=2,max=100,message="{Pattern.person.passwd}")private String realName;@Past(message="{Past.person.birthday}")@DateTimeFormat(pattern="yyyy-MM-dd")private Date birthday;@DecimalMin(value="1000.00",message="{DecimalMin.person.salary}")@DecimalMax(value="2500.00",message="{DecimalMax.person.salary}")@NumberFormat(pattern="#,###.##")private long salary;public Person() {super();}public Person(String username, String passwd, String realName) {super();this.username = username;this.passwd = passwd;this.realName = realName;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPasswd() {return passwd;}public void setPasswd(String passwd) {this.passwd = passwd;}public String getRealName() {return realName;}public void setRealName(String realName) {this.realName = realName;}public Date getBirthday() {// DateFormat df = new SimpleDateFormat("yyyy-MM-dd");// return df.format(birthday);return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public long getSalary() {return salary;}public void setSalary(long salary) {this.salary = salary;}@Overridepublic String toString() {return "Person [username=" + username + ", passwd=" + passwd + "]";}}
4. 国际化资源文件



5. 控制层



package com.ll.web;import java.security.NoSuchAlgorithmException;import javax.validation.Valid;import org.springframework.stereotype.Controller;import org.springframework.validation.BindingResult;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.RequestMapping;import com.ll.model.Person;/*** @author Administrator**/@Controller@RequestMapping(value = "/test")public class TestController {@ModelAttribute("person")public Person initModelAttr() {Person person = new Person();return person;}/*** 返回主页* @return*/@RequestMapping(value = "/index.action")public String index() {return "regedit";}/*** 1. 在入参对象前添加@Valid注解,同时在其后声明一个BindingResult的入参(必须紧随其后),* 入参可以包含多个BindingResult参数;* 2. 入参对象前添加@Valid注解:请求数据-->入参数据 ===>执行校验;* 3. 这里@Valid在Person对象前声明,只会校验Person p入参,不会校验其他入参;* 4. 概括起来:@Valid与BindingResult必须成对出现,且他们之间不允许声明其他入参;* @param bindingResult :可判断是否存在错误*/@RequestMapping(value = "/FormattingTest")public String conversionTest(@Valid @ModelAttribute("person") Person p,BindingResult bindingResult) throws NoSuchAlgorithmException {// 输出信息System.out.println(p.getUsername() + " " + p.getPasswd() + " "+ p.getRealName() + " " + " " + p.getBirthday() + " "+ p.getSalary());// 判断校验结果if(bindingResult.hasErrors()){System.out.println("数据校验有误");return "regedit";}else {System.out.println("数据校验都正确");return "success";}}}
6. 前台
引入Spring的form标签:

在前台显示错误:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %><html><head><title>数据校验</title><style>.errorClass{color:red}</style></head><body><form:form modelAttribute="person" action='FormattingTest.action' ><form:errors path="*" cssClass="errorClass" element="div"/><table><tr><td>用户名:</td><td><form:errors path="username" cssClass="errorClass" element="div"/><form:input path="username" /></td></tr><tr><td>密码:</td><td><form:errors path="passwd" cssClass="errorClass" element="div"/><form:password path="passwd" /></td></tr><tr><td>真实名:</td><td><form:errors path="realName" cssClass="errorClass" element="div"/><form:input path="realName" /></td></tr><tr><td>生日:</td><td><form:errors path="birthday" cssClass="errorClass" element="div"/><form:input path="birthday" /></td></tr><tr><td>工资:</td><td><form:errors path="salary" cssClass="errorClass" element="div"/><form:input path="salary" /></td></tr><tr><td colspan="2"><input type="submit" name="提交"/></td></tr></table></form:form></body></html>
7. 测试



附件列表
【Spring学习笔记-MVC-10】Spring MVC之数据校验的更多相关文章
- 【Spring学习笔记-MVC-4】SpringMVC返回Json数据-方式2
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- 【Spring学习笔记-MVC-3】SpringMVC返回Json数据-方式1
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- 【Spring学习笔记-MVC-7】Spring MVC模型对象-模型属性讲解
作者:ssslinppp 来自为知笔记(Wiz) 附件列表 处理模型数据.png
- 【Spring学习笔记-MVC-14】Spring MVC对静态资源的访问
作者:ssslinppp 参考链接: http://www.cnblogs.com/luxh/archive/2013/03/14/2959207.html http://www.cnb ...
- 【Spring学习笔记-MVC-16】Spring MVC之重定向-解决中文乱码
概述 spring MVC框架controller间跳转,需重定向,主要有如下三种: 不带参数跳转:形如:http://localhost:8080/SpringMVCTest/test/myRedi ...
- 【Spring学习笔记-MVC-15】Spring MVC之异常处理
作者:ssslinppp 1. 描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理 ...
- 【Spring学习笔记-MVC-13】Spring MVC之文件上传
作者:ssslinppp 1. 摘要 Spring MVC为文件上传提供了最直接的支持,这种支持是通过即插即用的MultipartResolve实现的.Spring使用Jakarta Co ...
- 【Spring学习笔记-MVC-12】Spring MVC视图解析器之ResourceBundleViewResolver
场景 当我们设计程序界面的时候,中国人希望界面是中文,而美国人希望界面是英文. 我们当然希望后台代码不需改变,系统能够通过配置文件配置,来自己觉得是显示中文界面还是英文界面. 这是,Spring mv ...
- Spring学习笔记 7.1 Spring MVC起步
7.1.1 跟踪Spring MVC的请求请求首先到达DispatcherServlet(DispatcherServlet是Spring MVC中的前端控制器):DispatcherServlet的 ...
随机推荐
- bzoj1008
题解: 要求有几种方案可以越狱,可以用总方案-不会越狱的方案 那么总方案就是m^n 那么考虑不会越狱的方案 显然第一个人有m中,后面都是m-1中(和前一个不一样) 答案就是m^n-m*(m-1)^(n ...
- hdu 1013 过山车 匈牙利算法(代码+详细注释)
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- windows与Linux实现文件传输Winscp工具的使用
WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端.同时支持SCP协议.它的主要功能就是在本地与远程计算机间安全的复制文件..winscp也可以链接其他系统,比如linux系统 ...
- anu - controlledComponent
/** input, select, textarea这几个元素如果指定了value/checked的**状态属性**,就会包装成受控组件或非受控组件 受控组件是指,用户除了为它指定**状态属性**, ...
- Android RIL结构分析与移植
介绍 本文档对Android RIL部分的内容进行了介绍,其重点放在了Android RIL的原生代码部分. 包括四个主题: 1.Android RIL框架介绍 2.Android RIL与 Wind ...
- C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast
在C++中,存在类型转换,通常意味着存在缺陷(并非绝对).所以,对于类型转换,有如下几个原则:(1)尽量避免类型转换,包括隐式的类型转换(2)如果需要类型转换,尽量使用显式的类型转换,在编译期间转换( ...
- 如何查看Window10系统隐藏文件夹
1 . 打开我的电脑(此电脑)等等诸如此类的称呼 2 . 点击左上角的查看选项 3 . 选中“隐藏的选项” 4 . 完成
- java并发编程-Executor框架 + Callable + Future
from: https://www.cnblogs.com/shipengzhi/articles/2067154.html import java.util.concurrent.*; public ...
- mysql 常用linux命令
★ 数据导出命令 D:\Program Files\MySQL\MySQL Server 5.6.39\bin 导出: mysqldump -u root -p cela_sub > D:/d ...
- django中的FBV和CBV
django中请求处理方式有2种:FBV 和 CBV 一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 看代码: urls.py from django.c ...