2012-01-23 7 views
2

私はSpring MVCでフォームを処理していますが、フォームを送信しました。私は、フォームを再送信ボタンで再送信しないように、投稿リクエストをリダイレクトしようとしています。Spring MVC 3でポストリダイレクトを処理するときに、セッション属性がURLに表示されますか?

しかし、リダイレクトされたページのフォーム送信に基づいて表示するには、動的に生成された値が必要です。だから私はポストハンドラメソッドでセッションでその値を保存し、リダイレクトされたページ処理メソッドに戻しています。

リダイレクトされたページに表示されるセッション属性は、GETメソッドの場合のリクエストパラメータと同様に表示されますか。続き

は、私が使用していますコードです:

このメソッドは、このメソッドは、リダイレクトされたページ

@RequestMapping(value="/something/somethingelse") 
public String testStopped(Model model, HttpSession session) { 
    ... 
    Integer kungfoo = (Integer) session.getAttribute("foo"); 
    model.addAttribute("kungfoo", kungfoo); 
    return "somethingelse"; 
} 

これを処理している

@RequestMapping(value="/something", method=RequestMethod.POST) 
public String testStopped(Model model, WebRequest request, HttpSession session) { 
    //... 
    int foo = 1234;//some dynamically generated value 
    session.setAttribute("foo", foo); 
    return "redirect:/something/somethingelse"; 
} 

フォームの送信を処理していますリダイレクト後に私が結びつくURLです:http://wikedlynotsmart.com/something/somethingelse?kungfoo=1234

最後に?kungfoo=1234が表示されず、リダイレクトリクエストハンドラメソッドに渡される方法はありますか?

これはどのように動作するはずですか、どこかで大失敗をしていますか?誰かが私にそれを理解するのを助けることができるか?

ありがとうございました。 the documentationから

答えて

4

引用:デフォルトで

すべてのモデル属性は、リダイレクトURLでURI テンプレート変数として公開していると考えられます。残りの属性のうち プリミティブ型またはプリミティブ型のコレクション/配列 の型は自動的にクエリパラメータとして追加されます。

これは、kungfooが最初のメソッドのモデルの属性であり、したがってリダイレクトURLにリクエストパラメータとして自動的に追加されることを意味します。

リダイレクトURLのすべての属性を必要としない場合は、どのように進めるかについて説明します(この場合はデフォルトを正確に使用していると感じていますが、 kungfoo値を取り戻すための第2の要求):モデルは)もともとの目的をレンダリングするための追加属性(例えばドロップダウン フィールド値を 追加が含まれていてもよいが、注釈付きのコントローラで

。 リダイレクトシナリオで使用されている属性を正確に制御するために、@RequestMappingメソッドは RedirectAttributes型の引数を宣言し、それを使用して RedirectViewで使用する属性を追加できます。コントローラーメソッドがリダイレクトする場合、 RedirectAttributesの内容が使用されます。それ以外の場合は、デフォルトのモデル の内容が使用されます。

この値をセッションに保存する場合は、flash属性を使用する必要があります。したがって、2番目の要求が受信されるとすぐにセッションから削除されます。段落の残りの部分では、それらを使用する方法について説明します。

タイプRedirectAttributesの引数を追加し、それにフラッシュ属性としてfooを追加:ここで

+0

多くのおかげで答えが:)。 – skip

+0

はい、私はドキュメンテーションを意味しました。 –

+0

私は答えとして私のために働いたものを投稿しました。ありがとう。 – skip

2

は私のために働いていたものです。

このメソッドは、このメソッドは、リダイレクトされたページを処理している

@RequestMapping(value="/something", method=RequestMethod.POST) 
public String testStopped(Model model, WebRequest request, RedirectAttributes redirectAttributes) { 
    //... 
    int foo = 1234; 
    redirectAttributes.addFlashAttribute("foo", foo); 
    return "redirect:/something/somethingelse"; 
} 

フォームの送信を処理しています。何が "foo" という

@RequestMapping(value="/something/somethingelse") 
public String testStopped() { 
    return "somethingelse"; 
} 

のために、ここで実行する必要がありません。これは、あなたがsomethingelse.jsp

${foo} 

そしてhttp://wikedlynotsmart.com/somethingelseに "foo" を使用する方法である私はURLで得るものです。

+0

これには1つの問題があります。リダイレクトされたページをリフレッシュすると、 'foo'が消えてしまいます。 – skip

+1

@_skip:この[ページ](http://www.tikalk.com/java/redirectattributes-new-feature-spring-mvc-31)の一番下にあるこの記事をチェックしてください。 – jelies

関連する問題