Dúvida sobre navegação JSF

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

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.

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

[quote=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[/quote]

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

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:

[code]public class SeuBean {

private String painelRenderizado;

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

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

private String renderizarPainel2() {
      painelRenderizado = 'PAINEL2';
}

}
[/code]

<!-- 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

[quote=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:

[code]public class SeuBean {

private String painelRenderizado;

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

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

private String renderizarPainel2() {
      painelRenderizado = 'PAINEL2';
}

}
[/code]

<!-- 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[/quote]

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

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

[quote=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
[/quote]

Entendi, obrigado

Eli Flávio Bortolotte