我们在使用SpringMVC时,常常需要把表单中的参数映射到我们对象的属性中,我们可以在默认的spring-servlet.xml加上如下的配置即可做到普通数据类型的转换,如将String转换成Integer和Double等:
<mvc:annotation-driven/> 或 <beanid="conversionService"class="org.springframework.format.support.FormattingConversionServiceFactoryBean"/>其实<mvc:annotation-driven/>标签会默认创建并注册一个RequestMappingHandlerMapping(在Spring3.2之前是DefaultAnnotationHandlerMapping)和RequestMappingHandlerAdapter(Spring3.2之前是AnnotationMethodHandlerAdapter),当然,如果上下文有对应的显示实现类,将该注解注册的覆盖掉。该注解还会创建一个ConversionService,即FormattingConversionServiceFactoryBean。
如果想把一个字符串转换成其它实体类型,spring没有提供这样默认的功能,我们需要自定义类型转换器。
这里有个实体类Employee。
1packagecom.proc; 2 3publicclassEmployee{ 4 5privateStringname; 6privateIntegerage; 7privateStringgender; 8publicStringgetName(){ 9returnname; 10} 11publicvoidsetName(Stringname){ 12this.name=name; 13} 14publicIntegergetAge(){ 15returnage; 16} 17publicvoidsetAge(Integerage){ 18this.age=age; 19} 20publicStringgetGender(){ 21returngender; 22} 23publicvoidsetGender(Stringgender){ 24this.gender=gender; 25} 26@Override 27publicStringtoString(){ 28return"Employee[name="+name+",age="+age+",gender="+gender 29+"]"; 30} 31 32}规定将字符串转换成实体类的规则为:name-age-gender
那么接下来就写一个类型转换器,需要实现一个接口org.springframework.core.convert.converter.Converter
1packagecom.proc; 2 3importorg.springframework.core.convert.converter.Converter; 4importorg.springframework.stereotype.Component; 5 6@Component 7publicclassEmployeeConverterimplementsConverter<String,Employee>{ 8 9@Override 10publicEmployeeconvert(Stringstr){ 11Employeeemp=null; 12//字符串格式name-age-gender 13if(str!=null&&str.split("-").length==3){ 14emp=newEmployee(); 15String[]arr=str.split("-"); 16emp.setName(arr[0]); 17emp.setAge(Integer.parseInt(arr[1])); 18emp.setGender(arr[2]); 19} 20returnemp; 21} 22}这里我们为转换器加上@Component注解,是为了让Spring自动扫描该转换器到容器中。这样就不用通过配置文件配置了
接下来编写控制器
1packagecom.proc; 2 3importorg.springframework.stereotype.Controller; 4importorg.springframework.web.bind.annotation.RequestMapping; 5importorg.springframework.web.bind.annotation.RequestParam; 6 7@Controller 8publicclassEmployeeController{ 9 10@RequestMapping("/add") 11publicStringadd(@RequestParam("employee")Employeeemployee){ 12System.out.println(employee); 13return"add"; 14} 15}这里可以看到,参数的名字为employee,所有要为请求定义一个employee参数,该参数传入需要转换的字符串
除此之外,我们还需要在spring配置文件中配置,如下类容。让转换器生效
1<?xmlversion="1.0"encoding="UTF-8"?> 2<beansxmlns="http://www.springframework.org/schema/beans" 3xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4xmlns:context="http://www.springframework.org/schema/context" 5xmlns:mvc="http://www.springframework.org/schema/mvc" 6xsi:schemaLocation="http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd 7http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.3.xsd 8http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.3.xsd"> 9 10<context:component-scanbase-package="com.proc"></context:component-scan> 11 12<beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"> 13<propertyname="prefix"value="/WEB-INF/"/> 14<propertyname="suffix"value=".jsp"></property> 15</bean> 16 17<mvc:annotation-drivenconversion-service="conversionService"/> 18 19<beanid="conversionService"class="org.springframework.context.support.ConversionServiceFactoryBean"> 20<propertyname="converters"> 21<set> 22<refbean="employeeConverter"/> 23</set> 24</property> 25</bean> 26</beans>测试代码:http://localhost:8080/springmvc-1/add?employee=caoyc-18-male
结果输出:Employee[name=caoyc,age=18,gender=male]
上面配置文件中我们使用配置了一个ConversionServiceFactoryBean。虽然可以这样,但不建议。我们通常用org.springframework.format.support.FormattingConversionServiceFactoryBean
使用FormattingConversionServiceFactoryBean可以让SpringMVC支持@NumberFormat和@DateTimeFormat等Spring内部自定义的转换器。
本文内容总结:为什么要这样用呢?这样用的好处是什么呢?,
原文链接:https://www.cnblogs.com/caoyc/p/5639652.html