好的,經過一些追溯到Spring源代碼後,我想我有一些明確的答案。
1)將查詢參數手動添加到您在「redirect:...」字符串中傳回的URL是一個非常棒的IDEA。 Spring會緩存這些URL所引用的視圖,所以如果你指定了很多不同的參數,你可以通過讓緩存保存很多不需要的值來有效地泄漏內存。
注意,在春季分佈的PetClinic示例代碼正是這樣做的,而且顯然也已提高到糾正:-)
2)模型對象是否仍然由春天舉行的控制器時,JIRA問題返回,並且Spring會自動將其中的任何值添加到您指定的URL(作爲查詢參數) - 提供模型值爲純String或原始對象。現在,由於表單支持對象是一個存儲爲單一屬性的對象,所以Spring不會對它做任何事情。
所以 - 從註釋的Controller中,最好的方法似乎是將一個ModelMap參數添加到處理程序方法。 ?當你準備返回,做這樣的事情:
Assuming the form backing object "formObject" has been passed as a parameter to the controller handler method (via the ModelAttribute annotation) and has properties "param1" and "param2" that are Strings -
modelMap.clear();
modelMap.addAttribute("param1", formObject.getParam1());
modelMap.addAttribute("param2", formObject.getParam2());
return "redirect:/my/url";
和春季會發出一個重定向到/我/ URL參數1 =值;參數2 =值
似乎沒有要一個內置的機制(在Spring中)將bean變成一個鍵/值對列表以添加到地圖中,但如果真的需要,Apache BeanUtils庫將會很好地完成。當然,您不希望爲大對象執行此操作,否則您可能會超出URL的允許長度。
發現了這一切,似乎更難比它需要的是:-)
似乎不工作...我使用Annotated控制器,所以我的控制器只是一個普通的java類,不能從任何Spring類繼承。 如果我創建一個新的RedirectView對象並從控制器返回它...它不會追加任何內容到URL。我無法看到RedirectView對象如何獲得對錶單對象的引用 - 沒有設置器或構造器選項可以傳入我的表單! – David 2010-03-23 17:19:35
處理RedirectView時調用renderMergedOutputModel。此方法接收您的模型並呈現正確的url。 – uthark 2010-03-23 17:51:48
如果我創建一個新的RedirectView,它將不會有任何對任何模型對象的引用。而且沒有二流派給它一個模型對象。如果我在RedirectView上調用「render()」方法,傳遞包含模型對象的Map,那麼它只會在運行時拋出IllegalStateException。 看起來像框架在使用註釋時忘記了包含對此的支持...... – David 2010-03-23 18:17:59