34

クラス があるとします。インスタンスPersonのリストを作成し、このリストを に追加します。PersonModel

List<Person> persons = new ArrayList<Person>();
model.addAttribute("persons",persons);
return "savePersons";

Viewページにはフォームがあります:

<form:form method="post" action="savePerson" modelAttribute="persons">
    <c:forEach var="person" items="${persons}">
        <form:input path="person.FName" name="FName" id="FName" value="" />
        <form:input path="person.LName" name="LName" id="LName" value="" />
    </c:forEach>

    <button type="submit"></button>
</form:form>

Person List送信ボタンをクリックすると、コントローラーの POST メソッドにバインドしたい..

@RequestMapping(value = { "savePerson" }, method = RequestMethod.POST)
public String savePerson(Model model, HttpServletRequest request,
        HttpSession session,@ModelAttribute("persons")List<Person> persons) {
    System.out.println(persons.length);
    return "success";
}

しかし、リストはメソッドpersonsでバインディング/フェッチしていません。POST

この方法でリスト オブジェクトをバインドすることは可能ですか、またはこれに代わるものはありますか?

4

2 に答える 2

53

このリンクは、あなたがやろうとしていることを設定するのに役立つと思います:

http://viralpatel.net/blogs/spring-mvc-multi-row-submit-java-list/

フォームでは、次のように変更する必要があるようです。

<form:form method="post" action="savePerson" modelAttribute="persons">
    <c:forEach var="person" items="${persons}" varStatus="status">
        <form:input path="person[${status.index}].FName" name="FName" id="FName" value="" />
        <form:input path="person[${status.index}].LName" name="LName" id="LName" value="" />
    </c:forEach>

この SO の質問にも役立つ良い例があります: List<Foo> as form backing object using spring 3 mvc, correct syntax?

于 2013-03-18T16:01:16.813 に答える
21

Shriが ssn771 answer に関するコメントで述べたように、バインディング リストが 256 を超えると、次のようなエラーが発生します。

org.springframework.beans.InvalidPropertyException : Bean クラス [com.app.MyPageListVO] の無効なプロパティ 'mylist[256]': プロパティ パス 'mylist[256]' の範囲外のインデックス。ネストされた例外は java.lang.IndexOutOfBoundsException: Index: 256, Size: 256 at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:830) at...

このエラーは、配列とコレクションの自動拡張を回避するための制限がデフォルトで 256 であるため発生しますが 、そのコントローラーOutOfMemoryErrorsで WebDataBinder の AutoGrowCollectionLimit プロパティを設定することにより、この制限を増やすことができます@InitBinder

コード:

@InitBinder
public void initBinder(WebDataBinder dataBinder) {
    // this will allow 500 size of array.
    dataBinder.setAutoGrowCollectionLimit(500);
}
于 2014-07-11T13:32:23.003 に答える