spring MVC之用表单控制器处理表单(二)
----------
接上一篇
应用post/redirect/get设计模式
然而,在表单提交后的成功视图中刷新网页时,刚刚提交的表单会再提交一次。这个问题被称作重复表单提交。为了避免这个问题,可以应用post/redirect/get设计模式,它建议在成功地提交一个表单之后,要重定向到另一个URL,而不是直接返回一个HTML页面。如例:
首先,用ParameterizableViewController定义一个只呈现reservationSuccess视图的控制器,它被映射到reservationSuccess.jsp。
<bean id="reservationSuccessController" class="org.springframework.web.servlet.mvc.ParameterizableViewController"> <property name="viewName" value="reservationSuccess"/. </bean>
由于ControllerClassNameHandlerMapping不会为内置的Spring MVC控制器产生映射,因此需要显式地在SimpleUrlHandlerMapping中为这个控制器定义一个映射。
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> ... <property name="mappings"> <props> ... <prop key="/reservationSuccess.htm"> reservationSuccessController </prop> </props> </property> </bean>
由于你在web应用程序上下文中配置了ResourceBundleViewResolver,因此可以在classpath根部的
views.properties中定义如下的重定向视图。
reservationSuccessRedirect.(class)=org.springframework.web.servlet.view.RedirectView
reservationSuccessRedirect.url=reservationSuccess.htm
最后,将ReservationFormController的成功视图指定为该重定向的视图。现在,当表单提交成功时,用户会被重定向到另一个URL,即使用户刷新了这个页面,也不会导致重复提交表单的问题。
<bean id="reservationFormController" class="com.apress.springrecipes.court.web.ReservationFormController"> <property name="reservationService" ref="reservationService"/> <property name="formView" value="reservationForm"/> <property name="successView" value="reservationSuccessRedirect"/> </bean>