- ConversionService是Spring類型轉(zhuǎn)換體系核心借口。
- 可以利用ConversionserviceFactoryBean在Spring的容器中定義一個ConversionService。Spring將自動識別出IOC容器中的ConversionService,并在Bean屬性配置及SpringMVC處理方法入?yún)⒔壎ǖ葓龊鲜褂盟M行數(shù)據(jù)的轉(zhuǎn)換
- 可通過ConversionServiceFactoryBean的converters屬性注冊自定義的類型轉(zhuǎn)換器
自定義類型轉(zhuǎn)換器
如果我們想通過一個字符串轉(zhuǎn)換為一個對象類型如
Bruce-1137@qq.com-0-101 -->
Employee
1. 前端頁面
<form action="${pageContext.request.contextPath}/testConversionServiceConverter" method="post">
<input type="text" name="employee"/>
<button type="submit">提交</button>
</form>
2. 處理器
@Controller
public class TestHandler {
@Autowired
private EmployeeDao employeeDao;
@RequestMapping("/testConversionServiceConverter")
public String testConverter(@RequestParam("employee") Employee employee){
System.out.println("進來了"+employee);
employeeDao.save(employee);
return "redirect:/list";
}
}
3. 自定義轉(zhuǎn)換器
@Component //實現(xiàn)接口:org.springframework.core.convert.converter.Converter;
public class EmployeeConverter implements Converter<String,Employee> {
// employeeBruce-1137@qq.com-0-101
@Override
public Employee convert(String source) {
if (source!=null){
String[] vals = source.split("-");
if (vals!=null && vals.length==4){
Employee employee = new Employee();
employee.setEmpName(vals[0]);
employee.setEmpEmail(vals[1]);
employee.setEmpGender(Integer.parseInt(vals[2]));
employee.setDepartment(new Department(Integer.parseInt(vals[3])));
return employee;
}
}
return null;
}
}
4. springmvc.xml配置
<!--1. 配置mvc標簽的annotation-driven
2. 配置ConversionService
-->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!-- 配置ConversionService -->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="employeeConverter"/>
</set>
</property>
</bean>
數(shù)值類型轉(zhuǎn)換/日期類型格式化
前端表單
birth:<form:input path="empBirth"/><br>
salary:<form:input path="empSalary"/><br>
對應屬性
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date empBirth;
@NumberFormat(pattern="#,##,###.#")//#代表一個數(shù)字,‘,’會被忽略,‘.’不會
private Float empSalary;
springmvc.xml配置<mvc:annotation-driven >
<mvc:annotation-driven />
補充:
我們知道
<mvc:annotation-driven />
默認創(chuàng)建的conversionService實例為FormattingConversionServiceFactoryBean,且該bean內(nèi)部已經(jīng)注冊了
- NumberFormatAnnotationFormatterFactory //Number類型轉(zhuǎn)換
- JodaDateTimeFormatAnnotationFormatterFactory //Date日期格式化
如果我們既要自定義類型轉(zhuǎn)換器,又要實現(xiàn)日期的格式化的話,那么便會沖突,因為
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="employeeConverter"/>
</set>
</property>
</bean>
該conversionService對應是ConversionServiceFactoryBean,該Bean沒有日期格式化和類型轉(zhuǎn)換的能力;于是我們可以把該bean換成FormattingConversionServiceFactoryBean,這樣魚和熊掌就可以兼得了
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 配置ConversionService -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="employeeConverter"/>
</set>
</property>
</bean>
數(shù)據(jù)綁定出錯,日期格式化出錯提示
當我們綁定的數(shù)據(jù)出錯,類型不配置,參數(shù)對不上;或日期格式化出錯時,怎么才能得到錯誤信息呢?
只要在處理方法上加上出錯參數(shù)就可以了
/**添加Employee*/
@RequestMapping(value="/emp",method=RequestMethod.POST)
public String save(Employee employee,BindingResult result){
if (result.getFieldErrorCount()>0){
for (FieldError error:result.getFieldErrors()){
System.out.println(error.getField()+":"+error.getDefaultMessage());
}
return "redirect:list";
}
employeeDao.save(employee);
return "redirect:list";
}