1

POST/Redirect/GET パターンと入力検証を組み込んだ Spring MVC アプリケーションの開発を検討しています。POST フェーズでは、Validator を実行して BindingResult/Errors コレクションを取得します。エラーがある場合は、検証エラーをそのままにしてフォームにリダイレクトしたいと思います。ブラウザーのナビゲーション ボタン (戻る、進む、更新) を使用するときに期限切れのキャッシュとフォームの再送信プロンプトを回避するために、これを GET 要求として解決するリダイレクトにしたいと考えています。

これは、最初のフォーム表示を処理する方法であり、検証エラーが発生した場合にユーザーをリダイレクトしたい場所です。

@RequestMapping("/account/list")
public String listAccounts(HttpServletRequest request, Map<String, Object> map) {

    log.debug("start of list accounts");

    map.put("accountList", entityService.listAccounts());
    map.put("account", new Account());
    map.put("accountTypeValues", AccountTypes.values());

//      Map<String, ?> inputFlashMap = RequestContextUtils.getInputFlashMap(request);
//      if (inputFlashMap != null) {
//          map.putAll(inputFlashMap);
//      }

    return "account";
}

これは、POST を処理するメソッドのスニペットです。

@RequestMapping(value = "/account/add", method = RequestMethod.POST)
public String addAccount(@ModelAttribute("account") @Valid Account account, BindingResult result, RedirectAttributes redirectAttributes, HttpServletRequest request, Map<String, Object> model) {
    accountValidator.validate(account, result);

    if (result.hasErrors()) {
        redirectAttributes.addFlashAttribute("account", account);
        redirectAttributes.addFlashAttribute(BindingResult.MODEL_KEY_PREFIX + "account", result);
        return "redirect:/account/list";
    }

addAccount メソッドの最後と、listAccounts メソッドでのリダイレクトの後に、HttpServletRequest オブジェクトで FlashMap を確認できます。ただし、そのマップが listAccounts のモデルとマージされることはありません。listAccounts の inputFlashMap ビットのコメントを外すと、目的の結果が得られます。

リダイレクト後に RedirectAttributes (別名 FlashMap) がモデルにマージされないのはなぜですか?

4

3 に答える 3

1

メソッド listAccounts には、 addAccount のようなパラメーターで @ModelAttribute("account") Account account が必要です

于 2014-04-10T08:14:09.383 に答える
0

追加することで、目的の動作を実現できると思います

@SessionAttributes("account")

フラッシュスコープを使用する代わりにコントローラーに。ただし、この場合、必要に応じてセッションから属性を削除することに注意する必要があります。

于 2013-01-15T23:01:23.153 に答える
0

POST リクエストのキャッシュについて心配する必要はありません。POST リクエストはまったくキャッシュされるべきではないためです。

したがって、無効な POST リクエストに応答して入力フォームを返すことは有効です。

于 2013-01-13T10:30:22.637 に答える