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 ответа:
здесь разница:
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. Флэш-карта сохраняется перед перенаправлением (обычно в сеансе) и становится доступной после перенаправления и немедленно удаляется."