在Spring MVC中处理重复表单提交

在上一个Spring MVC表单处理示例中,如果刷新表单成功视图,大多数浏览器将提示一个弹出对话框,以确认有关表单重新提交的信息。 如果单击“是”,将再次重新提交表单,这种情况被称为重复表单提交。

图片:重复提交表单的示例。

SpringMVC-Duplicate-Form-Submit

常见的解决方案是使用“ 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的配置链接在一起。

  1. 将“ successView ”更新为名为“ customerSuccessRedirect ”的新重定向视图。
  2. 声明一个“ XmlViewResolver ”以加载重定向视图。
  3. 为“ InternalResourceViewResolver ”和“ XmlViewResolver ”设置一个优先顺序,否则“ InternalResourceViewResolver ”将始终匹配,并且使您的应用程序没有机会调用“ XmlViewResolver ”。
  4. 声明一个“ 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)

参考文献

  1. 发布/重定向/获取设计模式
  2. Spring MVC中的表单处理

翻译自: https://mkyong.com/spring-mvc/handling-duplicate-form-submission-in-spring-mvc/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值