16

我使用 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}

它从会话中获取用户,我看到它登录

4

3 回答 3

19

有了您的新信息,问题就来了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
    ...
}

只要相信它最终会出现在请求属性中,因此可以在您的 jsp 中使用。

于 2013-09-24T14:11:05.100 回答
8

当您redirecting访问新 URL 时,浏览器实际上正在向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";
}

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

于 2013-09-24T14:31:20.493 回答
0

您以错误的方式重定向它。而不是 return "redirect:"+"index" 使用 return "redirect:/index"。将其重定向到您的 get 方法。因为redirectattributes 是post/redirect/get 属性。试试这个,你会在你的屏幕上看到一条闪光信息。而不是模型使用重定向属性。

redirectAttributes.addFlashAttribute("errormsg", "errormessage"); 返回“重定向:/index.do”;

于 2014-09-26T12:05:11.003 回答