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 класс имеет два методы:

некоторое время читал весеннюю документацию, но я немного потерялся. Что является фундаментальным разница между этими двумя, и как я должен выбрать, какой из них использовать?

3 56

3 ответа:

здесь разница:

  • addFlashAttribute() на самом деле хранит атрибуты в тег flashmap (который внутренне поддерживается в пользователях session и удалены как только следующий перенаправленный запрос будет выполнен)

  • addAttribute() по сути конструкции параметры запроса из ваши атрибуты и перенаправляет на нужную страницу с помощью запрос параметры.

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

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

addFlashAttribute("modelkey", "modelvalue");

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

второй вопрос ? В чем разница между addAttribute и addFlashAttribute на RedirectAttributes класс

addAttribute будет передавать значения как requestparameters вместо модели, так что при добавлении некоторых с помощью 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";
}

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