Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > JSF


Автор: offmagic 11.7.2010, 18:21
Здравствуйте, помогите разобраться. Изучаю JSF. Есть форма. Есть Бин в который сохряняется всё из формы. Есть ещё один бин который хранит список всех сохранёных объектов.

Код

PersonSave.jsp
-------------------
Для краткости пропустил все элементы формы
...
<h:commandButton action="success" value="Add this person" actionListener="#{listOfPerson.addPersonInList}">
<f:attribute name="user" value="#{person_save}" />
</h:commandButton>
...


#{person_save} - соответственно бин который хранит только что введённую информацию
#{listOfPerson} бин который хранит все сохраннёые объекты. Код класса вот такой:

Код

Persons.java
--------------------------
package www;
import java.util.ArrayList;

import javax.faces.event.ActionEvent;

public class PersonSave {
private ArrayList<Person> listOfPerson = new ArrayList<Person>();

public ArrayList<Person> getListOfPerson() {
return listOfPerson;
}

public void setListOfPerson(ArrayList<Person> listOfPerson) {
this.listOfPerson = listOfPerson;
}

public void addPersonInList(ActionEvent event){
Person p = (Person)event.getComponent().getAttributes().get("user");
listOfPerson.add(p);
}

}



Проблема в том что каждый раз в коллекции listOfPerson все элементы перезаписываются на тот бин который сохраняем тоесть получаем список из n-одинаковых элементов, хотя я только добавляю один элемент в конец - listOfPerson.add(p);

Код

facesconfig.xml
...
<managed-bean>
<managed-bean-name>person_save</managed-bean-name>
<managed-bean-class>www.Person</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

<managed-bean>
<managed-bean-name>listOfPerson</managed-bean-name>
<managed-bean-class>www.Persons</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
...

Автор: powerOn 11.7.2010, 21:25
Модератор: Название темы должно отражать ее суть!

Автор: SlavaSemushin 12.7.2010, 10:24
А разве в качестве значения actionListener не должен выступать класс, который реализцет одноимённый интерфейс с методом processAction()? Вот здесь есть пример: http://www.javabeat.net/tips/67-how-to-implement-actionlistener-factionlist.html

Если я правильно понял то, чего вы хотите, то я бы действовал иначе:
- сделал бы person_save request scope
- за'inject'ил бы в него listOfPerson
- все поля формы "прикрепил" бы к классу person_save
- в action подставил бы вызов метода, который бы вызывал метод из класса listOfPerson для добавления новой персоны и после этого возвращал строку для outcome

Автор: offmagic 12.7.2010, 11:02
Спасибо. Проблема решена. 
В ArrayList мы добавляем ссылку на бин. После изменения бина, соответсвенно все элементы которые уже в коллекции буду указать на новый бин.  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)