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”
和bean
userCO
的对象-

  • Controller1中提供了
    “flashvalue”
    userCO
    。 好的但是在Controller2
    “flashvalue”
    可用,但是
    userCO
    不是,为什么
  • 在Controller1中,数据来自模型ony,但在Controller2中相同 数据仅在请求中可用。为什么
  • 下面是我的控制台日志

    =====================================

    在控制器1中

    模型数据==userCO--com.ttnd.mvc_mod.co。UserCO@60098260

    模型数据==flashkey--flashvalue

    =====================================

    在控制器2中

    请求数据==flashkey:flashvalue


    除了在
    模型
    中绑定之外,还有其他方法可以获取
    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”)
    。重定向后,这两个都可以作为原语或原语集合的查询参数使用。