Spring:在RedirectAttributes

时间:2017-02-27 20:35:51

标签: 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("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的对象。我观察到了 -

  1. Controller1中提供"flashvalue"userCO。 很好!,但在Controller2中"flashvalue"可用但userCO 不。为什么?
  2. 在Controller1中,数据来自Model ony但在Controller2中相同 数据仅在请求中提供。为什么?
  3. 以下是我的控制台日志。

      

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

         

    在Controller 1中<​​/ p>      

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

         

    模型数据== flashkey - flashvalue

         

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

         

    在Controller 2中

         

    请求数据== flashkey:flashvalue

    有没有其他方法可以获得FlashAttribute而不是Model中的约束?

1 个答案:

答案 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-attributeshttp://docs.spring.io/spring/docs/4.1.7.RELEASE/spring-framework-reference/html/mvc.html#mvc-flash-attributes