2011-04-25 59 views
2

假設我有形式,像這樣的:如何將表單字段集合發佈到Spring控制器?

<form method="post" action="/create"> 

    <input type="text" name="title.0" value="Curious George" /> 
    <input type="text" name="author.0" value="H.A. Rey" /> 
    <input type="text" name="date.0" value="2/23/1973" /> 

    <input type="text" name="title.1" value="Code Complete" /> 
    <input type="text" name="author.1" value="Steve McConnell" /> 
    <input type="text" name="date.1" value="6/9/2004" /> 

    <input type="text" name="title.2" value="The Two Towers" /> 
    <input type="text" name="author.2" value="JRR Tolkien" /> 
    <input type="text" name="date.2" value="6/1/2005" /> 

    <input type="submit" /> 
</form> 

如何解析這個從Spring MVC的3.0控制器?

回答

1

能控制器請求映射簡單地作爲參數彈簧WebRequest,然後做一些事情,如:

Map<String, String[]> params = request.getParameterMap(); 
int i = 0; 
while (true) { 
    String title = params.get("title" + .i); 
    if (title != null) { 
     // get the rest and create your Book object or whatever 
     i += 1; 
    } 
    else { 
     break; 
    } 
}  
8

name屬性不必是唯一的。所以:

<input type="text" name="title" value="Curious George" /> 
<input type="text" name="title" value="Code Complete" /> 
<input type="text" name="title" value="The Two Towers" /> 

然後

@RequestMapping("/create") 
public void create(
    @RequestParam("title") List<String> titles, 
    @RequestParam("author") List<String> authors, ..) {..} 

元素的順序應該被保留,根據the spec

名稱/值在它們出現的順序列出的控制該文件。該名稱與值'='分開,名稱/值對由'&'分隔開。

+0

這是偉大的bozho,謝謝! – digitaljoel 2011-04-30 03:06:48

4

如果您可以更改視圖,理想情況下您可以使用某種列表來完成此操作。

喜歡的東西:

<input type="text" name="books[0].title" value="Curious George" /> 
<input type="text" name="books[0].author" value="H.A. Rey" /> 
<input type="text" name="books[0].date" value="2/23/1973" /> 

你會擁有一個包含3個元素一個類。 和其中包含的圖書列表BookContainer

public class BookContainer { 
    private List <Book> books = new ArrayList<Book>(); 

    public List<Book> getBooks() { 
    return books; 
    } 

    public void setBooks(List<Book> books) { 
    this.books = books; 
    } 
} 

現在,在你的控制器含有類,你就會有一個@ModelAttribute方法,它返回包含類以綁定到:

@ModelAttribute("container") 
public BookContainer getBookContainer() { 
    return new BookContainer; 
} 

最後你會有一個@ModelAttribute參數給你的請求映射方法:

@RequestMapping 
public void handlePost(@ModelAttribute("container") BookContainer container) { 

} 

春天將自動添加儘可能多的'圖書到您的清單,你需要。

+0

今天我試了很長時間纔得到這個想法,沒有運氣的工作。我甚至刪除了我的大部分代碼,並把你的骰子放在了一起。任何建議或指示,使這實際上工作? – digitaljoel 2011-05-01 01:32:19

+0

你使用的是什麼版本的spring MVC?我記得在3.0.0中有一個錯誤,[]沒有起作用。我目前使用的是3.0.5版 - 稍後我會稍後再介紹一下這個測試,以檢查我是否沒有錯過任何東西。 – kieron 2011-05-01 22:53:41

+0

我已經更新了我的答案,它沒有起作用的主要原因是它看起來不能直接綁定回列表,但如果列表包含在另一個類中,它工作正常。 – kieron 2011-05-02 01:15:50

相關問題