亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

spring MVC中數據綁定之日期類型

2024-04-27 15:18:25
字體:
來源:轉載
供稿:網友

sPRing MVC中數據綁定之日期類型

標簽: spring mvc數據綁定databind類型轉換2015-01-29 12:30 3164人閱讀 評論(0) 收藏 舉報 分類:

數據綁定應該算是spring MVC的特點之一吧~簡單易用且功能強大,極大地簡化了我們編程人員對于用戶輸入數據的接收及轉換。

早先版本的Spring中的數據綁定完全都是基于PropertyEditor的。而Spring3中引入了Converter,用來替代PropertyEditor完成類型轉換。

那么我們也依照這個順序,先來講講基于傳統的PropertyEditor來實現日期類型的數據綁定。

在Spring MVC中,我們可以通過WebDataBinder來注冊自定義的PropertyEditor,從而添加對應的請求參數綁定。有兩種方式:

1、使用@InitBinder注解@Controller中的方法 2、自定義WebBindingInitializer來提供一個全局的數據綁定規則。

1、使用@InitBinder注解

[java] view plain copy 在CODE上查看代碼片@InitBinder  public void initBinder(WebDataBinder binder){      binder.registerCustomEditor(Date.class, new DateEditor());  }  

[java] view%20plain copy public class DateEditor extends PropertyEditorSupport {      @Override      public void setAsText(String text) throws IllegalArgumentException {          SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");          Date date = null;          try {              date = format.parse(text);          } catch (ParseException e) {              format = new SimpleDateFormat("yyyy-MM-dd");              try {                  date = format.parse(text);              } catch (ParseException e1) {                  e1.printStackTrace();              }          }          setValue(date);      }  }  

這里我們將DateEditor提出來封裝成一個類方便重用。

另外這里有個try...catch的小妙用,就是首先以"yyyy-MM-dd%20HH:mm:ss"的形式來解析用戶輸入的參數,若解析失敗則轉以"yyyy-MM-dd"的形式來解析。這樣的邏輯就可以同時處理"yyyy-MM-dd%20HH:mm:ss"和"yyyy-MM-dd"形式的日期數據,我想在一般的中文系統中,這兩種形式應該是最常用的了吧。

添加如上代碼之后,@InitBinder所在的Controller就可以自動綁定日期類型的數據了,不過這僅僅是在該Controller中生效,若想在全局范圍內生效的話,可以將@InitBinder注解所在的Controller定義為一個BaseController,其余Controller都繼承這個Controller。當然還有另外的方法,若你有興趣的話,請看2。

2、自定義WebBindingInitializer

[java] view%20plain copy public class MyWebBindingInitializer implements WebBindingInitializer {            @Override      public void initBinder(WebDataBinder binder, WebRequest request) {          binder.registerCustomEditor(Date.class, new DateEditor());      }  }  

還是前面寫的DateEditor,這么快又見面了,只不過注冊的位置改變了,在WebBindingInitializer中注冊的PropertyEditor是在全局范圍內共享的。

不過光這樣還不夠,還要將WebBindingInitializer注入到AnnotationMethodHandlerAdapter中。

[html] view%20plain copy <bean      class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">      <property name="webBindingInitializer">          <bean              class="org.springframework.samples.petclinic.web.ClinicBindingInitializer" />      </property>  </bean>  

如果是用<mvc:annotation-driven%20/>的童鞋,上面的配置就沒效果了,而mvc命名空間也沒提供如此細粒度的配置,怎么辦呢?

別怕,方法還是有的,我們可以通過一個自定義PostBeanProcessor來處理:

[java] view%20plain copy @Override  public Object postProcessBeforeInitialization(Object bean, String beanName)          throws BeansException {      if (bean instanceof RequestMappingHandlerAdapter) {          RequestMappingHandlerAdapter adapter = (RequestMappingHandlerAdapter) bean;          adapter.setWebBindingInitializer(new MyWebBindingInitializer());      }      return bean;  }  

不過實際上<mvc:annotation-driven%20/>默認就為我們提供了一個WebBindingInitializer——ConfigurableWebBindingInitializer

而上面的方法則會覆蓋默認的ConfigurableWebBindingInitializer,其實我們可以直接使用這個Bean來注冊我們的PropertyEditor:

[java] view%20plain copy @Override  public Object postProcessBeforeInitialization(Object bean, String beanName)          throws BeansException {      if(bean instanceof ConfigurableWebBindingInitializer){          ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) bean;          initializer.setPropertyEditorRegistrar(new PropertyEditorRegistrar() {              @Override              public void registerCustomEditors(PropertyEditorRegistry registry) {                  registry.registerCustomEditor(Date.class, new DateEditor());              }          });      }      return bean;  }  

這里需要說明一下,WebBindingInitializer中不僅僅能注冊PropertyEditor,還能注冊Converter,也就是下面的3

3、使用ConverstionService

Spring3新引入了Converter系統,而ConversionService則是一個Facade類,用來封裝底層實現而對外提供便捷的類型轉換。所以這里不能重用之間的DateEditor了,不過大致邏輯還是一樣的。另外補充說明一下,Converter是處理任意兩類型間的轉換,而Formatter是處理字符串和另一類型之間的轉換的??梢钥闯鰜恚現ormatter是一類特殊的Converter,并且在處理數據綁定時,Formatter比Converter更加合適。所以我們這里就用Formatter來做:

[java] view%20plain copy public class DateFormatter implements Formatter<Date> {        @Override      public String print(Date object, Locale locale) {          return null;      }        @Override      public Date parse(String text, Locale locale) throws ParseException {          SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");          Date date = null;          try {              date = format.parse(text);          } catch (Exception e) {              format = new SimpleDateFormat("yyyy-MM-dd");              date = format.parse(text);          }          return date;      }    }  

這里我們只寫String到Date的邏輯。然后需要將DateFormatter注冊到一個ConversionService中,最后再將ConversionService注冊到Spring%20MVC中。

[html] view%20plain copy <bean id="conversionService"      class="org.springframework.format.support.FormattingConversionServiceFactoryBean">      <property name="formatters">          <set>              <bean class="com.test.common.core.DateFormatter"></bean>          </set>      </property>  </bean>  

如果是用<mvc:annotation-driven%20/>的童鞋,那么很簡單,只需要:

[html] view%20plain copy <mvc:annotation-driven conversion-service="conversionService"/>  

而未使用<mvc:annotation-driven%20/>的童鞋,需要定義一個WebBindingInitializer(或者使用ConfigurableWebBindingInitializer),然后注入到RequestMappingHandlerAdapter中去:

[html] view%20plain copy 派生到我的代碼片<bean      class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">      <property name="webBindingInitializer" ref="webBindingInitializer">      </property>  </bean>    <bean id="webBindingInitializer" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">      <property name="conversionService" ref="conversionService"></property>  </bean>  

此時可能有人會問,如果同時使用PropertyEditor和ConversionService,執行順序是什么呢?內部首先查找PropertyEditor進行類型轉換,如果沒有找到相應的PropertyEditor再通過ConversionService進行轉換。

4、PropertyEditor的自動注冊

對了,這里再稍帶提一下自動注冊PropertyEditor,只需要將JavaBean和JavaBean名稱+Editor這兩個類放在同一包下,那么JavaBeans的基礎結構會自動發現PropertyEditor的類,而無需你手動注冊~


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩在线亚洲字幕中文| 亚洲欧美日韩第一区| 亚洲最大av网| 欧美小视频在线| 久久国产视频网站| 欧美国产高跟鞋裸体秀xxxhd| 亚洲天堂视频在线观看| 神马国产精品影院av| 国产视频丨精品|在线观看| 日韩欧美亚洲成人| 国产成人黄色av| 国产亚洲欧美aaaa| 色妞久久福利网| 成人免费自拍视频| 欧美日韩亚洲成人| 国产精品自产拍在线观看中文| 91在线免费看网站| 亚洲第一福利网| 国产视频精品久久久| 日本精品久久久久影院| 精品少妇一区二区30p| 欧美另类极品videosbest最新版本| 国产日韩欧美91| 亚洲成色www8888| 亚洲自拍偷拍一区| 最近2019中文字幕mv免费看| 91成人在线播放| 97人人爽人人喊人人模波多| 久久97精品久久久久久久不卡| 日本国产精品视频| 日韩av免费看网站| 国产精品极品美女粉嫩高清在线| 成人做爽爽免费视频| 日韩中文字幕欧美| 色妞欧美日韩在线| 久久视频精品在线| 亚洲第一视频网站| 欧美肥臀大乳一区二区免费视频| 国产精品夜间视频香蕉| 久久久av电影| 国产精品video| 国产欧美日韩精品专区| 久久久国产一区| www.亚洲免费视频| 日韩在线中文视频| 国产成人黄色av| 91在线视频一区| 亚洲成年人在线播放| 欧美巨乳在线观看| 中文字幕综合一区| 在线播放日韩av| 97精品免费视频| 国产日产亚洲精品| 另类视频在线观看| 久久久成人精品| 国产亚洲欧美一区| 日韩成人激情视频| 亚洲成人国产精品| 亚洲人成电影网站色www| 综合国产在线观看| 精品视频偷偷看在线观看| 久久综合久久美利坚合众国| 国产91九色视频| 欧美日韩亚洲精品一区二区三区| 国产精品xxxxx| 国产丝袜一区二区三区免费视频| 欧美激情第一页xxx| 91免费视频国产| 色婷婷综合久久久久| 欧美亚洲另类视频| 国产精品亚发布| 日韩av在线影视| 久久久91精品国产一区不卡| 韩国一区二区电影| 国产精品久久久久久网站| 亚洲激情在线视频| 庆余年2免费日韩剧观看大牛| 亚洲一区二区三区在线视频| 国产亚洲美女精品久久久| 久久免费视频在线观看| 欧美精品在线免费观看| 亚洲少妇中文在线| 88国产精品欧美一区二区三区| 在线播放日韩精品| 精品久久香蕉国产线看观看gif| 日韩欧美在线视频日韩欧美在线视频| 国产日本欧美一区二区三区在线| 亚洲精品成a人在线观看| 国产精品女人网站| 亚洲欧美日韩爽爽影院| 欧美日韩免费一区| 日韩成人在线观看| 色诱女教师一区二区三区| 91久久在线观看| 伦伦影院午夜日韩欧美限制| 一区二区三区国产视频| 91精品久久久久久久久久| 亚洲无线码在线一区观看| 亚洲欧美一区二区精品久久久| 日本精品一区二区三区在线| 欧美电影免费看| 色婷婷成人综合| 91免费看片在线| 久久久精品中文字幕| 欧美一区二区三区免费视| 不卡av电影院| 九九精品视频在线观看| 国产一区二区三区日韩欧美| 国产91在线播放精品91| 成人黄色影片在线| 一区三区二区视频| 日本一区二三区好的精华液| 日本一区二区在线播放| 日韩美女激情视频| 精品美女久久久久久免费| 久久成人精品视频| 日本一区二区在线播放| 欧美成人精品在线| 日韩视频亚洲视频| 久久天天躁狠狠躁夜夜爽蜜月| 国产精品直播网红| 国产在线98福利播放视频| 久久精品国产清自在天天线| 亚洲精品99久久久久中文字幕| 亲子乱一区二区三区电影| y97精品国产97久久久久久| 亚洲激情视频在线| 久久精品国产久精国产一老狼| 欧美疯狂做受xxxx高潮| 亚洲色图第三页| 2024亚洲男人天堂| 精品国偷自产在线视频| 日本成熟性欧美| 亚洲国产精品久久久久秋霞不卡| 欧美日韩黄色大片| 久久九九免费视频| 成人做爰www免费看视频网站| 欧美一区在线直播| 日韩美女免费线视频| 狠狠久久亚洲欧美专区| 久久精品国产亚洲精品2020| 国产成人精品视| 国产精品看片资源| 少妇激情综合网| 国产精品偷伦一区二区| 91欧美精品成人综合在线观看| 日本免费久久高清视频| 久久偷看各类女兵18女厕嘘嘘| 成人亚洲欧美一区二区三区| 亚洲午夜未满十八勿入免费观看全集| 精品视频久久久久久| 亚洲精品一区中文字幕乱码| 91超碰caoporn97人人| 国产欧美日韩专区发布| 欧美日韩成人在线播放| 一本一本久久a久久精品综合小说| 久久久久久久久网站| 欧美一区二区三区四区在线| 国产精品久久久久久久久| 久久高清视频免费| 亚洲精品福利视频| 粉嫩av一区二区三区免费野| 亚洲欧美999| 一区二区三区国产在线观看|