深入解析@InitBinder注解的功能與應(yīng)用
一、注解作用
從字面意思可以看出這個(gè)的作用是給Binder做初始化的,被此注解的方法可以對(duì)WebDataBinder初始化。webDataBinder是用于表單到方法的數(shù)據(jù)綁定的! @InitBinder只在@Controller中注解方法來(lái)為這個(gè)控制器注冊(cè)一個(gè)綁定器初始化方法,方法只對(duì)本控制器有效。
二、代碼演示
1.對(duì)數(shù)據(jù)綁定進(jìn)行設(shè)置
WebDataBinder中有很多方法可以對(duì)數(shù)據(jù)綁定進(jìn)行具體的設(shè)置:比如我們?cè)O(shè)置name屬性為非綁定屬性(也可以設(shè)置綁定值setAllowedFields):
在Controller中添加一個(gè)方法:
@InitBinder public void initBinder(WebDataBinder binder) { binder.setDisallowedFields("name"); }
然后運(yùn)行:
添加:
看后面那個(gè)name值就沒(méi)有綁定成功!
(具體作用視頻舉了個(gè)例子來(lái)闡述其某個(gè)作用:比如表單中有多選按鈕,對(duì)應(yīng)的是JaveBean中的一個(gè)集合屬性,然而選擇的是id,而集合保存的確實(shí)類,這里我們就不能任SpringMVC自動(dòng)綁定,需要我們手動(dòng)綁定,所以就關(guān)閉其的自動(dòng)綁定,不然會(huì)報(bào)錯(cuò)?。?/p>
2.注冊(cè)已有的編輯器
WebDataBinder是用來(lái)綁定請(qǐng)求參數(shù)到指定的屬性編輯器.由于前臺(tái)傳到controller里的值是String類型的,當(dāng)往Model里Set這個(gè)值的時(shí)候,如果set的這個(gè)屬性是個(gè)對(duì)象,Spring就會(huì)去找到對(duì)應(yīng)的editor進(jìn)行轉(zhuǎn)換,然后再set進(jìn)去!Spring自己提供了大量的實(shí)現(xiàn)類(如下圖所示的在org.springframwork.beans.propertyEditors下的所有editor),諸如CustomDateEditor ,CustomBooleanEditor,CustomNumberEditor等許多,基本上夠用。 在平時(shí)使用SpringMVC時(shí),會(huì)碰到j(luò)avabean中有Date類型參數(shù),表單中傳來(lái)代表日期的字符串轉(zhuǎn)化為日期類型,SpringMVC默認(rèn)不支持這種類型的轉(zhuǎn)換。我們就需要手動(dòng)設(shè)置時(shí)間格式并在webDateBinder上注冊(cè)這個(gè)編輯器!
實(shí)現(xiàn)代碼
現(xiàn)在在student類中加上一個(gè)類型為Date的birth屬性、setter和getter,新增帶有birth所有屬性的構(gòu)造函數(shù)。(代碼略)
list.jsp(所有學(xué)生信息頁(yè)面)加一列顯示生日的:${stu.birth}
input.jsp(添加信息界面):
<br> birth(format=yyyy-mm-dd):<form:input path="birth"/> <br>
然后再控制器中該掉之前的@InitBinder代碼:
@InitBinder public void initBinder(WebDataBinder binder) { //binder.setDisallowedFields("name"); CustomDateEditor editor = new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true); binder.registerCustomEditor(Date.class, editor); } //編輯器構(gòu)造函數(shù) public CustomDateEditor(DateFormat dateFormat, boolean allowEmpty) //注冊(cè)編輯器函數(shù) public void registerCustomEditor(Class<?> requiredType, PropertyEditor propertyEditor)
然后運(yùn)行
添加成功
3.注冊(cè)自定義編輯器
使用自定義編輯器就是在第二個(gè)的基礎(chǔ)上添加個(gè)自定義編輯器就行了,自定義的編輯器類需要繼承
- org.springframework.beans.propertyeditors.PropertiesEditor;
并重寫(xiě)其setAsText和getAsText兩個(gè)方法就行了!
比如下面這個(gè)DoubleEditor:
public class DoubleEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { if (text == null || text.equals("")) { text = "0"; } setValue(Double.parseDouble(text)); } @Override public String getAsText() { return getValue().toString(); } }
然后在InitBinder方法中注冊(cè)就行。
4.設(shè)置屬性的前綴可以實(shí)現(xiàn)參數(shù)綁定
代碼所示:
jsp: <form action="/testBean" method="post"> name: <input type="text" name="u.name"> <br> age: <input type="text" name="u.age"> <br> name: <input type="text" name="s.name"> <br> age: <input type="text" name="s.age"> <br> <input type="submit"> </form>
controller:
@InitBinder("user") public void init1(WebDataBinder binder) { binder.setFieldDefaultPrefix("u."); } @InitBinder("stu") public void init2(WebDataBinder binder) { binder.setFieldDefaultPrefix("s."); } @RequestMapping("/testBean") public ModelAndView testBean(User user, @ModelAttribute("stu") Student stu) { System.out.println(stu); System.out.println(user); String viewName = "success"; ModelAndView modelAndView = new ModelAndView(viewName); modelAndView.addObject("user", user); modelAndView.addObject("student", stu); return modelAndView; }
@InitBinder(“user”)括號(hào)內(nèi)的參數(shù)為類的首字母小寫(xiě)(默認(rèn)命名規(guī)則),也可以用@ModelAttribute(“stu”)做限定.
到此這篇關(guān)于深入解析@InitBinder注解的功能與應(yīng)用的文章就介紹到這了,更多相關(guān)@InitBinder注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中讀取jar包中的resources目錄下的文件的三種方式
這篇文章給大家總結(jié)了SpringBoot讀取 jar 包中的 resources 目錄下的文件的三種方式,文中有詳細(xì)的代碼示例供大家參考,,需要的朋友可以參考下2023-06-06spring boot項(xiàng)目application.properties文件存放及使用介紹
這篇文章主要介紹了spring boot項(xiàng)目application.properties文件存放及使用介紹,我們的application.properties文件中會(huì)有很多敏感信息,大家在使用過(guò)程中要多加小心2021-06-06List集合中對(duì)數(shù)據(jù)實(shí)現(xiàn)多重規(guī)則進(jìn)行排序的案例
今天小編就為大家分享一篇關(guān)于List集合中對(duì)數(shù)據(jù)實(shí)現(xiàn)多重規(guī)則進(jìn)行排序的案例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12基于Java實(shí)現(xiàn)一個(gè)復(fù)雜關(guān)系表達(dá)式過(guò)濾器
這篇文章主要為大家詳細(xì)介紹了如何基于Java實(shí)現(xiàn)一個(gè)復(fù)雜關(guān)系表達(dá)式過(guò)濾器。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-07-07使用Java實(shí)現(xiàn)通用樹(shù)形結(jié)構(gòu)構(gòu)建工具類
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)通用樹(shù)形結(jié)構(gòu)構(gòu)建工具類,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03