如何将表单字段集合发布到Spring控制器?

时间:2011-04-25 21:07:33

标签: java spring spring-mvc

假设我有这样的形式:

<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控制器解析它?

3 个答案:

答案 0 :(得分: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

,应保留元素的顺序
  

控件名称/值按它们在文档中出现的顺序列出。名称通过'='与值分隔,名称/值对通过'&amp;'分隔。

答案 1 :(得分: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个元素的 Book 类。 以及包含书籍列表 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方法,它返回要绑定到的Containing类:

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

最后你的请求映射方法有一个@ModelAttribute参数:

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

}

spring会根据需要自动添加任意数量的“Book”。

答案 2 :(得分: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;
    }
}