Pessoal, estou com uma problema referente ao montar SelectOneMenus aninhadas com jsf.
O problema é o seguinte:
Ao clicar no primeiro select o mesmo preenche o segundo só que o ajax que trata o evento change da segunda combobox só funciona para o primeiro item, que coloquei um valor padrão default, então ele chama o listener somente quando clico em —Selecione a marca—. Segue uma parte do xhtml abaixo:
Então , não acontece nenhum erro. Ele é executado só quando clico em —Selecione em Marca—.
O primeiro select que é do tipo de quipamento já tem suas opções carregadas quando a página é selecionada. Os outros 2 select
vem só com a opção default e a lista vazia do banco. Ao clicar no primeiro select o mesmo carrega dinamicamnete o segundo, mas o
listener do ajax só executado na primeira opção e não nas opções que foram carregadas dinamicamente.
Segue o xhtml:
<?xml version='1.0' encoding='UTF-8' ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"xmlns:h="http://java.sun.com/jsf/html"xmlns:ui="http://java.sun.com/jsf/facelets"xmlns:p="http://primefaces.prime.com.tr/ui"xmlns:f="http://java.sun.com/jsf/core"><ui:compositiontemplate="/templates/principal.xhtml"><ui:definename="corpo"><p:panelid="panelPesquisaInventario"header="Pesquisa Inventário"styleClass="panelPesquisaInventario"><h:panelGridcolumns="2"><h:outputLabelvalue="Pesquisa de Clientes:"/><p:autoCompletestyleClass="inputComplete"size="40"completeMethod="#{clienteBean.autoCompleteClientes}"var="cliente"itemLabel="#{cliente.nomeCliente}"itemValue="#{cliente}"></p:autoComplete></h:panelGrid><h:panelGridcolumns="2"id="prod"rendered="#{inventarioBean.statusOneMenu}"><h:outputLabelvalue="Tipo:"/><h:selectOneMenu><f:selectItemsvalue="#{equipamentoBean.tipoEquipamentos}"var="item"itemLabel="#{item.nomeTipoEquipamento}"itemValue="#{item}"/></h:selectOneMenu></h:panelGrid></p:panel><br/><p:separatorstyle="width: 500px; text-align: left;"><h:outputLabelvalue="Cadastro de Inventário"/></p:separator><h:panelGroupstyleClass="panelCadastroInventario"><h:panelGridcolumns="6"id="tabelaCadastroInventario"><h:outputLabelvalue="Tipo Equipamento:"/><h:selectOneMenuid="tipo"value="#{inventarioBean.tipoEquipamento}"><f:selectItemsvalue="#{equipamentoBean.tipoEquipamentos}"var="item"itemLabel="#{item.nomeTipoEquipamento}"itemValue="#{item}"/><f:converterconverterId="tipoEquipamentoConverter"/><f:ajaxevent="change"listener="#{inventarioBean.listaMarca}"render="marca"/></h:selectOneMenu><h:outputLabelvalue="Marca:"/><h:selectOneMenuvalue="#{inventarioBean.marca}"id="marca"><f:selectItemitemValue=""itemLabel="----Selecione a Marca----"/><f:selectItemsvalue="#{inventarioBean.marcas}"var="marca"itemLabel="#{marca.nomeMarca}"itemValue="#{marca}"/><f:ajaxevent="change"render="modelo"listener="#{inventarioBean.listaModelo}"/></h:selectOneMenu><h:outputLabelvalue="Modelo:"/><h:selectOneMenuid="modelo"value="#{inventarioBean.modeloEquipamento}"><f:selectItemitemValue=""itemLabel="----Selecione o Modelo----"/><f:selectItemsvalue="#{inventarioBean.modelos}"var="modelo"itemLabel="#{modelo.nomeModeloEquipamento}"itemValue="#{modelo}"/></h:selectOneMenu></h:panelGrid></h:panelGroup><h:panelGridcolumns="4"><p:commandLinkvalue="Adicionar IP Access-Point"ajax="true"/></h:panelGrid></ui:define></ui:composition></html>
Segue o Managed Bean:
importdao.DAOGenerico;importdao.ModeloEquipamentoDAO;importdominio.Marca;importdominio.ModeloEquipamento;importdominio.TipoEquipamento;importjava.io.Serializable;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjavax.annotation.Resource;importjavax.faces.bean.ManagedBean;importjavax.faces.bean.RequestScoped;importjavax.faces.event.ValueChangeEvent;importorg.primefaces.event.SelectEvent;importorg.springframework.context.annotation.Scope;importorg.springframework.stereotype.Controller;@Controller("inventarioBean")@Scope("request")@ManagedBean(name="inventarioBean")@RequestScopedpublicclassInventarioBeanimplementsSerializable{privatebooleanstatusOneMenu=false;privatebooleanstatusCadastroInventario=false;privatebooleanstatusPanelAccessPoint=false;privateStringselectBox;privateModeloEquipamentomodeloEquipamento=newModeloEquipamento();privateTipoEquipamentotipoEquipamento=newTipoEquipamento();privateMarcamarca=newMarca();@ResourceprivateDAOGenerico<ModeloEquipamento,Integer>modeloEquipamentoDAO;@ResourceprivateDAOGenerico<Marca,Integer>marcaDAO;privateList<ModeloEquipamento>modelos;privateList<Marca>marcas;publicbooleangetStatusOneMenu(){returnstatusOneMenu;}publicvoidsetStatusOneMenu(booleanstatusOneMenu){this.statusOneMenu=statusOneMenu;}publicbooleangetStatusCadastroInventario(){returnstatusCadastroInventario;}publicvoidsetStatusCadastroInventario(booleanstatusCadastroInventario){this.statusCadastroInventario=statusCadastroInventario;}publicbooleangetStatusPanelAccessPoint(){returnstatusPanelAccessPoint;}publicvoidsetStatusPanelAccessPoint(booleanstatusPanelAccessPoint){this.statusPanelAccessPoint=statusPanelAccessPoint;}publicStringgetSelectBox(){returnselectBox;}publicvoidsetSelectBox(StringselectBox){this.selectBox=selectBox;}publicList<ModeloEquipamento>getModelos(){returnmodelos;}publicvoidsetModelos(List<ModeloEquipamento>modelos){this.modelos=modelos;}publicDAOGenerico<ModeloEquipamento,Integer>getModeloEquipamentoDAO(){returnmodeloEquipamentoDAO;}publicDAOGenerico<Marca,Integer>getMarcaDAO(){returnmarcaDAO;}publicvoidsetMarcaDAO(DAOGenerico<Marca,Integer>marcaDAO){this.marcaDAO=marcaDAO;}publicvoidsetModeloEquipamentoDAO(DAOGenerico<ModeloEquipamento,Integer>modeloDAO){this.modeloEquipamentoDAO=modeloDAO;}publicModeloEquipamentogetModeloEquipamento(){returnmodeloEquipamento;}publicvoidsetModeloEquipamento(ModeloEquipamentomodeloEquipamento){this.modeloEquipamento=modeloEquipamento;}publicTipoEquipamentogetTipoEquipamento(){returntipoEquipamento;}publicvoidsetTipoEquipamento(TipoEquipamentotipoEquipamento){this.tipoEquipamento=tipoEquipamento;}publicMarcagetMarca(){returnmarca;}publicvoidsetMarca(Marcamarca){this.marca=marca;}publicList<Marca>getMarcas(){returnmarcas;}publicvoidsetMarcas(List<Marca>marcas){this.marcas=marcas;}publicvoidhandleEvent(SelectEventevent){System.out.println("Select Item");this.statusCadastroInventario=false;this.statusOneMenu=true;}publicvoidselectOneEvent(ValueChangeEventevent){System.out.println("Select Item painel 1");this.statusPanelAccessPoint=true;}publicvoidnovoInventario(){System.out.println("tst");this.statusOneMenu=false;this.statusCadastroInventario=true;}publicvoidlistaMarca(){Stringquery="SELECT marca FROM ModeloEquipamento modelo"+" INNER JOIN modelo.idTipoEquipamento as tipo"+" INNER JOIN modelo.idMarcaEquipamento as marca"+" WHERE tipo.idTipoEquipamento = :tipoEquipamento"+" GROUP BY marca.nomeMarca";System.out.println(tipoEquipamento.getIdTipoEquipamento());Map<String,Object>params=newHashMap<String,Object>();params.put("tipoEquipamento",tipoEquipamento.getIdTipoEquipamento());marcas=marcaDAO.listPesqParam(query,params);}publicvoidlistaModelo(){System.out.println("lista modelo");if(this.marca!=null){Stringquery="SELECT modelo FROM ModeloEquipamento modelo"+" INNER JOIN modelo.idTipoEquipamento as tipo"+" INNER JOIN modelo.idMarcaEquipamento as marca"+" WHERE marca.idMarca = :marca";System.out.println(query);Map<String,Object>params=newHashMap<String,Object>();params.put("marca",marca.getIdMarca());modelos=modeloEquipamentoDAO.listPesqParam(query,params);}}}
Grato.
C
carlosbarbero
Tenta fazer assim:
Na tag ajax coloue assim:
<f:ajax event="change" listener="#{inventarioBean.listaMarca}" render="marca"/>
No método listarMarca faça isso:
public void listaMarca(AjaxBehaviorEvent event){
String query = "SELECT marca FROM ModeloEquipamento modelo"
+ " INNER JOIN modelo.idTipoEquipamento as tipo"
+ " INNER JOIN modelo.idMarcaEquipamento as marca"
+ " WHERE tipo.idTipoEquipamento = :tipoEquipamento"
+ " GROUP BY marca.nomeMarca";
System.out.println(tipoEquipamento.getIdTipoEquipamento());
Map<String, Object> params = new HashMap<String,Object>();
params.put("tipoEquipamento", tipoEquipamento.getIdTipoEquipamento());
marcas = marcaDAO.listPesqParam(query, params);
}
Não esqueça de importar:
importjavax.faces.event.AjaxBehaviorEvent;
L
LeoNovais
No f:ajax não encontrei esse atributo actionListener. Ele só tem listener.
Mesmo assim eu declaro no método aquele parâmetro do ActionEvent ?
Eu tô usando JSF 2.0.
C
carlosbarbero
deixa listener e no método tenta colocar como parametro:
AjaxBehaviorEvent event
C
carlosbarbero
Eu editei o post do código de exemplo.
Tenta aí e vê se funciona.
L
LeoNovais
Então, alterei o método, mas continuou o mesmo problema.
C
carlosbarbero
Oi Leo, bom dia!
Eu fiz um exemplo aqui e funcionou, o erro deve estar acontecendo em outro lugar.
Coloquei em anexo o projeto que criei para testar a atualização ajax.
Esse projeto é maven project, estou utilizando o jboss 6 como application server.
Abs,
L
LeoNovais
Oi Carlos, bom dia!
No projeto que você mandou-me você utiliza só dois selects. Na aplicação que estamos desenvolvendo aqui na empresa,
eu vou ter 3 combobox. O primeiro funciona o ajax para todas as opções, mas o segundo select o ajax não funciona para
as opções carregadas dinâmicamente.
Será que tenho que dar submit na página para que ele passe a reconhecer as outras opções do segundo combobox.
Valeu!!!
L
LeoNovais
Pessoal, consegui resolver o problema dos selects.
Foi necessário criar binding para os 2 últimos select e adicionar os items dinâmicamente no Bean.
Para aqueles que tiverem alguma dúvida é só seguir abaixo os códigos:
inventario.xhtml
<h:outputLabelvalue="Tipo Equipamento:"/><h:selectOneMenuid="tipo"value="#{inventarioBean.tipoEquipamento}"><f:selectItemitemValue=""itemLabel="----Selecione o tipo----"/><f:selectItemsvalue="#{equipamentoBean.tipoEquipamentos}"var="item"itemLabel="#{item.nomeTipoEquipamento}"itemValue="#{item}"/><f:converterconverterId="tipoEquipamentoConverter"/><f:ajaxevent="change"listener="#{inventarioBean.listaMarca}"render="marca"/></h:selectOneMenu><h:outputLabelvalue="Marca:"/><h:selectOneMenuvalue="#{inventarioBean.marca}"id="marca"binding="#{inventarioBean.selectMarca}"><f:converterconverterId="marcaConverter"/><f:ajaxevent="change"render="modelo"listener="#{inventarioBean.listaModelo}"/></h:selectOneMenu><h:outputLabelvalue="Modelo:"/><h:selectOneMenuid="modelo"value="#{inventarioBean.modeloEquipamento}"binding="#{inventarioBean.selectModelo}"><f:converterconverterId="modeloConverter"/></h:selectOneMenu>
Bean:
privateHtmlSelectOneMenuselectMarca;privateHtmlSelectOneMenuselectModelo;publicHtmlSelectOneMenugetSelectMarca(){returnselectMarca;}publicvoidsetSelectMarca(HtmlSelectOneMenuselectMarca){this.selectMarca=selectMarca;}publicHtmlSelectOneMenugetSelectModelo(){returnselectModelo;}publicvoidsetSelectModelo(HtmlSelectOneMenuselectModelo){this.selectModelo=selectModelo;}publicvoidlistaMarca(){selectMarca.getChildren().clear();System.out.println("lista marca");Stringquery="SELECT marca FROM ModeloEquipamento modelo"+" INNER JOIN modelo.idTipoEquipamento as tipo"+" INNER JOIN modelo.idMarcaEquipamento as marca"+" WHERE tipo.idTipoEquipamento = :tipoEquipamento"+" GROUP BY marca.nomeMarca";Map<String,Object>params=newHashMap<String,Object>();if(tipoEquipamento.getIdTipoEquipamento()!=null){params.put("tipoEquipamento",tipoEquipamento.getIdTipoEquipamento());marcas=marcaDAO.listPesqParam(query,params);List<SelectItem>items=newArrayList<SelectItem>();for(Marcam:marcas){SelectItemitem=newSelectItem();item.setLabel(m.getNomeMarca());item.setValue(m);items.add(item);System.out.println(m.getNomeMarca());}UISelectItemsuiSi=newUISelectItems();uiSi.setValue(items);selectMarca.getChildren().add(uiSi);}}publicvoidlistaModelo(){System.out.println("lista modelo");selectModelo.getChildren().clear();if(this.marca!=null||this.marca.getIdMarca()!=null){Stringquery="SELECT modelo FROM ModeloEquipamento modelo"+" INNER JOIN modelo.idTipoEquipamento as tipo"+" INNER JOIN modelo.idMarcaEquipamento as marca"+" WHERE marca.idMarca = :marca";System.out.println(query);Map<String,Object>params=newHashMap<String,Object>();params.put("marca",marca.getIdMarca());modelos=modeloEquipamentoDAO.listPesqParam(query,params);List<SelectItem>items=newArrayList<SelectItem>();for(ModeloEquipamentom:modelos){SelectItemitem=newSelectItem();item.setLabel(m.getNomeModeloEquipamento());item.setValue(m);items.add(item);System.out.println(m.getNomeModeloEquipamento());}UISelectItemsuiSi=newUISelectItems();uiSi.setValue(items);selectModelo.getChildren().add(uiSi);}}