Подтвердить что ты не робот

Spring RedirectAttributes: addAttribute vs addFlashAttribute

До сих пор мое понимание в нашем методе сопоставления запросов контроллера позволяет указать параметр RedirectAttributes и заполнить его атрибутами для того, когда запрос будет перенаправлен, например:

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

   // ...

   return "redirect:/somewhere";
}

Атрибуты перенаправления будут доступны на целевой странице, на которую она перенаправляется.

Однако RedirectAttributes имеет два метода: addAttribute и addFlashAttribute. Каковы основные различия между этими двумя, и как я должен выбрать, какой из них использовать? Некоторое время читал spring ручной документ, но я немного потерял

4b9b3361

Ответ 1

addFlashAttribute фактически хранит атрибуты в flashmap (который внутренне поддерживается пользователями session и удаляется после выполнения следующего перенаправленного запроса), а другой addAttribute по существу создает параметры запроса из ваших атрибутов и перенаправляет на желаемую страницу с параметрами запроса. Таким образом, преимущество состоит в том, что вы можете хранить почти любой объект в своем flash-атрибуте (поскольку он не сериализуется в параметрах запроса вообще, а поддерживается как объект), тогда как с addAttribute, поскольку добавляемый объект преобразуется в нормальный параметр запроса, вы довольно ограничены типами объектов, такими как String или примитивы.

Ответ 2

Предположим, у вас есть 2 контроллера. Если вы перенаправляете с одного контроллера на   другой контроллер значения в объекте модели не будут доступны в   другой контроллер. Поэтому, если вы хотите поделиться значениями объекта модели   то вы должны сказать в первом контроллере

addFlashAttribute("modelkey", "modelvalue");

Затем вторая модель контроллера содержит теперь пару ключевых ключей.

Второй вопрос? В чем разница между addAttribute и addFlashAttribute в классе 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";
}

Ответ 3

Описание Javadoc: "FlashMap предоставляет способ для одного запроса хранить атрибуты, предназначенные для использования в другом. Это чаще всего необходимо при перенаправлении с одного URL на другой, например, на шаблон Post/Redirect/Get. FlashMap сохраняется перед перенаправлением (обычно в сеансе) и становится доступным после перенаправления и немедленно удаляется."