spring MVC之用表单控制器处理表单(五)
----------
接上一篇
绑定定制类型的属性
提交表单时,SimpleFormController可以帮助你将表单域的值绑定到命令对象的同名属性上。然而,
对于定制类型的属性,SimpleFormController无法对它们进行转换,除非你为它们指定相应的属性编辑器。
例如:
运动类型的选择框只提交选中的运动类型ID。你必须通过属性编辑器将这个ID转换成SportType对象。
我们创建SportTypeEditor类,将运动类型ID转换成SportType对象。这个属性编辑器需要ReservationService来执行查找。
package com.apress.springrecipes.court.domain;
...
import java.beans.PropertyEditorSupport;
public class SportTypeEditor extends PropertyEditorSupport{
private ReservationService reservationService;
public SportTypeEditor(ReservationService reservationService){
this.reservationService = reservationService;
}
public void setAsText(String text)throws IllegalArgumentException{
int sportTypeId = Integer.parseInt(text);
SportType sportType = reservationService.getSportType(sportTypeId);
setValue(sportType);
}
}
最后一步是在控制器中注册该属性编辑器。你应该在i
nitBinder()方法里将它注册给ServletRequestDataBinder对象。
package com.apress.springrecipes.court.web;
...
public class ReservationFormController extends SimpleFormController{
...
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder)throws Exception{
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(date.class,new CustomDateEditor(dateFormat,true));
binder.registerCustomEditor(SportType.class,new SportTypeEditor(reservationService));
}
}