SpringMVC 自定义类型转换器
本文内容纲要:
-为什么要这样用呢?这样用的好处是什么呢?
我们在使用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