Scopo de sessão no JSF

Pessoal, uso sempre o viewScoped, por um motivo da carregamento de imagens precisei usar o sessionScoped.

Problema : sempre chamo metodos no contrutor do viewScoped, desta forma sempre ao acessar a pagina o construtor é chamado, ja no sessionScoped o construtor só é chamado novamente quando a sessão acaba assim gostaria de chamar um metodo sempre que a pagina for carregada no sessionScoped…

Alguem tem alguma ideia?

Obrigado

Olá,

Voce pode simplesmente fazer com que sua action do seu componente na tela chame um metodo específico do seu ManagedBean, assim independente do escopo que estiver trabalhando, aquele metodo será sempre chamado por causa da navegação, ou seja, sempre que carregar a tela, o método será invocado.

Abraços
Daniel.

Tinha imaginado algo parecedo, mais não sei como fazer…

tem algum exemplo?

valews

Segue exemplo:

<h:form> <h:commandButton action="#{pageController.moveToPage2}" value="Move to page2.xhtml by managed bean" /> </h:form>[code]
@ManagedBean
@SessionScoped
public class PageController implements Serializable {

public String moveToPage2(){
    return "page2"; //outcome
}

}[/code]fonte : http://www.mkyong.com/tutorials/jsf-2-0-tutorials/

Abraços,
Daniel

assim não funciona,

é o seguinte eu tenho um pagina com sessiionScoped…

eu acesso essa pagina de uma ação da pagina menu…

tenho um ação no menu que chama


    public String irPagina() {
             return "pagina";
    }

no meu construtor do MB tem um metodo que precisa ser chamado sempre que carrega a pagina…porem com sessionScoped o constrututor não é acionado

não intendi p que vc quis fazer

isso funcionava se vc viewScoped

Oi,

Voce não pode fazer simplesmente isso?

public String irPagina() { metodoQuePrecisaSerChamado(); return "pagina"; }

Resolvi


    public String irVisualizacaoAlbum() {
        FacesContext faces = FacesContext.getCurrentInstance();
        AlbumVisualizacaoMB av = (AlbumVisualizacaoMB) faces.getApplication().getVariableResolver().resolveVariable(faces, "albumVisualizacaoMB");
        av.buscarAlbunsDoCliente();
        return "visualizacaoAlbum";
    }

é que não tinha tido a luz de instaciar o MB rsrs

valew cara

Oi,

Voce não precisa instanciar o MB, o Container que fica como responsável por fazer as devidas injeçoes de dependencia, pois asim voce retira o controle do container nesse ponto, diminuindo a coesão do metodo e amarrando seu codigo.

Agora acho que entendi melhor, pois não tinha visto seu codigo por completo, esse metodo irVisualizacaoAlbum() está em um MB reponsavel pelo menu, é isso?

Se for basta voce mudar na propria pagina do menu na action ficaria algo assim : #{meuMBSessionScoped.buscarAlbunsDoCliente} e nesse metodo buscarAlbunsDoCliente() fazer o retorno para a pagina correspondente.

Abraços
Daniel.

"Agora acho que entendi melhor, pois não tinha visto seu codigo por completo, esse metodo irVisualizacaoAlbum() está em um MB reponsavel pelo menu, é isso?
"

correto

“Se for basta voce mudar na propria pagina do menu na action ficaria algo assim : #{meuMBSessionScoped.buscarAlbunsDoCliente} e nesse metodo buscarAlbunsDoCliente() fazer o retorno para a pagina correspondente”

eu tenho varias chamadas pra essa pagina… e todas centraliza naquele metodo

se eu fazer isso vou teque colocar esta logica na aplicacao inteira

Oi,

Isso infelizmente demonstra uma grande fragilidade no seu aplicativo, pois se voce alterar alguma coisa nesse metodo, acaba por comprometer todo o resto.

Se cada MB seu fosse responsavel por carregar a sua propria pagina, isso não aconteceria :slight_smile:

Abraços
Daniel.

Cada MB é responsavem pra carregar as resposabilidade , porem os controle de redirecionamento fica no MenuMB

Veja se é a melhor solução para o seu caso mas pode chamar um evento ao carregar a página assim:

<f:metadata> <f:event type="postAddToView" listener="#{menusMB.verificaPermissao(35, '2')}"/> // Verifica permissão <f:viewParam name="id" value="#{pedidoMB.pedido}" converter="convertePedido"/> // Seta valor ao pedido já ao carregar a página </f:metadata>