Pessoal , gostaria de saber se há como criar um menu dinâmico em JSF igual a essa imagem que está anexa.
Na verdade aqui eu criei um table e coloquei várias colunas , mas o ele trabalha com linhas.
Obrigado
Marco Aurélio
Usando somente os componentes do JSF padrão você terá que criar-los na “mão”, agora se quiser pode usar há vários…
Tomahawk
RichFaces
IceFaces
Que já possuem um componente menu.
Valeu , vou dar uma pesquisada no Rich
Já usei esse Menu dessa forma e funcionou:
rich:toolBar
<rich:dropDownMenu value=“Grupo 1”>
<rich:menuItem submitMode="ajax"
onclick="document.location.href=’/indicador/VisualizarIndicador.seam?idIndicador1"
value=“Indicador 1”/>
<rich:menuItem submitMode="ajax"
onclick="document.location.href=’/indicador/VisualizarIndicador.seam?idIndicador2"
value=“Indicador 2”/>
</rich:dropDownMenu>
<rich:dropDownMenu value=“Grupo 2”>
<rich:menuItem submitMode="ajax"
onclick="document.location.href=’/indicador/VisualizarIndicador.seam?idIndicador3"
value=“Indicador 3”/>
<rich:menuItem submitMode="ajax"
onclick="document.location.href=’/indicador/VisualizarIndicador.seam?idIndicador4"
value=“Indicador 4”/>
</rich:dropDownMenu>
</rich:toolBar>
![]()
Mas gostaria que ele fosse criado dinâmicamente, pois dependendo do usuário o menu é diferente.
Tentei fazer dessa forma e não funcionou:
<a>rich:toolBar</a>
<a:repeat value="#{menuAction.gruposDisponiveis}" var="_grupo">
<rich:dropDownMenu value="#{_grupo.nome}">
<a:repeat value="#{_grupo.indicadors}" var="_indicador">
<rich:menuItem submitMode="ajax"
onclick=“document.location.href=’/indicador/VisualizarIndicador.seam?idIndicador=’+#{_indicador.id}“
value=”#{_indicador.nome}”/>
</a:repeat>
</rich:dropDownMenu>
</a:repeat>
<a>rich:toolBar</a>
![]()
Não está ficando lado a lado, parece que o toolbar reconhece como uma coisa só.
O maximo que chegei foi isso:
|
<rich:dropDownMenu value="#{_grupo.nome}"> <a:repeat value="#{_grupo.indicadors}" var="_indicador"> <rich:menuItem submitMode="ajax" onclick=“document.location.href=’/indicador/VisualizarIndicador.seam?idIndicador=’+#_indicador.id}“ value=”#{_indicador.nome}”/> </a:repeat> </rich:dropDownMenu> |

Ou seja, dessa forma fica lado a lado, mas o menuItem não é renderizado. 
Alguém pode me ajudar?
[]s DECOLORES
A solução encontrado foi:
<rich:toolBar rendered=“true”>
<c:forEach var="_grupo" items="#{menuAction.gruposDisponiveis}" varStatus=“loopGrupo”>
<rich:dropDownMenu value="#{_grupo.nome}">
<c:forEach items="#{_grupo.indicadors}" var="_indicador">
<rich:menuItem submitMode="ajax"
onclick=“document.location.href=’/indicador/VisualizarIndicador.seam?idIndicador=’+#{_indicador.id}“
value=”#{_indicador.nome}”/>
</c:forEach>
</rich:dropDownMenu>
</c:forEach>
</rich:toolBar>
Parece que o repeat não funciona entro de alguns componentes do RichFaces…
Nesse caso usa-se forEach.
O name space dele é:
xmlns:c=“http://java.sun.com/jstl/core”
[]s DECOLORES
opa boa tarde…
voce poderia postar como ficou seu managed bean?
abraço
No caso que citei uso o MenuAction:
nome=MenuAction.java
@Name(“menuAction”)
@Scope(ScopeType.CONVERSATION)
public class MenuAction implements Serializable {
private List<Grupo> gruposDisponiveis = null;
public List<Grupo> getGruposDisponiveis() {
return gruposDisponiveis;
}
public void setGruposDisponiveis(List<Grupo> gruposDisponiveis) {
this.gruposDisponiveis = gruposDisponiveis;
}
}
Obrigado!
Mas especificamente essa linha:
<c:forEach items="#{_grupo.indicadors}" var="_indicador">
de onde veio o atributo “indicadors” ?
Eu to levando uma surra pra fazer o submenu funcionar 
Veja se pode ajudar por favor… Eu estou fazendo um pouco diferente.
O primeiro nivel do menu eu consigo montar, os submenus é que não rodam. E ainda nem coloquei recursivo:
<rich:toolBarGroup itemSeparator="line">
<c:forEach var="menuraiz" items="#{MenuJSFBean.menuraiz}">
<rich:dropDownMenu>
<f:facet name="label">
<h:outputText value="#{menuraiz.cnmmenu}" />
</f:facet>
<c:forEach var="submenu" items="#{menuraiz}">
<rich:menuItem value="#{submenu.cnmmenu}"
icon="imagens/icones_menu/open.gif"
submitMode="ajax"
action=""/>
</c:forEach>
</rich:dropDownMenu>
</c:forEach>
</rich:toolBarGroup>
O managed bean:
public ArrayList<Menu> getMenuraiz() {
try{
Connection con = Conexao.getConnection();
Statement stmt = con.createStatement();
ResultSet resm = stmt.executeQuery("select pkmenu,cnmmenu from base.tbmenu where fkmenu = 0");
ArrayList<Menu>menuraiz = new ArrayList<Menu>();
while(resm.next()){
Integer pkmenuraiz = resm.getInt(1);
String cnmmenuraiz = resm.getString(2);
Menu objmenuraiz = new Menu();
objmenuraiz.setPkmenu(pkmenuraiz);
objmenuraiz.setCnmmenu(cnmmenuraiz);
menuraiz.add(objmenuraiz);
ArrayList<Menu>submenu = new ArrayList<Menu>();
Statement stsm = con.createStatement();
ResultSet ressm = stsm.executeQuery("select pkmenu,cnmmenu from base.tbmenu where fkmenu = "+pkmenuraiz);
while(ressm.next()){
Menu objsubmenu = new Menu();
objsubmenu.setPkmenu(ressm.getInt(1));
objsubmenu.setCnmmenu(ressm.getString(2));
submenu.add(objsubmenu);
}
objmenuraiz.setSubmenu(submenu);
}
return menuraiz;
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
Ja resolvi… Obrigado pelas dicas 
Eae amigo, como vc resolveu? POde postar??
Vlw
opa!
Amanha vou catar no trabalho e posto
abraço!
opa!
Amanha vou catar no trabalho e posto
abraço!
Posta ae… to precisando ver alguma coisa nesse sentido.
Vlw.
Opa! Segue abaixo:
Codigo do JSF
<h:form id="formAjax">
<rich:toolBar>
<rich:toolBarGroup itemSeparator="line">
<c:forEach var="menuraiz" items="#{MenuJSFBean.menuraiz}">
<rich:dropDownMenu>
<f:facet name="label">
<h:panelGroup>
<h:graphicImage id="iconeRaiz" url="imagens/icones_menu/copy.gif" styleClass="pic"/>
<h:outputText value="#{menuraiz.cnmmenu}" />
</h:panelGroup>
</f:facet>
<c:forEach var="sm" items="#{menuraiz.submenu}">
<rich:menuItem value="#{sm.cnmmenu}" submitMode="ajax" action="#{PEPControllerJSFBean.processarMenu}" icon="imagens/icones_menu/open.gif">
<f:setPropertyActionListener target="#{PEPControllerJSFBean.parametromenu}" value="#{sm.cnmaction}"/>
</rich:menuItem>
</c:forEach>
</rich:dropDownMenu>
</c:forEach>
</rich:toolBarGroup>
<rich:toolBarGroup location="right">
<span id="relogio" class="texto"></span> <img />
</rich:toolBarGroup>
</rich:toolBar>
</h:form>
Codigo do controlador JSF bean:
package controller.jsf;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Map;
import javax.faces.context.FacesContext;
import model.base.Menu;
import model.base.Usuarios;
import utils.db.Conexao;
public class MenuController{
public ArrayList<Menu> getMenuraiz() {
Connection con = null;
try{
con = Conexao.getConnection();
Statement stmt = con.createStatement();
ResultSet resm = stmt.executeQuery("select pkmenu,cnmmenu from base.tbmenu where fkmenu = 0");
ArrayList<Menu>menuraiz = new ArrayList<Menu>();
Map<String,Object>sessaoAtiva = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
Usuarios usuario;
usuario = (Usuarios) sessaoAtiva.get("sessao");
while(resm.next()){
Integer pkmenuraiz = resm.getInt(1);
String cnmmenuraiz = resm.getString(2);
Menu objmenuraiz = new Menu();
objmenuraiz.setPkmenu(pkmenuraiz);
objmenuraiz.setCnmmenu(cnmmenuraiz);
menuraiz.add(objmenuraiz);
ArrayList<Menu>submenu = new ArrayList<Menu>();
objmenuraiz.setSubmenu(submenu);
Statement stsm = con.createStatement();
// O grupo default é o grupo "LOGOFF"
// Esse grupo irá exibir o menu incompleto
Integer pkgrupo = 4;
if(usuario != null){
pkgrupo = usuario.getGrupo().getPkgrupo();
}
ResultSet ressm = stsm.executeQuery("select pkmenu,cnmmenu,cnmaction from base.tbmenu menu inner join base.tbgrupos_has_tbmenu grupos_menu on menu.pkmenu = grupos_menu.fkmenu inner join base.tbgrupos grp on grupos_menu.fkgrupo = grp.pkgrupo where menu.fkmenu = "+pkmenuraiz+" and grp.pkgrupo = "+pkgrupo);
while(ressm.next()){
Menu objsubmenu = new Menu();
objsubmenu.setPkmenu(ressm.getInt(1));
objsubmenu.setCnmmenu(ressm.getString(2));
objsubmenu.setCnmaction(ressm.getString(3));
submenu.add(objsubmenu);
}
}
return menuraiz;
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
finally{
Conexao.closeConnection(con);
}
return null;
}
}
faces-config.xml
<managed-bean>
<managed-bean-name>MenuJSFBean</managed-bean-name>
<managed-bean-class>controller.jsf.MenuController</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
Outra coisa, tenha certeza de ter as ultimas libs para o JSTL. Pega a JSTL 1.2 e voce nao vai precisar daquela standard.jar.
Um bug maléfico nesse menu so foi resolvido assim.
Veja este exemplo:
http://benignosales.wordpress.com/2010/10/02/menu-dinamico-jsf-2-0-primefaces/
espero ter ajudado.
Benigno, sobre este seu artigo, vc nao teria os fontes para download ?