2012-08-14 11 views
11

私はSpring 3.1を使用しています。私はいくつかの処理をFORM経由して提出したコマンド・オブジェクト(データ保持)を取り込んでいコントローラ機能を持っている:Spring-MVC 3.1:あるコントローラ関数から別のコントローラ関数へのリクエストの転送

@RequestMapping(value = "/results", method = RequestMethod.POST) 
public String toResultsScreen(@ModelAttribute("ssdh") SearchScreenDataHolder ssdh, 
            BindingResult bindingResult,  
            ModelMap model,     
            HttpSession session) { 

    if (bindingResult.hasErrors()) { 
     logger.debug("Error returning to /search screen"); 
     return "search"; 
    } 

    netView = "results"; 

    // do stuff 

    return nextView;   

} // end function 
一部のユーザーがプログラムGETリンクが出て、サイトから情報を得るために、私は希望したいと思い

そのリクエストを処理する別のハンドラを設定するのが好きです。これは、コマンドオブジェクト(ssdh)の新しいインスタンスを作成し、GET要求を介して送信されたパラメータでそれを設定します。それはそれを上のハンドラに渡します。このような何か:

@RequestMapping(value = "/pubresult") 
public String toPublicResultsScreen(ModelMap model,  
            HttpSession session,    
            @RequestParam (required=true) String LNAME, 
            @RequestParam (required=false)String FNAME){ 

    Search search = new Search(usertype); 

    // Capture the search parameters sent by HTTP 
    ssdh.setLast_name(LNAME); 
    ssdh.setFirst_name(FNAME); 

    // To Do: "forward this data holder, ssdh to the controller function quoted first 

    return nextView;   

} // end function 

私の質問はどのように私はどのような方法で最初のコントローラfuncitonにコードを変更する必要がないように、第1のコントローラ機能に私の命令/データホルダーオブジェクトを転送することができますか?

答えて

17

Spring MVC 3.1で導入されたRedirectAttributesオブジェクトを使用して、リダイレクトするために保持したいデータを設定できます。 PRG(POST/Redirect/GET)パターンと呼ばれます。

@RequestMapping(value="/saveUserDetails.action", method=RequestMethod.POST) 
public String greetingsAction(@Validated User user,RedirectAttributes redirectAttributes){ 
    //setting attributes 
    redirectAttributes.addFlashAttribute("firstName", user.getFirstName()); 
    redirectAttributes.addFlashAttribute("lastName", user.getLastName()) 
    return "redirect:success.html"; 
} 

使用方法に関する技術的な記事を書きました。

http://www.tikalk.com/java/redirectattributes-new-feature-spring-mvc-31

+0

+1グレートは、あなたが提供しているdanny.lesnikリンクhttp://www.tikalk.com/java/redirectattributes-new-feature-spring-mvc-31 @たくさん – Jayanth

+1

が壊れている私を助けました。ワーキングリンクでこれを更新しますか? – OO7

+0

なぜこのイベントをフォワードで行う必要がありますか? – FelipeKunzler

7

あなたは、バック単に前方にこの方法をModelAttributeにSSDHを設定し、することができるはず、のRequestDispatcherは/resultsに戻ってそれをマッピングすることができるはずです。私はそれはあなたの詳細を与えるだろうと考えていますハンドラ:

@RequestMapping(value = "/pubresult") 
public String toPublicResultsScreen(ModelMap model,  
            HttpSession session,    
            @RequestParam (required=true) String LNAME, 
            @RequestParam (required=false)String FNAME, Model model){ 

    Search search = new Search(usertype); 
    // Capture the search parameters sent by HTTP 
    ssdh.setLast_name(LNAME); 
    ssdh.setFirst_name(FNAME); 
    model.addAttribute("ssdh", ssdh); 

    return "forward:/results";   

} 
+0

私はこれを試しました。私が転送したいコントローラ機能がPOST要求を処理します。上記の例の関数からGET要求を転送しようとします。 GET要求がサポートされていないというエラーメッセージが表示されます。私はPOST関数にGET要求を転送することはできないと推測しています。転送前にリクエストタイプを変更して同じURLで終了する方法がありますか? – Steve

+0

はい、そうです、私は転送の時点でリクエストメソッドを少し読んでいます - 元のリクエストと同じリクエストメソッドであり続けます。この場合、HTTP GETで/ pubresultを呼び出しているのでこれは転送された要求でも維持されます - http://stackoverflow.com/questions/4374548/does-jspforward-or-requestdispatcher-forward-use-get-or-post回避策があるかどうかわからない、実行可能であれば、両方に対して同じRequestMethodを持つ –

関連する問題