1

我刚刚开始学习 Spring MVC。所以,对不起,如果我的初学者水平激怒了你。

为了让我的问题简短明了,我正在使用以下简单的代码示例。

我在两个不同的 spring MVC 控制器中有两个功能。在第一个控制器中,我有:

@RequestMapping("/first")
public String first(Model model){
    model.addAttribute("user", "User Name");
    return "redirect:/second";
}

在第二个控制器中,我有:

@RequestMapping("/second")
public String second(){
    return "myView";
}

实际上第一个重定向到第二个。Bt 在我的视图(html)中,当我尝试获取模型的值时,例如:

<h1>Welcome! ${user} <h1>   //code in html to get user object

它显示为空。

所以我的问题是当你在 Spring MVC 中的两个请求之间重定向时如何传输数据。实现这一目标的最佳解决方案是什么。我可以通过模型或其他方法来实现这一点......?提前致谢

4

1 回答 1

2

返回与

return "redirect:/second";

导致DispatcherServlet返回带有Location标头的 302 响应代码,告诉您的客户端实际查找页面的位置。在你的情况下,去寻找它./second。如果您通过浏览器发出请求,这将导致浏览器向Location标头中的 URL 发送新的 HTTP GET 请求。

Model属性,就像HttpServletRequest属性一样,只存在于单个请求的上下文中。由于您所做的事情发生在两个请求上,因此第一个中的属性在第二个中将不存在。您需要使用 Flash 属性。

Spring 3.1 提供了RedirectAttributes实现flash 属性的类。您可以RedirectAttributes向处理程序方法添加类型参数,并使用该addFlashAttribute()方法添加将在下一个请求中添加到模型中的属性。

@RequestMapping("/first")
public String first(RedirectAttributes redirectAttributes){
    redirectAttributes.addFlashAttribute("user", "User Name");
    return "redirect:/second";
}

这在幕后所做的是将添加的属性添加addFlashAttributeHttpSession具有特殊键的属性中。在下一个请求中,将具有该特殊键的DispatcherServlet所有属性添加到.HttpSessionModel

于 2013-10-01T20:53:48.383 回答