zoukankan      html  css  js  c++  java
  • 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.jarvalidation-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就不罗嗦了。

  • 相关阅读:
    Codeforces ECR 83 C. Adding Powers (位运算)
    Codeforces Round #636div3 D. Constant Palindrome Sum (划分区间,差分)
    Codeforces Round #603 C. Everyone is a Winner!
    Centos7 下搭建SVN + Apache 服务器 风行天下
    完整部署CentOS7.2+OpenStack+kvm 云平台环境(1)基础环境搭建 风行天下
    云计算的理解 风行天下
    Python之路3【知识点】白话Python编码和文件操作 风行天下
    C#中TreeView组件使用方法初步
    复制文件时explorer.exe出错解决方法
    C# 里TreeView绑定数据库实现分类
  • 原文地址:https://www.cnblogs.com/selfchange/p/6297984.html
Copyright © 2011-2022 走看看