2012-02-17 23 views
6

現時点では、Spring MVC 3.1でPost/Redirect/Getパターンを実装しようとしています。モデルデータと検証エラーを保存して回復する正しい方法は何ですか?私はモデルとBindingResultを私のPOSTメソッドのRedirectAttributesで保持できることを知っています。しかし、フラッシュスコープからGETメソッドでそれらを回復する正しい方法は何ですか?Post/Redirect/Getパターンでモデル状態を保持する

私はPOSTに次のことを行っている

@RequestMapping(value = "/user/create", method = RequestMethod.POST) 
public String doCreate(@ModelAttribute("user") @Valid User user, BindingResult result, RedirectAttributes rA){ 

    if(result.hasErrors()){ 
     rA.addFlashAttribute("result", result); 
     rA.addFlashAttribute("user", user); 

     return "redirect:/user"; 
    } 

    return "redirect:/user/success"; 
} 

とユーザー作成フォームをGETするには、次

@RequestMapping(value = "/user", method = RequestMethod.GET) 
public ModelAndView showUserForm(@ModelAttribute("user") User user, ModelAndView model){ 

    model.addObject("user", user); 
    model.setViewName("userForm"); 

    return model; 
} 

これは私がANの場合に与えられたユーザデータを保存することができますエラー。しかし、エラーを回復する正しい方法は何ですか(BindingResult)私は春のフォームタグ付き形式でそれらを表示したい:?

<form:errors path="*" /> 

加えて、それからフラッシュスコープにアクセスする方法を興味深いものになるだろうgetメソッド?

答えて

3
public class BindingHandlerInterceptor extends HandlerInterceptorAdapter { 

    public static final String BINDING_RESULT_FLUSH_ATTRIBUTE_KEY = BindingHandlerInterceptor.class.getName() + ".flashBindingResult"; 

    private static final String METHOD_GET = "GET"; 
    private static final String METHOD_POST = "POST"; 


    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 


     if(METHOD_POST.equals(request.getMethod())) { 

      BindingResult bindingResult = getBindingResult(modelAndView); 

      FlashMap outFlash = RequestContextUtils.getOutputFlashMap(request); 

      if(bindingResult == null || ! bindingResult.hasErrors() || outFlash == null) { 
       return; 
      } 

      outFlash.put(BINDING_RESULT_FLUSH_ATTRIBUTE_KEY, bindingResult); 

     } 

     Map<String, ?> inFlash = RequestContextUtils.getInputFlashMap(request); 

     if(METHOD_GET.equals(request.getMethod()) && inFlash != null && inFlash.containsKey(BINDING_RESULT_FLUSH_ATTRIBUTE_KEY)) { 

      BindingResult flashBindingResult = (BindingResult)inFlash.get(BINDING_RESULT_FLUSH_ATTRIBUTE_KEY); 

      if(flashBindingResult != null) { 

       BindingResult bindingResult = getBindingResult(modelAndView); 

       if(bindingResult == null) { 
        return; 
       } 

       bindingResult.addAllErrors(flashBindingResult); 

      } 

     } 

    } 

    public static BindingResult getBindingResult(ModelAndView modelAndView) { 

     if(modelAndView == null) { 
      return null; 
     } 

     for (Entry<String,?> key : modelAndView.getModel().entrySet()) { 
      if(key.getKey().startsWith(BindingResult.MODEL_KEY_PREFIX)) { 
       return (BindingResult)key.getValue(); 
      } 
     } 

     return null; 
    } 


} 
1

バインドが失敗した後に更新フォームを表示しないと、ユーザーはフォームを再送信することができますか?

標準的な方法は、POSTハンドラメソッドからの更新フォームビューを返すことです。

if (bindingResult.hasErrors()) { 
    uiModel.addAttribute("user", user); 
    return "user/create"; 
} 

次の形式でエラーを表示できます:errorsタグ。

+5

これは質問の全体を逃します。彼はPOSTで画面を返すことを避けようとしています。なぜなら、ブラウザが投稿されたフォームをどのように扱うかということです。ユーザーがリフレッシュするか、または戻るとフォームが再ポストされ、サーバー上で状態が2回修正される可能性があります。 getを使って元のフォームに戻すほうがはるかに優れています。 – chubbsondubs

0

フラッシュ範囲からGETメソッドで

それらを回復する正しい方法は、私は、私はあなたがそれらを回収することによって何を意味するか理解していないものです。リダイレクト後にモデルにリダイレクトされる前に、フラッシュ属性として追加する内容。それには特別なことはありません。私はあなたに何かを尋ねようとしているが、それが何であるか分からない。

なぜphahnはエラーでリダイレクトするのですか?これを処理する一般的な方法は、成功にリダイレクトすることです。

関連する問題