spring MVC之用表单控制器处理表单(三)
----------
接上一篇
初始化命令对象
你可以为SimpleFormController指定一个命令对象,它会被实例化,用于绑定表单域。但是在某些情况下,你可能需要亲自初始化命令对象。要解决这个问题,你必须亲自初始化该命令对象。为此,可以覆盖SimpleFormController的formBackingObject()方法。这个方法的默认实现只是实例化命令类。当你覆盖该方法时,是不需要命令类的,因为SimpleFormController再也不会为你实例化这个类了。
package com.apress.springrecipes.court.web;
...
public class ReservationFormController extends SimpleFormController{
...
public ReservationFormController(){
//Don't need to specify the command class
//setCommandClass(Reservation.class);
setCommandName("reservation");
}
protected Object formBackingObject(HttpServletRequest request)throws Exception{
Reservation reservation = new Reservation();
reservation.setPlayer(new Player());
return reservation;
}
}
这个方法的另一种典型用途是获得某些用来初始化命令对象的请求参数。举个例子,你可以从请求中得到一个username参数,然后用这个名称来初始化player。
package com.apress.springrecipes.court.web;
...
import org.springframework.web.bind.ServletRequestUtils;
public class ReservationFormController extends SimpleFormController{
...
protected Object formBackingObject(HttpServletRequest request)throws Exception{
Reservation reservation = new Reservation();
String username = ServletRequestUtils.getStringParameter(request."username");
reservation.setPlayer(new Player(username,null));
return reservation;
}
}
现在,当显示这个表单的时候,username参数会先被填到player的名称域里。你可以通过下面的URL进行测试。
http://localhost:8080/court/reservationForm.htm?username=Roger
还有两个与命令对象有关的属性可以配置。第一个属性是bindOnNewForm,它设置的是在创建新表单时,请求参数是否应该绑定到命令对象上。表示请求参数是否被绑定到同名属性上。例如,可以在构造器中启用这个属性。
package com.apress.springrecipes.court.web;
...
public class ReservationFormController extends SimpleFormController{
...
public ReservationFormController(){
...
setBindOnNewForm(true);
}
}
现在,当显示表单时,请求参数会被绑定到同名的属性中去。通过下面的URL可以进行测试。
http://localhost:8080/court/reservationForm.htm?date=2008-01-14
第二个属性是SessionForm,设置了命令对象是否应该保存在会话中。默认情况下,该属性为false,即使在由于绑定错误而再次呈现表单的时候,也会为每个请求创建新的命令对象。如果这个属性为true。命令对象就会被保存在会话中供后续使用,直接表单任务成功完成。然后这个命令对象就会从会话中被清除掉。这通常用在命令对象为持久化对象的时候,为了追踪变化,它需要在不同的请求中保持一致。
package com.apress.springrecipes.court.web;
...
public class ReservationFormController extends SimpleFormController{
...
public ReservationFormController(){
...
setSessionForm(true);
}
}