天天看点

springmvc 之 自定义类型转换

1,自定义类型转换

配置xml

<!-- 注册自定义的转换类 -->
<bean id="myconverter" class="com.springmvc.conver.MyConver">
    <!-- 将自定义类型转换器添加到conversionServiceFactoryBean中 -->
<bean id="conversionService"    
    class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
    <ref bean="myconverter"/><!-- 将自定义转换类引入转换器 -->
</set>
</property>
</bean>
<!-- 注册类型转换器 -->
<mvc:annotation-driven conversion-service="conversionService" />
           

定义自己的转换类

Spring定义了3种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到ConversionServiceFactoryBean中。

Converter<S,T>:将S类型转换为T类型。

ConverterFactory:将相同系列的多个“同质”Converter封装在一起,如果希望一种类型转换成另一种类型及其子类对象(例如String转换为Number及Number的子类(Integer,Long,Double等)),可以使用该转换器工厂。

GenericConverter:会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换。

这里将字符串类型的时间转换为date类型

@Component
public class MyConverter implements Converter<String, Date> {
	@Override
	public Date convert(String text) {
		Date date = null;
		try {
		    if (text.contains("-")) {
			    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
			    date = sf.parse(text);
		    } else {
			    SimpleDateFormat sf = new SimpleDateFormat("dd/MM/yyyy");
			    date = sf.parse(text);
		    }
		} catch (Exception e) {
		    e.printStackTrace();
		}
		return date;
	}
}
           

接收数据的方法

@RequestMapping(value = "/getDate",method = RequestMethod.POST)
	public String getDate(Date date) {
		System.out.println(date);
		return "redirect:/list";
	}
           

如果转换失败也可以用BindingResult来捕获

@RequestMapping(value = "/getDate",method = RequestMethod.POST)
public String register(Date date,BindingResult result){
	if(result.getErrorCount() > 0){
		for (FieldError error : result.getFieldErrors()) {
		    System.out.println(error.toString());
		}
	}
	System.out.println("date:" + date);
	return “register";
}
           

数据格式化

对属性的输入/输出格式化,其本质来讲依然属于类型转换的范畴。

Spring在格式化模块中定义了一个实现ConversionService接口的FormattingConversionService实现类,该实现类扩展了GenericConversionService,因此它即具有类型转换的功能又具有格式化的功能。

FormattingConversionService拥有一个FormattingConversionServiceFactoryBean工厂类,后者用于构造前者。

FormattingConversionServiceFactoryBean内部已经注册了:

支持数字类型的属性用@NumberFormat注解。

支持日期类型的属性使用@DateTimeFormat注解。

<!-- 注册格式化工厂 -->
<bean id="myconverter" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 引用格式化工厂 -->
<mvc:annotation-driven conversion-service="format" />
           

装配了FormattingConverstionServiceFactoryBean后,就可以在SpringMVC形参绑定及模型数据输出时使用注解驱动了。

日期格式化

@DateTimeFormat注解可以对日期类型进行格式化。

pattern属性:类型为字符串,指定解析/格式化字段数据的模式。如”yyyy-MM-dd hh:mm:ss“。

iso属性:解析格式化的ISO模式。

ISO.DATE 等于 (yyyy-MM-dd)

ISO.TIME 等于(hh:mm:ss.SSSZ)

ISO.DATE_TIME 等于 (yyyy-MM-dd hh:mm:ss.SSSZ)

ISO.NONE 等于 (不使用)

style属性:字符串类型,通过样式指定日期时间的格式,由两位字符组成,第一位表示日期的格式,第二位表示时间的格式。

S:短日期时间格式

M:中日期时间格式

L:长日期时间格式

F:完整日期时间格式

-:忽略日期时间格式

如:

//加在需要转换格式的属性类的字段上
	//@DateTimeFormat(iso = ISO.DATE_TIME)
	//@DateTimeFormat(style = "F")
	@DateTimeFormat(pattern = "yyyy-MM-dd")
	private Date date;
           

数字格式化

@NumberFormat可对类似数字类型的属性进行标注,它拥有两个互斥的属性。

patten:类型为String,自定义样式,如”#,##”,#代表数字。

style:类型为NumberFormat.Style。用于指定样式类型,包括三种。

Style.NUMBER:正常数字类型。

Style.CURRENCY:货币类型。

Style.PERCENT:百分比类型。

用法和上面的日期格式化相同

关于mvc:annotation-driven

<mvc:annotation-driven />会自动注册以下三个Bean对象。

RequestMappingHandlerMapping

RequestMappingAdapter

ExceptionHandlerExceptionResolver

还将提供一下支持

支持使用ConversionService实例对表单参数进行实例转换。

支持使用@NumberFormatannotation、@DataFormatannotation注解完成数据类型的格式化。

支持使用@Valid注解对JavaBean实例进行JSR303验证。

支持使用@ReuqestBody和@ResponseBody注解。

<!--配置直接访问页面-->
<!--可以直接相应的转发页面,而无需再经过控制器-->
<mvc:view-controller path="/viewpath" view-name="viewname" />
<!--实际开发中通常都需要配置mvc:annotation-driven标签(注解驱动)-->
<mvc:annotation-driven />
<!--当静态资源文件被拦截需要配置该标签-->
<mvc:default-servlet-handler/>
           

继续阅读