SpringMVC中數據綁定及自定義類型轉換器
這篇博客記錄一下SpringMVC中的數據綁定,以及如何自定義類型轉換器
數據綁定
- Spring MVC 主框架將 ServletRequest 對象及目標方法的入參實例傳遞給 WebDataBinderFactory 實例,以創建 DataBinder 實例對象.
- DataBinder 調用裝配在 Spring MVC 上下文中的 ConversionService 組件進行數據類型轉換、數據格式化工作。將 Servlet 中的請求信息填充到入參對象中
- 調用 Validator 組件對已經綁定了請求消息的入參對象進行數據合法性校驗,并最終生成數據綁定結果 BindingData 對象
- ④Spring MVC 抽取 BindingResult 中的入參對象和校驗錯誤對象,將它們賦給處理方法的響應入參
Spring MVC 通過反射機制對目標處理方法進行解析,將請求消息綁定到處理方法的入參中。數據綁定的核心部件是 DataBinder,運行機制如下:
自定義類型轉換器
類型轉換器概述
- ConversionService 是 Spring 類型轉換體系的核心接口。
- 可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC 容器中定義一個
- ConversionService. Spring 將自動識別出 IOC 容器中的 ConversionService,并在 Bean 屬性配置及 Spring MVC 處理方法入參綁定等場合使用它進行數據的轉換
- 可通過 ConversionServiceFactoryBean 的 converters 屬性注冊自定義的類型轉換器
例如:
<bean id="factoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<!--將自定義的轉換器類MyConverter注冊到SpringMVC中-->
<bean class="com.hu.converter.MyConverter"></bean>
</set>
</property>
</bean>
Spring 支持的轉換器類型
Spring 定義了 3 種類型的轉換器接口,實現任意一個轉換器接口都可以作為自定義轉換器注冊到 ConversionServiceFactoryBean 中:- Converter<S,T>:將S類型對象轉換為T類型對象
- ConverterFactory:將多個Converter封裝在一起。如果希望將一種類型的對象轉換為另一種類型的及其子類的對象(例如將String轉換為Number及Number子類(Integer、Long、Double等對象))可使用該轉換器工廠類
- GenericConverTer:會根據源類對象及目標類對象所在宿主類中的上下文信息進行類型轉換
自定義轉換器
創建一個實體類Employpublic class Employ {
private String userName;
private int age;
private String hobby;
private double salary;
private double height;
public Employ(String userName, int age, String hobby, double salary, double height) {
this.userName = userName;
this.age = age;
this.hobby = hobby;
this.salary = salary;
this.height = height;
}
@Override
public String toString() {
return "employ{" +
"userName='" + userName + '\'' +
", age=" + age +
", hobby='" + hobby + '\'' +
", salary=" + salary +
", height=" + height +
'}';
}
public Employ() {
}
// get、set、toString方法省略
...
}
controller層
用SpringMVC默認的自定義類型轉換器,如果前端通過超鏈接傳遞 path?xxx=XXX&yyy=YYY,SpringMVC會將參數自動封裝到對象中
@RequestMapping("/testDataBinding")
public String testBinding(Employ employ){
System.out.println(employ);
return "show";
}
前端頁面
使用這個超鏈接發送請求
<a href="/testDataBinding?userName=張三&age=123&hobby=打籃球&salary=123456789&height=175.5">Test DataBinding </a>
發送請求后,控制臺打印
這里我們想要解析的字符串格式:lastName-age-hobby-salary-height
首先,創建自己的自定義轉換器類
MyConverter
public class MyConverter implements Converter<String, Employ> { // 將String類型轉換為Employ類型
@Override
public Employ convert(String s) { //字符串s代表的就是參數字符串
if (s != null) {
String[] split = s.split("-"); // 使用 "-" 分割字符串,獲取對應的參數
Employ employ = new Employ(split[0], Integer.parseInt(split[1])
, split[2], Double.parseDouble(split[3]), Double.parseDouble(split[4])); // 創建對象
System.out.println(s + "---convert---" + employ);
return employ; // 返回
}
return null; // 如果沒有帶參數,就返回為null
}
}
然后,將這個轉換器類注冊到SpringMVC容器中
//會將自定義的factoryBean注冊到 Spring MVC 的上下文中
<mvc:annotation-driven conversion-service="factoryBean"></mvc:annotation-driven>
<bean id="factoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.hu.converter.MyConverter"></bean>
</set>
</property>
</bean>
配置完以上,就可以嘗試發送參數格式為:lastName-age-hobby-salary-height 的請求
<a href="/testDataBinding?employ=張三-123-打籃球-123456789-175.5">Test DataBinding </a>
控制臺
智能推薦
springMVC-自定義類型轉換器
自定義類型轉換器: 背景:前端傳來一個字符串 2-zs-23,編寫自定義類型轉換器轉成一個學生對象 1編寫自定義類型轉化器(實現一個Converter接口) 2將實現 Converter接口的類納入到IOC容器中 3Springmvc配置 @Requestparam("name")是一個橋梁 public void test(@Reque...
SpringMVC自定義類型轉換器
在表單提交得的數據類型都是字符串類型的,但是后臺定義的是int類型的,數據還是可以封裝進去,SpringMVC默認是進行數據類型轉換。但是對于日期類型的數據進行轉換,就會出現錯誤。 這時我們就需要自定義進行數據封裝。就比如下面的類型轉換(日期的格式轉換) Controller類 使用對象進行數據封裝 執行的代碼: 對于輸入的2021-04-14默認的數據類型是無法轉換的,輸入2021/...
數據流程綁定以及自定義類型轉換器
一. 數據流程綁定分析 前端表單傳遞過來的數據為什么能夠自動的封裝成實體類的對象?為什么能夠進行自動的類型轉換? 數據綁定流程: ①:SpringMVC框架將ServletRequest對象及目標方法的入參實例傳遞給WebDataBinderFactory實例,以便創建DataBinder對象 ②:DataBinder調用裝配在SpringMVC上下文中的ConversionService組件進行...
SpringMVC04_自定義數據類型轉換器
SpringMVC04_自定義數據類型轉換器 addDate.jsp(這里前端會提交一個yyyy-MM-dd格式的字符串) ConverterHandler (從前端獲取的是String類型的字符串,但需要的參數是Date類型的數據) 啟動后輸入http://localhost:8080/addDate.jsp進入addDate.jsp 輸入2020-09-30后提交出現500錯誤(Failed ...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...