当前位置: 首页 > news >正文

spring MVC 使用 hibernate validator验证框架,国际化配置

spring mvc使用hibernate validator框架可以实现的功能:

1. 注解java bean声明校验规则。

2. 添加message错误信息源实现国际化配置。

3. 结合spring form中的errors标签展现错误信息。

优势:

代码简洁。

实现:

1. 使用hibernate validator 至少要引入两个jar包:

  hibernate-validator-5.3.4.Final.jar , validation-api-1.1.0.Final.jar

2. JSR规范定义的注解在validation-api下javax.validation.constraints包下,请自行查看。

3. java bean中使用注解添加检验规则

复制代码
 1 public class UserInfo {
 2 
 3     @Size(min = 8,max = 20,message="{username.size}")
 4     @Pattern(regexp="[_a-zA-Z0-9]+",message="{username.pattern}")
 5     private String username;
 6 
 7     public String getUsername() {
 8         return username;
 9     }
10     public void setUsername(String username) {
11         this.username = username;
12     }
13 }
复制代码

Controller的配置

复制代码
 1 @Controller 
3 public class UserController { 5 @GetMapping(value = "/register") 6 public String showRegister(Model model){ 7 model.addAttribute("user",new UserInfo()); 8 return "register"; 9 } 10 11 @PostMapping(value = "/register") 12 public String register(@ModelAttribute("user") @Valid UserInfo user, Errors errors) { 13 if (errors.hasErrors()) { 14 return "register"; 15 } 16 return "redirect:/index"; 17 } 25 }
复制代码

对应的register.jsp文件:

复制代码
  1 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
  3 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
  4 <%@taglib uri="http://www.springframework.org/tags/form" prefix="sf"%>
  5 <html>
  6 <head>
 10 <title></title>
 26 </head>
 27 <body>
 84         <sf:form method="POST" commandName="user">
 85              <sf:input path="username"/>
 86              <sf:errors path="username"/><br>
 88              <sf:password path="password"/>
 89              <sf:errors path="password"/><br>
 91              <sf:password path="re_password"/>
 92              <sf:errors path="re_password" /><br>
 94              <sf:input path="email" type="email"/>
 95              <sf:errors path="email" /><br>
 97              <sf:input path="phone"/>
 98              <sf:errors path="phone" /><br>
100              <input type="submit" value="注册">
101         </sf:form>
106 </body>
107 </html>
复制代码

其中需要注意的地方:

  • form标签如果不声明action属性,则默认提交到当前请求路径。
  • @Valid注解指定校验的对象,@ModelAttribute("user")注解声明模型对象,value需要与commandName属性的值一致,不然出错的话<sf:errors>标签找不到对应的对象;

如果不声明模型对象名称,那么默认是userInfo(即类名第一个首字母小写).

  • Errors对象存储错误信息,需要紧跟在@Valid注解的对象之后。
  • get方式访问/register,显示rigister.jsp,并提供一个对象给jsp, 属性的key与表单中的commandName属性的值对应,jsp将表单数据存入对象中。

post提交表单,如果有错误信息,返回rigister.jsp,spring的输入标签会填入之前输入的对象数据,即user.username的值,并且<sf:errors>标签会从Errors对象中获取user.username错误信息(即message指定的信息),将<sf:errors>标签渲染为<span>标签(有兴趣的话可以研究一下标签库的源码)。

4.spring-dispatcher-servlet.xml配置hibernate validator,并且配置国际化资源

复制代码
 1     <mvc:annotation-driven validator="validator"/>
 6     <mvc:default-servlet-handler />
 7 
13     <bean id="requestHandler" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
14         <property name="useSuffixPatternMatch" value="false"/><!--关闭自动使用 .* 后缀-->
15     </bean>
16     <bean id="requestAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
20         <property name="synchronizeOnSession" value="true"/>
21     </bean>
2
48     <bean id="hibernate_validator_messages" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
49         <property name="basenames">
50             <list>
51                 <value>/WEB-INF/hibernate_validator_messages/hibernate_validator_message_zh_CN</value>
52             </list>
53         </property>
54         <property name="fileEncodings">
55             <props>
56                 <prop key="/WEB-INF/hibernate_validator_messages/hibernate_validator_message_zh_CN">UTF-8</prop>
57             </props>
58         </property>
59     </bean>
60     <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
61         <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
62         <property name="validationMessageSource" ref="hibernate_validator_messages"/>
63     </bean>
复制代码

 

配置中需要注意的地方:

  • LocalValidatorFactoryBean :validationMessageSource通过set方法注入,然后转换为MessageInterpolator对象,如果不配置validationMessageSource
    信息源,那么会使用默认的信息源HibernateValidations_xx_xx.properties,位于org.hibernate.validator包下,具体使用哪个文件由Locale.getDefaultLocale()决定。
  •    ReloadableResourceBundleMessageSource :spring中提供的信息源配置类,支持proerties和xml文件,更改配置无需重启服务,basenames指定文件位置和名称(可使用classpath前缀),fileEncodings指定各个文件的编码方式,spring中首先查找.properties后缀文件,找不到再查找.xml后缀文件。

5.spring-dispatcher-servlet.xml完整配置如下:

复制代码
  1 <?xml version="1.0" encoding="UTF-8"?>
  2 
  3 <beans xmlns="http://www.springframework.org/schema/beans"
  4        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5        xmlns:context="http://www.springframework.org/schema/context"
  6        xmlns:mvc="http://www.springframework.org/schema/mvc"
  7        xsi:schemaLocation="
  8        http://www.springframework.org/schema/beans
  9        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
 10        http://www.springframework.org/schema/context
 11        http://www.springframework.org/schema/context/spring-context-4.3.xsd
 12        http://www.springframework.org/schema/mvc
 13        http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
 14        ">
 22     <context:component-scan base-package="sps.controller"/>
 36     <context:annotation-config/>
 37 
 45     <mvc:annotation-driven validator="validator"/>
 49 
 50     <mvc:default-servlet-handler /> 
 57     <bean id="requestHandler" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
 58         <property name="useSuffixPatternMatch" value="false"/><!--关闭自动使用 .* 后缀-->
 59     </bean>
 60     <bean id="requestAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">    
 64         <property name="synchronizeOnSession" value="true"/>
 65     </bean>
 66 
 67     <!--
 68     配置DispatcherServlet的视图解析器
 69     -->
 70     <bean id="internalresolver"
 71           class="org.springframework.web.servlet.view.InternalResourceViewResolver">
 72         <property name="prefix" value="/WEB-INF/views/"/>
 73         <property name="suffix" value=".jsp"/>
 74         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
 75         <property name="exposeContextBeansAsAttributes" value="true"/>
 76     </bean>
 77 
 92     <bean id="hibernate_validator_messages" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
 93         <property name="basenames">
 94             <list>
 95                 <value>/WEB-INF/hibernate_validator_messages/hibernate_validator_message_zh_CN</value>
 96             </list>
 97         </property>
 98         <property name="fileEncodings">
 99             <props>
100                 <prop key="/WEB-INF/hibernate_validator_messages/hibernate_validator_message_zh_CN">UTF-8</prop>
101             </props>
102         </property>
103     </bean>
104     <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
105         <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
106         <property name="validationMessageSource" ref="hibernate_validator_messages"/>
107     </bean>
108     
109 </beans>
复制代码

配置中需要注意的地方:

  • InternalResourceViewResolver 中的 viewClass 配置为JstlView,如果使用spring 标签库的话必须 声明为 JstlView,不然spring标签库可能不起作用,甚至引起错误。

6.web.xml 中配置servlet就不罗嗦了。

相关文章:

  • Kubernetes软件包管理系统-Helm架构
  • A - 夹角有多大(题目已修改,注意读题)
  • 卸载openssl后yum无法使用,ssh无法连接的解决办法
  • 春雪
  • (16)Reactor的测试——响应式Spring的道法术器
  • Oracle 谈 JavaFX 及 Java 客户端技术的未来
  • [译] React 中的受控组件和非受控组件
  • drbd配置简述
  • 聊聊编译时注解
  • 微服务架构—高级设计篇
  • 漫谈版本控制系统
  • pandas(一)操作Series和DataFrame的基本功能
  • Redhat6.5匿名访问win10共享文件夹.
  • 从零开始在ubuntu上搭建node开发环境
  • 《CDN 之我见》原理篇——CDN的由来与调度
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Apache Spark Streaming 使用实例
  • JavaScript中的对象个人分享
  • npx命令介绍
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Shell编程
  • Swift 中的尾递归和蹦床
  • vue总结
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 测试如何在敏捷团队中工作?
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 入门到放弃node系列之Hello Word篇
  • 1.Ext JS 建立web开发工程
  • Spring第一个helloWorld
  • 数据可视化之下发图实践
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • # Maven错误Error executing Maven
  • #include
  • #Z0458. 树的中心2
  • #数学建模# 线性规划问题的Matlab求解
  • (1)STL算法之遍历容器
  • (rabbitmq的高级特性)消息可靠性
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)http-server应用
  • (转载)Linux网络编程入门
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Project Open Day(2011.11.13)
  • .NET/C# 使窗口永不获得焦点
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .net反编译工具
  • .NET是什么
  • .NET性能优化(文摘)
  • .pyc文件是什么?
  • /*在DataTable中更新、删除数据*/
  • @ConditionalOnProperty注解使用说明