我使用的是Spring MVC。我需要为请求或其他对象添加属性。它应该是将在屏幕上显示的消息。例如,如果我使用纯Servlet,我可能只是:
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");
模型地图 -
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}
它从Session获取用户,我看到它登录
答案 0 :(得分:16)
根据您的新信息,问题是redirect:
。当您执行重定向时,您发送一个HTTP响应,其响应代码为302(或301),其中Location
标题指向新的URL。浏览器将向该位置发出新的HTTP请求。因此,您的请求属性(和模型属性)不再好,它们不存在于新请求中。
考虑使用flash属性。 RedirectAttributes
课程是要走的路。 The javadoc has a good example.
在请求处理期间,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中使用。
答案 1 :(得分:7)
当您redirecting
到新网址时,浏览器实际上是向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中(在用户会话中维护,并在下次重定向请求完成后删除)。
答案 2 :(得分:0)
您正在以错误的方式重定向它。而不是返回“redirect:”+“index”使用return“redirect:/ index”。将其重定向到您的get方法。因为redirectattributes是post / redirect / get属性。试试这个,你会在屏幕上看到一条flash信息。 而不是模型使用Redirectattributes。
redirectAttributes.addFlashAttribute(“errormsg”,“errormessage”); 返回“redirect:/index.do”;