2017-02-27 45 views
1

我是新的春天和學習RedirectAttributes。下面是我正在執行的示例代碼。Spring:在RedirectAttributes中添加FlashAttribute

@RequestMapping(value="/") 
public String app(Model model,RedirectAttributes rm) throws IOException{ 
    UserCO userCO= new UserCO(); 
    userCO.setEmail("[email protected]"); 
    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"和豆userCO的對象.I觀察到但─

  1. 在控制器1兩者"flashvalue"userCO是可用的。 不錯!但在Controller2中有"flashvalue"可用,但userCO 不是。爲什麼?
  2. 在控制器1中的數據進入模型ONY但在控制器2中相同 數據僅在請求中可用。爲什麼?

下面是我的控制檯日誌。

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

在控制器1

模型數據== userCO - [email protected]

模型數據== flashkey - flashvalue

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

在控制器2中

請求數據== flashkey:flashvalue

有可能的任何其它方式獲得FlashAttribute而非Model結合?

回答

0

首先解釋您的控制檯日誌:您在控制器1中收到兩個模型對象。這是因爲您在方法app中指定了兩個Flash屬性。 Flash屬性存儲在目標控制器的HTTP會話中,該會話將其作爲模型屬性從其中檢索。之後,Spring屬性被擦除。

在控制器2中,flash屬性不再可用。由於模型中的原始類型作爲查詢參數公開給重定向目標,因此在控制器2中可以使用「flashkey」作爲請求屬性。如前所述,傳遞給控制器​​1的Flash屬性作爲模型屬性公開。你的「userCO」不是原始類型,所以你不會得到它作爲請求參數,而你會在控制器2中得到「flashkey」作爲查詢參數。

如果你想關閉模型的「forward」對象作爲請求參數,將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

+0

這個原始數據來自哪裏?我只添加了'return'重定向:/ controller2「;'。 – TheCurious

+0

在控制器1中可用的所有模型屬性將被添加爲對控制器2的請求的查詢參數(通過由原始請求設置爲「/」的flash屬性將快捷鍵引入模型) –

+0

簡單地說,通過'.addAttribute()'添加到'RedirectAttributes'或'model'中的屬性'在重定向後可以在請求中使用。正確?那麼兩者的區別是什麼? – TheCurious

相關問題