Cargar combos con ADF-Faces

Este es un ejemplo de 2 combos anidados, similar a los demás ejemplos que es un combo de departamentos que carga un combo de distritos.

En el jsp :


<af:selectOneChoice id="departamento" label="#{mensajes['pagina.dashboards.departamento.label']}"
valuePassThru="true"
value="#{trendPage.departamentoId}"
autoSubmit="true"
valueChangeListener="#{trendPage.departamentoChangeListener}">
<f:selectItems value="#{trendPage.departamentos}" />
</af:selectOneChoice>


<af:selectOneChoice id="distrito" label="#{mensajes['pagina.dashboards.distrito.label']}"
value="#{trendPage.distritoId}"
partialTriggers="departamento">
<f:selectItems value="#{trendPage.distritos}" />
</af:selectOneChoice>





"mensajes" de la propiedad "label" es un properties donde están los valores de las etiquetas de las páginas.

Para que resulte la parte de Ajax es necesario colocar :
a) En el selectOneChoice de departamentos :
valuePassThru="true"
autoSubmit="true"
valueChangeListener="#{trendPage.departamentoChangeListener}">

b) En el selectOneChoice de distritos:
partialTriggers="departamento"


En el controller :



public class TrendPage{

private Map departamentos;
private Map distritos;
private String departamentoId;
private String distritoId;
private DepartamentoManager departamentoManager;
private DistritoManager distritoManager;


public void setDepartamentos(Map departamentos){
this.departamentos = departamentos;
}

public Map getDepartamentos(){
if(departamentos == null){
List departamentosList = departamentoManager.getDepartamentos();
for (Iterator iterator = distritoList.iterator(); iterator.hasNext();) {
Departamento departamento = (Departamento) iterator.next();
departamentos.put(departamento.getNombre(), departamento.getCodigo());
}
return departamentos;
}

public void setDistritos(Map distritos){
this.distritos = distritos;
}

public Map getDistritos(){
return distritos;
}


public void setDepartamentoId(String departamentoId){
this.departamentoId = departamentoId;
}

public String getDepartamentoId(){
return departamentoId;
}

public void setDistritoId(String distritoId){
this.distritoId = distritoId;
}

public String getDistritoId(){
return distritoId;
}

public DistritoManager getDistritoManager(){
return distritoManager;
}


public void setDistritoManager(DistritoManager distritoManager){
this.distritoManager = distritoManager;
}


public DepartamentoManager getDepartamentoManager(){
return departamentoManager;
}


public void setDepartamentoManager(DepartamentoManager departamentoManager){
this.departamentoManager = departamentoManager;
}



public void departamentoChangeListener(ValueChangeEvent event) {
departamentoId = (String) event.getNewValue();
List distritoList = distritoManager.getDistritos(departamentoId);
for (Iterator iterator = distritoList.iterator(); iterator.hasNext();) {
Distrito distrito = (Distrito) iterator.next();
distritos.put(distrito.getNombre(), distrito.getCodigo());
}

}

}



Asumir que:
- departamentoManager.getDepartamentos() devuelve una lista de objetos "Departamento"
- distritoManager.getDistritos(departamentoId) devuelve una lista de objetos "Distritos"

En este caso se están creando Maps para asociarlo a los combos también se podría hacer con el objeto SelectItem[] de ADF-faces.
Si se trabaja con Maps como en el ejemplo se debe colocar :

key del map = label del combo
value del map = value del combo (id del objeto)

En este ejemplo se ve cierta redundancia para convertir de Lista de beans a Maps. La idea acá es implementar un método común para realizar esta conversión. Para este ejemplo lo tengo usando BeanWrapperImpl de Spring. Sin embargo, no lo he puesto para no complicar el ejemplo. Después postearé respecto a BeanWrapperImpl.

Comentarios

Unknown ha dicho que…
Muy útil. gracias.
Alvaro Montilla ha dicho que…
Como hago para carga una pagina dentro de un div con richfaces tengo un rich:dropDownMenu y cuando le de a unas de la opciones no se valla a una pagina donde se tenga qu cargar toda la pagina sino que muestre el formulario en un div contenido que es la plantilla