2012-05-14 2 views
1

Может кто-то, пожалуйста, помогите мне узнать, почему моя попытка связать коллекцию с формой Spring MVC не работает?Bind Collection to Form - почему он не работает?

Вот как мой объект выглядит -

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. Я не могу понять, почему этот простой случай не работает?

Я по-настоящему признателен за любую помощь в ее работе.

ответ

0

Я думаю, что мое понимание метода formBackingObject должно быть неправильным. Я удалил этот метод из реализации, использовал referenceData для начальной загрузки формы и onSubmit, чтобы обработать его при отправке. Это отлично работает и действительно возвращает коллекцию в форме назад, как ожидалось.

Спасибо всем за помощь.

0

Вы используете пружину 3? Если это так, вы должны взглянуть на this post.

Что касается обработки списка и привязки объектов, взгляните на this post.

+0

Благодарим за ответ. Я просто взял приложение, которое использует Spring 2.0, поэтому еще не в состоянии использовать любую из функций Spring 3.0+. Я также просмотрел вторую ссылку, которую вы разместили в отношении привязки, и нашел использование AutoPopulatingList из другой ссылки, упомянутой там. Тем не менее, это все равно не помогает, так как я получаю список со всеми нулями. – JUG

+0

Мой опыт - исключительно с весны 3. Я немного поработаю, чтобы посмотреть, смогу ли я помочь дальше, но, надеюсь, кто-то еще ответит за вас ради вас! :) – skel625

0

Попробуйте использовать следующий код. Может быть, это может решить вашу проблему.

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

Он не вернет вам нулевой список.

Надеюсь, что вам поможет.

Cheers.

+0

Для этого вам также понадобится ** библиотека коллекций **. –

+0

Спасибо за ваше предложение. Я собираюсь попробовать. Вы предлагаете поместить его в TestForm в свой код, чтобы инициализировать testList с помощью выше кода? – JUG

+0

Это все еще не сработало. Я не понимаю, почему элементы в форме не отображаются. Форма TestForm не возвращается null, но List внутри всегда имеет значение null для submit. Я подозреваю, что сеттер на submit не устанавливает элементы из JSP в форму. У меня заканчивается мысль об этом, почему он этого не делает. – JUG