Как добавить несколько экземпляров управляемых компонентов JSF 2 в коллекцию Java?

Я пытаюсь осмыслить некоторые основные концепции JSF 2. Например, если у меня есть управляемый компонент Bean1:

@ManagedBean
public class Bean1 {
    private String foo;
    private String bar;
}

а значения для foo и bar получены из веб-формы JSF. При каждой отправке веб-формы я хочу сохранить экземпляр Bean1 в коллекции Java другого компонента:

@ManagedBean
public class Bean2 {
    private List<Bean1> beanList;
}

Каков правильный способ добиться этого? Спасибо.


person holic87    schedule 17.08.2011    source источник


Ответы (2)


Сделайте Bean2 управляемым свойством Bean1, чтобы у вас был доступ к его свойству beanList.

@ManagedBean
public class Bean1 {
    private String foo;
    private String bar;

    @ManagedProperty("#{bean2}")
    private Bean2 bean2;

    public void submit() {
        bean2.getBeanList().add(this);
        // ...
    }

    // ...
}

(обратите внимание, что таким образом сохраняется только ссылка, а не клон состояния Bean1 или что-то в этом роде!)

Излишне говорить, что это дизайнерский запах. Вероятно, есть лучшие способы достижения конкретного функционального требования, которое вы имели в виду, задавая вопрос, но ничего не сказали. В будущем постарайтесь спрашивать, как решить функциональное требование, а не как найти решение (которое, в конце концов, может оказаться неправильным).

person BalusC    schedule 17.08.2011
comment
Спасибо, BalusC! Я буду помнить о вашем совете обращаться за конкретной помощью по требованиям в будущем. - person holic87; 17.08.2011

BalusC прав на 100%, но (как он предупреждает) его ответ будет бесполезен. Важным моментом здесь является то, что вам вообще не нужно и не нужно управлять вторым компонентом. Это ваша модель, а не ваш графический интерфейс. Вы, вероятно, хотели что-то вроде:

@ManagedBean
@ViewScoped
class PeopleHolder {
    private List<Person> people = new ArrayList<Person>();

    // not managed at all:
    private Person currentPerson;

    // just the getter, no need for a setter
    public Person getCurrentPerson() { return currentPerson; }

    @PostConstruct
    public init(){ currentPerson = new Person(); }

    public void addCurrentPersonToList() {
        people.add(currentPerson);
        init();
    }

    // just for test:
    public List<People> getPeople() { return people; }
}

а теперь форма:

<h:form>
   <h:inputText value="#{peopleHolder.currentPerson.name}" />
   <h:inputText value="#{peopleHolder.currentPerson.lastName}" />

   <h:commandButton action="#{peopleHolder.addCurrentPersonToList}" />
</h:form>
person fdreger    schedule 17.08.2011
comment
Я думаю, вы попали в самую точку относительно того, что действительно нужно OP :) - person BalusC; 18.08.2011