Olá a todos
Estou aprendendo JSF e estou com problemas na hora de criar um componente personalizado.
Quero contruir uma caixa de menu a para isso criei uma tag personalizada. Nessa caixa de menu, terei vários commandlink’s.
Meu problema é que na hora que a tela é exibida, todos os commandlink’s que eu adiciono a caixa de menu é duplicada na página, conforme a figura abaixo.
Pois bem, segue o código:
Página JSP
<h:form id="formpage">
<div class="menu">
<b:menu value="#{pagina.menus}" />
</div>
</h:form>
Renderizador
@SuppressWarnings("unchecked")
public void encodeBegin(FacesContext context) throws IOException{
HtmlPanelGroup panel = (HtmlPanelGroup) context.getApplication().createComponent(HtmlPanelGroup.COMPONENT_TYPE);
ValueExpression value = (ValueExpression) this.getAttributes().get("value");
HtmlForm form = (HtmlForm) context.getViewRoot().findComponent("formpage");
List<Menu> menus = (List<Menu>) value.getValue(context.getELContext());
ResponseWriter writer = context.getResponseWriter();
form.getChildren().add(panel);
panel.encodeBegin(context);
for(Menu menu : menus){
writer.startElement("div", panel);
writer.writeAttribute("class", "item", null);
writer.write(menu.getNome());
writer.startElement("ul", panel);
for(Submenu submenu : menu.getSubmenus()){
writer.startElement("li", panel);
UIParameter param = new UIParameter();
param.setName("id");
param.setValue(submenu.getId());
HtmlCommandLink link = (HtmlCommandLink) context.getApplication().createComponent(HtmlCommandLink.COMPONENT_TYPE);
link.getChildren().add(param);
link.setActionExpression(context.getApplication().getExpressionFactory().createMethodExpression(context.getELContext(), "#{pagina.link}", String.class, new Class[0]));
link.setValue(submenu.getNome());
link.setImmediate(true);
panel.getChildren().add(link);
link.encodeAll(context);
writer.endElement("li");
}
writer.endElement("ul");
writer.endElement("div");
}
panel.encodeEnd(context);