2010-03-23 46 views
6

我有一個簡單的Spring表單,它被綁定到表單對象上。 http POST處理程序做了一些工作,然後需要重定向到一個新的URL,將表單數據作爲查詢字符串參數傳遞。Spring 3 MVC - 如何將表單轉換爲查詢字符串?

因此,假設我有一個屬性「參數1」和「參數2」的表單支持對象,我想建立一個字符串,它看起來是這樣的:

redirect:/app/new/page?param1=value;param2=value

現在,春天將自動綁定值從一個查詢字符串或表單發佈到我的表單對象,但我想生成一個查詢字符串與從表單對象採取的值。

很明顯,手動做這件事很簡單,但由於我將有很多不同的表單支持對象,Spring中是否有一些內置工具可以從表單對象生成查詢字符串,適合構建爲網址是什麼?

謝謝。

回答

2

好的,經過一些追溯到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的允許長度。

發現了這一切,似乎更難比它需要的是:-)

0

我認爲你應該使用RedirectView類的方法setExposeModelAttributes,但是如果你在你的控制器上使用Spring 3.0註解,可能很難獲得這個方法。

+0

似乎不工作...我使用Annotated控制器,所以我的控制器只是一個普通的java類,不能從任何Spring類繼承。 如果我創建一個新的RedirectView對象並從控制器返回它...它不會追加任何內容到URL。我無法看到RedirectView對象如何獲得對錶單對象的引用 - 沒有設置器或構造器選項可以傳入我的表單! – David 2010-03-23 17:19:35

+0

處理RedirectView時調用renderMergedOutputModel。此方法接收您的模型並呈現正確的url。 – uthark 2010-03-23 17:51:48

+0

如果我創建一個新的RedirectView,它將不會有任何對任何模型對象的引用。而且沒有二流派給它一個模型對象。如果我在RedirectView上調用「render()」方法,傳遞包含模型對象的Map,那麼它只會在運行時拋出IllegalStateException。 看起來像框架在使用註釋時忘記了包含對此的支持...... – David 2010-03-23 18:17:59

2
Map<String, Object> model = new HashMap<String, Object(); 
model.put("stuff", "here"); 
ModelAndView mv = new ModelAndView("redirect:/somewhere.htm", model); 
return mv; 

可生產

http://.../somewhere.htm?stuff=here 
相關問題