SpringMVC學習筆記14-----數據綁定與自定義類型轉換器
標簽: SpringMVC數據綁定 Converter 自定義轉換器 dataBinder bindingdata
一、問題分析
在之前的增刪改查中,數據都是通過表單傳向方法然后轉化成相應的數據類型!那么如果我們在java bean中再添加一個日期屬性birth時,就會有三個問題:
1.如何將表單中的字符串格式轉向日期格式:數據類型轉換
2.表單中輸入的字符串格式應該是怎么樣的:數據類型格式化
3.這是個生日屬性,既然是生日屬性就應該是當前日期的前面的時間,不能填未來的時間,如何檢驗:數據校驗
二、數據綁定流程
如尚硅谷視頻所說:
1.SpringMVC會把request和目標方法的入參傳遞給WebDataBinderFactory實例,以創建DataBinder實例對象
2.DataBinder調用SpringMVC上下文中的ConversionService組件將request中的數據轉換為相應的類型,然后填充到目標方法的入參中。(類型轉換和格式化往往是一起的!)
3.調用Validator對已經綁定了的請求消息的入參進行合法性的校驗,并將最終生成數據綁定結果BindingData對象!
4.SpringMVC抽取BindingResult中的校驗錯誤信息和入參對象,將他們賦給處理方法中相應的入參!
至此,SpringMVC就將我們上面的三個問題都解決了!
三、源碼分析
我們一直在寫的那個程序學生類有一個數據類型為整型類型的,即我們可以查看這個由字符串轉整型的過程:
因為在最終SpringMVC會調用Student類中的setAge方法,所以我們在這里打個斷點:
調試,新增學生信息,填寫表單,點擊添加,停在這個setter語句!我們在函數棧中翻到這個點擊:
可以看出來這個類完成了表單中數據綁定校驗等操作,第一行調用WebDataBinderFactory這個工廠類創建了一個WebDataBinder對象,然后第三行進行的是數據綁定,第四行完成校驗。
再看Variables,點擊屬性列表中的Binder屬性中的:
這個ConversionService是個DefaultFormattingConversionService對象,其可以完成數據的綁定和格式化工作!
這個組件中有個對象屬性里面包含一個有97個轉換器的對象的LinkHashMap(age中用的轉換器是StringToNumberconverter),SpringMVC就是在這里找到相應的對象并進行數據性轉換的!
出來往后翻可以看到一個size為0的validator。我們現在還沒有加任何校驗!
如果加了校驗的話,校驗過程中發生錯誤,就會將錯誤信息放進bindingResult中。
這就是一個數據綁定的流程!
四、自定義一個類型轉換器
SpringMVC內建了很多類型轉換器,可以完成大部分的轉換工作!
但如果我們遇到特殊情況,自定義轉換器還是可以了解下的!
視圖層
在input.jsp上加上表單:
<br><br><br><br>
<!--the basic format is "name-gender-age-school.id", such as "Tom-female/male-22-4"-->
<h3>字符串添加學生信息</h3>
<form action="/testDIYConversionService" method="post">
信息:<input type="text" name="student"/>
<input type="submit" value="添加信息">
</form>
控制層
新建一個TestConversionServiceHandler類:
@Controller
public class TestConversionServiceHandler {
@Autowired
private StudentDao studentDao;
@RequestMapping(value = "/testDIYConversionService", method = RequestMethod.POST)
public String testDIYConversionService(Student student){
System.out.println(student);
studentDao.saveStudent(student);
return "redirect:stus";
}
}
如果只是這樣的話,字符串類型和Student類型肯定會報錯。
我們現在只需實現一個Converter<S,T>接口將String信息轉化為一個student對象:
Converter
public class StudentConverter implements Converter<String, Student> {
@Autowired
private SchoolDao schoolDao;
@Override
public Student convert(String s) {
Student student = new Student();
String parameters[] = s.split("-");
if (parameters.length == 4) {
String name = parameters[0];
boolean gender = "female".equals(parameters[1]);
int age = Integer.parseInt(parameters[2]);
int schoolId = Integer.parseInt(parameters[3]);
student = new Student(0, name, gender, age, schoolDao.getSchoolById(schoolId));
System.out.println(s + "--convert--" + student);
}
return student;
}
}
springmvc.xml文件的配置
<!--config ConverterService bean-->
<bean id="studentConverter" class="cn.jxufe.Conversion.StudentConverter"> </bean>
<!--config ConversionServiceFactoryBean-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="studentConverter"/>
</set>
</property>
</bean>
可以看出來這個converters是個set對象。
然后我們在之前寫的mvc:annotation-driven配置使得其能自動注冊ConversionServiceFactoryBean對象。
<mvc:annotation-driven conversion-service="conversionService"> </mvc:annotation-driven>
注意: 這個配置寫一個就行了,之前因為重定向要用到,獲取靜態文件也要用到,所以我寫了兩個,然后寫自定義轉換器時只在一個mvc:annotation-driven配置了conversion-service,然后運行就一直沒有用,String不轉換為student,一直報錯!
mvc:annotation-driven的功能很多,教學視頻的進度還沒能覆蓋其全部作用(比如其對于json的作用),故后面再做詳細總結!
把一個刪掉運行就成功了!
智能推薦
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組件進行...
SpringMVC學習筆記07——自定義類型轉換器解決日期錯誤(ctrl+N搜索類)
繼續沿用代碼。。 1. 修改User.java,修改代碼如下 2. 在index.jsp中添加如下代碼 3. 在HelloController.java``中添加如下代碼 4. 創建如下轉換器目錄 StringToDate.java 5. 在springmvc.xml文件中添加如下代碼 6. 啟動tomcat進行測試 瀏覽器 控制臺 注意這樣做后,以前的默認的輸入方式“1777/5/2...
猜你喜歡
SSM筆記-SpringMVC的自定義類型轉換器
1、步驟: ①建立對應的bean和dao ②建立form表單 ③建立handler(①handler的參數需要更表單控件name值一樣 ②要用@RequestParam修飾方法的參數) ④建立converter類,且繼承org.springframework.core.convert.converter.Converter ⑤實現org.springframework.core.convert.c...
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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...