自定义类型转换器
关于SpringMVC,它是一个非常人性化的框架,它的内部实现了数据传向然后转化成相应的数据类型!帮我们省去了很多的麻烦。
例如:在我们前端页面输入数据的时候,后台接受数据的时候,如果事先写好一个类,且后台接受到响应参数为该类型时,那么他就会自动匹配类的属性,并将值注入,那么后台接收到的参数就是一个已经注入好参数的实例;再将实例传回给前端的页面即可。
以下是一个User类,包含三个属性
public class User implements Serializable {
private String username;
private String password;
private Integer age;
//此处省略get()和set()方法
}
前端jsp页面上只实现一个表单即可,但是传递的数据的name必须和上面的User类里面的属性名称一致:
<form action="user/transform" method="post">
用户名:<input type="text" name="username"/>
密码:<input type="text" name="password"/>
年龄:<input type="text" name="age"/>
<input type="submit" value="提交">
</form>
后台控制器接收到前端的请求,然后再响应给新的页面
@Controller
@RequestMapping("/user")
@SessionAttributes
public class UserController {
@RequestMapping("/transform")
public String transform(User user, Model model){
System.out.println("类型转换代码实现");
model.addAttribute("user",user);
return "success";
}
}
Spring MVC将数据依照匹配注入,非常人性化,但是,在默认情况下,他只能将请求参数(字符串类型)转化一部分类型。对于某些特殊类型无法转换成功。
例如:private Date birthday; 属性,在前端只有传回格式如2019/10/10的格式才会接收到数据,但是2019-10-10的格式是不会生效甚至会报错,所以依照这个案例来编写自定义类型转换器。
Spring提供了3种类型的转换器接口,我们可以实现任意的一种转换器,并将它作为自定义转换器注册到ConversionServiceFactoryBean
案例
需求: 表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明 Spring框架内部会默认进行数据类型转换,但是如果想自定义类型的转换就要重写自定义类型转换器。
问题: 在SpringMVC中,时间的类型的格式2018/11/11这样的格式能自动转换的,但是2018-11-11这样的类型是不能被自定转换器转换的所以要改写自动转换器让其能够转换。
第一步:
在上述问题中,当前端输入一个字符串表示用户的生日信息的时候,spring不能帮我们转换数据格式,那么我们需要自定义一个转换器,自定义一个类 实现Converter<S,T>接口。并且我们可以看出来,这个接口是一个泛型的接口,第一个是传进来的数据类型,后一个是输出的类型。
package cn.itcast.utils;
import javafx.scene.input.DataFormat;
import org.springframework.core.convert.converter.Converter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*把一个字符串转换成日期*/
public class StringToDateConverter implements Converter<String, Date> {
/*
* String s 传入进来的字符串
*
* */
public Date convert(String s) {
if(s==null){
throw new RuntimeException("请您传入数据");
}
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
//把字符串转换成日期
return dateFormat.parse(s);
} catch (ParseException e) {
throw new RuntimeException("数据类型转换错误");
}
}
}
以上的代码将传进来的字符串经过转换成时间类型然后返回。
第二步: 定义好了这和转换器之后,将他注册到CinversionServiceFactoryBean的converters属性,那么当前端输入数据之后,spring在进行参数的时候使用我们自定义的数据转换器进行数据的转换,参数的注入。
<!--配置自定义类型转换器-->
<bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<!--转换类的全部路径-->
<bean class="cn.itcast.utils.StringToDateConverter"></bean>
</set>
</property>
</bean>
<!--类型转换器没有自动生效,所以要在以下的代码中加一条让他去生效我们的自动类型转换器-->
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
以上的代码就是要配置自动类型转换器的代码,在最后的代码里面,因为它只会自动配置处理器适配器和处理器映射器两个,所以我们要在最后配置我们写的类型转换器。
第三步: 编写jsp页面代码
<center>
<form action="param/saveUser" method="post">
用户姓名:<input type="text" name="uname" /><br/>
用户年龄: <input type="text" name="age" /><br/>
用户生日: <input type="text" name="date" /><br/>
<input type="submit" value="提交">
</form>
</center>
注册成功之后,再次尝试前端输入(生日类型的值时),后才接收的时候,可以正常解析参数转换成功。