1

Collection を Spring MVC のフォームにバインドしようとしてもうまくいかない理由を教えてください。

これが私のオブジェクトの外観です-

public class TestObj {
   private Integer testNumber;
   private String home;
   private String destination;
}

上記のオブジェクトのリストを含む私のフォームオブジェクトは次のとおりです-

public class TestForm {
   private List<TestObj> testList;
   //contains getter and setter for testList
}

私のコントローラーでは、 formBackingObject メソッドを実装しました -

public class MyController extends SimpleFormController {

    public MyController() {
        setCommandClass(TestForm.class);
        setCommandName("testForm");
    }

        protected Object formBackingObject(HttpServletRequest request) throws Exception {
           if (isFormSubmission(request)) {
              testForm = (TestForm) super.formBackingObject(request);
              //THIS ALWAYS RETURNS NULL ON FORM SUBMISSION 
              List<TestObj> testList = testForm.getTestList();
           } else {
              //load initial data using hibernate. TestObj is hibernate domain object.
              List<TestObj> testList = myService.findTestList();
              testForm = new TestForm(testList);
           }
           return testForm;
        }

これが私のJSPスニペットです-

<form:form commandName="testForm" method="post">
   <c:forEach items="${testForm.testList}" var="testvar" varStatus="testRow">
     <tr>
       <td>
          <form:hidden path="testList[${testRow.index}].home" />
          <c:out value="${testvar.home}" />
    </td>
    <td>
      <form:input path="testList[${testRow.index}].destination" />
    </td>
     </tr>
   </c:forEach>
   <tr><td><input type="submit"></td></tr>
</form:form>

初めてデータをロードしたときはフォームに問題なく表示されますが、送信ボタンを押すと、コントロールは formBackingObject メソッドに移動し、isFormSubmission は true を返します。ただし、super.formBackingObject(request) を使用してコマンド オブジェクトを取得すると、testList 値が null のフォーム オブジェクトが返されます。この単純なケースが機能しない理由を理解できませんか?

これを機能させるための助けに本当に感謝します。

4

3 に答える 3

0

formBackingObject メソッドの理解が間違っているに違いないと思います。そのメソッドを実装から削除し、最初のフォームの読み込みに referenceData を使用し、送信時に処理するために onSubmit を使用しました。これは正常に機能し、期待どおりにフォームのコレクションを取得します。

でも助けてくれてありがとう。

于 2012-05-14T16:17:17.310 に答える
0

Spring 3を使用していますか?もしそうなら、この投稿を見てください。

リスト処理とオブジェクト バインディングに関しては、この投稿をご覧ください。

于 2012-05-14T04:02:56.667 に答える
0

次のコードを使用してみてください。それがあなたの問題を解決できるかもしれません。

private List<TestObj> operationParameterses = LazyList.decorate(new ArrayList<TestObj>(), FactoryUtils.instantiateFactory(TestObj.class));

すべての null リストを返すわけではありません。

お役に立てば幸いです。

乾杯。

于 2012-05-14T05:32:23.497 に答える