CustomDateEditor
CurrencyFormatter
StringToBooleanConverter
全局这里的意思是通过springmvc注入,局部,是说自己去实现一个在小范围使用。
converter的用法
前端传入1,yes,on的时候,后端可以直接用boolean来接收,返回true
这个转换器是spring提供的,要使用的话,还是需要先注入
测试Formatter的子类,CurrencyFormatter:货币格式化的类。
可以和前端约定,传参的时候a,b 传过来,a代表名字,b代表年龄,后端拿到后,按这个,进行分割解析
使用PropertyEditor时,一般不会直接实现,而是继承它的一个实现类,
PropertyEditorSupport
数据绑定中的格式
本章主要介绍SpringMVC提供的PropertyEditor和自定义Formatter、Converter的使用场景、解决的实际的问题以及Formatter和Converter的简单对比和选型依据
知识点1:
【a】PropertyEditor:属性编辑器,一般用于类型转换,它是一个接口,有很多实现类,常用直接下级实现类是PropertyEditorSupport,该类常用方法有。
setValue(Object value):一般自定义类型转换器调用并传入一个实体类对象。
getValue():一般通过自定义类型转换器对象调用该方法就可以获得实体类对象。
setAsText(String text):通常传入一个字符串,并对该字符串进行解析,然后对实体类属性进行赋值。
实现PropertyEdito接口时,通常不直接实现接口PropertyEditor,而是继承PropertyEditorSupport类进行扩展。
案例:创建一个名为MyPropertyEditor的自定义类型转换器,并继承PropertyEditorSupport,这样就可以使用接口PropertyEditor提供的方法,实现setAsText(String text)方法,该方法里创建User对象,并对传进来的字符串用逗号分隔成字符串数组,把字符串数组第0个元素赋值给User对象的name,字符串数组的第1个元素赋值给User对象的age,再通过setValue(Object obj),把User对象传入,这样做的目的,就可以和前端约定,第一个字符在逗号前面的传名字,第二个字符在逗号后面的传年龄,这样通过自定义的Editor就可以使用User对象进行接收。
扩展:getValue()方法源码实现——它会返回一个Object对象,源码中返回的是一个value属性,而这个value就是PropertyEditorSupport的Object类型的属性
【b】Formatter:格式化器,它是一个接口Formatter<T>,它继承Printer<T>和Parser<T>,他有很多实现类(AbstractNumberFormatter、CurrencyFormatter货币转换器、DateFormatter日期的转换、InstanceFormatter、NumberFormatter、PercentFormatter百分比转换器等),这里拿CurrencyFormatter讲解(货币转换器)(DateFormatter是做日期的格式化转换器,PercentFormatter是做百分比的格式化转换器)。
案例:创建自定义格式化类型转化器FormatterTest
test1()方法中,创建CurrencyFormatter对象,该对象调用setFractionDigits(2),该方法是用来保留小数点后几位的,该对象再调用setRoundingMode(RoundingMode.CEILING),该方法是用作舍入操作,celling表示四舍五入,接着通过Assert类的assertEquals()断言方法,拿123.13和123.125进行断言。
案例2:将BigDecimal("123")格式化为字符串"$123.00"展示,CurrencyFormatter的parse方法返回值是BigDecimal,print方法返回值是String。
【c】Converter:格式化器,它也是接口,该接口有两个泛型Converter<S,T>(其中<S>是source的类型,<T>是target的类型),它的实现类很多,例如NumberToCharacterConverter,把数字转换为字符,这里使用StringToBooleanConverter进行讲解,它实现了Converter<String,Boolean>接口,而且修饰的类使用的是final修饰符而不是public,原因是防止该类被修改、被继承,Converter接口不让实现类进行扩展,而Formatter不一样,它可以使用CurrentFormatter继承Formatter接口的实现类AbstractNumberFormatter,可以进行扩展。
案例:首先在dispatcher-servlet.xml中把StringToBooleanConverter注入,然后再配置<mvc:annotation-driven conversion-service="stringToBooleanConverter"/>
总结:内置的CustomDateEditor(它继承了PropertyEditorSupport),内置的CurrencyFormatter(它继承了AbstractNumberFormatter),内置的StringToBooleanConverter(它实现了Converter<String,Boolean>),就扩展性来说,这里所说扩展性都是Spring内置扩展性,Converter不可扩展,PropertyEditor一般局部使用配合webdatabinder使用,Formatter全局局部都可以,全局是通过Spring注入的方式,局部就像单元测试那样,new一个Formatter,然后调用它的方法,Converter全局和局部都可以,全局也是通过Spring注入的方式,局部也是自己实现Converter接口,写一个实现,然后new这个实现类。
本章主要介绍SpringMVC提供的PropertyEditor和自定义Formatter、Converter的使用场景、解决的实际的问题以及Formatter和Converter的简单对比和选型依据
知识点1:自定义类型转换器
【a】PropertyEditor:属性编辑器,一般用于类型转换,它是一个接口,有很多实现类,常用实现类是PropertyEditorSupport,该类常用方法有,setValue(Object value)、getValue(){返回的是Object类型的对象,这里返回的是通过setValue传入的对象}、setAsText(String text),实现自定义PropertyEditor,通常不直接实现接口PropertyEditor,而是继承PropertyEditorSupport进行扩展。
案例:创建一个名为MyPropertyEditor的自定义转换器,并继承PropertyEditorSupport,实现setAsText(String text)方法,该方法里创建User对象,并对传进来的字符串用逗号分隔成字符串数组,把字符串数组第一个元素赋值给User对象的name,字符串数组的第二个元素赋值给User对象的age,再通过setValue(Object obj),把User对象传入,这样做的目的,前端就可以通过逗号前传name逗号后传age传参数了。
【b】Formatter:Formatter<T>格式化器,它是一个接口,继承Printer<T>和Parser<T>,他有很多实现类,这里拿CurrencyFormatter讲解(货币转换器)(DateFormatter是做日期的格式化转换器,PercentFormatter是做百分比的格式化转换器)。
案例:创建自定义格式化类型转化器FormatterTest
test1()方法中,创建CurrencyFormatter对象,该对象调用setFractionDigits(2),该方法是用来保留小数点后几位的,该对象再调用setRoundingMode(RoundingMode.CEILING),该方法是用作舍入操作,celling表示四舍五入,接着通过Assert类的assertEquals()断言方法,拿123.13和123.125进行断言。
案例2:将BigDecimal("123")格式化为字符串"$123.00"展示,CurrencyFormatter的parse方法返回值是BigDecimal,print方法返回值是String。
【c】Converter:格式化器,它也是接口,该接口有两个泛型Converter<S,T>(其中<S>是source的类型,<T>是target的类型),它的实现类很多,例如NumberToCharacterConverter,把数字转换为字符,这里使用StringToBooleanConverter进行讲解,它实现了Converter<String,Boolean>接口,而且修饰的类使用的是final修饰符而不是public,原因是防止该类被修改、被继承,Converter接口不让实现类进行扩展,而Formatter不一样,它可以使用CurrentFormatter继承Formatter接口的实现类AbstractNumberFormatter,可以进行扩展。
案例:首先在dispatcher-servlet.xml中把StringToBooleanConverter注入,然后再配置<mvc:annotation-driven conversion-service="stringToBooleanConverter"/>
总结:内置的CustomDateEditor(它继承了PropertyEditorSupport),内置的CurrencyFormatter(它继承了AbstractNumberFormatter),内置的StringToBooleanConverter(它实现了Converter<String,Boolean>),就扩展性来说,这里所说扩展性都是Spring内置扩展性,Converter不可扩展,PropertyEditor一般局部使用配合webdatabinder使用,Formatter全局局部都可以,全局是通过Spring注入的方式,局部就像单元测试那样,new一个Formatter,然后调用它的方法,Converter全局和局部都可以,全局也是通过Spring注入的方式,局部也是自己实现Converter接口,写一个实现,然后new这个实现类。
propertyEditor
使用PropertyEditor实现绑定时的类型转换:(数据类型转换器) 请求参数string到参数类型(也可能是任意类型)的类型转换,都是使用PropertyEditor类实现的string到任意参数的转换的。但是PropertyEditor不能实现任意对象到任意对象之间的转换,比如我们常见的Long时间戳到Date类型的转换时办不到的。
1、PropertyEditor:在类中进行局部使用
2、Formatter:全局,或者使用new Formatter的方式进行局部使用,只能转换String到其他类型;
3、Converter:全局或局部,和Formatter类似,但Converter的源对象不仅仅是String,而可以自行进行定义
1、PropertyEditor:在类中进行局部使用
2、Formatter:全局,或者使用new Formatter的方式进行局部使用,只能转换String到其他类型;
3、Converter:全局或局部,和Formatter类似,但Converter的源对象不仅仅是String,而可以自行进行定义
1