深入解析@InitBinder注解的功能與應(yīng)用
一、注解作用
從字面意思可以看出這個(gè)的作用是給Binder做初始化的,被此注解的方法可以對(duì)WebDataBinder初始化。webDataBinder是用于表單到方法的數(shù)據(jù)綁定的! @InitBinder只在@Controller中注解方法來為這個(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值就沒有綁定成功!
(具體作用視頻舉了個(gè)例子來闡述其某個(gè)作用:比如表單中有多選按鈕,對(duì)應(yīng)的是JaveBean中的一個(gè)集合屬性,然而選擇的是id,而集合保存的確實(shí)類,這里我們就不能任SpringMVC自動(dòng)綁定,需要我們手動(dòng)綁定,所以就關(guān)閉其的自動(dòng)綁定,不然會(huì)報(bào)錯(cuò)!)
2.注冊(cè)已有的編輯器
WebDataBinder是用來綁定請(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ù),表單中傳來代表日期的字符串轉(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;
并重寫其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ù)為類的首字母小寫(默認(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-06
spring boot項(xiàng)目application.properties文件存放及使用介紹
這篇文章主要介紹了spring boot項(xiàng)目application.properties文件存放及使用介紹,我們的application.properties文件中會(huì)有很多敏感信息,大家在使用過程中要多加小心2021-06-06
List集合中對(duì)數(shù)據(jù)實(shí)現(xiàn)多重規(guī)則進(jìn)行排序的案例
今天小編就為大家分享一篇關(guān)于List集合中對(duì)數(shù)據(jù)實(shí)現(xiàn)多重規(guī)則進(jìn)行排序的案例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12
基于Java實(shí)現(xiàn)一個(gè)復(fù)雜關(guān)系表達(dá)式過濾器
這篇文章主要為大家詳細(xì)介紹了如何基于Java實(shí)現(xiàn)一個(gè)復(fù)雜關(guān)系表達(dá)式過濾器。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-07-07
使用Java實(shí)現(xiàn)通用樹形結(jié)構(gòu)構(gòu)建工具類
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)通用樹形結(jié)構(gòu)構(gòu)建工具類,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03

