Capturar item do Combo e enviar pra MB

Olá pessoal,

preciso capturar o id de um item do combo e enviar para o meu MB. Tenho quatro combos aninhados. Assim que eu clico no primeiro, os outros 3 são renderizados. Segue o código:

XHTML:
[code]
<h:outputLabel for=“categoria” value=“Categoria " styleClass=“rotulos” />
<h:selectOneMenu id=“categoria” value=”#{categoriaFace.categoria.id}" rendered=“true”>
<f:selectItems value="#{categoriaFace.categorias}" />
<a4j:support event=“onchange” ajaxSingle=“true” action="#{categoriaFace.actionCarregaTodosCombos}" reRender=“categoria,subcategoria,parametro,subparametro”>
<f:setPropertyActionListener value=“1” target="#{categoriaFace.subCategoria.id}" />
</a4j:support>
</h:selectOneMenu>

                           <h:outputLabel for="parametro" value=" - Parâmetro "styleClass="rotulos" />
                           <h:selectOneMenu id="parametro" value="#{categoriaFace.parametro.id}" rendered="true">
                                   <f:selectItems value="#{categoriaFace.parametros}" />
                           </h:selectOneMenu>

                           <h:outputLabel for="subcategoria" value="Sub categoria " styleClass="rotulos" />
                           <h:selectOneMenu id="subcategoria" value="#{categoriaFace.subCategoria.id}" rendered="true">
                                   <f:selectItems value="#{categoriaFace.subCategorias}" />
                           </h:selectOneMenu>

                           <h:outputLabel for="subparametro" value=" - Sub Parâmetro " styleClass="rotulos" />
                           <h:selectOneMenu id="subparametro" value="#{categoriaFace.subParametro.id}" rendered="true">
                                   <f:selectItems value="#{categoriaFace.subParametros}" />
                           </h:selectOneMenu>[/code]

Os combos categoria, subcategoria e parametro estão funcionando certinho. Só o último combo (subparametro) que não, pois ele precisa do id da subcategoria que foi renderizada. Eu setei o id na mão pra testar e funciona: <f:setPropertyActionListener value=“1” target="#categoriaFace.subCategoria.id}" />, o que eu preciso é saber o que coloca no lugar do “1”.

Alguém pode ajudar?

Agradeço antecipadamente!

hmm

deveria funcionar do jeito q esta … sem ter q setar na mao

um combo depende do outro certo ?

pq vc, ao invez de rederizer todos a partir d um, n vai renderizando um depois do outro( bota +1 q ajaxsupport nos combos ), so pra testa mesmo …

Mais fácil você fazer isso no seu MB.
No método que está setando os valores para o seu subcategoria, manda executar novamente o que faz a busca para os subparâmetros.

Não deu certo. Mesmo colocando pra chamar novamente o método eu vou precisar passar o id da subcategoria pro MB, e ele não está sendo enviado. Depois da alteração que fiz no código continuo recebendo: this.getSubCategoria().getId() >>> null.

Agora… o id da Categoria(primeiro combo) é enviado pro MB quando um dos itens é escolhido. Eu preciso fazer a mesma coisa e receber o id da subCategoria do outro lado. Daí é só sucesso!

Valew

Segue o código relevante:
MB: [code]public class CategoriaFace {

private Categoria categoria = new Categoria();

private Parametro parametro = new Parametro();

private SubCategoria subCategoria = new SubCategoria();

private SubParametro subParametro = new SubParametro();

private List<SelectItem> subCategorias = new ArrayList<SelectItem>();	
	
private List<Parametro> parametros = new ArrayList<Parametro>();

private List<SubParametro> subParametros = new ArrayList<SubParametro>();

/**
 * metodo que carrega o combo "categoria" com todas as categorias do banco. 
 * @return
 */
public List<SelectItem> getCategorias(){
	Session session = HibernateUtil.currentSession();
	CategoriaDAO dao = new CategoriaDAO(session);
	
	List<Categoria> lc = dao.loadAll();
	List<SelectItem> items = new ArrayList<SelectItem>(lc.size());
	
	for(Categoria cat : lc){
		items.add(new SelectItem(cat.getId(), cat.getNome()));
	}
	
	System.out.println("getCategorias() invocado!");

	System.out.println("this.categoria.getId() >>> " + this.categoria.getId());
	
	return items;
}

/**
 * metodo que carrega o combo(subCategoria) com todas subCategorias relacionadas a categoria o qual foi escolhida no combo "categoria"
 * @return
 */
public String actionCarregaComboSubcategoria(){
	this.subCategorias = getSubcategoriasByCategoria(this.getCategoria().getId());
		
	System.out.println("actionCarregaTodosCombos() invocado!");
	
	System.out.println("this.getSubCategoria().getId() >>> " + this.getSubCategoria().getId());
	System.out.println("this.getCategoria().getId() >>> " + this.getCategoria().getId());
	
	return "carregaCombosSubCategoriaSucesso";
}

/**
 * metodo que preenche a tabela (tableParams) com todos os parametros relacionados a categoria escolhida
 * @return
 */
public List<Parametro> getParametrosByCategoria(){
	Session session = HibernateUtil.currentSession();
	CategoriaDAO dao = new CategoriaDAO(session);
	
	System.out.println("getParametrosByCategoria() invocado!");
	
	return dao.pesquisaParametrosByCategoriaId(this.getCategoria().getId());
}

/**
 * metodo que preenche o combo (subCategoria) com todas as subCategorias relacionadas a categoria escolhida no primeiro combo.
 * Este metodo eh invocado pelo metodo "actionCarregaComboSubcategoria"
 * @param idCategoria
 * @return
 */
public List<SelectItem> getSubcategoriasByCategoria(long idCategoria){
	Session session = HibernateUtil.currentSession();
	CategoriaDAO dao = new CategoriaDAO(session);

	List<SubCategoria> subcategorias = dao.pesquisaSubcategoriasByCategoriaId(idCategoria);
	List<SelectItem> items = new ArrayList<SelectItem>(subcategorias.size());
	
	System.out.println("getSubcategoriasByCategoria() invocado!");
	
	for(SubCategoria subcat : subcategorias){
		items.add(new SelectItem(subcat.getId(), subcat.getNome()));
	}
	
	System.out.println("items >>> " + items);
	
	return items;
}

/**
 * metodo que "DEVERIA" preencher a tabela (tableSubParams) com todos os subParametros relacionados a subCategoria escolhida 
 * Eh nesse metodo que esta dando null:  * this.getSubCategoria().getId() >>> null
 * @return
 */
public List<SubParametro> getSubParametrosBySubCategoria(){
	Session session = HibernateUtil.currentSession();
	CategoriaDAO dao = new CategoriaDAO(session);
	
	System.out.println("getSubParametrosBySubCategoria() invocado!");
	
	System.out.println(" * this.getSubCategoria().getId() >>> "  + this.getSubCategoria().getId());
	return dao.pesquisaSubParametrosBySubCategoriaId(this.getSubCategoria().getId());
}[/code]XHTML:[code]<ui:composition>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Pesquisa de Categorias</title>
<link rel="StyleSheet" type="text/css" href="/sistema/style/estilos.css" media="screen" />
<script type="text/javascript" src="/sistema/resources/jquery.maskedinput-1.2.1.js"></script>
</head>

<body>
<h:messages style="color:#f00;" />

<f:view>
	<h:form acceptcharset="UTF-8">

	<fieldset>
		<legend>Pesquisa Categoria</legend> 
		
		<h:panelGrid columns="1">

			<!--  categorias -->
			<h:outputLabel for="categoria" value="Categoria " styleClass="rotulos" />
			<h:selectOneMenu id="categoria"	value="#{categoriaFace.categoria.id}" rendered="true">
				<f:selectItems value="#{categoriaFace.categorias}" />
				<a4j:support event="onchange" ajaxSingle="true" action="#{categoriaFace.actionCarregaComboSubcategoria}" reRender="categoria,subcategoria,tableParams,tableSubParams"/>
					
			</h:selectOneMenu>

		<!-- parametros -->
		<h:outputText value="Parâmetros" />
		<rich:dataTable value="#{categoriaFace.parametrosByCategoria}" var="parametro" rendered="true" rows="5" id="tableParams" width="30%" cellspacing="0" cellpadding="0" border="0">
		<h:column>
			<h:outputText value="#{parametro.nome}" />
		</h:column>
		<h:column>
		 	 <h:outputText value="#{parametro.escolhido}" />
			 <h:selectBooleanCheckbox value="true" id="checkBoxParam"/>
		</h:column>
	</rich:dataTable>
	
	<f:verbatim><br/></f:verbatim>

	<h:outputLabel for="subcategoria" value="Sub categoria " styleClass="rotulos" />
	<h:selectOneMenu id="subcategoria" value="#{categoriaFace.subCategoria.id}" rendered="true">
		<f:selectItems value="#{categoriaFace.subCategorias}" />
	</h:selectOneMenu>

	<f:verbatim><br /></f:verbatim>
			
	<!-- sub parametros -->
	<h:outputText value="Sub Parâmetros" />
	<rich:dataTable value="#{categoriaFace.subParametrosBySubCategoria}" var="subParametro" rendered="true" rows="5" id="tableSubParams" width="30%" cellspacing="0" cellpadding="0" border="0">
	<h:column>
			<h:outputText value="#{subParametro.nome}" />
	</h:column>
		
	<h:column>
		 <h:outputText value="#{subParametro.escolhido}" />
		 <h:selectBooleanCheckbox value="true" id="checkBoxSubParam"/>
	</h:column>

	</rich:dataTable>

		</h:panelGrid></fieldset>
	</h:form>
</f:view>
</body>

</ui:composition>

[/code]