假设我有这样的形式:
<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控制器解析它?
答案 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;
}
}