Spring:在重定向属性中添加FlashAttribute
我是春天的新手,正在学习Spring:在重定向属性中添加FlashAttribute,spring,spring-mvc,redirect,url-redirection,Spring,Spring Mvc,Redirect,Url Redirection,我是春天的新手,正在学习RedirectAttributes。下面是我正在执行的示例代码 @RequestMapping(value="/") public String app(Model model,RedirectAttributes rm) throws IOException{ UserCO userCO= new UserCO(); userCO.setEmail("rptdbay@gmail.com"); rm.addFlashAttribute("flas
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";
}
@RequestMapping(value=“/”)
公共字符串应用程序(模型、重定向属性和rm)引发IOException{
UserCO UserCO=new UserCO();
userCO.setEmail(“rptdbay@gmail.com");
rm.addFlashAttribute(“flashkey”、“flashvalue”);
rm.addFlashAttribute(“userCO”,userCO);
返回“重定向:/controller1”;
}
@请求映射(value=“/controller1”)
公共字符串app1(模型,HttpServletRequest请求)引发IOException{
System.out.println(“======================================================================”);
System.out.println(“控制器1中”);
Map md=model.asMap();
对于(对象模型键:md.keySet()){
对象modelValue=md.get(modelKey);
System.out.println(“模型数据=”+modelKey+“--”+modelValue);
}
java.util.Enumeration reqEnum=request.getParameterNames();
while(reqEnum.hasMoreElements()){
字符串s=reqEnum.nextElement();
System.out.println(“请求数据=”+s+:“+Request.getParameter(s));
}
返回“重定向:/controller2”;
}
@请求映射(value=“/controller2”)
公共字符串app2(模型,HttpServletRequest请求)引发IOException{
System.out.println(“======================================================================”);
System.out.println(“控制器2中”);
Map md=model.asMap();
对于(对象模型键:md.keySet()){
对象modelValue=md.get(modelKey);
System.out.println(“模型数据=”+modelKey+“--”+modelValue);
}
java.util.Enumeration reqEnum=request.getParameterNames();
while(reqEnum.hasMoreElements()){
字符串s=reqEnum.nextElement();
System.out.println(“请求数据=”+s+:“+Request.getParameter(s));
}
返回“重定向:/controller3”;
}
我添加了字符串“flashvalue”
和beanuserCO
的对象-
“flashvalue”
和userCO
。
好的但是在Controller2“flashvalue”
可用,但是userCO
不是,为什么除了在
模型
中绑定之外,还有其他方法可以获取FlashAttribute
吗?首先,请解释控制台日志:您在控制器1中收到两个模型对象。这是因为您在方法app
中指定了两个flash属性。闪存属性存储在目标控制器的HTTP会话中,目标控制器从那里将其作为模型属性检索。之后,flash属性被Spring擦除
在控制器2中,闪存属性不再可用。之所以“flashkey”在控制器2中作为请求属性可用,是因为模型中的基元类型作为查询参数公开给重定向目标。如前所述,传递给控制器1的闪存属性作为模型属性公开。您的“userCO”不是基元类型,因此您不会将其作为请求参数获取,而将在控制器2中获取“flashkey”作为查询参数
如果要关闭模型对象作为请求参数的“转发”,请将org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.setIgnoreDefaultModelOnRedirect(布尔)
设置为true(如Spring为“新”应用程序所建议的)
我不知道是否有其他方法可以获得flash属性。我鼓励您不要在这里讨论Spring的概念,而是像您在问题中所做的那样处理flash属性。将flash属性视为重定向目标中的模型属性。如果出于什么原因需要两次重定向,直到达到目标,请在控制器1中再次添加所需属性作为闪存属性
有关详细信息,请参阅和。此原始数据来自何处?我添加了
return“redirect:/controller2”代码>仅限。控制器1中可用的所有模型属性将作为查询参数添加到控制器2的请求中(flashkey是通过原始请求设置为“/”的flash属性引入模型的),简而言之,我的问题,由于通过在RedirectAttributes
或model
中添加了attribute
,因此在重定向后请求中可以使用addAttribute()
。正确吗?那么这两种方式的区别是什么?是的,这是正确的,但对基本类型有限制。请参阅参考文件。据说:默认情况下,所有模型属性都被视为在重定向URL中作为URI模板变量公开。在其余属性中,属于基本类型或基本类型集合/数组的属性将自动附加为查询参数
。我不知道你对的意思是什么
?我关心的是重定向attributes.addAttribute(“key”,“val”)
和model.addAttribute(“key”,“val”)
。重定向后,这两个都可以作为原语或原语集合的查询参数使用。