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";