Spring MVC 的数据绑定、转换器、属性编辑器

本文详细介绍了Spring MVC中的数据绑定技术,包括全局和局部数据绑定的实现方式,以及如何通过属性编辑器和转换器实现不同类型的数据转换。

转自:http://aokunsang.iteye.com/blog/1409505

一、数据绑定 

1、全局数据绑定

第一种方式,定义一个BaseController,在里面注册一个protected void ininBinder(WebDataBinder binder){},添加注解@InitBinder。【注解式】 

       此种方式一般不建议使用

第二种方式,定义一个类MyBinder实现WebBindingInitializer接口,同时实现其方法public void initBinder(WebDataBinder binder, WebRequest arg1) {}。【声明式】

在spring-mvc.xml中配置

一般大家可能省事,直接写了<mvc:annotation-driven/>来激活@Controller模式,它默认会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter两个bean,它们是springMVC为@Controllers分发请求所必须的。
但是如果你想用声明式注册一个数据绑定,你需要手动注册AnnotationMethodHandlerAdapter和DefaultAnnotationHandlerMapping。

 

Xml代码  收藏代码
  1. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>  <!-- 这个类里面你可以注册拦截器什么的 -->  
  2. <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>  
  3. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
  4.     <property name="webBindingInitializer">  
  5.         <bean class="packagename.MyBinder"></bean>  <!-- 这里注册自定义数据绑定类 -->  
  6.     </property>  
  7.     <property name="messageConverters">  
  8.       <list>  
  9.         <ref bean="jacksonMessageConverter"/>    <!-- 注册JSON  Converter-->  
  10.       </list>  
  11.     </property>  
  12. </bean>  

 

 说明:此处org.springframework.http.converter.json.MappingJacksonHttpMessageConverter是必须配置的,否则在Controller方法前面加@ResponseBody,无法返回JSON,并报错

同时需要引入两个jar包。jackson-core-asl.jar和jackson-mapper-asl.jar。

 

2、局部数据绑定

这个就简单了,直接在需要的绑定的Controller中,添加protected void ininBinder(WebDataBinder binder){  },并且添加注解@InitBinder就可以实现。例如:

 

Java代码  收藏代码
  1. @Controller  
  2. public class TestController{  
  3.     
  4.    //日期转换器,这样就会作用到这个Controller里所有方法上  
  5.    @InitBinder    
  6.     public void initBinder(WebDataBinder binder) {    
  7.         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");    
  8.         dateFormat.setLenient(false);    
  9.         binder.registerCustomEditor(Date.classnew CustomDateEditor(dateFormat, false));  
  10.     }  
  11.      
  12.  ...各种增删改查方法  
  13. }  

 

 

四、转换器

 

 Spring提供了很多默认转换器,如StringToBooleanConverter,ObjectToStringConverter,NumberToCharacterConverter,ArrayToCollectionConverter,StringToArrayConverter,ObjectToCollectionConverter,ObjectToObjectConverter等等,如果需要自定义转换器,需要实现接口

  1. public interface Converter<S, T> { //S是源类型 T是目标类型  
  2.     T convert(S source); //转换S类型的source到T目标类型的转换方法  
  3. }

 我目前用到的转换器和数据绑定,基本都是对字段类型转换,两种方式都可以实现字符串到日期的转换。如:

Java代码  收藏代码
  1. public class CustomDateConverter implements Converter<String, Date> {  
  2.   
  3.     private String dateFormatPattern;  //转换的格式  
  4.   
  5.     public CustomDateConverter(String dateFormatPattern) {  
  6.             this.dateFormatPattern = dateFormatPattern;  
  7.     }  
  8.       
  9.     @Override  
  10.     public Date convert(String source) {  
  11.          if(!StringUtils.hasLength(source)) {  
  12.              return null;  
  13.          }  
  14.          DateFormat df = new SimpleDateFormat(dateFormatPattern);  
  15.          try {  
  16.              return df.parse(source);  
  17.          } catch (ParseException e) {  
  18.              throw new IllegalArgumentException(String.format("类型转换失败,需要格式%s,但格式是[%s]", dateFormatPattern, source));   
  19.          }  
  20.     }  
  21. }  

 配置文件有两种方式,

第一种比较简单:

Java代码  收藏代码
  1. <mvc:annotation-driven conversion-service="conversionService"/>  
  2. <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">  
  3.  <property name="converters">  
  4.        <list>  
  5. <bean class="packagename.CustomDateConverter">  
  6.     <constructor-arg value="yyyy-MM-dd"></constructor-arg>  
  7. </bean>  
  8. lt;/list>  
  9.  </property>  
  10. </bean>  

 第二种,稍微麻烦点:

Java代码  收藏代码
  1. <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">  
  2.    <property name="converters">  
  3.     <list>  
  4.         <bean class="packagename.CustomDateConverter">  
  5.             <constructor-arg value="yyyy-MM-dd"></constructor-arg>  
  6.         </bean>  
  7.     </list>  
  8.    </property>  
  9. </bean>  
  10. <bean id="myBinder" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">    
  11.     <property name="conversionService" ref="conversionService"/>    
  12. </bean>  
  13. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">  
  14.         <property name="webBindingInitializer" ref="myBinder"></property>  
  15. </bean>  

 

 

 

五、属性编辑器

1、在第三条中说了数据绑定,那么怎么能做到将String转换为Calendar或者Date呢。这里需要说的就是Spring的属性编辑器,感觉跟struts2的那个数据转换差不多。先看一段代码:

 

Java代码  收藏代码
  1. public void initBinder(WebDataBinder binder, WebRequest arg1) {  
  2.     //这里我定义了一个匿名属性编辑器将String转为为Calendar  
  3.         binder.registerCustomEditor(Calendar.classnew PropertyEditorSupport(){  
  4.         @Override  
  5.         public void setAsText(String text) throws IllegalArgumentException {  
  6.             Calendar cal = null;  
  7.             Date date = Util.convertDate(text);  
  8.             if(date != null){  
  9.                 cal = new GregorianCalendar();  
  10.                 cal.setTime(date);  
  11.             }  
  12.             setValue(cal);  
  13.         }  
  14.     });  
  15. }  

说明:用binder.registerCustomEditor()注册一个属性编辑器,来进行数据的转换操作。它有2种方式。

第一种binder.registerCustomEditor(Class clz,String field,PropertyEditor propertyEditor);这种方式可以针对bean中的某一个属性进行转换操作。clz为类的class,field为bean中的某一个属性,propertyEditor为编辑器。

第二种binder.registerCustomEditor(Class clz,PropertyEditor propertyEditor)。这种方式可以针对某种数据类型进行数据转换操作。如:将传递过来的String字符串转换为Calendar,这里就需要将clz设置为Calendar.class,propertyEditor为编辑器。

 

2、默认spring提供了很多种属性编辑器,可以在Spring-beans-3.0.5.jar的org.springframework.beans.propertyeditors包中看到。直接使用即可,如将String转换为Date类型:

 

Java代码  收藏代码
  1. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  2. binder.registerCustomEditor(Date.classnew CustomDateEditor(sdf, false));  

 


先看效果: https://renmaiwang.cn/s/jkhfz Hue系列产品将具备高度的个性化定制能力,并且借助内置红、蓝、绿三原色LED的灯泡,能够混合生成1600万种不同色彩的灯光。 整个操作流程完全由安装于iPhone上的应用程序进行管理。 这一创新举措为智能照明控制领域带来了新的启示,国内相关领域的从业者也积极投身于相关研究。 鉴于Hue产品采用WiFi无线连接方式,而国内WiFi网络尚未全面覆盖,本研究选择应用更为普及的蓝牙技术,通过手机蓝牙与单片机进行数据交互,进而产生可调节占空比的PWM信号,以此来控制LED驱动电路,实现LED的调光功能以及DIY调色方案。 本文重点阐述了一种基于手机蓝牙通信的LED灯设计方案,该方案受到飞利浦Hue智能灯泡的启发,但考虑到国内WiFi网络的覆盖限制,故而选用更为通用的蓝牙技术。 以下为相关技术细节的详尽介绍:1. **智能照明控制系统**:智能照明控制系统允许用户借助手机应用程序实现远程控制照明设备,提供个性化的调光及色彩调整功能。 飞利浦Hue作为行业领先者,通过红、蓝、绿三原色LED的混合,能够呈现1600万种颜色,实现了全面的定制化体验。 2. **蓝牙通信技术**:蓝牙技术是一种低成本、短距离的无线传输方案,工作于2.4GHz ISM频段,具备即插即用和强抗干扰能力。 蓝牙协议栈由硬件层和软件层构成,提供通用访问Profile、服务发现应用Profile以及串口Profiles等丰富功能,确保不同设备间的良好互操作性。 3. **脉冲宽度调制调光**:脉冲宽度调制(PWM)是一种高效能的调光方式,通过调节脉冲宽度来控制LED的亮度。 当PWM频率超过200Hz时,人眼无法察觉明显的闪烁现象。 占空比指的...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值