[RESOLVIDO] Padrão para navegação menu JSF 2.0

Olá amigos,

Estou usando menu do primefaces e desde então me surgiu uma dúvida e algumas dores de cabeça.
Qual é a maneira mais adequada de se utilizar navegação através de menu em JSF, pela action ou pela URL?

A minha estrutura é a seguinte:

/WEB-INF
/template/template-cadastro.xhtml
/pages/…

O menu fica no meu template e está da seguinte maneira:

<p:menubar id="menubar">
     <p:submenu label="Configuração">
          <p:menuitem value="Usuários" url="pages/usuario.xhtml" />
          <p:menuitem value="Grupo de Pessoa" url="pages/grupo-pessoa.xhtml" />
     </p:submenu>
</p:menubar>

Eu não sei como a url deve ser informada no atributo do p:menuitem, algumas vezes o navegador exibe o endereço do menu como:

localhost:8080/Trinus/faces/pages/usuario.xhtml (que é o correto)
localhost:8080/Trinus/faces/pages/pages/usuario.xhtml (as vezes duplica o diretório “pages”)
localhost:8080/Trinus/pages/pages/usuario.xhtml (as vezes some com o “/faces/” da URL)

Usar action seria inviável pelo fato do menu ficar no template? De qualquer página eu posso ir para qualquer outra.
Eu teria que ter diversas navigation-rule.

Sinceramente, não sei qual a solução ideal para navegação em uma aplicação JSF.

Eu fiz assim

&lt;p:submenu label="Cadastros" icon="ui-icon-document" rendered="#{usuarioLogadoController.userIsAdministrator()}" &gt;
                        &lt;p:menuitem value="Cadastrar Cargo" url="/faces/paginas/cadastros/cadCargo.xhtml" /&gt;
                        &lt;p:separator /&gt;
                        &lt;p:menuitem value="Cadastrar Município" url="/faces/paginas/cadastros/cadMunicipio.xhtml" /&gt;
                        &lt;p:separator /&gt;
                        &lt;p:menuitem value="Cadastrar Estado" url="/faces/paginas/cadastros/cadEstado.xhtml" /&gt;
                        &lt;p:separator /&gt;
                        &lt;p:menuitem value="Cadastrar Combustível" url="/faces/paginas/cadastros/cadCombustivel.xhtml" /&gt;
                        &lt;p:separator /&gt;
                        &lt;p:menuitem value="Cadastrar Funcionário" url="/faces/paginas/cadastros/cadFuncionario.xhtml" /&gt;
                        &lt;p:separator /&gt;
                        &lt;p:menuitem value="Cadastrar Usuário" url="/faces/paginas/cadastros/cadUsuario.xhtml" /&gt;
                        &lt;p:separator /&gt;
                        &lt;p:menuitem value="Cadastrar Tido de Veículo" url="/faces/paginas/cadastros/cadTipoVeiculo.xhtml" /&gt;
                        &lt;p:separator /&gt;
                        &lt;p:menuitem value="Cadastrar Veículo" url="/faces/paginas/cadastros/cadVeiculo.xhtml" /&gt;
                        &lt;p:separator /&gt;
                        &lt;p:menuitem value="Cadastrar Rota" url="/faces/paginas/cadastros/cadRota.xhtml" /&gt;
                        &lt;p:separator /&gt;
                        &lt;p:menuitem value="Cadastrar Marca" url="/faces/paginas/cadastros/cadMarca.xhtml" /&gt;
                        &lt;p:separator /&gt;
                        &lt;p:menuitem value="Cadastrar Modelo" url="/faces/paginas/cadastros/cadModelo.xhtml" /&gt;
                    &lt;/p:submenu&gt;

[quote=Sergio Possari]Olá amigos,

Estou usando menu do primefaces e desde então me surgiu uma dúvida e algumas dores de cabeça.
Qual é a maneira mais adequada de se utilizar navegação através de menu em JSF, pela action ou pela URL?

A minha estrutura é a seguinte:

/WEB-INF
/template/template-cadastro.xhtml
/pages/…

O menu fica no meu template e está da seguinte maneira:

<p:menubar id="menubar">
     <p:submenu label="Configuração">
          <p:menuitem value="Usuários" url="pages/usuario.xhtml" />
          <p:menuitem value="Grupo de Pessoa" url="pages/grupo-pessoa.xhtml" />
     </p:submenu>
</p:menubar>

Eu não sei como a url deve ser informada no atributo do p:menuitem, algumas vezes o navegador exibe o endereço do menu como:

localhost:8080/Trinus/faces/pages/usuario.xhtml (que é o correto)
localhost:8080/Trinus/faces/pages/pages/usuario.xhtml (as vezes duplica o diretório “pages”)
localhost:8080/Trinus/pages/pages/usuario.xhtml (as vezes some com o “/faces/” da URL)

Usar action seria inviável pelo fato do menu ficar no template? De qualquer página eu posso ir para qualquer outra.
Eu teria que ter diversas navigation-rule.

Sinceramente, não sei qual a solução ideal para navegação em uma aplicação JSF.[/quote]

No seu web.xml deve ser assim:

<servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param>

e você deve ajustar seu código para ser utilizado da seguinte forma:

<p:menubar id="menubar"> <p:submenu label="Configuração"> <p:menuitem value="Usuários" url="usuario.jsf" /> <p:menuitem value="Grupo de Pessoa" url="grupo-pessoa.jsf" /> </p:submenu> </p:menubar>

trocado pages/usuario.xhtml para usuario.jsf

A URL voce deve utilizar para redirecionar para um página diretamente, já utilizando a action você pode embutir algum procedimento de programação antes de redirecionar para a próxima página. Como por exemplo verificar a permissão, e outros. Aí vai da sua lógica.

Vou realizar alguns testes e já posto o resultado…

Obrigado desde já!

[quote=Sergio Possari]Olá amigos,

Estou usando menu do primefaces e desde então me surgiu uma dúvida e algumas dores de cabeça.
Qual é a maneira mais adequada de se utilizar navegação através de menu em JSF, pela action ou pela URL?

A minha estrutura é a seguinte:

/WEB-INF
/template/template-cadastro.xhtml
/pages/…

O menu fica no meu template e está da seguinte maneira:

<p:menubar id="menubar">
     <p:submenu label="Configuração">
          <p:menuitem value="Usuários" url="pages/usuario.xhtml" />
          <p:menuitem value="Grupo de Pessoa" url="pages/grupo-pessoa.xhtml" />
     </p:submenu>
</p:menubar>

Eu não sei como a url deve ser informada no atributo do p:menuitem, algumas vezes o navegador exibe o endereço do menu como:

localhost:8080/Trinus/faces/pages/usuario.xhtml (que é o correto)
localhost:8080/Trinus/faces/pages/pages/usuario.xhtml (as vezes duplica o diretório “pages”)
localhost:8080/Trinus/pages/pages/usuario.xhtml (as vezes some com o “/faces/” da URL)

Usar action seria inviável pelo fato do menu ficar no template? De qualquer página eu posso ir para qualquer outra.
Eu teria que ter diversas navigation-rule.

Sinceramente, não sei qual a solução ideal para navegação em uma aplicação JSF.[/quote]

Eu particulamente aconselho a fazer através de action, pois com a action como o Ileos mencionou você pode definir procedimentos, críticas e etc…

amigos, a solução proposta pelo lleos até funcionou, mas não do jeito que eu esperava.

Essa é a minha estrutura de pastas:

Páginas Web
/WEB-INF
/template/template-cadastro.xhtml
/pages/…
/cadastros/
/index.xhtml

Este é meu web.xml:

    <context-param>  
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>  
        <param-value>.xhtml</param-value>  
    </context-param>  
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsf</welcome-file>
    </welcome-file-list>

Notem que a página inicial é o index.xhtml que não está dentro do diretório pages.
Se eu tento acessar outras páginas pela url usuario.jsf, o browser não inclui o diretório “pages” na URL, o “pages” apenas aparece na URL se eu tentar acessar de uma página que esteja dentro do diretório “pages”.

Uma pergunta, todas as minhas pastas devem estar sempre no mesmo diretório?
Ou existe alternativas para isso?

[quote=Sergio Possari]amigos, a solução proposta pelo lleos até funcionou, mas não do jeito que eu esperava.

Essa é a minha estrutura de pastas:

Páginas Web
/WEB-INF
/template/template-cadastro.xhtml
/pages/…
/cadastros/
/index.xhtml

Este é meu web.xml:

    <context-param>  
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>  
        <param-value>.xhtml</param-value>  
    </context-param>  
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsf</welcome-file>
    </welcome-file-list>

Notem que a página inicial é o index.xhtml que não está dentro do diretório pages.
Se eu tento acessar outras páginas pela url usuario.jsf, o browser não inclui o diretório “pages” na URL, o “pages” apenas aparece na URL se eu tentar acessar de uma página que esteja dentro do diretório “pages”.

Uma pergunta, todas as minhas pastas devem estar sempre no mesmo diretório?
Ou existe alternativas para isso?
[/quote]
não precisa colocar todas as paginas ma mesma pasta apenas é necessário dizer qual a pasta na propria action assim:

<p:menuItem action="/pages/usuario" value="Usuarios" />

Lembrando que no JSF 2.0 não é necessário colocar a extensão da pagina pois ele já identifica pelo mapeamento do servlet e verifica qual pagina tem o mesmo nome.

Amigos a solução abaixo, proposta pelo santgoss, funcionou pra mim.

um abraço!

[quote=satangoss][quote=Sergio Possari]amigos, a solução proposta pelo lleos até funcionou, mas não do jeito que eu esperava.

Essa é a minha estrutura de pastas:

Páginas Web
/WEB-INF
/template/template-cadastro.xhtml
/pages/…
/cadastros/
/index.xhtml

Este é meu web.xml:

    <context-param>  
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>  
        <param-value>.xhtml</param-value>  
    </context-param>  
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsf</welcome-file>
    </welcome-file-list>

Notem que a página inicial é o index.xhtml que não está dentro do diretório pages.
Se eu tento acessar outras páginas pela url usuario.jsf, o browser não inclui o diretório “pages” na URL, o “pages” apenas aparece na URL se eu tentar acessar de uma página que esteja dentro do diretório “pages”.

Uma pergunta, todas as minhas pastas devem estar sempre no mesmo diretório?
Ou existe alternativas para isso?
[/quote]
não precisa colocar todas as paginas ma mesma pasta apenas é necessário dizer qual a pasta na propria action assim:

<p:menuItem action="/pages/usuario" value="Usuarios" />

Lembrando que no JSF 2.0 não é necessário colocar a extensão da pagina pois ele já identifica pelo mapeamento do servlet e verifica qual pagina tem o mesmo nome.[/quote]