#session #jsf
#сессия #jsf
Вопрос:
Я хочу выполнить несколько действий с разными управляемыми компонентами с помощью одной и той же кнопки, один из которых является сеансом с привязкой, а другой запросом. В моем примере я использую один и тот же компонент для обоих.
index.xhtml
<h:form>
<p:commandButton image="ui-icon ui-icon-notice" action="#{controller.inc()}" update="result">
<f:actionListener type="controller.Controller" />
</p:commandButton>
</h:form>
<p:panel id="result">
#{controller.count}
</p:panel>
контроллер.Controller.java
@Named(value = "controller")
@SessionScoped
public class Controller implements ActionListener, Serializable
{
int count = 0;
public Controller(){
System.out.println("new");
}
public void inc(){
count = 1;
}
public int getCount(){
return count;
}
@Override
public void processAction(ActionEvent event) throws AbortProcessingException{
count = 1000;
}
}
Когда я нажимаю кнопку, количество увеличивается на 1 вместо 1001 и создает новый компонент. Что я сделал не так?
Спасибо.
Ответ №1:
Это ожидаемое поведение. <f:actionListener type>
Создает и получает свой собственный экземпляр компонента при каждом объявлении. Он не использует повторно тот же компонент с привязкой к сеансу, который управляется JSF.
Вместо этого вам нужно использовать binding
для привязки к уже созданному экземпляру компонента с привязкой к сеансу.
<f:actionListener binding="#{controller}" />