Spring MVC将属性设置为request/model/modelMap

Cat*_*t H 15 java spring-mvc

我使用Spring MVC.我需要为请求或其他对象添加属性.它应该是将在屏幕上显示的消息.例如,如果我使用纯Servlet,我可能只是:

request.setAttribute("message", "User deleted");
Run Code Online (Sandbox Code Playgroud)

而不是在JSP页面上

<div id="message">${message}</div>
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在方法中做这样的事情时:

@RequestMapping(value = "/delete", method = RequestMethod.GET)
public String deleteUser(@RequestParam("login") String login,
        ModelMap map, HttpServletRequest request)
Run Code Online (Sandbox Code Playgroud)

模型对象 -

model.addAttribute("message", "User deleted");
Run Code Online (Sandbox Code Playgroud)

地图 -

map.put("message", "User deleted");
Run Code Online (Sandbox Code Playgroud)

模型地图 -

map.put("message", "User deleted");
Run Code Online (Sandbox Code Playgroud)

HttpServletRequest -

request.setAttribute("message", "User deleted");
Run Code Online (Sandbox Code Playgroud)

没有显示.但在我的浏览器中我看到: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";
}
Run Code Online (Sandbox Code Playgroud)

在我的JSP中我也以这种方式显示用户登录:

${user.login}
Run Code Online (Sandbox Code Playgroud)

它需要来自Session的用户,我看到它登录

Sot*_*lis 16

有了您的新信息,问题就出在了redirect:.执行重定向时,发送带有302(或301)响应代码的HTTP响应,其中Location标题指向新URL.浏览器将向该位置发出新的HTTP请求.因此,您的请求属性(和模型属性)不再好,它们在请求中不存在.

考虑使用flash属性.该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
    ...
}
Run Code Online (Sandbox Code Playgroud)

只要相信它最终会在请求属性中,因此可以在你的jsp中使用.


Deb*_*kia 7

当您redirecting使用新网址时,浏览器实际上是向该网址发送新请求redirect URL.并且map.addAttribute("message", "User " + login + " deleted");新请求中不存在请求属性.

您可以使用RedirectAttributesmessage用户显示:

@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";
}
Run Code Online (Sandbox Code Playgroud)

redirectAttributes.addAttribute从您的属性构造请求参数,并使用请求参数重定向到所需的页面.并将addFlashAttribute属性存储在flashmap中(在用户会话中维护,并在下一次重定向请求得到满足后删除).