2011-10-06 17 views
5

Quiero realizar varias acciones en diferentes beans administrados con el mismo botón, una de las cuales es la sesión de ámbito y la otra solicitud. En mi ejemplo, uso el mismo bean para ambos.Session Beaded managed Bean y 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; 
    } 
} 

Al pulsar el botón de que el recuento se incrementa en 1, en lugar de 1001, y se crea un nuevo bean. Qué hice mal ?

Gracias.

Respuesta

7

Es el comportamiento esperado. El <f:actionListener type> crea y obtiene su propia instancia de bean en cada declaración. No reutiliza el mismo bean con ámbito de sesión administrado por JSF.

En su lugar, necesita utilizar binding para enlazar a la instancia ya creada de bean con ámbito de sesión.

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

Pero por supuesto, ¡gracias! – ThzChz

+0

De nada. – BalusC

Cuestiones relacionadas