2013-03-19 18 views
4

我試圖從客戶端發送一些數據到服務器,並將其處理成文件下載。 我正在使用一個簡單的HTML表單,因爲我想初始化一個文件下載(而不是AJAX)。 其中一個表單域是一個項目數組。 (另外兩個是名稱和說明字符串)。 我在提交表單之前將此字段序列化爲字符串(JSON.stringify)。在春天處理一個包含項目數組的表單帖子MVC

在服務器端,我嘗試了一百萬種技術(@ModelAttribute與@RequestBody,不同的jackson映射bean配置)將其轉換爲單一類型或三種不同的類型(String + String + List/Array)。

我發現的例子只適用於AJAX ... 任何人都可以提供一個工作示例或描述嗎?

=======

更新: 我已經JSON.stringify-ING的收集和傳遞它的輸入之一, 並在服務器端我實現了一個解決辦法:

@RequestMapping(method = RequestMethod.POST, value = "exportSectionsToExcel") 
    public HttpEntity<byte[]> createExcelWorkBook(@ModelAttribute ExportSectionsListForm exportSectionsListForm) { 
Section[] sectionObjects = gson.fromJson(exportSectionsListForm.getSections(), Section[].class); 
... 

與僅含有ExportSectionsListForm對象字符串:

public class ExportSectionsListForm { 
private String name; 
private String url; 
private String rssUrl; 
private String sections; 
... 
(omitting ctor, getters and setters) 

另外,我發現這種有前途的鏈接: http://viralpatel.net/blogs/spring-mvc-multi-row-submit-java-list/ 但沒有嘗試它 - 似乎我需要動態生成輸入元素才能工作,但它實際上可能是正確的解決方案。有沒有人試過這個?

+0

請問您我的控制器代碼? – OQJF 2013-03-19 11:12:45

+0

我嘗試了很多技巧 - 每個都會​​導致不同的問題,而且沒有任何工作 - 所以我正在尋找一個工作示例... – 2013-03-19 11:20:38

+0

因爲我不在辦公室,所以無法提供我的代碼,但我建議您添加斷點到您的控制器方法,並檢查存儲在請求中的數據類型? – OQJF 2013-03-19 11:25:04

回答

6

@ModelAttribute標記將嘗試基於表單發佈構建對象。由於你正在將你的表單值序列化爲JSON,所以這不會起作用。 @RequestBody只是給你一個表示請求體的字符串。所以,你可以得到表示傳入的JSON的字符串,然後使用FlexJSON的Jackson(或者你使用的任何JSON庫)對JSON進行解組。不過,我不確定這是否是最好的方法。

我會問你爲什麼需要序列化表單到JSON開始。 Spring使用Lists/Maps處理表單很好。只需使用@ModelAttribute提交表單,在Controller上創建「數組」和List,或者您期望的任何內容。所以,如果我正確地解釋你的榜樣,我的ModelAttribute會是什麼樣子:

public class ExportSectionsFormBean { 
    private String name; 
    private String url; 
    private String rssUrl; 
    private List<String> sections; 
    /* getters/setters */ 
} 

然後我控制器的方法會是這樣的:

@RequestMapping(method = RequestMethod.POST, value = "exportSectionsToExcel") 
public HttpEntity<byte[]> createExcelWorkBook(@ModelAttribute ExportSectionsFormBean exportSectionsFormBean) { 
    /* Do whatever with your */ 
} 

在形式方面,使用Spring JSTL標籤,簡單地讓你的 「章節」 字段的樣子:

<form:input path="sections[0]" /> 
<form:input path="sections[1]" /> 

或者,如果你想用HTML,然後

<input type="text" name="sections[0]" id="sections0" /> 
<input type="text" name="sections[1]" id="sections1" /> 

這就是上述JSTL標籤生成的內容。只要「部分」的值作爲'部分[#] =值'放入HTTP請求中,您就全部設置了。

+0

謝謝,這就是我正在尋找的 - 我在文章中看到這個也鏈接 - 但我沒有測試它(因爲我使用了一個醜陋的解決方法)。 – 2013-03-20 09:30:18

+1

Spring MVC中帶有列表/地圖的一個caviat,允許添加/刪除表單的方式是,如果要將ModelAttribute放入會話中,必須以某種方式跟蹤刪除的那些。問題在於ModelAttribute只創建一次,因此設置了列表/地圖。後續帖子不會重新構建列表/地圖,只修改/插入您在表單帖子中專門引用的項目。因此,例如,如果您的列表中有10個項目,並且您在視圖端刪除了第5個項目,則Spring將設置1-4和6-10,並且5將仍舊是舊值,不要攜帶#5。 – CodeChimp 2013-03-20 11:47:35

1

我一直在研究同一個問題。如果我有幾個輸入witht誒相同的名稱,如:

<input name="somename"/> 
<input name="somename"/> 
<input name="somename"/> 

和我有一個表格映射到我的方法是這樣的:

@ModelAttribute("ReturnsAndExchangesForm") ReturnsAndExchangesForm returnsAndExchangesForm 

,並以這樣的形式我有getter和setter的屬性命名爲: String [] somename,spring將這些值很好地傳遞給該數組!