概述
上一篇通过Spring MVC+Freemaker整合一个国际化实现demo,同时demo里还整合了Spring MVC自带的bean验证Validator,需要自己去实现验证逻辑。本篇主要内容Spring MVC+hibernate-validator bean实现国际化表单验证,相关代码已上传Githut,地址见文章结尾。
hibernate-validator 验证框架整合
提到bean验证,不得不说下JSR bean validation规范(JSR303、JSR349),这个规范只是定义了对象属性约束说明,没有具体实现。hibernate-validator就是实现了这个规范的框架之一,另外bean validation 1.1对JSR349进行了实现,但据说还不够稳定。2016年中bean validation 2.0发布,发布说明:http://beanvalidation.org/news/2016/07/15/bean-validation-2-0-is-coming/。相对而言hibernate-validator更成熟,这里采用hibernate-validator进行demo搭建(版本5.2.4.Final)。
采用hibernate-validator验证框架比spring mvc自带的验证框架好用,首先不需要自己实现验证逻辑,hibernate已经帮我们实现了;其次hibernate-validator验证框架可以完全基于注解,使用更加方便灵活。
首先看下JSR303约束注解标签,以及基本用法:
按照以上讲解的注解格式,为上一章的User类中需要验证的字段进行相应注解添加(在上一章的代码里进行修改):
/** * Created by gantianxing on 2017/6/8. */ public class User implements Serializable { private static final long serialVersionUID = 1L; @NotNull @Size(min=2,max = 5) private String name;//姓名 @NotNull @Past private Date birthday;//生日 @NotNull @Digits(integer=3,fraction=2) private BigDecimal money;//资产 @NotNull @Pattern(regexp="\\d{11}") private String phoneNum;//手机号 public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public BigDecimal getMoney() { return money; } public void setMoney(BigDecimal money) { this.money = money; } public String getPhoneNum() { return phoneNum; } public void setPhoneNum(String phoneNum) { this.phoneNum = phoneNum; } }
具体注解含义就不解释了,根据上面的规则讲解,一目了然。
启动tomcat,访问http://localhost/add,如下:
每个字段都不填写值,直接点击”添加”按钮:
切换化到英文:
可以看到验证框架,有一套自己默认的错误提示信息,并且已经支持了国际化(这里我只试了中文和英文)。
整合国际化配置文件
一般情况下你对默认的错误提示信息会不满意,别紧张,Spring MVC可以很好的把hibernate-validator验证器与国际化配置整合起来。整合分三步:
第一步:首先我们要修改User类的注解,把错误消息的key指定为国际化属性配置文件中的key,如下:
public class User implements Serializable { private static final long serialVersionUID = 1L; @NotNull(message="{user.name.null}") @Size(min=2,max =5,message = "{user.name.error}") private String name;//姓名 @NotNull(message="{user.birthday.null}") @Past(message="{user.birthday.error}") private Date birthday;//生日 @NotNull(message="{user.money.null}") @Digits(integer=3,fraction=2,message="{user.money.error}") private BigDecimal money;//资产 @NotNull(message="{user.phoneNum.null}") @Pattern(regexp="\\d{11}",message="{user.phoneNum.error}") private String phoneNum;//手机号 public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public BigDecimal getMoney() { return money; } public void setMoney(BigDecimal money) { this.money = money; } public String getPhoneNum() { return phoneNum; } public void setPhoneNum(String phoneNum) { this.phoneNum = phoneNum; } }
第二步:再修改spring-mvc.xml配置文件,整合hibernate-validator验证器与国际化配置:
<mvc:annotation-driven validator="validator" conversion-service="formatService" /> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> <!--指定国际化配置文件 不设置则默认为classpath下的 ValidationMessages.properties --> <property name="validationMessageSource" ref="messageSource"/> </bean> <!-- formatter转换配置 --> <bean id="formatService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="formatters"> <set> <bean class="com.sky.locale.demo.formatter.MyDateFormatter" /> <bean class="com.sky.locale.demo.formatter.MyCurrencyFormatter" /> </set> </property> </bean> <!-- 国际化资源文件 --> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basenames" > <list> <value>/WEB-INF/resource/usermsg</value> <value>/WEB-INF/resource/userlabels</value> </list> </property> <property name="defaultEncoding" value="UTF-8"/> </bean>
第三步:在属性配置文件中添加自定义的国家化消息,在中文usermsg_zh_CN.properties配置中添加:
user.name.null=请输入用户名 user.name.error=用户名长度必须在{min}到{max}之间 user.birthday.null=请输入生日 user.birthday.error=生日必须小于当前时间 user.money.null=请输入资产 user.money.error=资产不能超过1000000 user.phoneNum.null=请输入手机号 user.phoneNum.error=手机号必须为11位
在英文配置文件usermsg_en_GB.properties中添加:
user.name.null=Please enter a name user.name.error=name length must between{min} and {max} user.birthday.null=Please enter a birthday user.birthday.error=birthday is a past time user.money.null=Please enter a money user.money.error=money < 1000000 user.phoneNum.null=Please enter a phoneNum user.phoneNum.error=phoneNum length is 11
ok, 修改完毕,重新启动tomcat,访问http://localhost/add,不填写任何字段,提交表单,显然如下:
切换到英文(ps:如果切换不成功,tomcat版本请换成tomcat8以上),再次提交表单:
可以看到结果是我们想要的,hibernate-validator验证器与Spring MVC国际化配置整合完成。以上示例代码详见Github地址:https://github.com/gantianxing/locale-demo1.git
相关推荐
springmvc的服务器表单校验所需要的jar包,java入参验证,支持实体类中对象验证,各种JSR-303标准规定的验证
Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。 该压缩包包含了hibernate-validator-5.2.4.Final.jar、hibernate-validator-annotation-processor-5.2.4.Final.jar、...
5.3 Struts应用程序的国际化及表单验证 174 5.3.1 Struts应用程序的国际化 174 案例5-2 实现身份验证应用程序的国际化 178 5.3.2 Struts应用程序中的表单验证 182 案例5-3 实现身份验证应用程序的表单验证...
该项目为网上银行系统,使用技术为Struts+Hibernate。 JSP页面采用Tiles框架布局,表单验证没有采用Validator框架验证。 JDK:1.4以上 数据库:SQL Server2000 开发工具:Eclipse+MyEclipse
java常见的所有框架的API打包 hibernate spring Struts2 还有Validato_表单验证
故在hibernate-validator的基础上封装了zuihou-validator-starter起步依赖,提供一个通用接口,可以获取需要校验表单的规则,然后前端使用后端返回的规则, 以后若规则改变,只需要后端修改即可。 12、防跨站脚本...
166、如何用JQuery进行表单验证? 39 167、Prototype如何实现页面局部定时刷新? 40 168、Prototype如何为一个Ajax添加一个参数? 40 169、Ajax请求总共有多少种Callback? 41 170、Javascript如何发送一个Ajax请求?...
对于每一个功能采取前后端校验,前端使用JQuery验证框架进行表单校验,后端使用HibernateValidator验证框架进行字段校验,保障系统的安全性。权限模块需要使用RBAC权限模式设计数据表,必要时要用SpringMVC框架的...
CAM编辑器是领先的开源XML编辑器/验证/架构工具集,用于快速构建/部署XML / JSON / Hibernate / SQL数据/ Forms应用程序。 可视WYSIWYG数据设计,规则输入向导+拖放字典组件。 将从XML Schema / JSON导入,分析/重构...
天梯(tianti) Java 轻量级的 CMS 解决方案-天梯。天梯是一个用 Java 相关技术搭建的后台 CMS 解决方案,用户可以结合自身业务... 表单验证 :jquery.validator 展现树 :jquery.ztree html模版引擎 :template
本示例中使用了以下功能: Spring MVC Portlet 动作和渲染映射依赖注入(使用@Inject) 表单绑定表单验证(Hibernate Validator)入门第 1 步:安装先决条件:安装(EXO_TOMCAT_ROOT_FOLDER 将用于指定 eXo Tomcat ...
166、如何用JQuery进行表单验证? 39 167、Prototype如何实现页面局部定时刷新? 40 168、Prototype如何为一个Ajax添加一个参数? 40 169、Ajax请求总共有多少种Callback? 41 170、Javascript如何发送一个Ajax请求?...
Hibernate Validator用于表单数据验证 H2内存数据库,用于存储数据 Java Mail API通过SMTP发送HTML电子邮件 JSTL 要求 Java Oracle 阿帕奇Tomcat 玛文 配置 在“ application.properties”中更改SMTP详细信息 登录...