Menu dinâmica no Primefaces

Prezados,

Preciso de um ajuda, estou usando o Menu do primafaces de forma dinâmica, onde carrego vários itens cadastrados no banco, itens diferentes do menu podem ir para a mesma tela exemplo graficoPizza.xhtml onde outros itens também apontam para ela, porém o que muda é a query que irá carregar na tela.
O problema está exatamente ai, quero identifica qual o item o usuário click no menu para busca a query desse item e popula o Bean com os dados correspondente.

Segue os códigos:

menu.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui" template="layout.xhtml"> <ui:define name="menu"> <p:menu model="#{menuAction.model}" style="width:95%"/> </ui:define> </ui:composition>

parte da classe do menuAction

[code]while (graficoIt.hasNext()) {
Grafico graficoNovo = graficoIt.next();
item = new MenuItem();
item.setId(“itemMenu” + graficoNovo.getTitulo().replace(" “, “”));
item.setValue(graficoNovo.getTitulo());
item.setAjax(false);
if (graficoNovo.getComponenteWeb().equals(“Barra”)) {
item.setUrl(“graficoBarra.xhtml”);
item.setActionExpression(createMethodExpression(”#{barraAction.teste}"));
} else if (graficoNovo.getComponenteWeb().equals(“Pizza”)) {
item.setUrl(“conteudo/graficoPizza.xhtml”);
item.setActionExpression(createMethodExpression("#{pizzaAction.teste}"));
} else if (graficoNovo.getComponenteWeb().equals(“Area”)) {
item.setUrl(“graficoArea.xhtml”);
item.setActionExpression(createMethodExpression("#{areaAction.teste}"));
} else if (graficoNovo.getComponenteWeb().equals(“Gauge”)) {
item.setUrl(“graficoGauge.xhtml”);
item.setActionExpression(createMethodExpression("#{gaugeAction.teste}"));
} else if (graficoNovo.getComponenteWeb().equals(“Linha”)) {
item.setUrl(“graficoLinha.xhtml”);
item.setActionExpression(createMethodExpression("#{linhaAction.teste}"));
}
submenu.getChildren().add(item);
}

	model.addSubmenu(submenu);[/code]

private MethodExpression createMethodExpression(String action) { MethodExpression methodExpression = FacesContext .getCurrentInstance() .getApplication() .getExpressionFactory() .createMethodExpression( FacesContext.getCurrentInstance().getELContext(), action, null, new Class<?>[0]); return methodExpression; }

método teste da pizzaAction

public void teste(ActionEvent event) { System.out.println(event.getComponent().getId()); }

Aguardo a ajuda de vocês.
Obrigado.

E se fizer o cast?

public void teste(ActionEvent event) { System.out.println(new ((MenuItem)event.getComponent()).getId()); }

E se tirar os if… else não seria mais rápido?

[code] while (graficoIt.hasNext()) {
Grafico graficoNovo = graficoIt.next();
item = new MenuItem();
item.setId(“itemMenu” + graficoNovo.getTitulo().replace(" ", “”));
item.setValue(graficoNovo.getTitulo());
item.setAjax(false);

            item.setUrl("grafico"
                            + graficoNovo.getComponenteWeb() 
                            + ".xhtml");  
            item.setActionExpression(createMethodExpression("#{"
                            + graficoNovo.getComponenteWeb().toLowerCase()
                            + "Action.teste}"));  

            submenu.getChildren().add(item);  
        }  
  
        model.addSubmenu(submenu);  [/code]

Marcelo,

Desculpa, acho que omiti uma informação importante.
O problema é que ele não entra no método actionEvent, mas para frente irei precisa saber sobre isso também de como recupera o item selecionado.

E sobre os IF e porque o dado volta do banco e preciso verifica um coluna para sabe qual o tipo do gráfico e para qual tela ele tem que ser redirecionada.

Obrigado pela ajuda.

NOSSA MARCELO AGORA QUE ENTENDI DO IF…VLW pela dica…
MAS O PROBLEMA CONTINUA, PRECISA IDENTIFICA OQUE ITEM DO MENU QUE CLIQUEI.

Ninguém sabe a solução desse problema???

Cara,

eu tive este problema a pouco tempo e resolvi passando
no metodo uma string com o conteudo que eu preciso,
sem usar Action.

Segue um exemplo:

for (String filho : filhos) {
            MenuItem item = new MenuItem();
            item.setValue(filho);
            // item.setUrl("#");
            item.setAjax(false);
            //factory = FacesContext.getCurrentInstance().getApplication()
            //        .getExpressionFactory();
            //methodExpression = new MethodExpressionActionListener(
            //        factory.createMethodExpression(FacesContext
            //                .getCurrentInstance().getELContext(),
            //                "#{menuBean.processAction2('login.jsf')}", Void.TYPE,
            //                new Class[] { ActionEvent.class }));
            //item.addActionListener(methodExpression);
            String programaChamado = "login.jsf";
            item.setActionExpression(createMethodExpression("#{menuBean.processAction2('" + programaChamado + "')}"));
            id++;
            item.setId("id_" + Integer.toString(id));
            submenu2.getChildren().add(item);
           
        }

E o método:

private MethodExpression createMethodExpression(String action) { 
        MethodExpression methodExpression = FacesContext 
                .getCurrentInstance() 
                .getApplication() 
                .getExpressionFactory() 
                .createMethodExpression( 
                        FacesContext.getCurrentInstance().getELContext(), 
                        action, null, new Class<?>[0]); 
        return methodExpression; 
    }  

public String processAction2(String pagina) throws AbortProcessingException {
		// TODO Auto-generated method stub
		System.out.println(pagina);
		
		return pagina;
		

	}

Espero ter ajudado.

Dei um tempo nesse projeto, mas assim que consegui um tempo irei alterar para testar dessa maneira que você me passou.

Mas desde já, obrigado.