Uma coisa que nunca gostei foi de selectOneMenu, segue embaixo um exemplo tosco, se alguem sabe como fazer diferente com mais eficiencia, posta aqui !
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@taglib uri="http://richfaces.org/a4j" prefix="a4j" %>
<%@taglib uri="http://richfaces.org/rich" prefix="rich" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery.maskedinput-1.2.1.js"></script>
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/estilos.css" />
<title>Registrar Cliente</title>
</head>
<body>
<f:view>
<f:loadBundle basename="messages" var="msgs" />
<rich:tabPanel>
<rich:tab label="Cadastro de Clientes">
<h:form id="formCliente" styleClass="global" >
<fieldset>
<div>
<h:messages id="MensagensGlobais" globalOnly="true" errorClass="errorMessage"
infoClass="successMessage" />
</div>
<h2 class="h2"><font ><h:outputText value="#{msgs['cliente.titulo']}" /> </font></h2>
<br />
<table>
<h:inputHidden value="#{ClienteBean.cliente.id}" id="id_cliente" ></h:inputHidden>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.nome']}" for="nome" /></td>
<td><h:inputText id="nome" value="#{ClienteBean.cliente.nome}" required="true" maxlength="60"
size="40" requiredMessage="Informe o seu nome" />
</td>
</tr>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.sobrenome']}" for="sobrenome" /></td>
<td><h:inputText id="sobrenome" value="#{ClienteBean.cliente.sobrenome}" required="true" maxlength="60"
size="60" requiredMessage="Informe o seu sobrenome" />
</td>
</tr>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.CPF']}" for="cpf" /></td>
<td>
<h:inputText id="cpf" value="#{ClienteBean.cliente.cpf}" required="false" maxlength="14"
size="14" >
<rich:jQuery selector="#cpf" query="mask('999.999.999-99')" timing="onload" />
</h:inputText>
</td>
</tr>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.RG']}" for="rg" /></td>
<td><h:inputText id="rg" value="#{ClienteBean.cliente.rg}" required="false" maxlength="13"
size="20" >
<rich:jQuery selector="#rg" query="mask('999.999.999-9')" timing="onload" />
</h:inputText>
</td>
</tr>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.dtnascimento']}" for="dataNascimento" /></td>
<td>
<rich:calendar id="dataNascimento" value="#{ClienteBean.cliente.dataNascimento}"
required="false" datePattern="dd/MM/yyyy" >
<f:convertDateTime pattern="dd/MM/yyyy"/>
</rich:calendar>
<br /><h:message for="dataNascimento" styleClass="message" />
</td>
</tr>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.sexo']}" for="sexo" /></td>
<td>
<h:selectOneRadio id="sexo" value="#{ClienteBean.cliente.sexo}" required="true"
requiredMessage="Sexo é obrigatório" styleClass="radio">
<f:selectItems value="#{ClienteBean.opcoesSexo}" />
</h:selectOneRadio>
</td>
</tr>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.email']}" for="email" /></td>
<td>
<h:inputText id="email" value="#{ClienteBean.cliente.email}" required="false" maxlength="100"
size="100" >
<f:validator validatorId="jm.validator.email" />
</h:inputText>
<h:message for="email" styleClass="message" />
</td>
</tr>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.senha']}" for="senha" /></td>
<td>
<h:inputSecret id="senha" value="#{ClienteBean.cliente.senha}" required="true" maxlength="6"
size="6" requiredMessage="Senha é obrigatório">
</h:inputSecret>
<h:message for="senha" styleClass="message"></h:message>
</td>
</tr>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.confirma_senha']}" for="senhaConfirma" /></td>
<td><h:inputSecret id="senhaConfirma" value="#{ClienteBean.senhaConfirma}" required="true" maxlength="6"
size="6" requiredMessage="Confirme a senha" />
</td>
</tr>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.telefone']}" for="telefone" /> </td>
<td>
<h:inputText id="telefone" value="#{ClienteBean.cliente.telefone}" required="false"
maxlength="14" size="14" >
<rich:jQuery selector="#telefone" query="mask('(999)9999-9999')" timing="onload" />
</h:inputText>
</td>
</tr>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.celular']}" for="celular" /> </td>
<td>
<h:inputText id="celular" value="#{ClienteBean.cliente.celular}" required="false"
maxlength="14" size="14" >
<rich:jQuery selector="#celular" query="mask('(999)9999-9999')" timing="onload" />
</h:inputText>
</td>
</tr>
</table>
<h2 class="h2"><font ><h:outputText value="#{msgs['cliente.subtitulo']}" /></font></h2>
<br />
<table>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.estado']}" for="uf" /></td>
<td>
<h:selectOneMenu id="uf" value="#{ClienteBean.cliente.unidadeFederativa}" required="true"
immediate="true" requiredMessage="Informe o estado do seu endereço" rendered="true">
<f:selectItem itemLabel="-- Selecione um --" />
<f:selectItems value="#{ClienteBean.unidadesFederativas}" />
<a4j:support event="onchange" ajaxSingle="true" reRender="uf,municipio"
actionListener="#{ClienteBean.atualizaMunicipio}" />
</h:selectOneMenu>
<h:message for="uf" styleClass="uf" />
</td>
</tr>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.municipio']}" for="municipio" /> </td>
<td>
<h:selectOneMenu id="municipio" value="#{ClienteBean.cliente.municipio}" required="true"
immediate="true" requiredMessage="Informe o municipio do seu endereço" rendered="true" >
<f:selectItem itemLabel="-- Selecione um --" />
<f:selectItems value="#{ClienteBean.municipios}" />
</h:selectOneMenu>
</td>
</tr>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.endereco']}" for="endereco" /> </td>
<td>
<h:inputText id="endereco" value="#{ClienteBean.cliente.endereco}" required="true"
maxlength="60" size="60" requiredMessage="O campo endereço é obrigatório" >
</h:inputText>
</td>
</tr>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.numero']}" for="numero" ></h:outputLabel> </td>
<td>
<h:inputText id="numero" value="#{ClienteBean.cliente.numero}" required="false"
maxlength="30" size="10" >
</h:inputText>
</td>
</tr>
<tr>
<td class="td_titulo" ><h:outputLabel value="#{msgs['cliente.complemento']}" for="complemento" ></h:outputLabel> </td>
<td>
<h:inputText id="complemento" value="#{ClienteBean.cliente.complemento}" required="false"
maxlength="10" size="10" >
</h:inputText>
</td>
</tr>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.bairro']}" for="bairro" /> </td>
<td>
<h:inputText id="bairro" value="#{ClienteBean.cliente.bairro}" required="true"
maxlength="30" size="30" requiredMessage="O campo bairro é obrigatório" ></h:inputText>
</td>
</tr>
<tr>
<td class="td_titulo"><h:outputLabel value="#{msgs['cliente.referencia']}" for="referencial" /> </td>
<td>
<h:inputText id="referencial" value="#{ClienteBean.cliente.referencial}" required="false"
maxlength="40" size="40">
</h:inputText>
</td>
</tr>
</table>
<h:commandButton value="Registrar" action="#{ClienteBean.registrar}" />
<h:commandButton value="Limpar" type="reset" />
<h:commandButton value="Cancelar" action="mostrar" immediate="true" />
</fieldset>
</h:form>
</rich:tab>
</rich:tabPanel>
</f:view>
</body>
</html>
package jm.livrosonline.bean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import jm.livrosonline.dao.Alias;
import jm.livrosonline.dao.impl.DAOImpl;
import jm.livrosonline.entidade.Cliente;
import jm.livrosonline.entidade.Municipio;
import jm.livrosonline.entidade.UnidadeFederativa;
import jm.livrosonline.enumerados.Sexo;
import jm.livrosonline.util.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
public class ClienteBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private List<SelectItem> municipios;
private List<SelectItem> unidadesFederativas;
private Cliente cliente = new Cliente();
private List<Cliente> clientes = new ArrayList<Cliente>();
private String senhaConfirma;
private String editId;
public ClienteBean() {
// TODO Auto-generated constructor stub
}
public void atualizaMunicipio( ValueChangeEvent vce ){
try{
cliente.setUnidadeFederativa( (UnidadeFederativa)vce.getNewValue() );
loadMunicipio( (UnidadeFederativa)vce.getNewValue() );
}catch( Exception e ){
municipios.clear();
e.printStackTrace();
System.out.println("Erro no método atualizaMunicipio do tipo: " + e.getMessage() );
}
}
public String novo(){
this.cliente = new Cliente();
return "novo";
}
public String registrar() {
if ( ! senhaConfirma.equals( this.cliente.getSenha() ) ) {
FacesMessage msg =
new FacesMessage( "A senha de confirmação informada não confere" );
msg.setSeverity( FacesMessage.SEVERITY_ERROR );
FacesContext.getCurrentInstance().addMessage( null, msg );
return "erro";
}
Session session = HibernateUtil.getSession();
DAOImpl<Cliente> daoCliente = new DAOImpl<Cliente>(session, Cliente.class);
daoCliente.merge( this.cliente );
this.cliente = new Cliente();
this.municipios.clear();
return "mostrar";
}
public ArrayList<SelectItem> getMunicipios() {
if ( this.municipios == null && cliente.getUnidadeFederativa() != null ){
loadMunicipio( cliente.getUnidadeFederativa() );
}else if ( this.municipios == null ) {
return new ArrayList<SelectItem>();
}
return (ArrayList<SelectItem>) this.municipios;
}
private void loadMunicipio( UnidadeFederativa uf ){
this.municipios = new ArrayList<SelectItem>();
Session session = HibernateUtil.getSession();
DAOImpl<Municipio> daoMunicipio = new DAOImpl<Municipio>( session, Municipio.class );
List<Criterion> criteria = new ArrayList<Criterion>();
List<Alias> aliases = new ArrayList<Alias>();
criteria.add( Restrictions.eq("unidadeFederativa.id", uf.getId() ) );
List<Municipio> entidade = daoMunicipio.listar( aliases, criteria, "descricao", true );
for (Municipio municipio : entidade) {
this.municipios.add( new SelectItem( municipio, municipio.getDescricao() ) );
}
}
public List<SelectItem> getUnidadesFederativas(){
if ( unidadesFederativas == null ) {
unidadesFederativas = new ArrayList<SelectItem>();
Session session = HibernateUtil.getSession();
DAOImpl<UnidadeFederativa> daoUnidadeFederativa = new DAOImpl<UnidadeFederativa>(session, UnidadeFederativa.class);
List<UnidadeFederativa> entidades = daoUnidadeFederativa.list();
for (UnidadeFederativa unidadeFederativa : entidades) {
unidadesFederativas.add(
new SelectItem( unidadeFederativa , unidadeFederativa.getDescricao() ) );
}
}
return unidadesFederativas;
}
public String escolherCliente( ){
Session session = HibernateUtil.getSession();
DAOImpl<Cliente> daoCliente = new DAOImpl<Cliente>(session, Cliente.class);
return "editar";
}
public void deletarCliente( ActionEvent event ){
UIComponent link = event.getComponent();
UIParameter param = (UIParameter) link.findComponent("deletId");
Long id = ( Long ) param.getValue();
Session session = HibernateUtil.getSession();
DAOImpl<Cliente> daoCliente = new DAOImpl<Cliente>( session, Cliente.class );
daoCliente.delete( daoCliente.load( id ) );
}
public List<SelectItem> getOpcoesSexo(){
List<SelectItem> itens = new ArrayList<SelectItem>();
itens.add( new SelectItem( Sexo.FEMININO.toString() , "Feminino" ) );
itens.add( new SelectItem( Sexo.MASCULINO.toString() , "Masculino" ) );
return itens;
}
public Cliente getCliente() {
return cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
public String getSenhaConfirma() {
return senhaConfirma;
}
public void setSenhaConfirma(String senhaConfirma) {
this.senhaConfirma = senhaConfirma;
}
public List<Cliente> getClientes() throws Exception {
Session session = HibernateUtil.getSession();
DAOImpl<Cliente> daoCliente = new DAOImpl<Cliente>( session, Cliente.class );
List<Criterion> criteria = new ArrayList<Criterion>();
List<Alias> aliases = new ArrayList<Alias>();
criteria.add( Restrictions.ilike("nome", "", MatchMode.ANYWHERE ) );
this.clientes = daoCliente.listar( aliases, criteria, "nome", true );
return clientes;
}
public void setClientes(List<Cliente> clientes) {
this.clientes = clientes;
}
public String getEditId() {
return editId;
}
public void setEditId(String editId) {
this.editId = editId;
}
}