[RESOLVIDO] Buscar dados após digitar CPF

Olá

Eu tenho uma aplicação web em JSF e tenho uma página onde preciso digtar um CPF, buscar as informações no BD (caso existam) e carregá-las nos campos correspondentes na mesma página.

Alguém tem alguma idéia de como posso fazer isso? :roll:

DWR

JSF2 possui suporte nativo à ajax.
A documentação é bem tranquila e existem vários exemplos na internet.

Alguém sabe onde tem algum exemplo?

Obrigada

Utiliza JSF “puro” ou com framework adicional ? (Primefaces, RichFaces, … )

Segue um exemplo, utilizando http://primefaces.org/ ,neste exemplo o cara digitava o cep, ele consultava no banco e carregava o endereço

[code]<h:panelGrid columns=“2”>
<p:inputMask id=“cep” value="#{pessoaBean.endereco.cep}" required=“true” requiredMessage=“Cep é um campo obrigatório” maxlength=“8” mask=“99999999” >
<p:ajax event=“blur” listener="#{pessoaBean.buscaEndereço()}" update=“formCadastroJuridica:estado,formCadastroJuridica:cidade,formCadastroJuridica:bairro,formCadastroJuridica:endereco”/>
</p:inputMask>

            &lt;p:ajaxStatus&gt;
                &lt;f:facet name="start"&gt;
                    &lt;h:graphicImage value="/imagens/icones/ajaxloading.gif"/&gt;
                &lt;/f:facet&gt;

                &lt;f:facet name="complete"&gt;
                    &lt;h:outputText value="" /&gt;
                &lt;/f:facet&gt;
            &lt;/p:ajaxStatus&gt;
        &lt;/h:panelGrid&gt;
        &lt;p:message for="cep"/&gt;

        UF: *
        &lt;h:selectOneMenu  id="estado" value="#{pessoaBean.endereco.uf}" required="true" requiredMessage="Selecione um estado." converterMessage="Estado é obrigatório." &gt;
            &lt;f:selectItem itemLabel="Selecione..." itemValue="" /&gt; 
            &lt;f:selectItems value="#{ufBean.ufItens}" /&gt;
            &lt;p:ajax event="change" process="estado" listener="#{pessoaBean.carregaCidadesEstado()}" update="formCadastroJuridica:estado,formCadastroJuridica:bairro,formCadastroJuridica:endereco" /&gt;
        &lt;/h:selectOneMenu&gt;
        &lt;p:message for="estado"/&gt;
        Cidade: *
        &lt;h:selectOneMenu id="cidade" value="#{pessoaBean.endereco.cidade}" required="true" requiredMessage="Selecione uma cidade." converterMessage="Cidade é obrigatório."&gt;
            &lt;f:selectItem itemValue="a" itemLabel="Selecione..." /&gt;
            &lt;f:selectItems value="#{pessoaBean.cidadesByUf}" /&gt;
        &lt;/h:selectOneMenu&gt;
        &lt;p:message for="cidade"/&gt;


        Bairro: *
        &lt;p:inputText id="bairro" value="#{pessoaBean.endereco.bairro}" required="true" requiredMessage="Bairro é um campo obrigatório"
                     maxlength="15"/&gt;
        &lt;p:message for="bairro"/&gt;


        Endereço: *
        &lt;p:inputText id="endereco" value="#{pessoaBean.endereco.logradouro}"
                     maxlength="60" size="60" required="true" requiredMessage="Endereço é um campo obrigatório"/&gt;
        &lt;p:message for="endereco"/&gt;[/code]

Na linha 3:

&lt;p:ajax event="blur" listener="#{pessoaBean.buscaEndereço()}"

Ele executa o metodo buscaEndereço após o campo perder o focus

Funciona mais ou menos assim :slight_smile:
:-o

Tentei fazer meu código seguindo o exemplo do ale0790, mas verifiquei que o número do CPF não é passado para o Bean e dessa forma a consulta retorna sem dados para carregar na página.
Meu código ficou assim:

xhtml

[code]<h:form id=“cadastrousuario”>
<p:messages showDetail=“true” autoUpdate=“true” showSummary=“false” />
<h:inputHidden value="#{usuarioBean.usuario.id}" />

		<div class="campo-grupo">
			<h:outputLabel value="CPF" />
			<p:inputText id="cpf"
				value="#{usuarioBean.documento.numero}"
				required="true" requiredMessage="CPF é um campo obrigatório"
				immediate="true" maxlength="11" 
				converter="documentoConversor" size="10">
				<p:ajax event="blur" listener="#{usuarioBean.buscaPorCPF()}"
					update="cadastrousuario:nome" />
			</p:inputText>
		</div>

		<div class="campo-grupo">
			<h:outputLabel value="Nome" />
			<p:inputText id="nome" value="#{usuarioBean.usuario.pessoa.nome}"
				required="true" requiredMessage="Nome é um campo obrigatório"
				maxlength="60" onkeyup="up(this)" size="70"/>
				<p:message for="nome" />
		</div>

		<div style="clear: both;"></div>

		<div class="campo-simples">
			<h:outputLabel value="Email" />
			<p:inputText size="100" name="email"
				value="#{usuarioBean.usuario.pessoa.email}" maxlength="60" />
		</div>[/code]

meu ManagedBean

[code]@javax.faces.bean.ManagedBean(name = “usuarioBean”)
@RequestScoped
public class UsuarioBean {
private Usuario usuario = new Usuario();
private List lista = null;
private Documento documento = new Documento();

public String salvar() {
	UsuarioRN usuarioRN = new UsuarioRN();
	this.usuario.getPessoa().setDocumento(this.documento);
	usuarioRN.salvar(this.usuario);
	return "principal";
}

public Map<Long, String> ListarUsuarios() {
	UsuarioRN usuarioRN = new UsuarioRN();
	Map<Long, String> auxiliar = new HashMap<Long, String>();
	for (Usuario usuario : usuarioRN.listar()) {
		auxiliar.put(usuario.getId(), usuario.getNome());
	}
	return auxiliar;
}

public void buscaPorCPF() {
	UsuarioRN usuarioRN = new UsuarioRN();
	this.usuario.setPessoa(usuarioRN.buscarPessoaPorCPF(this.documento));
}

// GETTERS AND SETTERS
public Usuario getUsuario() {
	return usuario;
}

public void setUsuario(Usuario usuario) {
	this.usuario = usuario;
}

public List<Usuario> getLista() {
	UsuarioRN usuarioRN = new UsuarioRN();
	return usuarioRN.listar();
}

public void setLista(List<Usuario> lista) {
	this.lista = lista;
}

public Documento getDocumento() {
	return documento;
}

public void setDocumento(Documento documento) {
	this.documento = documento;
}

}[/code]

Alguém pode me ajudar por favor?

sou meio leigo ainda, sera que seu bean nao devia ser ?? @SessionScoped ?? testa ai

Já tentei isso :confused:

Tá difícil encontrar uma solução viu…

value="#{usuarioBean.usuario.pessoa.nome}" 

Dentro de usuário tem um objeto pessoa que tem um atributo nome? ou o nome fica no usuario?

value="#{usuarioBean.usuario.nome}" 

Não carrega o objeto ou nao atualiza a tela?

Outra dica,

Quanto você faz:

//@ManagedBean(name = "usuarioBean") @ManagedBean public class UsuarioBean { }
Você pode utilizar somente o @ManagedBean, que por padrão, ele já irá pegar o nome da classe (No caso UsuarioBean) seguindo os padrões, e ficaria usuarioBean, use name="" apenas se for colocar um mapeamento diferente.

Fica a dica :wink:

[quote=Cesar Pizolato]value="#{usuarioBean.usuario.pessoa.nome}"
Dentro de usuário tem um objeto pessoa que tem um atributo nome? ou o nome fica no usuario?

value="#{usuarioBean.usuario.nome}" 

Não carrega o objeto ou nao atualiza a tela?[/quote]

Então, dentro de Usuario eu tenho um objeto pessoa onde tem o nome, ou seja (value="#{usuarioBean.usuario.pessoa.nome}") tá certo.
Ele não carrega o objeto, coloquei um Sysout no método assim:

public void buscaPorCPF() { System.out.println(this.documento.getNumero()); UsuarioRN usuarioRN = new UsuarioRN(); this.usuario.setPessoa(usuarioRN.buscarPessoaPorCPF(this.documento)); System.out.println(this.documento.getNumero()); }

E ele me retorna sempre NULL… O Select que ele monta está correto pois já executei no BD e funciona perfeitamente, então não é problema no mapeamento.

Estou ficando sem idéias já :cry:

Ele executa o método então ? Pq uma vez apanhei disso para cacete, ele não executava o método pq tinha um campo required=“true” e eu só ia preenchê-lo depois, do jeito que está ai, o nome está required, acho que ele só irá executar se o campo estiver preenchido, confirma ai…

Sim, ele executa o método porém já entra nele com os valores ‘null’…
Testei da forma que voc falou tirando o required mas mesmo assim não funciona.

Não entendo porque o valor do Cpf não chega no método…

Oi. Ao postar tópicos, por favor, NÃO USE CAIXA ALTA NO TÍTULO.

Fez passo a passo o Debug?

Oi, desculpem desenterra o tópico, mas queria saber como voce conseguiu resolver. Voce pode explicar a solução Juliana?

Obrigado