1、SpringMVC标签库
2、自定义参数转换器WebDataBinder
3、(conversionService )自定义String到java.util.Date类型转换器
4、(Validate)较验器----参数的有效性验证Validate----Hibernate(JSR303)
5、(bindingResult)自定义错误信息的回显

1、SpringMVC标签库(*用的不多*)
1、搭建SpringMVC开发环境
导入springmvc所需要的jar包
commons-logging-1.1.3.jar
log4j-1.2.17.jar
spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar
配置配置文件:
log4j.properties
# Global logging configuration
log4j.rootLogger=INFO, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
Springmvc配置文件:
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:component-scan base-package="com.tcent"></context:component-scan>
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<mvc:annotation-driven></mvc:annotation-driven>
<mvc:default-servlet-handler />
</beans>
web.xml中的配置内容:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>tag</display-name>
<!-- 解决中文乱码的filter -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 支持restful风格的filter -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
2、创建对象模型Person对象
public class Person {
private Integer id;
private String name;
private Date birthDate;
private String email;
private BigDecimal salary;
3、在webContent下创建jsp页面
springMVC的标签form标签可以关联Request域中bean对象
method="delete" 此时的method有crud的restful风格,可以增删改查
addPerson.jsp页面:
<body>
<!--
springMVC的标签form标签可以关联Request域中bean对象
我们在隐含模型中保存的key值。也一定要跟form:form标签中的modelAttribute值对应上。
-->
这里是添加用户页面
<form:form action="${ pageContext.request.contextPath }/addPerson" method="delete"
modelAttribute="person">
name:<form:input path="name"/><br/>
<%-- birthDate:<form:input path="birthDate"/><br/> --%>
email:<form:input path="email"/><br/>
salary:<form:input path="salary"/><br/>
<input type="submit" />
</form:form>
</body>
4、创建PersonController控制器
隐含模型中必须要有一个form标签对应的pojo对象
@Controller
public class PersonController {
@RequestMapping(value = "/toAddPerson")
public String toAddPerson(Map<String, Object> map) {
System.out.println("经过toAddPerson方法");
// 隐含模型中必须要有一个form标签对应的pojo对象
map.put("person", new Person(12, "wzg168", null, "wzg168@qq.com",
new BigDecimal(30000)));
return "addPerson";
}
@RequestMapping(value = "/addPerson")
public String addPerson(Person person) {
System.out.println("添加用户【" + person + "】到数据库");
return "redirect:/index.jsp";
}
}
2、自定义参数转换器WebDataBinder
2.1、WebDataBinder类介绍
在SpringMVC中有WebDataBinder类。这个类专门用来负责将请求参数类型转换。以及请求参数数据验证,错误信息绑定等功能。
在WebDataBinder类中有三个组件分别处理三种不同的功能。
(1)、conversionService 负责处理参数类型转换。把请求的参数转换成为Controller中的方法参数值。
converters接口:在ConversionService组件中需要各种类型转换器,在conversionService组件中需要依赖于各种转换器类去实现转换工作。
(2)、validators 负责验证传入的参数值是否合法。
(3)、bindingResult 负责接收验证后的错误信息。
下图展示了WebDataBinder、ConversionService、Converter的关系。

如果我们要自定义请求参数的类型转换器。需要实现org.springframework.core.convert.converter.Converter<S,T>接口。
然后注入到ConversionService组件中。最后再将ConversionService注入到WebDataBinder中。创建ConversionService组件,需要配置:
org.springframework.format.support.FormattingConversionServiceFactoryBean对象。
3、(conversionService )自定义String到java.util.Date类型转换器
方法一:String到java.util.Date转换
/**
* 自定义 String转换成为java.util.Date类
*
*/
public class MyStringToDateConverter implements Converter<String, Date> {
// 字符串和日期类型相互转换的工具类
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
/**
* convert就是转换器工作时调用的转换方法<br/>
* 参数source就是客户端传递过来的值。
*/
@Override
public Date convert(String source) {
// 以下情况上null,无法转换
if (source == null) {
return null;
}
if (source != null && "".equals(source.trim())) {
return null;
}
try {
// 将日期 字符串转换成为 java.util.Date类型
return sdf.parse(source);
} catch (ParseException e) {
e.printStackTrace();
throw new IllegalArgumentException("Invalid Date value '" + source + "'");
}
}
}
在springmvc配置文件中做如下的配置:
<!-- 配置FormattingConversionServiceFactoryBean去创建ConversionService组件,用于类型转换 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 将自己定义的各种Converter转换器。注入到ConversionService中 -->
<property name="converters">
<set>
<bean class="com.tcent.converter.MyStringToDateConverter" />
</set>
</property>
</bean>
<!-- 静态资源的支持 -->
<mvc:default-servlet-handler/>
<!-- springmvc注解驱动 -->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
最后再将ConversionService注入到WebDataBinder中:通过mvc的注解驱动
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
3.1、@DateTimeFormat注解类型转换器
方法二:String到java.util.Date转换
我们也可以像上面。在类的Date类型的属性上标上注解。就可以自动将String类型转换成为Date数据
pattern属性表示 日期的格式。最完成的格式是:yyyy-MM-dd hh:mm:ss
yyyy表示年份必须是4位
MM 表示月份必须是2位
dd 表示日期必须是2位
hh 表示小时,必须是2位
mm 表示分钟,必须是2位
ss 表示秒钟,必须是2位

4、(Validate)较验器----参数的有效性验证Validate----Hibernate
在JavaEE6.0中,定义了很多的验证规范。这些规范统称为:JSR303验证规范。
而这些规范的实现。我们使用现在业内比较认可的Hibernate-Validate验证
@AssertTrue | 用于boolean字段,该字段只能为true |
@AssertFalse | 该字段的值只能为false |
@CreditCardNumber | 对信用卡号进行一个大致的验证 |
@DecimalMax | 只能小于或等于该值 |
@DecimalMin | 只能大于或等于该值 |
@Digits(integer=,fraction=) | 检查是否是一种数字的整数、分数,小数位数的数字 |
检查是否是一个有效的email地址 | |
@Future | 检查该字段的日期是否是属于将来的日期 |
@Length(min=,max=) | 检查所属的字段的长度是否在min和max之间,只能用于字符串 |
@Max | 该字段的值只能小于或等于该值 |
@Min | 该字段的值只能大于或等于该值 |
@NotNull | 不能为null |
@NotBlank | 不能为空,检查时会将空格忽略 |
@NotEmpty | 不能为空,这里的空是指空字符串 |
@Null | 检查该字段为空 |
@Past | 检查该字段的日期是在过去 |
@Pattern(regex=,flag=) | 被注释的元素必须符合指定的正则表达式 |
@Range(min=,max=,message=) | 被注释的元素必须在合适的范围内 |
@Size(min=, max=) | 检查该字段的size是否在min和max之间,可以是字符串、数组、集合、Map等 |
@URL(protocol=,host,port) | 检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件 |
使用Hiberante的验证器较验数据分以下步骤:
1、导入Hibernate验证的jar包
classmate-0.8.0.jar
hibernate-validator-5.0.0.CR2.jar
hibernate-validator-annotation-processor-5.0.0.CR2.jar
jboss-logging-3.1.1.GA.jar
validation-api-1.1.0.CR1.jar
2、在实体bean对象的属性上使用较验的注解
public class Person {
private Integer id;
/**
* @NotNull表示验证当前name属性不能为null值<br/>
* @Length(min = 5, max = 12)表示验证name属性最小5位,最大12位
*/
@NotNull
@Length(min = 5, max = 12)
private String name;
/**
* @Past 表示日期的值必须是过去的时间
*/
@Past
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthDate;
/**
* @Email 表示当前email属性必须是合法的邮箱格式
*/
@Email
private String email;
/**
* @Max(value = 100) 表示当前salary的值不能大于100
*/
@Max(value = 100)
private BigDecimal salary;
3、在Controller的方法参数上,给需要验证的bean对象。添加验证注解@Valid,以及在验证对象后跟一个BindingResult 对象用于接收验证的错误信息
/**
* @Valid Person person=====@Valid表示要验证当前这个person对象的数据<br/>
* BindingResult personBindingResult用来接收前面一个pojo对象验证的错误信息。
*/
@RequestMapping(value = "/addPerson")
public String addPerson(@Valid Person person,
BindingResult personBindingResult) {
// 判断输入的数据是否有错误,
if (personBindingResult.hasErrors()) {
System.out.println("*********************************************");
System.out.println( personBindingResult.getAllErrors() );
System.out.println("*********************************************");
return "addPerson";
}
System.out.println("添加用户【" + person + "】到数据库");
return "redirect:/index.jsp";
}
4、在SpringMVC的form表单字段后,使用<form:errors path="字段名" />输出对应字段的错误信息
<body>
<!--
springMVC的标签form标签可以关联Request域中bean对象
我们在隐含模型中保存的key值。也一定要跟form:form标签中的modelAttribute值对应上。
-->
这里是添加用户页面
<form:form action="${ pageContext.request.contextPath }/addPerson" method="delete"
modelAttribute="person">
name:<form:input path="name"/><form:errors path="name" /><br/>
birthDate:<form:input path="birthDate"/><form:errors path="birthDate" /><br/>
email:<form:input path="email"/><form:errors path="email" /><br/>
salary:<form:input path="salary"/><form:errors path="salary" /><br/>
<input type="submit" />
</form:form>
</body>
5、(bindingResult)自定义错误信息的回显
5.1、错误消息规则:
这是校验错误的key规则:
格式1: Pattern.bean.property
说明: 校验格式.隐含模型包.属性名
示例:Email.person.email------------person对象的email属性验证Email格式失败
格式2: Pattern.property
说明: 校验格式.属性名
示例:Email.email-----------任何对象的email属性验证Email格式失败
格式3: Pattern.javaType
说明: 校验格式.字段数据类型
示例:Email.java.lang.String-----------任何String类型的属性验证Email格式失败
key4: Pattern
说明: 校验格式
示例:Email-----------校验Email格式失败
参数转换失败的key规则:
格式1: typeMismatch.bean.property
说明: 类型不匹配.隐含模型名.属性名
示例:typeMismatch.person.birthDate-----------person对象的birthDate属性转换失败
格式2: typeMismatch.property
说明: 类型不匹配.属性名
示例:typeMismach.birthDate-----------任何对象的birthDate属性转换失败
格式3: typeMismatch.javaType
说明: 类型不匹配.字段数据类型
示例:typeMismach.java.util.Date ----------- Java.util.Date类型转换失败
格式4: typeMismatch
说明: 类型不匹配
示例:typeMismach-----------字段类型转换失败
5.2、在源码目录下配置错误信息的属性配置文件

validate.properties属性配置文件的内容如下:
Email.person.email=\u81EA\u5B9A\u4E49-\u90AE\u7BB1\u683C\u5F0F\u4E0D\u5408\u6CD5
NotNull=\u81EA\u5B9A\u4E49-\u503C\u4E0D\u80FD\u4E3A\u7A7A
Length.name=\u81EA\u5B9A\u4E49-\u957F\u5EA6\u5FC5\u987B\u4E3A 5 \u5230 12 \u4F4D
Past=\u81EA\u5B9A\u4E49-\u65F6\u95F4\u5FC5\u987B\u662F\u8FC7\u53BB\u7684\u65F6\u95F4
Max=\u81EA\u5B9A\u4E49-\u503C\u4E0D\u80FD\u5927\u4E8E 100
typeMismatch=\u81EA\u5B9A\u4E49-\u4E0D\u8981\u968F\u4FBF\u8F93\u5165
输入的汉字会立刻转换成16进制(有点小神秘~_`~)
占位符的使用:
{0}表示第一个传入的参数。 {0}第一个参数固定是验证的属性名
Length.name=\u81EA\u5B9A\u4E49-\u957F\u5EA6\u5FC5\u987B\u4E3A {0} \u5230 12 \u4F4D
Max=\u81EA\u5B9A\u4E49-\u503C\u4E0D\u80FD\u5927\u4E8E {0}
5.3、在Spring中配置如下:
<!-- 告诉Spring容器,去加载自定义的错误信息 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="validate" />
</bean>