2011-03-08 21 views
13

私はPOSTを使用して最初のユーザーに送信するフォームと最後の名前を持っているが、私はGETリクエストを使用して同じマッピングにリダイレクトしていますダブル提出し、問題を解決するためにSpring MVCのPost/Redirect/Getパターンのリクエスト間でデータを渡す方法は?

@RequestMapping(value="/signin.html",method = RequestMethod.POST) 
public ModelAndView submit(@Valid User user){ 
    ModelAndView mv = new ModelAndView("redirect:signin.html"); 
    //Business logic with user account 
    return mv; 
} 

をsignin.html。

@RequestMapping(value="/signin.html",method = RequestMethod.GET) 
public ModelAndView submitPRG(){ 
    ModelAndView mv = new ModelAndView("submitted"); 
    mv.addObject("message", "Submitted Correctly"); 
    return mv; 
} 

このようにして、私は問題を二重に解決します。

私はいくつかの質問があります:

1)どのように私は/signin.htmlにGETリクエストをリダイレクトから、ブラウザでユーザーによって要求されなかったことを知ることができるの?私はちょうどhttp://server/signin.htmlをブラウズし、 "提出された正しい"メッセージを得るためのオプションをクローズしたいと思います。私は/signin.html?submitted=trueのようなものを追加できることを知っていますが、もっときれいにしたいと思います。

2)ModelAndViewオブジェクトをsubmit()からsubmitPRG()に渡す方法はありますか?

この場合、PRGを使用する他の方法はありますか?

答えて

4

  • あなたは
  • は、HTTPヘッダに

をリファラを見て自分のセッションにマーカーを保存することができ、私は「提出のためにセッションベースのメッセージングのいくつかの並べ替えを使用することをお勧めします「正しく」メッセージ。これは「フラッシュ」と呼ばれることもあります。 StackExchangeはこれを常に使用します(画面の上部に表示されるメッセージ)。

ありがとうございます。どうすればいいですか? は、HttpServletRequestの参照元を取得するにはどうすればよいですか?

HttpServletRequest.getHeader("Referer") 
+1

ありがとうございますが、どうすればHttpServletRequestから参照元を取得できますか? –

17

希望の動作を「フラッシュ範囲」といいます。これは通常、リダイレクト後に表示されるメッセージをセッションに格納することで実装されます。

SpringチームはSpring 3.1(SPR-6464)でそれを実装することを約束します。一方、mvc-showcaseサンプルでは、​​フラッシュスコープの実装を見ることができます、それは非常に簡単ですので、あなた自身でそれを行うことができます。

URLをリダイレクトするためのパラメータとして必要なデータを追加する方法があります。サブミットメソッドがモデルオブジェクトを保存して後でそれを何らかの識別子でアクセスできるようにすると、そのオブジェクトを表示するページ(つまり/signin.htmlの代わりに/users.html?userId=...)にリダイレクトし、そのサブミットされたページをフラッシュ範囲から削除します。

したがって、通常、スコープはモデルオブジェクトではなくメッセージを渡すために使用されます。私はリダイレクトと から来る /signin.htmlにGETリクエストがブラウザでユーザーによって要求されなかったことを知ることができる方法

+2

あなたはその時間的整合性が厳密に保証されていないとして、しかし、フラッシュを使用して少し注意する必要があります。春のdocsから:http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-flash-attributes これはおそらく問題ではありませんが、少なくとも知っておくべきことです。 – sanimalp

関連する問題