83

これまでの私の理解では、RedirectAttributesパラメータを指定して、リクエストがリダイレクトされたときの属性を設定できるコントローラ リクエスト マッピング メソッドについて理解しています。

@RequestMapping(value="/hello", method=GET)
public String hello(RedirectAttributes redirAttr)
{
   // should I use redirAttr.addAttribute() or redirAttr.addFlashAttribute() here ?

   // ...

   return "redirect:/somewhere";
}

リダイレクト属性は、リダイレクト先のターゲット ページで使用できるようになります。

ただし、 RedirectAttributesクラスには 2 つのメソッドがあります。

しばらくSpringのドキュメントを読んでいますが、少し迷っています。これら 2 つの基本的な違いは何ですか?また、どちらを使用するかをどのように選択すればよいでしょうか?

4

3 に答える 3

115

違いは次のとおりです。

  • addFlashAttribute()実際に属性をフラッシュマップに保存します (これはユーザーで内部的に維持されsession、次のリダイレクトされた要求が満たされると削除されます)

  • addAttribute()基本的に、属性から要求パラメーターを構築し、要求パラメーターを使用して目的のページにリダイレクトします。

したがって、 will の利点は、ほとんどすべてのオブジェクトをフラッシュ属性addFlashAttribute()に格納できることです(リクエストパラメーターにシリアル化されるのではなく、オブジェクトとして維持されるため) 。 request param、またはプリミティブなどのオブジェクトタイプにかなり制限されています。addAttribute()String

于 2013-01-23T01:03:35.380 に答える
18

2 つのコントローラーがあるとします。一方のコントローラーから別のコントローラーにリダイレクトすると、モデル オブジェクトの値はもう一方のコントローラーでは使用できなくなります。したがって、モデルオブジェクトの値を共有したい場合は、最初のコントローラーで言う必要があります

addFlashAttribute("modelkey", "modelvalue");

次に、2 番目のコントローラーのモデルには、上記のキーと値のペアが含まれるようになりました。

2 番目の質問は? クラスのaddAttributeaddFlashAttributeの違いは何ですかRedirectAttributes

addAttributeモデルではなくリクエストパラメーターとして値を渡すため、使用していくつかを追加すると、addAttributeからそれらの値にアクセスできますrequest.getParameter

これがコードです。何が起こっているのかを知るために使用しました:

@RequestMapping(value = "/rm1", method = RequestMethod.POST)
public String rm1(Model model,RedirectAttributes rm) {
    System.out.println("Entered rm1 method ");

    rm.addFlashAttribute("modelkey", "modelvalue");
    rm.addAttribute("nonflash", "nonflashvalue");
    model.addAttribute("modelkey", "modelvalue");

    return "redirect:/rm2.htm";
}


@RequestMapping(value = "/rm2", method = RequestMethod.GET)
public String rm2(Model model,HttpServletRequest request) {
    System.out.println("Entered rm2 method ");

    Map md = model.asMap();
    for (Object modelKey : md.keySet()) {
        Object modelValue = md.get(modelKey);
        System.out.println(modelKey + " -- " + modelValue);
    }

    System.out.println("=== Request data ===");

    java.util.Enumeration<String> reqEnum = request.getParameterNames();
    while (reqEnum.hasMoreElements()) {
        String s = reqEnum.nextElement();
        System.out.println(s);
        System.out.println("==" + request.getParameter(s));
    }

    return "controller2output";
}
于 2015-05-31T17:31:08.063 に答える
7

Javadoc の説明: 「FlashMap は、あるリクエストが別のリクエストで使用するための属性を保存する方法を提供します。これは、ある URL から別の URL にリダイレクトする場合に最も一般的に必要です。たとえば、Post/Redirect/Get パターンです。FlashMap は、 (通常はセッションで) リダイレクトされ、リダイレクト後に使用可能になり、すぐに削除されます。」

于 2014-01-11T19:56:12.417 に答える