Добавить элементы в список в запросе Scoped Bean
У меня есть бэк-бин следующим образом:
@Named
@RequestScoped
public class ClientNewBackingBean {
@Inject
private ClientFacade facade;
private Client client;
Client
класс имеет List<Child> childrenList
атрибут, среди других. Я могу создать новый Client
при настройке childrenList
с new ArrayList()
,
В представлении у меня есть поле ввода текста и Add Child
кнопка. Кнопка имеет атрибут actionListener=#{clientNewBackingBean.addChild()}
реализовано как:
public void addChild() {
if(client.getChildrenList() == null) {
client.getChildrenList(new ArrayList());
}
Child c = new Child("John Doe");
client.getChildrenList().add(c);
}
Каждый раз Add Child
нажата кнопка, бин воссоздается, и в представлении отображается только один ребенок John Doe (я полагаю, что он является областью действия запроса). Есть ли другой способ решения этой проблемы, кроме изменения области действия компонента на Session?
2 ответа
Если вы использовали стандартную аннотацию управления компонентами JSF @ManagedBean
, вы могли бы решить это, просто поместив компонент в область видимости, @ViewScoped
,
@ManagedBean
@ViewScoped
public class ClientNewBackingBean implements Serializable {
@EJB
private ClientFacade facade;
// ...
В CDI @ViewScoped
однако не существует, ближайшая альтернатива @ConversationScoped
, Вы только должны начать и остановить это самостоятельно.
@Named
@ConversationScoped
public class ClientNewBackingBean implements Serializable {
@Inject
private Conversation conversation;
// ...
@PostConstruct
public void init() {
conversation.begin();
}
public String submitAndNavigate() {
// ...
conversation.end();
return "someOtherPage?faces-redirect=true";
}
}
Вы также можете использовать расширение CDI MyFaces CODI, которое прозрачно соединит JSF @ViewScoped
аннотация для правильной работы вместе с @Named
:
@Named
@ViewScoped
public class ClientNewBackingBean implements Serializable {
@Inject
private ClientFacade facade;
// ...
Альтернативой CODI является использование @ViewAccessScoped
который действует до тех пор, пока последующие запросы ссылаются на один и тот же управляемый компонент независимо от используемого файла физического представления.
@Named
@ViewAccessScoped
public class ClientNewBackingBean implements Serializable {
@Inject
private ClientFacade facade;
// ...
Смотрите также:
Если вы используете JSF 2, вы должны использовать ViewScoped
боб.