Spring MVCで重複したフォームの提出を処理する
最後のリンク://spring-mvc/spring-mvc-form-handling-example/[Spring MVCフォームの処理]の例では、フォーム成功ビューを更新すると、ほとんどのブラウザはフォームについて確認するためのポップアップダイアログを表示します再提出。 「はい」をクリックすると、フォームが再度再送信されます。このシナリオは、重複したフォーム送信としてよく知られています。
Figure:重複したフォーム提出の例

これに対する共通の解決策は、 ”
Post/Redirect/Get
“デザインパターンを使用することです。 Webページを直接返すのではなく、フォームの送信が成功した場合は別のURLにリダイレクトされます。
Post/Redirect/Spring MVCでデザインパターンを取得する
このチュートリアルでは、Spring MVCで ”
Post/Redirect/Get
“デザインパターンを適用して、リンク内の重複したフォーム送信の問題を解決する方法を説明します://spring-mvc/spring-mvc-form-handling-example/[ラストフォーム処理]の例です。
1.フォーム提出の重複
重複したフォーム提出の問題にぶつかる通常のフォーム宣言を見てください。
File: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
“を返します。
File: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.春の設定
-
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。 ”
customerSuccessRedirect
“である “successView”を返します。
<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)
参考文献
-
http://en.wikipedia.org/wiki/Post/Redirect/Get
[Post/Redirect/Get
デザインパターン]。リンク://spring-mvc/spring-mvc-form-handling-example/[フォームの処理
Spring MVC]