Как разместить коллекцию полей формы в контроллере Spring? - PullRequest
2 голосов
/ 26 апреля 2011

Предположим, у меня есть такая форма:

<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 ]

8 голосов
/ 26 апреля 2011

Атрибут 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, ..) {..}

Порядок элементов должен быть сохранен, согласно спецификации :

Имена / значения элементов управления перечислены в порядке их появления в документе. Имя отделяется от значения символом '=', а пары имя / значение отделяются друг от друга знаком '&'.

4 голосов
/ 29 апреля 2011

Если вы можете изменить представление, в идеале вы должны сделать это с каким-то списком.

Что-то вроде:

<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" />

у вас будет класс Book , содержащий ваши 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, который возвращает класс Contained для привязки:

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

наконец, у вас будет параметр @ModelAttribute для метода отображения вашего запроса:

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

}

весна автоматически добавит столько книг в ваш список, сколько вам нужно.

1 голос
/ 26 апреля 2011

Может ли ваше сопоставление запроса контроллера просто взять пружину 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;
    }
}    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...