将时间字符串转换为Date对象除了使用数据类型转换器外还可以通过数据格式化方式实现:
@DateTimeFormat注解可对java.util.Date、java.util.Calendar、java.long.Long时间类型进行标注:
pattern 属性:类型为字符串。指定解析/格式化字段数据的模式,如:yyyy-MM-ddhh:mm:ss
ISO属性:指定解析/格式化字段数据的ISO模式,包括四种:ISO.NONE(默认值,不使用)、ISO.DATE(yyyy-MM-dd) 、ISO.TIME(hh:mm:ss.SSSZ)、ISO.DATE_TIME(yyyy-MM-ddhh:mm:ss.SSSZ)
style 属性:字符串类型。通过样式指定日期时间的格式,由两位字–符组成,第一位表示日期的格式,第二位表示时间的格式:S:短日期/时间格式、M:中日期/时间格式、L:长日期/时间格式、F:完整日期/时间格式、-:忽略日期或时间格式
@NumberForma注解t可对类似数字类型的属性进行标注,它拥有两个互斥的属性:
pattern属性:自定义样式,如patter="#,###";
style属性:指定样式类–型,包括三种:Style.NUMBER(正常数字类型)、Style.CURRENCY(货币类型)、Style.PERCENT(百分数类型)
我们在controller层要处理好格式不对的错误提示:
@Controller public class UserInfoController { @RequestMapping("/userinfo/add.do")
//BindingResult中保存了类型转换及格式化相关的错误信息
public String add(UserInfo userInfo,BindingResult result){ if(result.getErrorCount()>0){ for(ObjectError error: result.getAllErrors()){ System.out.println(error.getDefaultMessage()); } return "userinfo/error"; } return "userinfo/ok"; } }
接下来我们用上述两个注解给vo类对应属性添加格式:
publicclass UserInfo { @DateTimeFormat(pattern="yyyy-MM-dd") private Date birth; @NumberFormat(pattern="#,###,###.") private Float salary; //...省略getter和setter方法... }
当我们在表单页获取了上述格式数据,就会自动转换为date类和int类
比如我们输入
就会输出
这就是数据格式化注解的作用,当我们要同时使用注解和类型转换器时,我们可以使用
FormattingConversionServiceFactroyBean类:
使用自定义类型转换器时需要通过org.springframework.context.support.ConversionServiceFactoryBean的converters属性注册该类型转换器,此时<mvc:annotation-driven/>默认创建的ConversionService实例不再org.springframework.format.support.DefaultFormattingConversionService对象,而是org.springframework.core.convert.support.DefaultConversionService对象,无法使用@DateTimeFormat和@NumberFormat注解,为了解决这一问题需要将org.springframework.context.support.ConversionServiceFactoryBean替换成org.springframework.context.support.ConversionServiceFactoryBean,如下配置:
<beanid="conversionService"class="org.springframework.context.support.ConversionServiceFactoryBean"> <propertyname="converters"> <set> <refbean="dateConverter"/> </set> </property> </bean> <mvc:annotation-drivenconversion-service="conversionService"></mvc:annotation-driven>