2013-10-01 31 views
0

我刚开始学习Spring MVC。所以,如果我的初学者水平让你感到不快,那很抱歉。维护弹簧控制器中不同URL之间重定向的数据

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

我在两个不同的弹簧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中传输数据。达到这个目标的最佳解决方案是什么?我可以通过模型或其他方法达到这个目标吗? 在此先感谢

+1

请参阅[Flash Attributes](http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/mvc.html#mvc-flash-attributes) – GriffeyDog

回答

1

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"; 
} 

这里做的事情在幕后为它增加了通过addFlashAttribute加入HttpSession属性和特殊键的属性。在下一个请求中,DispatcherServlet将该特殊键的所有HttpSession属性添加到Model中。

+0

感谢您的不错详细的答案。根据你的回答 - 使用redirectionAttributes后,当我重定向后来到视图,对象有它的价值,但刷新它再次得到**空/空**。如果我仍然希望该属性即使在此刷新上怎么办?我应该为此做些什么。我有没有比httpsession更好的解决方案? – vicky