詳解SpringMVC的類(lèi)型轉(zhuǎn)換及驗(yàn)證方法
Spring mvc 數(shù)據(jù)綁定流程:
SpringMvc將ServletRequest對(duì)象及目標(biāo)方法的形參實(shí)例傳給WebDataBinderFactory實(shí)例,以創(chuàng)建DataBinder實(shí)例對(duì)象。DataBinder調(diào)用裝配在SpringMvc上下文中的ConversionService組件進(jìn)行類(lèi)型轉(zhuǎn)換和數(shù)據(jù)格式化工作,將Servlet請(qǐng)求信息填充到形參對(duì)象中。調(diào)用Validator主鍵對(duì)已經(jīng)綁定了請(qǐng)求信息的形參對(duì)象精選數(shù)據(jù)有效性驗(yàn)證,并最終生成數(shù)據(jù)綁定結(jié)果BindingData對(duì)象。SpringMVC抽取BindingResult中的形參對(duì)象和校驗(yàn)錯(cuò)誤對(duì)象,將他們賦給處理方法的相應(yīng)參數(shù)
我們查看源代碼可以看到,通過(guò)WebDataBinderFactory創(chuàng)建DataBinder對(duì)象

自定義類(lèi)型轉(zhuǎn)換器
當(dāng)我們碰到一些特殊場(chǎng)合,有可能需要我們自己定義類(lèi)型轉(zhuǎn)換器。下麥呢來(lái)講解一個(gè)自定義類(lèi)型轉(zhuǎn)器,將字符串轉(zhuǎn)換成emp對(duì)象,當(dāng)頁(yè)面無(wú)法完成數(shù)據(jù)綁定或者類(lèi)型轉(zhuǎn)換時(shí),springmvc會(huì)拋出異常,異常信息可以使用BindingResult來(lái)進(jìn)行獲取。
Spring定義了三種類(lèi)型的轉(zhuǎn)換器接口,實(shí)現(xiàn)任意一個(gè)轉(zhuǎn)換器接口都可以作為自定義轉(zhuǎn)換器注冊(cè)到ConversionServiceFactoryBean中。
Convertre<S,T>:將S類(lèi)型轉(zhuǎn)換為T(mén)類(lèi)型。
ConverterFactory:將相同系類(lèi)的多個(gè)“同質(zhì)”Converter封裝在一起,如果希望一種類(lèi)型轉(zhuǎn)換成另一種類(lèi)型以及子類(lèi)對(duì)象(例如String轉(zhuǎn)換成Number以Number的子類(lèi)),可以使用該轉(zhuǎn)換器
GenericConverter:會(huì)根據(jù)源類(lèi)對(duì)象以及目標(biāo)類(lèi)對(duì)象所在的宿主類(lèi)中的上下文信息精選類(lèi)型轉(zhuǎn)換。
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時(shí)SpringMVC中類(lèi)型轉(zhuǎn)換器的核心接口,要添加自定義類(lèi)型轉(zhuǎn)換器,需要實(shí)現(xiàn)該接口/利用
ConversionServiceFactoryBean在Spring的IOC容器中第一一個(gè)ConversionService,并在Bean屬性配置對(duì)于的類(lèi)型轉(zhuǎn)換器的實(shí)現(xiàn)類(lèi),SpringMvc處理方法的形參綁定時(shí)就會(huì)自動(dòng)調(diào)用該類(lèi)型轉(zhuǎn)換器。
<!--將非mapping配置下的請(qǐng)求交給默認(rèn)的Servlet來(lái)處理 -->
<mvc:default-servlet-handler />
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="userConverter" />
</set>
</property>
</bean>
<!-- 注冊(cè)類(lèi)型轉(zhuǎn)換器 -->
<mvc:annotation-driven conversion-service="conversionService" />
在實(shí)際的開(kāi)發(fā)同需要配置:<mvc:annotation-driven />標(biāo)簽
數(shù)據(jù)格式化
對(duì)屬性的輸入/輸出格式化,其本質(zhì)來(lái)講依然屬于類(lèi)型轉(zhuǎn)換的范疇。Spring在格式化模塊中定義一個(gè)實(shí)現(xiàn)ConversionService接口的FarmattingConversionService實(shí)現(xiàn)類(lèi),該實(shí)現(xiàn)類(lèi)擴(kuò)展了GenericConversionService,因此它既具有類(lèi)型轉(zhuǎn)換的功能有具有格式化的功能。FormattingConversionService擁有一個(gè)FormattingConversionServiceFactoryBean工廠類(lèi),后者用于構(gòu)造前者。我們要注冊(cè)這個(gè)
<mvc:annotation-driven conversion-service="FormattingConversionServiceFactoryBean" />
JSR303
jsr303時(shí)java為bean數(shù)據(jù)合法性校驗(yàn)提供的標(biāo)準(zhǔn)框架,它已經(jīng)包含在JavaEE6.0中,JSR303通過(guò)在Bean屬性上標(biāo)注類(lèi)似@NotNull,@Max等標(biāo)準(zhǔn)的數(shù)據(jù)指定驗(yàn)證規(guī)則,并通過(guò)標(biāo)注的驗(yàn)證接口對(duì)Bean進(jìn)行驗(yàn)證。
@NotEmpty @NotNull private String name; @NotNull @NotEmpty private String age; @NotNull @NotEmpty @Email private String email;
我們?cè)谇芭_(tái)使用SpringMVC提供的Form標(biāo)簽使用Form:errors path 綁定屬性即可
@RequestMapping(value="/student",method=RequestMethod.POST)
public String add(@Valid()Student student,BindingResult result){
if (!result.hasErrors()) {//判斷是否有格式轉(zhuǎn)換錯(cuò)誤或者其他校驗(yàn)沒(méi)通過(guò)
userService.addStudent(student);
return "redirect:list";
}else
return "addPage";
}
SpringMvc提示消息國(guó)際化
<!-- 注冊(cè)國(guó)際化信息,必須有id,指定資源文件名稱(chēng),資源文件在src目錄下 --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="message"></property> </bean>

- SpringMVC自定義類(lèi)型轉(zhuǎn)換器實(shí)現(xiàn)解析
- 詳解SpringMVC注解@initbinder解決類(lèi)型轉(zhuǎn)換問(wèn)題
- 解決springmvc關(guān)于前臺(tái)日期作為實(shí)體類(lèi)對(duì)象參數(shù)類(lèi)型轉(zhuǎn)換錯(cuò)誤的問(wèn)題
- springMVC4之強(qiáng)大類(lèi)型轉(zhuǎn)換器實(shí)例解析
- SpringMVC實(shí)現(xiàn)自定義類(lèi)型轉(zhuǎn)換器
- Spring MVC自定義日期類(lèi)型轉(zhuǎn)換器實(shí)例詳解
- SpringMVC對(duì)日期類(lèi)型的轉(zhuǎn)換示例
- Springmvc自定義類(lèi)型轉(zhuǎn)換器實(shí)現(xiàn)步驟
相關(guān)文章
Java服務(wù)假死之生產(chǎn)事故的排查與優(yōu)化問(wèn)題
在服務(wù)器上通過(guò)curl命令調(diào)用一個(gè)Java服務(wù)的查詢(xún)接口,半天沒(méi)有任何響應(yīng),怎么進(jìn)行這一現(xiàn)象排查呢,下面小編給大家記一次生產(chǎn)事故的排查與優(yōu)化——Java服務(wù)假死問(wèn)題,感興趣的朋友一起看看吧2022-07-07
springboot驗(yàn)證碼的生成與驗(yàn)證的兩種方法
本文主要介紹了springboot驗(yàn)證碼的生成與驗(yàn)證的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
SpringMVC中的DispatcherServlet結(jié)構(gòu)和初始化詳解
這篇文章主要介紹了SpringMVC中的DispatcherServlet結(jié)構(gòu)和初始化詳解,SpringMVC中Spring容器的關(guān)系是通過(guò)監(jiān)聽(tīng)方式啟動(dòng)的,那么Spring與Servlet的Web容器(如:Tomcat、jetty)的關(guān)系則是通過(guò)DispatcherServlet進(jìn)行關(guān)聯(lián),需要的朋友可以參考下2024-01-01
Java C++實(shí)現(xiàn)相同MD5加密算法的方式
這篇文章主要介紹了Java與C++實(shí)現(xiàn)相同MD5加密算法的方法,需要的朋友可以參考下面文章內(nèi)容2021-09-09

