JSF - Menu Dinâmico

17 respostas
A

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


17 Respostas

D

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.

A

Valeu , vou dar uma pesquisada no Rich

P

http://livedemo.exadel.com/richfaces-demo/richfaces/dropDownMenu.jsf?c=dropDownMenu&tab=usage

R

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:toolBar



<a:repeat value="#{menuAction.gruposDisponiveis}" var="_grupo">

</a:repeat>


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

</rich:toolBar>

Ou seja, dessa forma fica lado a lado, mas o menuItem não é renderizado. :cry:

Alguém pode me ajudar?

[]s DECOLORES

R

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

M

opa boa tarde…
voce poderia postar como ficou seu managed bean?

abraço

R

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;
}

}

M

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 :cry:

M

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:

&lt;rich:toolBarGroup itemSeparator="line"&gt;
								
									&lt;c:forEach var="menuraiz" items="#{MenuJSFBean.menuraiz}"&gt;
										&lt;rich:dropDownMenu&gt;
										   &lt;f:facet name="label"&gt;
									           &lt;h:outputText value="#{menuraiz.cnmmenu}" /&gt;
									       &lt;/f:facet&gt;
									       
									       &lt;c:forEach var="submenu" items="#{menuraiz}"&gt;
									       		&lt;rich:menuItem value="#{submenu.cnmmenu}"
								  					   		   icon="imagens/icones_menu/open.gif"
								  					   		   submitMode="ajax"
								  					   		   action=""/&gt;
								  		   &lt;/c:forEach&gt;
									   &lt;/rich:dropDownMenu&gt;
								   &lt;/c:forEach&gt;
																	
							  	&lt;/rich:toolBarGroup&gt;

O managed bean:

public ArrayList&lt;Menu&gt; getMenuraiz() {
    	
        try{
	        Connection con = Conexao.getConnection();
			Statement stmt = con.createStatement();
			ResultSet resm = stmt.executeQuery("select pkmenu,cnmmenu from base.tbmenu where fkmenu = 0");
        
			ArrayList&lt;Menu&gt;menuraiz = new ArrayList&lt;Menu&gt;();
			
			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&lt;Menu&gt;submenu = new ArrayList&lt;Menu&gt;();
				
				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;
    }
	
}
M

Ja resolvi… Obrigado pelas dicas :smiley:

K

Eae amigo, como vc resolveu? POde postar??

Vlw

M

opa!
Amanha vou catar no trabalho e posto
abraço!

E

mmartinsrj:
opa!
Amanha vou catar no trabalho e posto
abraço!

Posta ae… to precisando ver alguma coisa nesse sentido.

Vlw.

M

Opa! Segue abaixo:

Codigo do JSF

&lt;h:form id="formAjax"&gt;
							  &lt;rich:toolBar&gt;
								&lt;rich:toolBarGroup itemSeparator="line"&gt;
								
									&lt;c:forEach var="menuraiz" items="#{MenuJSFBean.menuraiz}"&gt;
										&lt;rich:dropDownMenu&gt;
										   &lt;f:facet name="label"&gt;
										   	   &lt;h:panelGroup&gt;
											   	   &lt;h:graphicImage id="iconeRaiz" url="imagens/icones_menu/copy.gif" styleClass="pic"/&gt;
										           &lt;h:outputText value="#{menuraiz.cnmmenu}" /&gt;
									           &lt;/h:panelGroup&gt;
									       &lt;/f:facet&gt;
									       
									       &lt;c:forEach var="sm" items="#{menuraiz.submenu}"&gt;
									       		&lt;rich:menuItem value="#{sm.cnmmenu}" submitMode="ajax" action="#{PEPControllerJSFBean.processarMenu}" icon="imagens/icones_menu/open.gif"&gt;
									       			&lt;f:setPropertyActionListener target="#{PEPControllerJSFBean.parametromenu}" value="#{sm.cnmaction}"/&gt;
									       		&lt;/rich:menuItem&gt;
								  		   &lt;/c:forEach&gt;
									   &lt;/rich:dropDownMenu&gt;
								   &lt;/c:forEach&gt;
																	
							  	&lt;/rich:toolBarGroup&gt;
							  	&lt;rich:toolBarGroup location="right"&gt;
							  		&lt;span id="relogio" class="texto"&gt;&lt;/span&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img />
							  	&lt;/rich:toolBarGroup&gt;
							  &lt;/rich:toolBar&gt;
							  
						  &lt;/h:form&gt;

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&lt;Menu&gt; 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&lt;Menu&gt;menuraiz = new ArrayList&lt;Menu&gt;();
			
			Map&lt;String,Object&gt;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&lt;Menu&gt;submenu = new ArrayList&lt;Menu&gt;();
				
				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

&lt;managed-bean&gt;
    	&lt;managed-bean-name&gt;MenuJSFBean&lt;/managed-bean-name&gt;
    	&lt;managed-bean-class&gt;controller.jsf.MenuController&lt;/managed-bean-class&gt;
    	&lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;
    &lt;/managed-bean&gt;
M

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.

B

Veja este exemplo:

http://benignosales.wordpress.com/2010/10/02/menu-dinamico-jsf-2-0-primefaces/

espero ter ajudado.

C

Benigno, sobre este seu artigo, vc nao teria os fontes para download ?

Criado 6 de fevereiro de 2008
Ultima resposta 10 de jul. de 2011
Respostas 17
Participantes 9