Estou tentando preencher um menu em tempo de execução. A melhor opção que achei foi com o <h:dataTable. O maior problema que estou tendo é como chamar o método para executar a ação. Cada opção de menu deverá apontar para um método diferente em tempo de execução. Estou postando a parte do meu código que carrega o menu. Alguém pode me dar uma dica.
<h4>Menu Principal</h4>
<ul>
<h:dataTable value="#{usuarioController.listaMenu}" var="lista">
<h:column>
<li>
<h:commandLink action="#{lista.funcionalidade.fuc_Acao}"> //como faço para invocar a ação aqui nesta parte do código???
<h:outputText value="#{lista.funcionalidade.fuc_Descricao}"/>
</h:commandLink>
</li>
</h:column>
</h:dataTable>
</ul>
Aqui eu uso o f:param. A cada iteração do h:dataTable coloco um f:param, assim consigo resgatar qual menu foi acessado através do FacesContext. Desta forma:
JSP
...
<h4>Menu Principal</h4>
<ul>
<h:dataTable value="#{usuarioController.listaMenu}" var="lista">
<h:column>
<li>
<h:commandLink action="#{lista.funcionalidade.fuc_Acao}">
<h:outputText value="#{lista.funcionalidade.fuc_Descricao}"/>
<f:param name="codigoMenu" value="${lista.codigoMenu}" /> //Assumi q cada item terá um código, somente para exemplo
</h:commandLink>
</li>
</h:column>
</h:dataTable>
</ul>
...
No ManagedBean
...
public String irParaMenu(){
//recupera o codigo do menu clicado
String parametro = FacesContext.getCurentInstance().getExternalContext().getRequestParameterMap().get("codigoMenu");
if("codigo1".equals(parametro)){
//Faz alguma coisa
}
else if("codigo2".equals(parametro)){
//Faz alguma coisa
}
else if("codigo3".equals(parametro)){
//Faz alguma coisa
}
}
...
Este é o método q eu uso para saber qual menu foi chamado!
Se alguém souber de alguma outra forma mais “bonitinha” de fazer isso, por favor descreva p/ a gente.
Acho que entendi a forma como você fez. Já pesquisei muito e não encontrei uma solução para atender esta necessidade. Pelo que eu vi na sua solução, a minha classa controladora usuarioController será a responsável por gerenciar todo a navegação inicial para as outras páginas. Acho que o método irParaMenu deve retornar uma string informando qual página deverá ser renderizada. É isto mesmo??? De qualquer forma, amanhã ou quarta-feira lá na empresa vou tentar implementar esta solução. Vou a postar a resposta aqui, de sucesso eu espero… De qualquer forma, muito obrigado pela ajuda. Até +
Conforme fiquei de postar o resultado aqui, o código funcionou corretamente. Consigo carregar o menu com as funcionalidades que somente o usuário logado tem permissão para ver, de acordo com a configuração de perfil, etc. Acho que foi uma solução simples e fácil de entender. Mais uma vez, obrigado pela ajuda…