1. @InitBinder
注解一個方法甸各,用來初始化屬性編輯器他膳、注冊參數(shù)驗證器
1.1 屬性編輯器惦银,指定了類型和它對對應(yīng)的編輯器堕阔,比如Date類型綁定了一個編輯器棍厂,以后就可以使用這個編輯器來對Date進(jìn)行解析
1.2 參數(shù)驗證器,參數(shù)驗證器需要實現(xiàn)Validator接口超陆,然后在binder中注冊牺弹,在controller參數(shù)上加上@Validated浦马,就能使用這里注冊的參數(shù)驗證器。其實參數(shù)驗證也可以考慮使用jsr303的參數(shù)驗證框架配合攔截器或者切面實現(xiàn)张漂。
2. @ModelAttribute
顧名思義晶默,模型屬性,模型也就是springmvc中的數(shù)據(jù)部分航攒,也就是說這個注解是和模型屬性操作相關(guān)的磺陡,他可以在模型中設(shè)置屬性,也可以從模型中取出屬性的值漠畜。
2.1 這個注解有3種使用方式:
注解在controller的一個普通方法上币他,方法上不含有 @RequestMapping,這種情況下每個請求過來的時候都會調(diào)用這個方法憔狞,他的意圖是希望在請求到達(dá)真正的處理方法之前設(shè)置一下模型的屬性蝴悉,這樣可以在正在處理之前做一些初始化的工作,比如說所有的方法里都需要一個公共的信息瘾敢,就可以在這里做設(shè)置拍冠。具體的:1.如果注解的方法參數(shù)中有Model、Map簇抵、ModelMap類型的參數(shù)庆杜,可以直接將希望設(shè)置的參數(shù)設(shè)置上去,后面再controller的處理方法上可以獲取到 2. 如果設(shè)置了@ModelAttribute 的value值碟摆,會使用這個value值作為key欣福,使用方法的返回值作為值,設(shè)置到model中焦履。3. @ModelAttribute注解的方法上同時也有@RequestMapping 那么方法的返回值不會生成modelAndView,會把方法的返回值設(shè)置到model中去雏逾。
2.2 @ModelAttribute 究竟在什么地方起作用呢嘉裤?springmvc在哪個階段使用了這個注解呢?
每個請求到來的時候栖博,springmvc都會去初始化當(dāng)前請求處理所使用的model屑宠,@ModelAttribute 注解的方法需要得到執(zhí)行以便初始化model屬性。
3. @ControllerAdvice 是干什么用的仇让?
使用@InitBinder @ModelAttribte 注解一個方法的時候典奉,這個方法在所有需要的controller中都寫一個就造成很多的重復(fù),如果使用基類繼承也可以做到丧叽,但是不夠靈活卫玖,@ControllerAdvice 允許將這些公共的方法都放到一個類中即可,系統(tǒng)啟動時自動掃描踊淳,自動把這些公共的東西都注冊好假瞬,對controller代碼沒有任何影響陕靠,而且ControllerAdvice還可以指定basepackge,basepackageclass脱茉、annotation等方式剪芥,可以精確控制這些公共方法的影響范圍,比如可以自定義annotation琴许,注解到合適的controller上去税肪。
4. 如何判斷class A 實現(xiàn)了 B 接口?
B.class.isAssignableFrom(A.class)
bean instanceof Ordered
5. 如何自定義springmvc的攔截器榜田?
實現(xiàn) HandlerInterceptor 接口益兄,然后在springmvc的配置文件里配置上就可以了,在配置文件里還可以指定每一個攔截器使用的mapping
6. 自定義參數(shù)解析器
springmvc 雖然允許自定義參數(shù)解析器串慰,但是自定義的解析器地位比較低偏塞,只有當(dāng)springmvc自身的解析器都無法解析的情況下才考慮你自己定義的解析器!
7. class文件一旦編譯后就看不到了參數(shù)名等信息邦鲫,那么請求的參數(shù)如何映射到方法參數(shù)上灸叼?
讀取class文件,解析局部變量表中的參數(shù)名庆捺,最終在內(nèi)存中形成一個map古今,key是method,值是string數(shù)組滔以,里面就是方法的參數(shù)名捉腥。
8. @SessionAttribute 的用法
sessionAttribute 類似于httpsession,可以在多個請求之間保持?jǐn)?shù)據(jù)你画。用法:1抵碟、設(shè)置:@SessionAttribute 只能用在class上,參數(shù)可以指定names和types坏匪,這樣當(dāng)我們往model中設(shè)置屬性的同時也會往sessionAttribute中設(shè)置指定names和types的屬性拟逮。2、獲仁首摇:一旦通過1的方法設(shè)置后敦迄,在后面的請求中會自動(model初始化階段)的把這些屬性設(shè)置到后面請求的model中去,后面可以直接從model中獲取這些屬性凭迹。也可以在頁面上通過request.getAttribute罚屋、session.getAttribute來獲取屬性的值。3嗅绸、清除的方法脾猛,使用sessionStatus.setComplete來清除。