在上一个Spring MVC表单处理示例中,如果刷新表单成功视图,大多数浏览器将提示一个弹出对话框,以确认有关表单重新提交的信息。 如果单击“是”,将再次重新提交表单,这种情况被称为重复表单提交。
图片:重复提交表单的示例。
常见的解决方案是使用“ Post / Redirect / Get ”设计模式。 如果表单提交成功,它将重定向到另一个URL,而不是直接返回网页。
注意
检查Wiki中的Post / Redirect / Get设计模式的详细说明。
Spring MVC中的发布/重定向/获取设计模式
在本教程中,我们向您展示如何在Spring MVC中应用“ Post / Redirect / Get ”设计模式来解决最后一个表单处理示例中的重复表单提交问题。
1.表单提交重复
请参阅下面的正常表单声明,该声明会遇到重复的表单提交问题。
文件:mvc-dispatcher-servlet.xml
<bean
class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
<bean class="com.mkyong.customer.controller.CustomerController">
<property name="formView" value="CustomerForm" />
<property name="successView" value="CustomerSuccess" />
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix">
<value>/WEB-INF/pages/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
在上面的代码段中, CustomerController
直接返回一个“ CustomerSuccess ”视图,应将其替换为重定向URL 。
2.重定向视图
声明了一个名为“ customerSuccessRedirect ”的审阅视图,并返回URL“ CustomerSuccess.htm ”。
文件:spring-views.xml
<beans ...>
<!-- Redirect view -->
<bean id="customerSuccessRedirect"
class="org.springframework.web.servlet.view.RedirectView">
<property name="url" value="CustomerSuccess.htm" />
</bean>
</beans>
3. Spring配置
更新mvc-dispatcher-servlet.xml设置以将所有Spring的配置链接在一起。
- 将“ successView ”更新为名为“ customerSuccessRedirect ”的新重定向视图。
- 声明一个“ XmlViewResolver ”以加载重定向视图。
- 为“ InternalResourceViewResolver ”和“ XmlViewResolver ”设置一个优先顺序,否则“ InternalResourceViewResolver ”将始终匹配,并且使您的应用程序没有机会调用“ XmlViewResolver ”。
- 声明一个“ ParameterizableViewController ”控制器以匹配重定向URL并将视图返回给用户。 由于“ ControllerClassNameHandlerMapping ”不会为任何内置的Spring控制器生成映射,因此您必须在“ SimpleUrlHandlerMapping ”中定义显式映射。
文件:mvc-dispatcher-servlet.xml
<bean
class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
<bean class="com.mkyong.customer.controller.CustomerController">
<property name="formView" value="CustomerForm" />
<property name="successView" value="customerSuccessRedirect" />
<!-- it was
<property name="successView" value="CustomerSuccess" />
-->
</bean>
<!-- Redirect Controller -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/CustomerSuccess.htm">customerSuccessController</prop>
</props>
</property>
</bean>
<bean id="customerSuccessController"
class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<property name="viewName" value="CustomerSuccess" />
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix">
<value>/WEB-INF/pages/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
<property name="order" value="1" />
</bean>
<bean class="org.springframework.web.servlet.view.XmlViewResolver">
<property name="location">
<value>/WEB-INF/spring-views.xml</value>
</property>
<property name="order" value="0" />
</bean>
4.如何运作?
1.访问URL: http:// localhost:8080 / SpringMVC / customer.htm 。
2.填写并提交表格。
3.返回“ successView”,即“ customerSuccessRedirect ”。
<bean class="com.mkyong.customer.controller.CustomerController">
<property name="formView" value="CustomerForm" />
<property name="successView" value="customerSuccessRedirect" />
</bean>
4.“ XmlViewResolver”与之匹配,并返回一个URL为“ CustomerSuccess.htm ”的“ RedirectView”。
<bean id="customerSuccessRedirect"
class="org.springframework.web.servlet.view.RedirectView">
<property name="url" value="CustomerSuccess.htm" />
</bean>
5.与“ SimpleUrlHandlerMapping”匹配,并返回ParameterizableViewController,“ customerSuccessController ”,并返回视图名称“ CustomerSuccess ”。
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/CustomerSuccess.htm">customerSuccessController</prop>
</props>
</property>
</bean>
<bean id="customerSuccessController"
class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<property name="viewName" value="CustomerSuccess" />
</bean>
6.“ InternalResourceViewResolver”将其匹配并返回最终视图“ /WEB-INF/pages/CustomerSuccess.jsp ”。
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix">
<value>/WEB-INF/pages/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
<property name="order" value="1" />
</bean>
7. URL更改为http:// localhost:8080 / SpringMVC / CustomerSuccess.htm 。
8.尝试刷新成功表单页面,表单重新提交对话框将不再提示。
注意
总体概念是返回重定向URL而不是直接页面。
下载源代码
下载它– SpringMVC-Duplicated-Form-Submission-Solution.zip (12KB)
参考文献
翻译自: https://mkyong.com/spring-mvc/handling-duplicate-form-submission-in-spring-mvc/