spring mvc 數(shù)據(jù)綁定流程:
springmvc將servletrequest對象及目標(biāo)方法的形參實例傳給webdatabinderfactory實例,以創(chuàng)建databinder實例對象。databinder調(diào)用裝配在springmvc上下文中的conversionservice組件進行類型轉(zhuǎn)換和數(shù)據(jù)格式化工作,將servlet請求信息填充到形參對象中。調(diào)用validator主鍵對已經(jīng)綁定了請求信息的形參對象精選數(shù)據(jù)有效性驗證,并最終生成數(shù)據(jù)綁定結(jié)果bindingdata對象。springmvc抽取bindingresult中的形參對象和校驗錯誤對象,將他們賦給處理方法的相應(yīng)參數(shù)
我們查看源代碼可以看到,通過webdatabinderfactory創(chuàng)建databinder對象
自定義類型轉(zhuǎn)換器
當(dāng)我們碰到一些特殊場合,有可能需要我們自己定義類型轉(zhuǎn)換器。下麥呢來講解一個自定義類型轉(zhuǎn)器,將字符串轉(zhuǎn)換成emp對象,當(dāng)頁面無法完成數(shù)據(jù)綁定或者類型轉(zhuǎn)換時,springmvc會拋出異常,異常信息可以使用bindingresult來進行獲取。
spring定義了三種類型的轉(zhuǎn)換器接口,實現(xiàn)任意一個轉(zhuǎn)換器接口都可以作為自定義轉(zhuǎn)換器注冊到conversionservicefactorybean中。
convertre<s,t>:將s類型轉(zhuǎn)換為t類型。
converterfactory:將相同系類的多個“同質(zhì)”converter封裝在一起,如果希望一種類型轉(zhuǎn)換成另一種類型以及子類對象(例如string轉(zhuǎn)換成number以number的子類),可以使用該轉(zhuǎn)換器
genericconverter:會根據(jù)源類對象以及目標(biāo)類對象所在的宿主類中的上下文信息精選類型轉(zhuǎn)換。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package com.spring.mvc.controller; import org.springframework.core.convert.converter.converter; import org.springframework.stereotype.component; @component public class userconverter implements converter<string, user>{ @override public user convert(string source) { system.out.println(source); string users [] = source.split( "-" ); user user = new user(); user.setuno(integer.valueof(users[ 0 ])); user.setusername(users[ 1 ]); user.setuserpass(users[ 2 ]); return user; } } |
conversionservice時springmvc中類型轉(zhuǎn)換器的核心接口,要添加自定義類型轉(zhuǎn)換器,需要實現(xiàn)該接口/利用
conversionservicefactorybean在spring的ioc容器中第一一個conversionservice,并在bean屬性配置對于的類型轉(zhuǎn)換器的實現(xiàn)類,springmvc處理方法的形參綁定時就會自動調(diào)用該類型轉(zhuǎn)換器。
1
2
3
4
5
6
7
8
9
10
11
12
|
<!--將非mapping配置下的請求交給默認(rèn)的servlet來處理 --> <mvc: default -servlet-handler /> <bean id= "conversionservice" class = "org.springframework.context.support.conversionservicefactorybean" > <property name= "converters" > <set> <ref bean= "userconverter" /> </set> </property> </bean> <!-- 注冊類型轉(zhuǎn)換器 --> <mvc:annotation-driven conversion-service= "conversionservice" /> |
在實際的開發(fā)同需要配置:<mvc:annotation-driven />標(biāo)簽
數(shù)據(jù)格式化
對屬性的輸入/輸出格式化,其本質(zhì)來講依然屬于類型轉(zhuǎn)換的范疇。spring在格式化模塊中定義一個實現(xiàn)conversionservice接口的farmattingconversionservice實現(xiàn)類,該實現(xiàn)類擴展了genericconversionservice,因此它既具有類型轉(zhuǎn)換的功能有具有格式化的功能。formattingconversionservice擁有一個formattingconversionservicefactorybean工廠類,后者用于構(gòu)造前者。我們要注冊這個
1
|
<mvc:annotation-driven conversion-service= "formattingconversionservicefactorybean" /> |
jsr303
jsr303時java為bean數(shù)據(jù)合法性校驗提供的標(biāo)準(zhǔn)框架,它已經(jīng)包含在javaee6.0中,jsr303通過在bean屬性上標(biāo)注類似@notnull,@max等標(biāo)準(zhǔn)的數(shù)據(jù)指定驗證規(guī)則,并通過標(biāo)注的驗證接口對bean進行驗證。
1
2
3
4
5
6
7
8
9
10
11
12
|
@notempty @notnull private string name; @notnull @notempty private string age; @notnull @notempty @email private string email; |
我們在前臺使用springmvc提供的form標(biāo)簽使用form:errors path 綁定屬性即可
1
2
3
4
5
6
7
8
|
@requestmapping (value= "/student" ,method=requestmethod.post) public string add( @valid ()student student,bindingresult result){ if (!result.haserrors()) { //判斷是否有格式轉(zhuǎn)換錯誤或者其他校驗沒通過 userservice.addstudent(student); return "redirect:list" ; } else return "addpage" ; } |
springmvc提示消息國際化
1
2
3
4
|
<!-- 注冊國際化信息,必須有id,指定資源文件名稱,資源文件在src目錄下 --> <bean id= "messagesource" class = "org.springframework.context.support.resourcebundlemessagesource" > <property name= "basename" value= "message" ></property> </bean> |