springmvc实现数据类型转换

6 篇文章 0 订阅
3 篇文章 0 订阅

springmvc实现数据类型转换

最近在敲一个ssm项目的过程中遇到了数据类型转换的问题,只是记得好像可以在springmvc中来实现,但具体咋实现记不清了,正好借此重新回顾一下。

spring中实现类型转换模块的代码在org.springframework.core.convert这个包中

使用ConversionService进行类型转换

**.core.convert.ConversionService是实现spring类型转换的核心接口,该接口定义了中有4个方法。
1.boolean canConvert(Class<?> sourceType, Class<?> targetType);判断是都可以将一个java类转换成另一个类。

2.boolean canConvert(TypeDescriptor sourceType, TypeDescriptor targetType);将需要转换的类以成员变量的方式出现,TypeDescriptor描述了需要转换类的信息,还描述了类的上下文信息(我也没看懂是个啥意思)

3. T convert(Object source, Class targetType);将源类型对象转换成目标类型对象

4.Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType);

可以利用org.springframework.context.support.ConversionServiceFactoryBean在spring上下文中定义一个ConversionService,spring会自动识别上下文中的ConversionService,并在SpringMVC处理Bean的属性配置或者方法的入参时,进行数据转换。下面举个例子,将前台传来的时间的字符串数据转换成Date数据。

前台页面:
index.jsp页面
结果页面:
在这里插入图片描述
关键部分的代码在springmvc的配置文件中:

	<!-- 配置自动扫描的包 -->
    <context:component-scan base-package="com.springmvc.*"></context:component-scan>
    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
    <!-- 配置视图扫描器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	    <property name="prefix" value="/pages/"></property>
	    <property name="suffix" value=".jsp"></property>
	</bean>
	
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="com.springmvc.convert.ConvertTest" p:dataPattern="yyyy-MM-dd"></bean>
            </list>
        </property>
    </bean>

在该配置文件中,mvc:annotation-driven/标签可简化SpringMVC的相关配置,自动注册处理器适配器和处理器映射器的两个Bean。而当这个标签没有显示定义时,会默认注册一个ConversionService,满足大部分类型转换的需求。而现在需要的是注册一个自定义的转换类,所以要显示定义一个ConversionService来覆盖默认的实现类。

自定义了一个转换类:

public class ConvertTest implements Converter<String, Date> {
	
	private String dataPattern;//日期的模板类型 如:yyyy-MM-dd
	public void setDataPattern(String dataPattern) {
		this.dataPattern = dataPattern;
	}
	@Override
	public Date convert(String date) {
		// TODO Auto-generated method stub
		try {
			SimpleDateFormat dateFormat = new SimpleDateFormat(this.dataPattern);
			return dateFormat.parse(date);
		}catch(Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
}

使用@InitBinder注解进行类型转换

除了使用ConversionService进行类型转换,还可以使用SpringMVC的注解@InitBinder和Spring自带的WebDataBinder来实现这一类型转换。

使用该方法是要在Controller类中添加initBinder()方法并加上@InitBinder的注解。

	@InitBinder
	public void initBinder(WebDataBinder binder) {
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
	}
	@RequestMapping(value="/submit2",method = RequestMethod.POST)
	public String submit2(User user,Model model) {
		System.out.println(user.getName());
		System.out.println(user.getbirthday());
		model.addAttribute("user", user);
		return "result";
	}

@InitBinder表示的方法的参数为WebDataBinder,是DataBinder的子类。
DataBinder是数据绑定的核心部件,可以用来进行数据类型转换,格式化以及数据校验。

最后结果如下:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值