Spring атрибут set MVC для запроса/model/modelMap
Я использую Spring MVC. Мне нужно добавить атрибут к запросу или другому объекту. Это должно быть сообщение, которое будет отображаться на экране. Например, если я использую чистые сервлеты, я могу просто:
request.setAttribute("message", "User deleted");
а не на странице JSP
<div id="message">${message}</div>
но когда я пытаюсь сделать что-то вроде этого в методе:
@RequestMapping(value = "/delete", method = RequestMethod.GET)
public String deleteUser(@RequestParam("login") String login,
ModelMap map, HttpServletRequest request)
Объект модели -
model.addAttribute("message", "User deleted");
Карта -
map.put("message", "User deleted");
ModelMap -
map.put("message", "User deleted");
HttpServletRequest -
request.setAttribute("message", "User deleted");
ничего не отображается. Но в моем браузере я вижу: http://localhost: 8081/project/index? Message = User + deleted
Как решить эту небольшую проблему?
Спасибо за ваши ответы
Обновлено:
для ясного понимания. Я пытаюсь это сделать:
@RequestMapping(value = "/delete", method = RequestMethod.GET)
public String deleteUser(@RequestParam("login") String login,
Model model) {
dao.delete(login); // there is NO exeptions
map.addAttribute("message", "User " + login + " deleted");
return "redirect:" + "index";
}
в моем JSP я также показываю логин пользователя следующим образом:
${user.login}
он принимает пользователя из сеанса, и я вижу его login
Ответы
Ответ 1
С вашей новой информацией проблема redirect:
. Когда вы выполняете перенаправление, вы отправляете HTTP-ответ с кодом ответа 302 (или 301) с заголовком Location
, указывающим на новый URL-адрес. Браузер сделает новый HTTP-запрос в этом месте. Таким образом, ваши атрибуты запроса (и атрибуты модели) уже не являются хорошими, они не существуют в запросе new.
Рассмотрим использование флеш-атрибутов. Класс RedirectAttributes
- это путь. Хороший пример javadoc.
Атрибут Model
добавляется к атрибутам запроса намного позже во время обработки запроса. Поэтому вы не увидите, что это делается непосредственно
@RequestMapping(value = "/delete", method = RequestMethod.GET)
public String deleteUser(@RequestParam("login") String login,
ModelMap map, HttpServletRequest request)
map.put("message", "User deleted");
String message = (String) request.getAttribute("message"); // will return null
...
}
Просто верьте, что он в конечном итоге будет в атрибутах запроса и, следовательно, доступен в вашем jsp.
Ответ 2
Как вы redirecting
для нового URL-адреса, браузер фактически отправляет новый запрос в redirect URL
. А атрибут запроса map.addAttribute("message", "User " + login + " deleted");
отсутствует в новом запросе.
Вы можете использовать RedirectAttributes
, чтобы показать message
пользователю:
@RequestMapping(value = "/delete", method = RequestMethod.GET)
public String deleteUser(@RequestParam("login") String login,
Model model,RedirectAttributes redirectAttributes) {
dao.delete(login); // there is NO exeptions
//map.addAttribute("message", "User " + login + " deleted");
redirectAttributes.addFlashAttribute("message", "User " + login + " deleted");
return "redirect:" + "index";
}
redirectAttributes.addAttribute
строит параметры запроса из ваших атрибутов и перенаправляет на нужную страницу параметры запроса. И addFlashAttribute
хранит атрибуты в flashmap (поддерживается в сеансе пользователя и удаляется после выполнения следующего перенаправленного запроса).
Ответ 3
Вы перенаправляете его неправильно. вместо return "redirect:" + "index" использовать return "redirect:/index". перенаправить его на ваш метод get. поскольку redirectattributes - атрибут post/redirect/get. попробуйте это, и вы получите флеш-сообщение на вашем экране.
вместо модели используйте Redirectattributes.
redirectAttributes.addFlashAttribute( "errormsg", "errormessage" );
return "redirect:/index.do";