spring MVC之用表单控制器处理表单(一)

spring MVC之用表单控制器处理表单(一)

----------

 

创建表单控制器

 

 

在web应用程序中,经常要处理表单。表单控制器既要为用户显示表单,又要处理表单提交。表单处理可能是件非常复杂且充满变数的任务。如果从头开始构建表单控制器,会牵涉到太多的表单处理细节。

Spring MVC提供的SimpleFormController类定义了基本的表单处理流程。它支持命令对象的概念,并且可以将表单域的值绑定到命令对象的同名属性上。通过扩展SimpleFormController类,控制器就可以继承处理表单的能力。

当HTTP GET请求SimpleFormController显示表单时, 它会将表单视图呈现给用户。当HTTP POST请求提交该表单时,SimpleFormController就会将表单域的值绑定到命令对象上,并调用onSubmit()方法,以这种方式来处理表单提交。如果表单处理成功,会呈现success视图。否则,呈现带错误信息的表单视图。

为了适应不同的表单需求,SimpleFormController允许你覆盖其中的生命周期方法,以此定制表单处理流程。

 

 

创建表单控制器

通过扩展SimpleFormController类,可以为这个控制器指定命令类(在本例中是Reservation),然后表单域的值将被绑定到命令对象的同名属性中。你还可以指定视图要访问的命令对象的名称(在本例中是reservation),但这是可选的,默认名称为command。

package com.apress.springrecipes.court.web;
...
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.mvc.SimpleFormController;
public class ReservationFormController extends SimpleFormController{
	private ReservationService reservationService;
	public ReservationFormController(){
		setCommandClass(Reservation.class);
		setCommandName("reservation");
	}
	public void setReservationService(ReservationService reservationService){
		this.reservationService = reservationService;
	}
	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));
	}
	protected void doSubmitAction(Object command)throws Exception{
		Reservation reservation = (Reservation)command;
		reservationService.make(reservation);
	}
}

由于表单域的值都是作为字符串提交的,为了将这些绑定到命令对象上,表单控制器可能需要进行类型转换。类型转换实际是由注册在这个控制器中的属性编辑器来执行的。Spring预先注册了几个属性编辑器,用来转换大家熟知的数据类型,如数字类型布尔类型。你必须为其他的数据类型注册定制的编辑器,,如java.util.Date。定制的属性编辑器都被注册到initBinder()方法ServletRequestDataBinder参数中。

在绑定表单域值时如果发生任何错误,SimpleFormController会自动呈现带有错误信息的表单视图。如果一切顺利,则会

调用onSubmit()方法来处理表单提交。在onSubmit()方法中,可以通过参数获取绑定了表单域值的命令对象。对于这个控制器而言,它是个Reservation对象,因为你将命令类设置为Reservation。onSubmit()方法的三个变体可供覆盖。为了访问符合你需要的方法参数,应该覆盖它们中最简单的那个。 

protected ModelAndView onSubmit(Object command)throws Exception;
protected ModelAndView onSubmit(Object command,BindException errors)
	throws Exception;
protected ModelAndView onSubmit(HttpServletRequest request,HttpServletResponse response,
	Object command,BindException errors)throws Exception;

在覆盖onSubmit()方法时,必须返回ModelAndView对象。如果只需在命令对象上执行一个动作,并在这个动作完成时返回成功视图,可以覆盖doSubmitAction()方法,它的返回类型为void,默认呈现成功视图。

在声明这个控制器时,为了进行预订,还需要一个指向服务层中的reservationService Bean的引用。此外,还必须为这个表单控制器设置表单视图和成功视图,分别是formView和successView属性。

<bean id="reservationFormController"
	class="com.apress.springrecipes.court.web.ReservationFormController">
	<property name="reservationService" ref="reservationService"/>
	<property name="formView" value="reservationForm"/>
	<property name="successView" value="reservationSuccess"/>
</bean>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值