Spring MVC基础知识整理➣数据校验与格式化
概述
将view中Form的数据提交到后台之后,后台如何验证数据的有效性?在这里Spring MVC提供了相应的Hibernate类包(hibernate-validator-4.3.1.Final.jar、jboss-logging-3.1.0.jar、validation-api-1.0.0.GA.jar)来校验数据的有效性。通过实体注解的方式,添加实体的有效属性。
数据校验
将上面需要的三个包文件添加到项目WEB-INF下的Lib之后,需要配置springservletconfig.xml文件,添加下面内容:
<mvc:annotation-driven validator="validator" conversion-service="conversion-service" /> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> <!--不设置则默认为classpath下的 ValidationMessages.properties --> <property name="validationMessageSource" ref="validatemessageSource"/> </bean> <bean id="conversion-service" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" /> <bean id="validatemessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basename" value="classpath:validatemessages"/> <property name="fileEncodings" value="utf-8"/> <property name="cacheSeconds" value="120"/> </bean>
XML解析如下:
SpringMVC的注解驱动,采用org.springframework.validation.beanvalidation.LocalValidatorFactoryBean类包进行数据校验,验证的错误信息提示读取当前项目下的 validatemessageSource.properties。采用org.springframework.format.support.FormattingConversionServiceFactoryBean类包进行数据格式转换;
添加验证实体
import org.hibernate.validator.constraints.NotEmpty; import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.Range; public class PersonModel { /** * @Fields name : 姓名 */ @NotEmpty(message="{name.not.empty}") private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } /** * @Fields email : 邮箱 */ @NotEmpty(message="{email.not.empty}") @Email(message="{email.not.correct}") private String email; public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } /** * @Fields age : 年龄 */ @Range(min=0,max=100,message="{age.not.inrange}") private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
验证属性采用注解的方式,message读取validatemessageSource.properties设置的key值。
添加validatemessageSource.properties文件,追加内容如下,和上面model设置的message保存同步
name.not.empty=姓名不能为空 age.not.inrange=年龄不是有效范围 email.not.correct=邮箱格式不正确 email.not.empty=有效不能为空
添加From表单
Jsp头需要添加<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>才能启用Spring的控件
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>数据校验</title> </head> <body> <form:form modelAttribute="contentModel" method="post"> name:<form:input path="name" /><br/> <form:errors path="name"></form:errors><br/> age:<form:input path="age" /><br/> <form:errors path="age"></form:errors><br/> email:<form:input path="email" /><br/> <form:errors path="email"></form:errors><br/> <input type="submit" value="Submit" /> </form:form> </body> </html>
添加Controller接受和校验数据
@RequestMapping(value="/test", method = {RequestMethod.POST}) public String Perstest(Model model,@Valid @ModelAttribute("contentModel") PersonModel permodel,BindingResult result) { if(result.hasErrors()) { return Perstest(model); } else { return "validate/ValidSucc"; } }
其中@Valid表示添加数据校验注解,BindingResult获取绑定验证后台结果;
数据格式化
MVC-Spring格式采用的方式有2中,第一种采用注解的方式,第二种采用代码后台转换,借助Joda-Time包。
Model注解格式
需要在Model中添加格式化属性,比如@DateTimeFormat等
@NumberFormat(style=Style.CURRENCY) private double money;
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date BirthData
在View中需要采用<spring:eval>这样的转换方式获取。记得引用<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <spring:eval expression="FUser.UserName "></spring:eval> <br/> <spring:eval expression="FUser.UBalace "></spring:eval> <spring:eval expression="FUser.UBirthData "></spring:eval> </body> </html>
采用Joda-Time包数据转换,FormattingConversionService和DefaultFormattingConversionService来完成对象的解析和格式化。
使用FormattingConversionService,实例如下:
CurrencyFormatter currencyFormatter=new CurrencyFormatter(); currencyFormatter.setFractionDigits(2); currencyFormatter.setRoundingMode(RoundingMode.HALF_UP); DateFormatter dateFormatter=new DateFormatter(); dateFormatter.setPattern("yyyy-MM-dd HH:mm:ss"); Locale locale=LocaleContextHolder.getLocale(); UserModel.setMoney(currencyFormatter.print(12345.678, locale)); UserModel.setDate(dateFormatter.print(new Date(), locale));
使用DefaultFormattingConversionService,实例如下:
FormatModel formatModel=new FormatModel(); CurrencyFormatter currencyFormatter = new CurrencyFormatter(); currencyFormatter.setFractionDigits(2);//保留2位小数 currencyFormatter.setRoundingMode(RoundingMode.HALF_UP); DateFormatter dateFormatter=new DateFormatter(); dateFormatter.setPattern("yyyy-MM-dd HH:mm:ss"); DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(); conversionService.addFormatter(currencyFormatter); conversionService.addFormatter(dateFormatter); UserModel.setMoney(conversionService.convert(12345.678, String.class)); UserModel.setDate(conversionService.convert(new Date(), String.class));
格式化Formate格式如下:
名称 | 功能 |
NumberFormatter | 实现Number与String之间的解析与格式化 |
CurrencyFormatter | 实现Number与String之间的解析与格式化(带货币符号) |
PercentFormatter | 实现Number与String之间的解析与格式化(带百分数符号) |
DateFormatter | 实现Date与String之间的解析与格式化 |
NumberFormatAnnotationFormatterFactory | @NumberFormat注解,实现Number与String之间的解析与格式化,可以通过指定style来指示要转换的格式(Style.Number/Style.Currency/Style.Percent),当然也可以指定pattern(如pattern=“#.##”(保留2位小数) ),这样pattern指定的格式会覆盖掉Style指定的格式 |
JodaDateTimeFormatAnnotationFormatterFactory | @DateTimeFormat注解,实现日期类型与String之间的解析与格式化这里的日期类型包括Date、 |