2012-01-20 6 views
1

私はSpring MVCを初めて使い、Post/Redirect/Getパターンを取得しようとしています。私たちは、各ページがさまざまな数の質問を表示できる調査を実装しようとしています。私がこれを実装したいのは、次の調査ページを準備してからビューに渡すGETハンドラです。同じコントローラ内で、アンケートの質問に対するフォームの回答を処理し、アンケートサービスに提出して次の質問ページを返し、次のsurveyPageをgetNextPage GETハンドラにリダイレクトする投稿ハンドラを持っています。Post-Redirect-GetでSpring MVCを使用してGETハンドラにオブジェクトを渡す方法は?

リダイレクトでPOSTハンドラからgetNextPage GETハンドラにその '次の調査ページ'オブジェクトを渡す方法がわからないという点を除いて、ほとんどが動作しています。リダイレクトは機能しています。 POSTメソッドからGETメソッドに移行しますが、surveyPage ModelAttributeはPOSTメソッドの最後に設定されたものではなく、GETメソッドの新しいオブジェクトです。ご覧のとおり、ModelAttributeを使ってみましたが、うまくいきません。私もクラスの上の@SessionAttributesを使ってみましたが、HttpSessionRequiredExceptionを取得しました。

Spring MVCフォームで変数の質問を含む動的フォームを処理する方法がわからなかったので、まっすぐにJSTLを実行しました。それはファンキーですが、うまくいきます。その不器用さは、Postと一緒に戻る@RequestBodyとSurveyPageBeanを使用した結果です。正直なところ、私はSurveyPageBeanがどのように設定されているのか分かりません。いくつかのSpring MVCの魔法のように見えますが、私は今のところそれを残しています(別の開発者がこれを行い、それを取り上げて、両方ともSpring MVCの新機能です)。それが空のsurveyPagePageAttributeがリダイレクトされない問題の一部でない限り、珍しいフォーム処理に気を取られないようにしてください。

は、ここでコントローラの抜粋です:

@Controller 
@RequestMapping("/surveyPage") 
public class SurveyPageController{ 

    @RequestMapping(method=RequestMethod.GET) 
    public String getNextPage(@ModelAttribute("surveyPage") SurveyPage surveyPage, Model model) { 
     if(surveyPage.getPageId() == null) { 
      // call to surveyService (defined elsewhere) to start Survey and get first page 
      surveyPage = surveyService.startSurvey("New Survey"); 
     } 
     model.addAttribute("surveyPage", surveyPage); 
     return "surveyPage"; 
    } 


    @RequestMapping(method=RequestMethod.POST) 
    public String processSubmit(@RequestBody String body, SurveyPageBean submitQuestionBean, Model model, @ModelAttribute("surveyPage") SurveyPage surveyPage) { 
     // process form results, package them up and send to service, which 
     // returns the next page, if any 
     surveyPage = surveyService.submitPage(SurveyPageWithAnswers); 
     if (results.getPageId() == null) { 
      // The survey is done 
      surveyPage = surveyService.quitSurvey(surveyId); 
      return "redirect:done"; 
     } 
     model.addAttribute("surveyPage ", surveyPage); 

     return "redirect:surveyPage";  
    } 

答えて

0

あなたのGETが、それはURLからそれを読んでいることを意味model属性、としてsurveyPageを取ります。 POSTでは、surveyPageをモデルに追加するのではなく(クライアントにリダイレクトするように指示しているために失われます。新しいリクエストと新しいモデルが作成されます)、survey_Pageをクエリパラメータとして追加する必要があります。"redirect:surveyPage" 'クエリー文字列をどのように置くべきかを知るために、surveyPageがクエリーparamsからどのように構築されているかを調べる必要があります。

たとえば、surveyPageがユーザー、ページ番号、質問数などから作成されている場合は、そのモデル属性を渡すために"redirect:surveyPage?userId=1234&pageNumber=5678&questionCount=12のようなことができると思います。

+0

私はこのアプローチを行うことを計画し、私はDBから一部のデータをフェッチするために私たちにそれをつもりだが、私の考えは、そのパラメータがユーザーによってそれがなって、データを変更した場合は何であるのパラメータの一つでしたフェッチするには別の方法がありますか? – newbie

+0

セッションを使用しても構わない場合は、Flashスコープを見ることができます。 http://www.javabeat.net/flash-attributes-in-spring-mvc-3-1/ – digitaljoel

2

Warlock's ThoughtsのようにFlash属性を使用してください。

@RequestMapping(method = RequestMethod.POST) 
public String handleFormSubmission(..., final RedirectAttributes redirectAttrs) { 
    ... 
    redirectAttrs.addFlashAttribute("AttributeName", value); 
    return "redirect:to_some_url_handled_by_BController"; 
} 
関連する問題