Dúvida sobre navegação JSF

7 respostas
E

Fiz um teste de aplicação JSF com 2 páginas XHTML, cada uma com um botão apontando pra outra:

Inicio.xhtml

<h:form>

Resposta.xhtml

<h:form>

Porém, não estou entendendo o comportamento, quando clico no botão Acione o botão, a página Resposta.xhtml é aberta corretamente, porém, no link do browser aparece:
http://localhost:8080/Navegacao/faces/Inicio.xhtml

Quando clico no botão Voltar, a página Inicio.xhtml é aberta corretamente, porém, no link do browser aparece:
http://localhost:8080/Navegacao/faces/Resposta.xhtml

Por que ocorre esta inversão?

Eli Flávio Bortolotte

7 Respostas

Hebert_Coelho

Não é inversão.

O link fica sempre um atrás mesmo.

Caso você queira que fique sendo o atual, uma das soluções seria utilizar o redirect. Com ele o browser terá o link atualizado.

yorgan

Isso é mais uma, dentre várias outras, que não gosto no JSF.
O lifecycle dele não muda o link do browser.
Mas de qualquer forma, como JSF não trabalha mto bem com navegação por links html, isso é mais uma issue no ponto de vista estético do que funcional.
Resumindo: como a navegação é feita pelos componentes e o lifecycle dele consegue se entender bem com a renderização dos objetos, então o link é o de menos.
Se a sua preocupação é utilizar o sistema fazendo uso de URL’s, recomendo partir para um framework baseado em ações e não um baseado em componentes.

[]'s
Daniel

E

yorgan:
Isso é mais uma, dentre várias outras, que não gosto no JSF.
O lifecycle dele não muda o link do browser.
Mas de qualquer forma, como JSF não trabalha mto bem com navegação por links html, isso é mais uma issue no ponto de vista estético do que funcional.
Resumindo: como a navegação é feita pelos componentes e o lifecycle dele consegue se entender bem com a renderização dos objetos, então o link é o de menos.
Se a sua preocupação é utilizar o sistema fazendo uso de URL’s, recomendo partir para um framework baseado em ações e não um baseado em componentes.

[]'s
Daniel

Atualmente Eu uso EJB no backend com Flex no frontend e estou migrando para JSF. No Flex eu criava uma página só, e ia abrindo e fechando as janela dentro dela, sem precisar ficar recarregando. No JSF é possível ir carregando e destruindo componentes sem ficar recarregando a página?

Eli Flávio Bortolotte

yorgan

Então, como você já programou nos dois, percebeu que Flex e JSF tem características bem diferentes.
Mas o que você pode fazer é utilizar o atributo redenred das tags.
Exemplo:

Código no bean:
public class SeuBean {
   
    private String painelRenderizado;

    public SeuBean() {
          painelRenderizado = 'PAINEL1';
    }

    private String renderizarPainel1() {
          painelRenderizado = 'PAINEL1';
    }

    private String renderizarPainel2() {
          painelRenderizado = 'PAINEL2';
    }
  
}
<!-- primeiro painel -->
<h:panelGroup redered="seuBean.painelRenderizado == 'PAINEL1'">
    <h:form>
    <!-- aqui vão os componentes do primeiro panelGroup -->
    </h:form>
</h:panelGroup>

<!-- segundo painel -->
<h:panelGroup redered="seuBean.painelRenderizado == 'PAINEL2'">
    <h:form>
    <!-- aqui vão os componentes do segundo panelGroup -->
    </h:form>
</h:panelGroup>

Se você utilizar as tags do a4j e fizer o controle desses painéis, você terá a renderização da tela sem refresh de página.
Lembrando, esse é só uma idéia de como fazer. Existem outras formas, mas daí você adapta essa solução para o seu caso.

Obs: Sempre utilize a tag Code ao inserir código em um post no fórum =).

[]'s
Daniel

E
yorgan:
Então, como você já programou nos dois, percebeu que Flex e JSF tem características bem diferentes. Mas o que você pode fazer é utilizar o atributo redenred das tags. Exemplo: Código no bean:
public class SeuBean {
   
    private String painelRenderizado;

    public SeuBean() {
          painelRenderizado = 'PAINEL1';
    }

    private String renderizarPainel1() {
          painelRenderizado = 'PAINEL1';
    }

    private String renderizarPainel2() {
          painelRenderizado = 'PAINEL2';
    }
  
}
<!-- primeiro painel -->
<h:panelGroup redered="seuBean.painelRenderizado == 'PAINEL1'">
    <h:form>
    <!-- aqui vão os componentes do primeiro panelGroup -->
    </h:form>
</h:panelGroup>

<!-- segundo painel -->
<h:panelGroup redered="seuBean.painelRenderizado == 'PAINEL2'">
    <h:form>
    <!-- aqui vão os componentes do segundo panelGroup -->
    </h:form>
</h:panelGroup>

Se você utilizar as tags do a4j e fizer o controle desses painéis, você terá a renderização da tela sem refresh de página.
Lembrando, esse é só uma idéia de como fazer. Existem outras formas, mas daí você adapta essa solução para o seu caso.

Obs: Sempre utilize a tag Code ao inserir código em um post no fórum =).

[]'s
Daniel

Neste exemplo, supondo que inicialmente o Painel1 seja renderizado. Aí o usuário executa alguma ação em que eu queira esconder o Painel1 e exibir o Painel2. É possível fazer isto sem recarregar a página, apenas com chamadas de eventos AJAX?

Eli Flávio Bortolotte

yorgan

Exatamente.
O JSF 2.0 incorporou vários recursos Ajax, então é possível.
Agora, se você estiver usando a versão 1.2, terá que recorrer ao a4j, presente por exemplo no Richfaces.

[]'s
Daniel

E

yorgan:
Exatamente.
O JSF 2.0 incorporou vários recursos Ajax, então é possível.
Agora, se você estiver usando a versão 1.2, terá que recorrer ao a4j, presente por exemplo no Richfaces.

[]'s
Daniel

Entendi, obrigado

Eli Flávio Bortolotte

Criado 18 de novembro de 2011
Ultima resposta 19 de nov. de 2011
Respostas 7
Participantes 3