我刚开始学习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中重定向两个请求时如何传输数据。实现这一目标的最佳解决方案是什么。我可以通过模型或其他方法实现这一目标吗? 提前致谢
答案 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
中。