2011-04-25 57 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

相关问题