2011-10-28 89 views
1

你好我有找到一個答案......如何通過使用重定向一個複雜的ModelAttribute:在Spring MVC 3.0

使用案例問題的所有問題:

閱讀在控制器的Excel電子表格。處理了一行4行,行2和行3有一些錯誤,所以我跳過它們並繼續處理其餘的處理。但是我想保留這些行以在處理完成後顯示給用戶。我想保留該行中的所有值以顯示給用戶,只是爲了提供足夠的信息。

所以我試圖做的是這樣的:

@RequestMapping(value = "/bulk-create", method = RequestMethod.POST) 
public String bulkCreate(Model model, SpreadSheetFile spreadSheetFile){ 
    ...some code... 

    List<Row> errorRows = new LinkedList<Row>(); 

    ...some code to process rows... 

    //Error Found 
    errorRows.add(row); 

    ...more code to wrap up processing (possibly more errors)... 

    model.addAttribute("erroRows", errorRows); 
    return "redirect:/bulk-review" 
} 

@RequestMapping(value = "/bulk-review", method = RequestMethod.GET) 
public String bulkReview(Model model, 
         @ModelAttribute("errorRows") 
         LinkedList<Row> errorRows){ 
    model.addAttribute("errorRows", errorRows); 
    return "bulk-review"; 
} 

所以基本上我試圖從一個MVC方法一個LinkedList傳遞到另一個沒有實際擊中頁第(除非我誤解如何「重定向:」的作品...它調用控制器的方法第一次是正確的?)

當我但一個斷點進入bulkReview方法,errorRows是空的......那麼我怎麼保留這兩個方法之間的值?

感謝您的幫助!讓我知道是否需要澄清任何事情! :)

克里斯

回答

1

我不認爲重定向機制的工作方式,你認爲它的確如此。第一個控制器將一個URL發送回用戶的瀏覽器,然後瀏覽器隨後執行。默認情況下,Spring會在重定向URL中重定向時在模型中放置任何數據,以便被重定向的頁面可以「查看」模型數據。但是,如果模型中存在複雜的數據,這種方法效果不佳。

所以,你需要考慮如何將數據將在瀏覽器發送回用戶重定向URL進行傳遞。列表如何被序列化到URL?可能不是很好。

另一種辦法是把數據會話從一個控制器和訪問它在第二位。

+0

所以我結束了這樣做: ' model.addAttribute(「errorList」,errorList); model.addAttribute( 「totalRows」,sheet.getLastRowNum()); model.addAttribute(!? 「totalProcessed」,errorList.size()= sheet.getPhysicalNumberOfRows()sheet.getPhysicalNumberOfRows() - errorList.size():0); \t \t \t \t回報 「集中審查」; ' 不是進入另一個控制器方法,而是防止通過一些驗證重新運行頁面,因爲我看到的這種方式的垮臺是,如果用戶按下刷新,它將再次運行前一個控制器方法。 –