搭建Spring,Spring MVC,Mybatis,freemarker等集成开发环境,为了增加数据校验和国际化花了好几天的时间(其实可以手动编写校验代码,或者使用spring mvc自带校验但不怎么好,故实现hibernate validation),本来如果阅读源代码会可能更快,但是没有时间静下心来阅读,只有工作间隙中去网上查资料,但是尝试了很多次都没能成功,直到今天发现了Spring mvc集成hibernate的validation框架的潜规则后才算成功,Spring MVC校验有两种:1是继承org.springframework.validation.Validator类,2是使用JSR303规范Hibernate Validator,下面讲第2种实现。
前提spring 和spring mvc是3.2.5版,hibernate的validation是4.2.0版,mybatis是3.2.3,freemarker是2.3.20版(这里再废话下,网上找了一堆全是抄来抄去,就算抄也先验证ok后再转发)。这里主要采用的是spring mvc与freemarker结合做web页面传入到controller的数据验证及国际化验证消息。目前我验证freemarker的ftl文件有两种方式: (1)结合spring mvc的spring.tld和spring-form.tld标签库实现;(2)结合spring mvc的spring.ftl宏定义文件实现。
两种实现都需要配合错误消息文件,消息文件:A自定义消息文件名,B使用hibernate的默认的消息文件名,它是在hibernate-validator-4.2.0.Final.jar包中的/org/hibernate/validator/ValidationMessages.properties中。建议使用hibernate的默认名称。
以下把两种共同的配置如下
1. web.xml的配置
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>mwsys-shop</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/config/spring/*.xml</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/classes/log4j.properties</param-value>
</context-param>
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>mwsys-shop</param-value>
</context-param>
<listener>
<listener-class>freemarker.ext.jsp.EventForwarding</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.util.Log4jConfigListener
</listener-class>
</listener>
<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/config/spring/spring-mvc-main.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remoting</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
2. spring mvc配置spring-mvc-main.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.maowu.shop.view" />
<mvc:annotation-driven />
<!-- FreeMarker configuration -->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/ftl/" />
<property name="freemarkerVariables">
<map>
<entry key="xml_escape" value-ref="fmXmlEscape" />
<entry key="BASEPATH" value="http://localhost:8080/shop/"></entry>
<entry key="IMGBASEPATH" value="http://localhost:8080/shop/res/file/"></entry>
<entry key="RESBASEPATH" value="../../"></entry>
</map>
</property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="contentType" value="text/html;charset=UTF-8" />
<property name="cache" value="true" />
<property name="prefix" value="" />
<property name="suffix" value=".ftl" />
</bean>
<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" />
<!-- exception handling configuration -->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定义默认的异常处理页面,当该异常类型的注册时使用 -->
<property name="defaultErrorView" value="error/error" />
<!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception -->
<property name="exceptionAttribute" value="ex" />
<!-- 全局异常记录到日志中,若warnLogCategory不为空,spring就会使用apache的org.apache.commons.logging.Log日志工具,记录这个异常级别是warn -->
<property name="warnLogCategory" value="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" />
<property name="exceptionMappings">
<map>
<entry key="RemoteAccessException" value="error/remote_error" />
</map>
</property>
</bean>
<!-- bind i18n messages properties,this just setting zh_CN message -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="useCodeAsDefaultMessage" value="false"/>
<property name="defaultEncoding" value="UTF-8"/>
<property name="fallbackToSystemLocale" value="true"/>
<property name="basenames">
<list>
<value>classpath:bundle/messages</value>
<value>classpath:bundle/ValidationMessages</value>
</list>
</property>
</bean>
<!-- setting validation implementor,actually HibernateValidator is java validation interface default implementor-->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<property name="validationMessageSource" ref="messageSource"/>
</bean>
</beans>
3. UserVo的源代码
import javax.validation.constraints.Max;
import javax.validation.constraints.Size;
publicclass UserVo
{
@Size(min = 2, max = 6, message = "{size.u.name.len}")
private String name;
@Max(value = 1, message = "{Max.sex}")
privateintsex;
public String getName()
{
returnname;
}
publicvoid setName(String name)
{
this.name = name;
}
publicint getSex()
{
returnsex;
}
publicvoid setSex(int sex)
{
this.sex = sex;
}
@Override
public String toString()
{
return String.format("UserVo [name=%s, sex=%s]", name, sex);
}
}
4. 需要把spring.tld和spring-form.tld两个文件加入webapp的目录下
5. ValidationMessages.properties国际化消息(校验的错误消息)
size.u.name.len=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A\u957F\u5EA6\u5728{min}\u548C{max}\u4E4B\u95F4
Max.sex=\u8D85\u8FC7\u6700\u5927\u503C{value}
6. messages.properties国家化消息(非校验的错误消息)
u.reg.welcome=\u6B22\u8FCE\u6CE8\u518C
7. 成功后的user_reg_ok.ftl页面:
数据没问题,注册成功!
以下是不同部分
第一种:使用spring.ftl结合Hibernate Validator
1)Controller的代码
@RequestMapping(value = "user/reg0", method = RequestMethod.GET)
public String reg0(ModelMap model)
{
UserVo userVo = new UserVo();
model.addAttribute("userVo", userVo);
return"user/user_reg0";
}
@RequestMapping(value = "user/reg0", method = RequestMethod.POST)
public String reg0(@Valid@ModelAttribute UserVo userVo, BindingResult result, ModelMap model)
{
System.out.println(userVo.toString());
if (result.hasErrors())
{
return"user/user_reg0";
}
else
{
return"user/user_reg_ok";
}
}
2)user_reg0.ftl代码
<#import "/spring.ftl" as spring />
<html>
<style>
.error {
color: #ff0000;
font-weight: bold;
}
</style>
<body>
<div><br/></div>
<@spring.message code="u.reg.welcome" />
<br/>
<form method="POST" action="/shop/user/reg0" id="user_validator">
<@spring.bind "userVo.name" />
<input type="input" name="name" value=""/>
<@spring.showErrors "<br/>"/>
<@spring.bind "userVo.sex" />
<input type="input" name="sex" value=""/>
<input type="submit" value="提交"/>
<@spring.showErrors "<br/>"/>
</form>
</body>
</html>
第二种:使用spring.tld和spring-form.tld结合Hibernate Validator
1) Controller代码
@RequestMapping(value = "user/reg1", method = RequestMethod.GET)
public String reg1(ModelMap model)
{
return"user/user_reg1";
}
@RequestMapping(value = "user/reg1", method = RequestMethod.POST)
public String reg1(@Valid@ModelAttribute UserVo userVo, BindingResult result, ModelMap model)
{
System.out.println(userVo.toString());
if (result.hasErrors())
{
return"user/user_reg1";
}
else
{
return"user/user_reg_ok";
}
}
2) user_reg1.ftl代码文件
<#assign spring=JspTaglibs["/WEB-INF/spring.tld"]/>
<#assign form=JspTaglibs["/WEB-INF/spring-form.tld"]/>
<html>
<style>
.error {
color: #ff0000;
font-weight: bold;
}
</style>
<body>
<@spring.message code="u.reg.welcome" />
<div><br/></div>
<@form.form method="POST" action="/shop/user/reg1" commandName="userVo" id="user_validator">
<input type="input" name="name" value=""/>
<@form.errors path = "name" />
<input type="input" name="sex" value=""/>
<@form.errors path = "sex" />
<input type="submit" value="提交"/>
</@form.form>
</body>
</html>
以上就是两种配置的实际可以运行的源码,调试时注意各文件的存放路径。
以下是对上面的两种的总结:
验证错误消息文件名字:是默认名ValidationMessages.properties,编译后存放在classes目录下则:消息key名可以自定义,消息内容可以包含参数(如上面代码中的“{min}”)
验证错误消息文件名字:是自定义名ErrorMessages.properties,编译后存放在classes目录下则:消息key名不可自定义,需用hibernate validation的消息key格式(下面会讲解),消息内容不可包含参数(如上面代码中的“{min}”)
验证错误消息文件名字:是默认名ValidationMessages.properties,编译后不放在classes目录下则:消息key名不可自定义,需用hibernate validation的消息key格式(下面会讲解),消息内容不可包含参数(如上面代码中的“{min}”)
如果消息内容中包含参数则会报:java.lang.IllegalArgumentException: can't parse argument number: xxx 异常。(xxx是参数名)
以下是对hibernate validation默认的错误消息文件及默认错误消息键值说明:
默认的提供的错误消息文件名如下:
ValidationMessages.properties
ValidationMessages_de.properties
ValidationMessages_en.properties
ValidationMessages_es.properties
ValidationMessages_fr.properties
ValidationMessages_hu.properties
ValidationMessages_mn_MN.properties
ValidationMessages_pt_BR.properties
ValidationMessages_tr.properties
ValidationMessages_zh_CN.properties
默认的错误消息Key:验证约束注解的全限定类名.message,默认将为验证的对象自动生成如下错误消息键:
验证错误注解简单类名.验证对象名.字段名
验证错误注解简单类名.字段名
验证错误注解简单类名.字段类型全限定类名
验证错误注解简单类名
使用的优先级是:从高到低,即最前边的具有最高的优先级,而且以上所有默认的错误消息键优先级高于自定义的错误消息键。
总结:一般来说消息key是要自定义的,而且消息内容可以传参数,所以我们使用默认文件名且存放在classes目录下。
相关推荐
Spring MVC、Spring 3 和 Hibernate 4 是三个在 Java Web 开发中广泛使用的开源框架,它们各自负责不同的职责。Spring MVC 用于构建可扩展的、模块化的Web应用程序,Spring 提供了依赖注入(DI)和面向切面编程(AOP...
在Java开发中,尤其是SSM(Spring、SpringMVC、MyBatis)框架的使用中,`spring-webmvc`扮演着至关重要的角色。 **一、Spring MVC的核心概念** 1. **DispatcherServlet**:它是Spring MVC的前端控制器,负责接收...
11. **Validation**: `hibernate-validator.jar` 提供了JSR-303/349标准的验证框架,用于校验Bean的属性值。 12. **Other Utilities**: 如 `commons-lang3.jar` 提供了各种实用的Java工具类。 这些库共同构成了一...
- 验证:使用 `javax.validation` 或 Spring 自带的 `Validator` 接口进行数据校验。 ### 6. 文件上传与下载 Spring MVC 提供了便捷的文件上传和下载功能,通过 `MultipartFile` 类型的参数处理文件上传,通过流...
Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,专门用于构建 MVC(Model-View-Controller)架构的 Web 应用程序。在这个"springmvcjar包"中,包含了搭建 Spring MVC 框架所需的所有...
3. **数据验证**:Spring MVC提供了内置的数据验证机制,可以使用JSR-303/JSR-349的 Bean Validation API 对请求参数进行校验。通过`@Valid`注解,可以在控制器方法中触发验证,并利用`BindingResult`对象获取验证...
8. **国际化支持增强**:Spring 3.0 提供了更完善的国际化支持,包括在消息源中使用SpEL表达式,以及支持多种消息格式。 9. **测试框架改进**:Spring Test模块加强了对JUnit和TestNG的支持,提供了更丰富的测试...
SSH(Struts2、Spring、Hibernate)整合旨在简化开发流程,提供模型-视图-控制器(MVC)架构支持,以及数据持久化和依赖注入等功能。 首先,让我们详细了解这三个框架的核心功能: 1. **Struts2**:这是一个基于...
Struts2.1.6、Spring2.5.6和Hibernate3.3.2是三个在Java Web开发中广泛使用的开源框架,它们分别是MVC框架、IoC/DI容器和对象关系映射(ORM)框架的代表。这些框架的组合在当时是非常流行的,用于构建高效、可扩展和...
- **验证**:Spring MVC集成JSR303/JSR349 Bean Validation,可以对提交的数据进行校验。 - **国际化**:通过Spring MVC的`MessageSource`接口,可以实现多语言支持。 5. **实际项目中的应用场景** - **用户登录...
- **功能简介**:包含了 Spring MVC 框架相关的所有类,包括国际化、标签、Theme、视图展现的 FreeMarker、JasperReports、Tiles、Velocity、XSLT 相关类。 - **应用场景**:适用于使用 Spring MVC 框架的项目。 - *...
5. **Validation**:Spring MVC 集成了 Hibernate Validator,可以方便地进行表单验证,通过在 Model 对象上添加验证注解,然后在 Controller 中调用 BindingResult 对象来获取验证结果。 6. **Interceptor(拦截器...
可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI所需的全部类,UI方面的用来与模板(Templating)引擎如 Velocity、FreeMarker、JasperReports集成的类,以及校验Validation方面的相关类。...
可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI 所需的全部类,instrumentation组件以及校验Validation 方面的相关类。 外部依赖spring-beans, (spring-aop)。 spring-jdbc.jar(必须) :这个jar...
此外,Spring 2.5 提供了对JSR 303校验的集成,改进了数据访问抽象,包括JDBC、Hibernate和JPA,以及Web MVC框架,与Struts 2可以很好地协同工作。 这三种框架的整合,SSH,提供了完整的MVC解决方案,使得开发者...
可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI所需的全部类,UI方面的用来与模板(Templating)引擎如 Velocity、FreeMarker、JasperReports集成的类,以及校验Validation方面的相关类。...
SSH集成是Java开发中一种常见的技术栈组合,包括Spring、Struts和Hibernate,它们分别负责应用的依赖注入、MVC框架和对象关系映射。在这个例子中,SSH被用来构建一个积分管理系统,其中Spring2.5、Struts2和...
Struts2.1.8+Spring3.0.2+Hibernate3.5.1是一个经典的Java Web开发框架组合,常用于构建企业级应用。这个组合提供了MVC(模型-视图-控制器)架构的支持,以及服务层和持久层的管理。下面我们将详细探讨这三个框架...
Struts2.0.14、Spring2.5.6、Struts1.3.8以及Hibernate3.2是四个非常关键的Java Web开发框架,它们在2000年代末到2010年代初广泛应用于企业级应用中。这个压缩包文件包含了这些框架的核心组件,对于学习和理解SSH...
2. **JSR-303/JSR-349 Bean Validation**:Spring 3.0集成了Bean Validation框架,允许对JavaBeans进行校验,增强了数据验证的能力。 3. **改进的AOP支持**:支持基于注解的切点表达式,可以更方便地定义切点和通知...