Spring - лучший способ справиться с привязкой к списку bean-компонентов в простом контроллере формы - PullRequest
2 голосов
/ 12 марта 2009

Не задумываясь об этом, я делал что-то вроде следующего:

1) построение списка объектов SomeBean на основе результатов вызова базы данных

2) поместить этот список в объект моей команды

3) построение формы на основе этого объекта команды, где пользователи могут изменять атрибуты SomeBeans

4) извлечение данных из объекта команды после отправки и запись обновленных данных в мою базу данных

Мой код выглядит примерно так:

public class UpdateThingsinListController extends SimpleFormController {

    protected Object formBackingObject(final HttpServletRequest request)
          throws Exception {

    List<SomeBean> beans = database.getBeans();

    Command comamnd = new UpdateThingsCommand()
    command.setList(beans);

    return command;

  }

   protected ModelAndView onSubmit(final HttpServletRequest request,
          final HttpServletResponse response, final Object commandArg,
          final BindException errors) throws Exception {

    database.setBeans(commandArg.getList());        

   }


}

мой JSP выглядит примерно так:

<form:form>
    <c:forEach var="bean" items="${beans}" varStatus="status">
        <form:checkbox path="beans[${status.index}].someBooleanProperty" />${bean.name} <br>    
    </c:forEach>
</form:form>

Код работает нормально, но до меня дошло, что мой список "бобов" создается дважды (в моем случае сессия должна иметь значение false) - один раз при отображении формы, один раз при привязке. Если что-то изменится во втором создании (боб отсутствует, результаты в другом порядке), моя привязка испортится, и меня уволят. Я начинаю думать, что любая схема привязки, в которой объект команды должен быть объединен с отправкой формы, очень рискованна.

Итак, мой вопрос - как люди гарантируют, что представления формы будут правильно связаны со списками? Есть ли другой способ сделать это, кроме индекса списка? Может быть, идентификаторы объектов?

спасибо,

-Morgan

Ответы [ 3 ]

2 голосов
/ 27 октября 2011

Если для sessionForm задано значение false, то при отправке команда воссоздается в методе formBackingObject. Порядок списка в методе onSubmit будет точно таким же, как порядок связанных объектов на странице.

0 голосов
/ 16 марта 2009

Если вы не можете полагаться на то, что список всегда будет одинаковым при извлечении, тогда вам придется использовать другую коллекцию - карту.

Другим подходом было бы где-то кэшировать ваш список. Возможно, какой-то AOP вокруг вашего метода database.getBeans.

0 голосов
/ 13 марта 2009

Самый быстрый способ - сначала удалить все существующие SomeBeans из базы данных и создать те, которые связаны при отправке.

Более элегантный способ - поместить уникальный идентификатор SomeBean в скрытое поле формы.

...