4
respostas

Ciclo JSF

Como identificar se uma Pagina JSF esta sendo carregada pela primeira vez ou se esta sendo exibida apos alguma transmissão?

4 respostas

Isto é como saber se uma requisição feita a fase RESTORE VIEW é uma requisição inicial e não de uma pagina já existente que foi transmitida ?

Olá,

Abaixo um pequeno código que mostra o nome da view e a quantidade de vezes que foi chamada:

package org.jsfcontapaginas;

import java.util.HashMap;

import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

public class LifeCycleListener implements PhaseListener {
    private static final long serialVersionUID = 1L;

    private HashMap<String,Long> contaPagina = new HashMap<String,Long>();

    @Override
    public void afterPhase(PhaseEvent phaseEvent) {
        if(phaseEvent.getPhaseId() == getPhaseId()) {
            String viewId = phaseEvent.getFacesContext().getViewRoot().getViewId();
            if(contaPagina.containsKey(viewId)) {
                contaPagina.put(viewId, contaPagina.get(viewId)+1);
            }
            else {
                contaPagina.put(viewId, 1L);
            }

            for(String key:contaPagina.keySet()) {
                System.out.println(key + " : " + contaPagina.get(key));
            }
        }
    }

    @Override
    public void beforePhase(PhaseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }

}

Obrigada pela resposta. Como acessar contaPagina do Bean?

Olá,

A partir do JSF 2.2, o PhaseLinear é um target CDI, assim você pode injetar um bean dentro dele. Esse bean pode ter a lógica que citei acima. Por último, basta injetar esse bean em qualquer outro bean que você queira.

Referência: http://stackoverflow.com/questions/19930241/how-to-inject-in-a-phaselistener