2011-10-06 14 views
5

Desidero eseguire più azioni su diversi bean gestiti con lo stesso pulsante, uno con sessione scoped e l'altra richiesta. Nel mio esempio uso lo stesso bean per entrambi.Bean gestito con scope della sessione e actionListener

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

Quando si preme il tasto il conteggio aumenta di 1, invece di 1001, e crea un nuovo bean. Che cosa ho fatto di sbagliato ?

Grazie.

risposta

7

Questo è il comportamento previsto. Il <f:actionListener type> crea e ottiene la propria istanza di bean su ogni dichiarazione. Non riutilizza lo stesso bean con scope di sessione gestito da JSF.

È necessario utilizzare binding per collegarsi all'istanza del bean con ambito sessione già creato.

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

Ma ovviamente, grazie! – ThzChz

+0

Prego. – BalusC

Problemi correlati