在Spring控制器中的不同URL之间保持重定向数据

时间:2013-10-01 20:49:31

标签: java spring spring-mvc

我刚开始学习Spring MVC。所以,对不起,如果我的初学者水平让你感到烦恼。

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

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

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

在第二个控制器中我有:

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

实际上第一个是重定向到第二个。在我看来(html),当我试图得到模型的价值时:

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

显示为空。

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

1 个答案:

答案 0 :(得分:2)

返回

return "redirect:/second";

导致DispatcherServlet返回302响应代码,并带有Location标题,告诉客户端实际查找页面的位置。在您的情况下,请在./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";
}

这样做的内容是它使用特殊键将addFlashAttribute添加的属性添加到HttpSession属性。在下一个请求中,DispatcherServlet会将具有该特殊密钥的所有HttpSession属性添加到Model中。