Что такое хороший способ делать многострочные обновления в стойках (с живыми стойками)? - PullRequest
0 голосов
/ 27 апреля 2009

Без использования DynaForm и его родственников.

Я хотел бы использовать объект передачи данных POJO, например, Person:

public class Person {
   private Long id;
   private String firstName;
   private String lastName;
   // ... getters / setters for the fields
}

В живой форме распорки у нас будет:

public class PersonUpdateForm extends SLActionForm {
   String organization;
   Person[] persons; // all the people will be changed to this organization; they're names and so forth can be updated at the same time (stupid, but a client might desire this)

   // getters / setters + index setters / getters for persons

}

Как должны выглядеть соответствующие теги html: text в JSP, чтобы разрешить это? Если я переключусь на поле Список лиц и использую список с отложенной загрузкой (в общих коллекциях), как это изменится?

Похоже, что в стойках нет хорошего способа сделать это (1.2?)

Вся помощь очень ценится !!! Если вам нужно больше контекста, дайте мне знать, и я могу предоставить некоторые.

1 Ответ

1 голос
/ 27 апреля 2009

Хорошо, я думаю, что понял это! Хитрость заключается в том, чтобы ваш индексированный геттер создавал элемент каждый раз, когда метод getPersons () вызывается методом populate объекта BeanUtils. Код еще не завершен, но я получил положительный результат. Сейчас 3:30, и я застрял на этом некоторое время. Казалось, никто не знает ответа, что заставляет меня хотеть ударить их по голове форелью. Что касается моего собственного невежества ... Я их только виню!

public List<Person> getPersons() {
   persons.add(new Person()); // BeanUtils needs to know the list is large enough
   return persons;
}

Конечно, добавьте и ваши индексированные геттеры и сеттеры.

Я помню, как я на самом деле сделал это. Вы должны предварительно инициализировать список лиц, указанный выше, до максимального размера, который вы планируете перевести. Это связано с тем, что сначала список преобразуется в массив, затем свойства устанавливаются для каждого элемента массива и, наконец, список отбрасывается с помощью setPersons (...). Следовательно, использование реализации отложенной загрузки List или аналогичного подхода (например, показанного выше) НЕ будет работать с живыми распорками. Вот что вам нужно сделать более подробно:

private List<Person> persons = new ArrayList<Person>(MAX_PEOPLE);
public MyConstructor() { for(int i = 0; i < MAX_PEOPLE; i++) persons.add(new Person()); }

public List<Person> getPeopleSubmitted() {
    List<Person> copy = new ArrayList<Person>();
    for(Person p : persons) {
        if(p.getId() != null) copy.add(p); 
        // id will be set for the submitted elements;
        // the others will have a null id
    }
    return copy; // only the submitted persons returned - not the blank templates
}

Это в основном то, что вы должны сделать! Но реальный вопрос - кто больше использует живые распорки?!

...