Combo Cidade UF com Primefaces e JSF 2

Segue para comunidade, com o objetivo de facilitar pra quem precisar um combo Cidade/ Unidade Federal com JSF 2 e Primefaces:
 
Veja funcionando:

 
index.xhtml
[cc lang=”html”]














[/cc]
 
CidadeUFComboBean.java
[cc]
/**
* CidadeUF Combo Controller
*
* @author César Barbosa
*/
@ManagedBean
@ApplicationScoped
public class CidadeUFComboBean implements Serializable{

EnderecoCidadeDAO cidDao = new EnderecoCidadeDAO();
EnderecoUFDAO ufDao = new EnderecoUFDAO();

/*
* Construtor
*/
public CidadeUFComboBean() {
populateUFs();
populateCidades();
}

/*
* Propriedades
*/
private String uf;

public String getUF() {
return uf;
}
public void setUF(String uf) {
this.uf = uf;
}

private String cidade;

public String getCidade() {
return cidade;
}
public void setCidade(String cidade) {
this.cidade = cidade;
}

private SortedMap ufs =
new TreeMap();

public SortedMap getUFs() {
return ufs;
}
public void setUFs(SortedMap ufs) {
this.ufs = ufs;
}

private SortedMap> cidadesData =
new TreeMap>();

public SortedMap> getCidadesData() {
return cidadesData;
}
public void setCidadesData(SortedMap> cidadesData) {
this.cidadesData = cidadesData;
}

private SortedMap cidades = new TreeMap();

public SortedMap getCidades() {
return cidades;
}
public void setCidades(SortedMap cidades) {
this.cidades = cidades;
}

/*
* Helpers
*/
private void populateUFs(){
System.out.println(“Populando Ufs…”);
List enderecoUFs = ufDao.list();
for (EnderecoUF enderecoUF : enderecoUFs) {
ufs.put(enderecoUF.getSigla(), enderecoUF.getSigla());

}
System.out.println(“Populando Ufs com “+ufs.size()+” itens…”);
}

private void populateCidades(){
for (String ufName : ufs.keySet()) {
cidadesData.put(ufName,cidDao.listCidadeNomes(ufName));
}
}

/*
* Action handlers
*/
public void changeUF() {
if(uf !=null && !uf.equals(“”))
cidades = cidadesData.get(uf);
else
cidades = new TreeMap();
}

}
[/cc]
 
Um grande abraço e muito sucesso!