2011-10-06 8 views
5

Chcę wykonać wiele akcji na różnych zarządzanych komponentach bean za pomocą tego samego przycisku, z których jedna to sesja o ustalonym zakresie i drugie żądanie. W moim przykładzie używam tego samego komponentu dla obu.Sesja zarządzana o ograniczonej liczbie sesji i akcjaListener

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.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; 
    } 
} 

Po naciśnięciu przycisku zwiększa count o 1, a nie 1001, a tworzy nową Bean. Co zrobiłem źle ?

Dzięki.

Odpowiedz

7

To oczekiwane zachowanie. <f:actionListener type> tworzy i otrzymuje własną instancję bean dla każdej deklaracji. Nie używa ponownie tego samego komponentu o zakresie sesji, który jest zarządzany przez JSF.

Zamiast tego należy użyć binding, aby utworzyć powiązanie z już utworzoną instancją z zakresem o ograniczonym zakresie sesji.

<f:actionListener binding="#{controller}" /> 
+0

Ale oczywiście, dzięki! – ThzChz

+0

Nie ma za co. – BalusC

Powiązane problemy