天天看點

springMVC4(9)屬性編輯器剖析入參類型轉換原理PropertyEditorRegistrySupportPropertyEditor執行個體解析自定義屬性編輯器

我們通過http請求送出的參數都以字元串的形式呈現,但最終在springmvc的方法入參中,我們卻能得到各種類型的資料,包括number、boolean、複雜對象類型、集合類型、map類型等,這些都是springmvc内置的資料類型轉換器幫我們完成的。springmvc的将請求資料綁定到方法入參的流程如下所示:

created with raphaël 2.1.0資料綁定流程圖解servletrequestservletrequestdatabinderdatabinderconversionserviceconversionservicevalidatorvalidatorbindingresultbindingresult請求資料送出資料類型轉換格式化資料合法性驗證生成資料綁定結果

在本文裡,我們通過屬性編輯器來了解springmvc的資料轉換、綁定過程。

而對于常見的資料類型,spring在propertyeditorregistrysupport中提供了預設的屬性編輯器,這些常見的資料類型如下圖所示:

springMVC4(9)屬性編輯器剖析入參類型轉換原理PropertyEditorRegistrySupportPropertyEditor執行個體解析自定義屬性編輯器

在propertyeditorregistrysupport中,有兩個重要的map類型成員變量:

1. <code>private map&lt;class&lt;?&gt;, propertyeditor&gt; defaulteditors</code>:用于儲存預設屬性類型的編輯器,元素的key為屬性類型,值為對應屬性編輯器的執行個體

2. <code>private map&lt;class&lt;?&gt;, propertyeditor&gt; customeditors</code>:用于儲存使用者自定義的屬性編輯器,元素的鍵值和defaulteditors一緻。

在propertyeditorregistrysupport中,有一個重要的成員方法:createdefaulteditors()來建立預設的屬性編輯器,它的定義如下所示:

propertyeditor是java原生的屬性編輯器接口,它的核心功能是将一個字元串轉換為一個java對象。

它的定義和常用方法如下所示:

它的一個核心實作類是propertyeditorsupport,如果我們要編寫自定義的屬性編輯器,隻需要繼承這個類,然後重寫setastext方法即可。下面我們來看一個自定義屬性編輯器的執行個體:嘗試将字元串“myname,1995-01-01,15k”轉換為person pojo對象,person對象的定義如下:

下面是我們自定義的屬性編輯器:

自定義完屬性編輯器後,我們需要将其注冊才能生效,springmvc中使用自定義的屬性編輯器有3種方法:

執行個體:

方法1是針對特定的控制器的,如果我們需要對全局控制器生效,可以編寫自己的webbindinginitializer,然後在spring容器中注冊,如下所示:

在容器中注冊:

我們可以通過此注解配置一個控制器增強,

我們需要将其納入<code>&lt;context:component-scan&gt;</code>的掃描路徑中才能生效。

從上面的分析我們能看到,springmvc注冊了大量的資料類型編輯器,恰是通過這些屬性編輯器,springmvc幫助我們完成了請求參數字元串到入參資料的綁定。在一篇文章裡,我們會談到springmvc對新的轉換器架構的支援。