web-dev-qa-db-ja.com

オブジェクトのリストをビューに送信し、コントローラーのPostメソッドに戻す方法

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

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 to 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メソッドでバインド/フェッチしていません。

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

31
Amogh

このリンクは、あなたがしようとしていることをセットアップするのに役立つと思います:

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> Spring 3 mvcを使用したフォームバッキングオブジェクトとして、正しい構文?

51
ssn771

Shriがssn771の comment で述べたように、バインディングリストが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.getPrope rtyValue(BeanWrapperImpl.Java:830)at ...

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

コード:

@InitBinder
public void initBinder(WebDataBinder dataBinder) {
    // this will allow 500 size of array.
    dataBinder.setAutoGrowCollectionLimit(500);
}
17
Amogh