我是春天的新人并且正在学习RedirectAttributes
。以下是我正在执行的示例代码。
@RequestMapping(value="/")
public String app(Model model,RedirectAttributes rm) throws IOException{
UserCO userCO= new UserCO();
userCO.setEmail("rptdbay@gmail.com");
rm.addFlashAttribute("flashkey", "flashvalue");
rm.addFlashAttribute("userCO", userCO);
return "redirect:/controller1";
}
@RequestMapping(value="/controller1")
public String app1(Model model,HttpServletRequest request) throws IOException{
System.out.println("=====================================");
System.out.println("In Controller 1");
Map md = model.asMap();
for (Object modelKey : md.keySet()) {
Object modelValue = md.get(modelKey);
System.out.println("Model data =="+ modelKey + " -- " + modelValue);
}
java.util.Enumeration<String> reqEnum = request.getParameterNames();
while (reqEnum.hasMoreElements()) {
String s = reqEnum.nextElement();
System.out.println("Request data =="+ s+" : "+ request.getParameter(s));
}
return "redirect:/controller2";
}
@RequestMapping(value="/controller2")
public String app2(Model model,HttpServletRequest request) throws IOException{
System.out.println("=====================================");
System.out.println("In Controller 2");
Map md = model.asMap();
for (Object modelKey : md.keySet()) {
Object modelValue = md.get(modelKey);
System.out.println("Model data =="+ modelKey + " -- " + modelValue);
}
java.util.Enumeration<String> reqEnum = request.getParameterNames();
while (reqEnum.hasMoreElements()) {
String s = reqEnum.nextElement();
System.out.println("Request data =="+ s+" : "+ request.getParameter(s));
}
return "redirect:/controller3";
}
我添加了字符串"flashvalue"
和bean userCO
的对象。我观察到了 -
"flashvalue"
和userCO
。
很好!,但在Controller2中"flashvalue"
可用但userCO
不。为什么?以下是我的控制台日志。
=====================================
在Controller 1中</ p>
模型数据== userCO - com.ttnd.mvc_mod.co.UserCO@60098260
模型数据== flashkey - flashvalue
=====================================
在Controller 2中
请求数据== flashkey:flashvalue
有没有其他方法可以获得FlashAttribute
而不是Model
中的约束?
答案 0 :(得分:0)
首先解释您的控制台日志:您在控制器1中收到两个模型对象。这是因为您在方法app
中指定了两个Flash属性。 Flash属性存储在目标控制器的HTTP会话中,目标控制器从那里将其作为模型属性进行检索。之后,Spring会删除flash属性。
在控制器2中,闪光灯属性不再可用。 “flashkey”在控制器2中作为请求属性可用的原因是,因为模型中的基元类型作为查询参数公开给重定向目标。如前所述,传递给控制器1的flash属性作为模型属性公开。您的“userCO”不是原始类型,因此您不会将其作为请求参数获取,而您将在控制器2中获得“flashkey”作为查询参数。
如果要关闭模型对象的“转发”作为请求参数,请将org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.setIgnoreDefaultModelOnRedirect(boolean)
设置为true(正如Spring为“新”应用程序所建议的那样)。
我不知道是否有另一种获取flash属性的方法。我鼓励你不要在这里解决Spring的概念,而是像处理你的问题一样处理flash属性。将flash属性视为重定向目标中的模型属性。如果您 - 出于什么原因 - 在到达目标之前需要两次重定向,请再次将所需属性添加为控制器1中的闪存属性。
有关详细信息,请参阅http://docs.spring.io/spring/docs/4.1.7.RELEASE/spring-framework-reference/html/mvc.html#mvc-ann-redirect-attributes和http://docs.spring.io/spring/docs/4.1.7.RELEASE/spring-framework-reference/html/mvc.html#mvc-flash-attributes。