Spring MVC-自定义类型转换器
Spring中的Conventer是如何实现的,因为他没有绑定类中的属性,它怎么知道要将那个String转换?看了几遍的书也没有找到,后来想想,其实我已经知道了,他的名字就是答案,转换器,因为已经告诉他了目标类型,所以只要实体类中有这个类型,在使用springMVC表单对象时就会启动,但是另外一个问题产生了,如果项目中有多个地方那个有了时间,一个时间格式是yyyy-MM-dd,另一个是yyyy-MM-dd HH:mm:ss,那么此时该如果让Spring确定该用那个conventer呢(这个需求在我现在做的项目中就有这样)??
1.conversionService是Spring类型转换体系的核心借口
2.可以利用ConversionserviceFactoryBean在Spring的
IOC容器中定义一个ConversionService.
Spring将自动识别出IOC容器中的ConversionService,并在Bean
属性配置及SpringMVC处理方法入参绑定场合使用它进行数据的转换
3.可以通过ConversionServiceFactoryBean的ConversionServiceFactoryBean
的converters属性注册自定义的类型转换器
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="formatters"> <set> <bean class="app07a.formatter.DateFormatter"> <constructor-arg type="java.lang.String" value="MM-dd-yyyy" /> </bean> </set> </property> </bean>
在Spring中很多地方都用FactoryBean来整合第三方的框架的bean
Spring支持的转换器
Spring定义了3种类型的转换器借口,实现任意一个转换器接口都可以作为自定义转换器
注册到ConversionServiceFactoryBean
-Converter<S,T>:将s类型转换为T类型对象
-coverterFactory: 将相同系列多个"同质"converter封装在一起,如果希望将一种
类型的对象转换为另一种类型及其子类的对象(例如将String转换为Number以及Number
子类(Integer,Long,Double等)对象)可使用该转换器工厂类
-GenericConverter:会根据源类对象及目标对象所在的宿主类中的上下问信息进行类型转换
<mvc:annotation-driver conversionService = "conversionService"/>会将自定义的ConversionService注册到Spring MVC的上下文中
这个是一个简单的转换器
1页面
<form action="http://localhost:8080/springMVCapp07a/testConversionServiceConverter" method="post"> <!-- private String name; private String description; private Float price; private Date productionDate; --> <!--格式:java-javabase-12.0-2011.12.12 --> product:<input type="text" name="product"> <input type="submit" value="submit"> </form>
转换器的类
@Component public class ProcuctConverter implements Converter<String, Product> { @Override public Product convert(String source) { if(source != null) { Product product = new Product(); //java-javabase-12.0-2011.12.12 String[] values = source.split("-"); if(values != null && values.length==4) { product.setName(values[0]); product.setDescription(values[1]); product.setPrice(Float.parseFloat(values[2])); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); product.setProductionDate(new Date()); System.out.println(source + "--converter"+product); return product; } } return null; }
springmvc配置文件
<!--配置ConversionService --> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <ref bean="procuctConverter"/> </set> </property> </bean>
记得要在annotation上加上这句
<mvc:annotation-driven conversion-service="conversionService" />
目标action
@Controller public class testConversionService { @RequestMapping(value="/testConversionServiceConverter") public String test(@RequestParam("product") Product product ) { System.out.println("/testConversionServiceConverter"+product); return "ProductForm"; } }