Erro: montar menu dinâmico

18 respostas
maurenginaldo

Oi pessoal,

estou tentando montar um menu dinâmico com o RichFaces.
Criei um componente com o facelets e estou passando um List #{lista} como parâmetro.
Vejam o codigo abaixo:

<f:view> <h:form> <h:panelGrid columns="2"> <c:forEach var="itemmenu" items="#{lista}"> <c:choose> <c:when test="#{itemmenu.tipo == 1}"> <rich:dropDownMenu value="#{itemmenu.nome}"> </c:when> <c:when test="#{itemmenu.tipo == 2}"> <rich:menuGroup value="#{itemmenu.nome}" > </c:when> <c:when test="#{itemmenu.tipo == 3}"> <rich:menuItem value="#{itemmenu.nome}" /> </c:when> <c:when test="#{itemmenu.tipo == 4}"> <rich:menuSeparator /> </c:when> <c:when test="#{itemmenu.tipo == 5}"> </rich:dropDownMenu> </c:when> <c:when test="#{itemmenu.tipo == 6}"> </rich:menuGroup> </c:when> </c:choose> </c:forEach> </h:panelGrid> </h:form> </f:view>

Será executado um forEach em cima da lista e dependendo do tipo do menu será aberto um tag de DropDown, MenuGroup ou fechada.
Fiz alguns testes apenas imprimindo através de um outputText o #{itemmenu.tipo} e confirmei que a sequencia de menus está correta.
Mas quando vou executar o código ao abrir a janela é gerado o erro:

SEVERE: Error Rendering View[/modulos/gerenciadoridentidade/gerenciadoridentidade.xhtml] com.sun.facelets.FaceletException: Error Parsing /tagslib/menuModulo.xhtml: Error Traced[line: 19] The element type "rich:dropDownMenu" must be terminated by the matching end-tag "</rich:dropDownMenu>".

Eu penso que antes de interpretar o código, o parser passa pelo código e identifica que existem tags abertas e não fechadas, dando um erro logo na primeira. Mas analisando o código sabemos que ao executar funcionará corretamente.

Alguém sabe como resolver isso?
O erro é mesmo o que estou pensando?

Valeu.

18 Respostas

spycall

Cara, eu fiz um menu dinamico com RichFaces, mas eu crie o menu no MBControler e amarrei o objeto do jsp com o binding.

maurenginaldo

Boa idéia spycall,

eu nunca fiz componente no bean.
Você tem algum trecho de código que para exemplificar?

Valeu.

spycall
HtmlToolBar toolBar;
HtmlToolBarGroup group;
HtmlCommandLink link;
						
toolBar = new HtmlToolBar();
		
group = new HtmlToolBarGroup();
group.setId("g1");
group.setLocation("left");
link = new HtmlCommandLink();
link.setId("l1");
link.setValue("Home");
link.setImmediate(true);
link.setActionExpression(JSFUtil.getMethod("#{menuController.doHome}"));
group.getChildren().add(link);
		
toolBar.getChildren().add(group);

group = new HtmlToolBarGroup();
group.setId("g2");
link = new HtmlCommandLink();	
link.setId("l2");
link.setValue(JSFUtil.getLabel("genericMessages", "field_maintenance"));
link.setImmediate(true);
link.setActionExpression(JSFUtil.getMethod("#{menuController.doManut}"));
group.getChildren().add(link);
	
toolBar.getChildren().add(group);

Depois é só vc criar uma tag toolbar no jsp e amarrar com o controller.

<rich:toolBar itemSeparator="line" styleClass="menutop" binding="#{menuController.toolBar}" />

não esqueça de fazer o get e set de toolBar

maurenginaldo

Legal spycall,

andei olhando e vi que da para usar as bibliotecas do próprio RichFaces

import org.richfaces.component.html.HtmlToolBar; import org.richfaces.component.html.HtmlDropDownMenu; import org.richfaces.component.html.HtmlMenuGroup; import org.richfaces.component.html.HtmlMenuItem; import org.richfaces.component.html.HtmlMenuSeparator;

Vou tentar fazer assim.

Mas a título de curiosidade, alguém sabe o porque do erro no código do 1º post???

Valeu pessoal.

S

Somente para postar… Um exemplo de menu dinâmico com JSF:

Na classe bean:

import org.richfaces.component.html.HtmlDropDownMenu;

import org.richfaces.component.html.HtmlMenuGroup;

import org.richfaces.component.html.HtmlMenuItem;

import org.richfaces.component.html.HtmlMenuSeparator;

import org.richfaces.component.html.HtmlToolBar;

HtmlToolBar menuBar = new HtmlToolBar();

public HtmlToolBar getMenuBar() {

montarMenu();

return menuBar;

}
public void setMenuBar(HtmlToolBar menuBar) {

this.menuBar = menuBar;

}

public HtmlToolBar montarMenu() throws Exception {

HtmlToolBar menu = new HtmlToolBar();

HtmlDropDownMenu menuDrop = new HtmlDropDownMenu();

menuDrop.setValue(“D1”);

HtmlMenuItem menuItem = new HtmlMenuItem();

menuItem.setValue(“I1”);

menuItem.setTarget(“principal”);

menuDrop.getChildren().add(menuItem);

menuBar.getChildren().add(menuDrop);
HtmlDropDownMenu menuDrop = new HtmlDropDownMenu();

menuDrop.setValue(“D2”);

HtmlMenuItem menuItem = new HtmlMenuItem();

menuItem.setValue(“I1”);

menuDrop.getChildren().add(menuItem);

HtmlMenuGroup menuGrop = new HtmlMenuGroup();

menuGrop.setValue(“G1”);

HtmlMenuItem menuItem = new HtmlMenuItem();

menuItem.setValue(“S1”);

menuGrop.getChildren().add(menuItem);

menuDrop.getChildren().add(menuGrop);

HtmlMenuGroup menuGrop = new HtmlMenuGroup();

menuGrop.setValue(“G2”);

HtmlMenuItem menuItem = new HtmlMenuItem();

menuItem.setValue(“S2”);

menuGrop.getChildren().add(menuItem);

menuDrop.getChildren().add(menuGrop);

menuBar.getChildren().add(menuDrop);

}

Na JSP:
<rich:toolBar binding="#{menu.menuBar}"/>

Para tornar dinâmico é somente colocar os dados no banco e criar loop para criar o Menu… :smiley:

abraço

jeanbr07

cara acho q o erro do teu primeiro codigo esta na parte do loop que ta fechando assim

rich:dropDownMenu...

<rich:menuGroup …>

.
.
.

</rich:dropDownMenu>

</rich:menuGroup>

e na verdade esse final deve ser ao contrario:

rich:dropDownMenu...

<rich:menuGroup …>

.
.
.
</rich:menuGroup>

</rich:dropDownMenu>

pelo menos é só o erro q eu percebi

A

Suzy:
Somente para postar… Um exemplo de menu dinâmico com JSF:

Na classe bean:

import org.richfaces.component.html.HtmlDropDownMenu;

import org.richfaces.component.html.HtmlMenuGroup;

import org.richfaces.component.html.HtmlMenuItem;

import org.richfaces.component.html.HtmlMenuSeparator;

import org.richfaces.component.html.HtmlToolBar;

HtmlToolBar menuBar = new HtmlToolBar();

public HtmlToolBar getMenuBar() {

montarMenu();

return menuBar;

}
public void setMenuBar(HtmlToolBar menuBar) {

this.menuBar = menuBar;

}

public HtmlToolBar montarMenu() throws Exception {

HtmlToolBar menu = new HtmlToolBar();

HtmlDropDownMenu menuDrop = new HtmlDropDownMenu();

menuDrop.setValue(“D1”);

HtmlMenuItem menuItem = new HtmlMenuItem();

menuItem.setValue(“I1”);

menuItem.setTarget(“principal”);

menuDrop.getChildren().add(menuItem);

menuBar.getChildren().add(menuDrop);
HtmlDropDownMenu menuDrop = new HtmlDropDownMenu();

menuDrop.setValue(“D2”);

HtmlMenuItem menuItem = new HtmlMenuItem();

menuItem.setValue(“I1”);

menuDrop.getChildren().add(menuItem);

HtmlMenuGroup menuGrop = new HtmlMenuGroup();

menuGrop.setValue(“G1”);

HtmlMenuItem menuItem = new HtmlMenuItem();

menuItem.setValue(“S1”);

menuGrop.getChildren().add(menuItem);

menuDrop.getChildren().add(menuGrop);

HtmlMenuGroup menuGrop = new HtmlMenuGroup();

menuGrop.setValue(“G2”);

HtmlMenuItem menuItem = new HtmlMenuItem();

menuItem.setValue(“S2”);

menuGrop.getChildren().add(menuItem);

menuDrop.getChildren().add(menuGrop);

menuBar.getChildren().add(menuDrop);

}

Na JSP:
<rich:toolBar binding="#{menu.menuBar}"/>

Para tornar dinâmico é somente colocar os dados no banco e criar loop para criar o Menu… :smiley:

abraço

Suzy também estou implementando um menu dinâmico com o richfaces. Para isso utilizei os exemplos do próprio framework e consegui carregar o menu, com os dados vindo do banco de dados. O q acontece com o meu menu, é que quando eu clico em uma opção do menu, ele carrega o jsf correspondente, (no primeiro click no menu). Depois quando clico em outra opção do menu, ao invés de carregar a página jsf correspondente, ele carrega a anterior. Estou utilizando iframe, pq preciso do menu em todas as telas e não quero utilizar include - pq no projeto em questão vai dar muito problema utilizar include.
Vc tem alguma idéia para me ajudar a fazer com que o menu richfaces (DropDownMenu) carregue as páginas certas?

Obrigado!

gustavodelgado

Olá pessoal…

Eu tenho um menu dinâmico em minha aplicação que parou de funcionar assim que atualizei os jars do richfaces para a nova versão (3.2.0). Na versão anterior funcionava blz.
Alguém aí conseguiu fazê-lo funcionar na nova versão??
Fiz alguns testes aqui com os exemplos postados neste tópico, mas o problema continuou o mesmo… o menu simplesmente não aparece (como se a propriedade binding não estivesse lá).

[]s

wamaral

Suzy também estou implementando um menu dinâmico com o richfaces. Para isso utilizei os exemplos do próprio framework e consegui carregar o menu, com os dados vindo do banco de dados. O q acontece com o meu menu, é que quando eu clico em uma opção do menu, ele carrega o jsf correspondente, (no primeiro click no menu). Depois quando clico em outra opção do menu, ao invés de carregar a página jsf correspondente, ele carrega a anterior. Estou utilizando iframe, pq preciso do menu em todas as telas e não quero utilizar include - pq no projeto em questão vai dar muito problema utilizar include.
Vc tem alguma idéia para me ajudar a fazer com que o menu richfaces (DropDownMenu) carregue as páginas certas?

Obrigado!

jeanbr07, você conseguiu resolver este problema ?

albama

Pessoal eu segui as dicas postadas e consegui montar o menu dinâmico.

Veja um trecho da página.

&lt;a4j:form id="idForm"&gt;
        &lt;rich:toolBar id="idToolBar"  binding="#{perfilHandler.toolBar}"/&gt;
   &lt;/a4j:form&gt;

Aqui eu preencho o toolbar com botões

toolBar.getChildren().add(htmlCommandButton);
	    toolBar.getChildren().add(button2);

Coloquei os getters e setters para o toolBar.

O problema é que não consigo saber em qual botão foi clicado.

Alguém sabe como resolver isso ?

Marco Aurélio

wamaral

Eu havia conseguido de outra forma, mas ficou muiito legal, se quiser me passe o seu e-mail que eu eu envio os codigos.

albama

Segue meu email : [email removido]

wamaral

Mandei no seu e-mail.

Abraços

Cherubini

Walyson, blz cara ?

tipo eu consegui montar meu menu dinamico(arrumei o duplicate id colocando meu MB como request)

so q como faço ele executar chamando paginas com ajax!

pq toda vez q click no botao ele da refresh, vc tem alguma dica ?

vlws pela ajuda, e mals por resucitar o topico!rs

wamaral

Enão cara, eu usei uma função com js dai ficou show, no meu caso o endereco das paginas ‘…/cadastro/cadastro.jsf’ vem do banco, então ficou melhor ainda, neste caso não tenho nada mapeado no faces config, nem mesmo os maneged beans pois o spring faz isso pra mim.

Cherubini

vc nao conseguiu integrar o a4j dinamicamente ?

albama

Bem eu estou usando rich faces para facilitar o ajax, dessa forma ao usar as tagas <a4J:component></a4J:component> eu já tenho ajax embutido.

Thamila

ressucitandando este tópico…

spycall, vc teve prob. com o fato do setId e o setValue terem valores diferentes setados? Eu tive, e tenho a seguinte exceção:IndexOutOfBoundsException. Vc saberia o motivo?

Criado 24 de janeiro de 2008
Ultima resposta 19 de mai. de 2011
Respostas 18
Participantes 10