RichFaces - a4jsuport -> autopreencher htmlinputtext

19 respostas
B

Boa Tarde Pessoal, estou tentando fazer um formulário autopreencher quando for digitado o cep no mesmo:

Ex: Digito 21840-040

Preenche:

Logradouro: Rua Evaristo Pires
Bairro: Bangu
Cidade: Rio de Janeiro
Estado: RJ

Esse é meu jsf (só a parte problemática):

<rich:tab label="Dados do endereço:">
                    <h:panelGrid columns="3" style="font-size: 9pt;">

                        <h:outputLabel value="CEP:" for="cep"/>
                        <h:inputText id="inputCep" size="6"  maxlength="9" binding="#{cadastroUsuario.inputCep}" valueChangeListener="#{cadastroUsuario.autoPreencherCep}"      value="#{cadastroUsuario.usuario.cep}" onchange="this.form.submit()" onkeyup="FormataCep(this,event)" />
                        
                    </h:panelGrid>
                        <h:message for="inputCep" styleClass="msgErro" />
                        <br/>
                        <rich:separator height="1"/>
                        <br/>

                    <h:panelGrid columns="4" style="font-size: 9pt;">

		        <h:outputLabel value="Logradouro:" for="logradouro"/>                        
                        <h:inputText id="inputLogradouro" binding="#{cadastroUsuario.inputLogradouro}" value="#{cadastroUsuario.usuario.logradouro}">
                            
                        </h:inputText>

			<h:outputLabel value="Numero:" for="numero"/>
                        <rich:inputNumberSpinner id="numero" minValue="1" maxValue="50000" value="#{cadastroUsuario.usuario.numero}"/>

                        <h:outputLabel value="Bairro:" for="bairro"/>
                        <h:inputText id="inputBairro" binding="#{cadastroUsuario.inputBairro}" value="#{cadastroUsuario.usuario.bairro}"/>

                        <h:outputLabel value="Cidade:" for="cidade"/>
                        <h:inputText id="inputCidade" binding="#{cadastroUsuario.inputCidade}" value="#{cadastroUsuario.usuario.cidade}"/>

                        <h:outputLabel value="Estado:" for="estado"/>
                        <h:inputText id="inputUf" maxlength="2" binding="#{cadastroUsuario.inputUf}" value="#{cadastroUsuario.usuario.estado}"/>

                        
		    </h:panelGrid>
		</rich:tab>

Meu mananger:

package br.com.projeto.control;

import br.com.projeto.model.Usuario;
import br.com.projeto.persistence.UsuarioDao;
import br.com.projeto.webServiceCep.WebServiceCep;
import javax.faces.application.FacesMessage;
import javax.faces.component.html.HtmlInputText;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;

public class ManterCadastroUsuario {

    private Usuario usuario;
    private String imagem;
    private String senha2;
    private HtmlInputText inputCep, inputLogradouro, inputBairro, inputCidade, inputUf;

    public ManterCadastroUsuario() {
        usuario = new Usuario();
    }

    public void autoPreencherCep(ValueChangeEvent vce) throws Exception{
        String cep = vce.getNewValue().toString();

        StringBuilder logradouro = new StringBuilder();
        StringBuilder bairro = new StringBuilder();
        StringBuilder cidade = new StringBuilder();
        StringBuilder uf = new StringBuilder();

        consultarCep(cep, logradouro, bairro, cidade, uf);
        inputLogradouro.setValue(logradouro.toString());
        inputBairro.setValue(bairro.toString());
        inputCidade.setValue(cidade.toString());
        inputUf.setValue(uf.toString());

    }

    private void consultarCep(String cep, StringBuilder logradouro, StringBuilder bairro, StringBuilder cidade, StringBuilder uf) throws Exception {

        String mensagemCep = null;
        if (usuario.getCep().length() < 9){
            mensagemCep = "Informe o CEP completo.";
          } else{
            WebServiceCep webServiceCep = WebServiceCep.searchCep(usuario.getCep());
                if (webServiceCep.wasSuccessful()) {

                    logradouro.append(webServiceCep.getLogradouroFull());
                    bairro.append(webServiceCep.getBairro());
                    cidade.append(webServiceCep.getCidade());
                    uf.append(webServiceCep.getUf());

                } else {
                    mensagemCep = "O CEP digitado não foi encontrado.";
                }
          }
            FacesContext.getCurrentInstance().addMessage("cep", new FacesMessage(mensagemCep));
       }

Agradeço se alguem puder me dar uma luz...

19 Respostas

R

olha, vc pode usar a tag

[code]

/code]

B

Eu tenho um webservice que busca o logradouro, bairro, cidade, uf, ele está rodando já testei o problema é que não to conseguindo trazer isso para o formulário, não ta auto preenchendo…

alves.Felipe

arruma o metodo do valueChangeListener para vc usar o a4j:support igual que o amigo baixo falou…
mas tem que renderizar os ids que vc quer…

a4j:support event="onchange" action="#{actionBean.método}" reRender="id1,id2,id3"/>
B

entendi… vou tentar aki…

A

Já experimentou retirar o onchange="this.form.submit()" do inputCep??

B

Mas se eu tirar o onchange nada acontece…

R

troca isto

<h:inputText id="inputCep" size="6"  maxlength="9" binding="#{cadastroUsuario.inputCep}" valueChangeListener="#{cadastroUsuario.autoPreencherCep}"      value="#{cadastroUsuario.usuario.cep}" onchange="this.form.submit()" onkeyup="FormataCep(this,event)" />

por

<h:inputText id="inputCep" size="6"  maxlength="9" binding="#{cadastroUsuario.inputCep}"       value="#{cadastroUsuario.usuario.cep}" onchange="this.form.submit()" onkeyup="FormataCep(this,event)" >
       <a4j:support event="onchange" action="#{cadastroUsuario.autoPreencherCep}" reRender = "ids dos componentes a serem renderizados />
</h:inputText>

lembrando que vc tem que colocar id nos compontes ou ainda vc pode utilizar um a4j:outputPanel para ajudar;
tenta ai qualquer coisa pergunta ai

R

me esqueci, tira o onchange e o onkeyup

B

To ligado em tirar o onchange, mas o onkeyup formata o cep 00000-000 tá em java script lá para cima, rs vou tentar as opções que me passaram daki a pouco dou a resposta, Obrigado Galera!

A
No input:
&lt;h:inputText id="inputCep" ... immediate="true" /&gt;
E no backBean:
public void autoPreencherCep(ValueChangeEvent vce) throws Exception{
        String cep = vce.getNewValue().toString();
        ....        
        inputUf.setValue(uf.toString());

       FacesContext.getCurrentInstance().renderResponse();
    }
A

mas a parada do ajax ai tambem funfa!!!

B

Fala pessoal!

Fiz as alterações, quando preencho o cep e clico no proximo campo ou fora ele até faz o reRender, mas não traz os valores Rua Evaristo Pires... ele não tá encaixando as informações nos campos... :?

O controle:

package br.com.projeto.control;

import br.com.projeto.model.Usuario;
import br.com.projeto.persistence.UsuarioDao;
import br.com.projeto.webServiceCep.WebServiceCep;
import javax.faces.application.FacesMessage;
import javax.faces.component.html.HtmlInputText;
import javax.faces.context.FacesContext;

public class ManterCadastroUsuario {

    private Usuario usuario;
    private String imagem;
    private String senha2;
    private HtmlInputText inputCep, inputLogradouro, inputBairro, inputCidade, inputUf;

    public ManterCadastroUsuario() {
        usuario = new Usuario();
    }

    public void autoPreencherCep() throws Exception{

        StringBuilder logradouro = new StringBuilder();
        StringBuilder bairro = new StringBuilder();
        StringBuilder cidade = new StringBuilder();
        StringBuilder uf = new StringBuilder();

        consultarCep(logradouro, bairro, cidade, uf);
        inputLogradouro.setValue(logradouro.toString());
        inputBairro.setValue(bairro.toString());
        inputCidade.setValue(cidade.toString());
        inputUf.setValue(uf.toString());

        FacesContext.getCurrentInstance().renderResponse();
    }

    private void consultarCep(StringBuilder logradouro, StringBuilder bairro, StringBuilder cidade, StringBuilder uf) throws Exception {

        String mensagemCep = null;
        if (usuario.getCep().length() < 9){
            mensagemCep = "Informe o CEP completo.";
          } else{
            WebServiceCep webServiceCep = WebServiceCep.searchCep(usuario.getCep());
                if (webServiceCep.wasSuccessful()) {

                    logradouro.append(webServiceCep.getLogradouroFull());
                    bairro.append(webServiceCep.getBairro());
                    cidade.append(webServiceCep.getCidade());
                    uf.append(webServiceCep.getUf());

                } else {
                    mensagemCep = "O CEP digitado não foi encontrado.";
                }
          }
            FacesContext.getCurrentInstance().addMessage("inputcep", new FacesMessage(mensagemCep));
       }

A jsf:

<f:view>

	<rich:panel>
		<f:facet name="header">
            <h:outputText value="Cadastro de usuário"/>
		</f:facet>

		<h:outputText value="Formulário para cadastro de usuário"/>

		<a4j:form id="formcadastrousuario">

			<rich:tabPanel switchType="client" width="600">
				<rich:tab label="Dados do usuário:">

                    <h:panelGrid columns="2" style="font-size: 9pt;">

                        <h:outputLabel value="Nome:" for="nome"/>
						<h:inputText id="nome" value="#{cadastroUsuario.usuario.nome}"/>

						<h:outputLabel value="CPF:" for="cpf"/>
                        <h:inputText id="cpf" maxlength="14" value="#{cadastroUsuario.usuario.cpf}" onkeyup="FormataCpf(this,event)"/>

						<h:outputLabel value="Data de Nascimento:" for="datanascimento"/>
						<rich:calendar id="datanascimento" datePattern="dd/MM/yyyy"
							value="#{cadastroUsuario.usuario.datanascimento}"/>

                     </h:panelGrid>

                     <br/>
                        <rich:separator height="1"/>
                     <br/>

                     <h:panelGrid columns="1" style="font-size: 9pt;">

                        <h:graphicImage url="kaptcha.jpg" width="200" />
                        <br/>
                        <h:outputLabel value="Digite a imagem acima:" for="imagem" />
                        <h:inputText id="imagem" value="#{cadastroUsuario.imagem}" size="16" />
                        
                     </h:panelGrid>
                </rich:tab>

                 <rich:tab label="Dados do endereço:">                  
                    <h:panelGrid columns="3" style="font-size: 9pt;">

                        <h:outputLabel value="CEP:" for="cep"/>
                        <h:inputText id="inputCep" size="6"  maxlength="9" value="#{cadastroUsuario.usuario.cep}" onkeyup="FormataCep(this,event)" >
                             <a4j:support event="onchange" action="#{cadastroUsuario.autoPreencherCep}" reRender="inputLogradouro, inputBairro, inputCidade, inputUf" />
                        </h:inputText>
                        
                    </h:panelGrid>
                        <h:message for="inputCep" styleClass="msgErro" />
                        <br/>
                        <rich:separator height="1"/>
                        <br/>

                    <h:panelGrid columns="4" style="font-size: 9pt;">

						<h:outputLabel value="Logradouro:" for="logradouro"/>                        
                        <h:inputText id="inputLogradouro" binding="#{cadastroUsuario.inputLogradouro}" value="#{cadastroUsuario.usuario.logradouro}" immediate="true">
                            
                        </h:inputText>

						<h:outputLabel value="Numero:" for="numero"/>
                        <rich:inputNumberSpinner id="numero" minValue="1" maxValue="50000" value="#{cadastroUsuario.usuario.numero}"/>

                        <h:outputLabel value="Bairro:" for="bairro"/>
                        <h:inputText id="inputBairro" binding="#{cadastroUsuario.inputBairro}" value="#{cadastroUsuario.usuario.bairro}"/>

                        <h:outputLabel value="Cidade:" for="cidade"/>
                        <h:inputText id="inputCidade" binding="#{cadastroUsuario.inputCidade}" value="#{cadastroUsuario.usuario.cidade}"/>

                        <h:outputLabel value="Estado:" for="estado"/>
                        <h:inputText id="inputUf" maxlength="2" binding="#{cadastroUsuario.inputUf}" value="#{cadastroUsuario.usuario.estado}"/>

					</h:panelGrid>
				</rich:tab>

                    <rich:tab label="Dados da conta:">
                        <h:panelGrid columns="2" style="font-size: 9pt;">

						<h:outputLabel value="Email:" for="email"/>
						<h:inputText id="email" value="#{cadastroUsuario.usuario.email}"/>

                        <h:outputLabel value="Senha:" for="senha"/>
                        <h:inputSecret id="senha" value="#{cadastroUsuario.usuario.senha}"/>

                        <h:outputLabel value="Confirme a senha:" for="senha2"/>
                        <h:inputSecret id="senha2" value="#{cadastroUsuario.senha2}"/>

					</h:panelGrid>

				</rich:tab>

				
			</rich:tabPanel>
            <br/>
			<a4j:commandButton value="Cadastrar Usuário" action="#{cadastroUsuario.cadastrar}" reRender="formcadastrousuario"/>
            <a4j:commandButton value="Cancelar" id="cancelar" >
				<rich:componentControl attachTo="cancelar" for="formcadastrousuario" event="onclick" operation="hide" />
			</a4j:commandButton>
            <br/><br/>
            <h:messages styleClass="msgErro"/>

		</a4j:form>
        </rich:panel>
        </f:view>
A

Cara vc me entendeu errado era uma solução ou outra! Mas vc mudou seu form e seu backbean, logo se vc resolver voltar o q era antes talvez funcione :wink:

No input (Dentro de um form jsf normal sem ajax):
&lt;h:inputText id="inputCep" size="6"  maxlength="9" binding="#{cadastroUsuario.inputCep}" valueChangeListener="#{cadastroUsuario.autoPreencherCep}"      value="#{cadastroUsuario.usuario.cep}" onchange="this.form.submit()" onkeyup="FormataCep(this,event)" immediate="true" /&gt;
Seu backBean deveria ser:
public void autoPreencherCep(ValueChangeEvent vce) throws Exception{
        String cep = vce.getNewValue().toString();

        StringBuilder logradouro = new StringBuilder();
        StringBuilder bairro = new StringBuilder();
        StringBuilder cidade = new StringBuilder();
        StringBuilder uf = new StringBuilder();

        consultarCep(logradouro, bairro, cidade, uf);
        inputLogradouro.setValue(logradouro.toString());
        inputBairro.setValue(bairro.toString());
        inputCidade.setValue(cidade.toString());
        inputUf.setValue(uf.toString());

        FacesContext.getCurrentInstance().renderResponse();
    }
B

Eu te entendi sim amigo, até fiz o que vc me aconselhou mas não trouxe as informações… mas piscou a tela… renderizou…

B

Se eu der um print ou trazer dentro de uma msg eu consigo trazer o resultado Rua… Bairro… cidade… Estado… mas não to conseguindo fazer esse troço entrar nos campos, o erro ou tá no backbean na parte que eu resgato os valores, ou está no formulário em trazer os valores nos campos…

A

Esse seu backBean que vc postou ta completo, ou vc so colocou a parte importante, tipo existe nele os getters e setters dos inputs né???

B

tem sim vou postar ele completo...

package br.com.projeto.control;

import br.com.projeto.model.Usuario;
import br.com.projeto.persistence.UsuarioDao;
import br.com.projeto.webServiceCep.WebServiceCep;
import javax.faces.application.FacesMessage;
import javax.faces.component.html.HtmlInputText;
import javax.faces.context.FacesContext;

public class ManterCadastroUsuario {

    private Usuario usuario;
    private String imagem;
    private String senha2;
    private HtmlInputText inputCep, inputLogradouro, inputBairro, inputCidade, inputUf;

    public ManterCadastroUsuario() {
        usuario = new Usuario();
    }

    public void autoPreencherCep() throws Exception{

        StringBuilder logradouro = new StringBuilder();
        StringBuilder bairro = new StringBuilder();
        StringBuilder cidade = new StringBuilder();
        StringBuilder uf = new StringBuilder();

        consultarCep(logradouro, bairro, cidade, uf);
        inputLogradouro.setValue(logradouro.toString());
        inputBairro.setValue(bairro.toString());
        inputCidade.setValue(cidade.toString());
        inputUf.setValue(uf.toString());

        FacesContext.getCurrentInstance().renderResponse();
    }

    private void consultarCep(StringBuilder logradouro, StringBuilder bairro, StringBuilder cidade, StringBuilder uf) throws Exception {

        String mensagemCep = null;
        if (usuario.getCep().length() < 9){
            mensagemCep = "Informe o CEP completo.";
          } else{
            WebServiceCep webServiceCep = WebServiceCep.searchCep(usuario.getCep());
                if (webServiceCep.wasSuccessful()) {

                    logradouro.append(webServiceCep.getLogradouroFull());
                    bairro.append(webServiceCep.getBairro());
                    cidade.append(webServiceCep.getCidade());
                    uf.append(webServiceCep.getUf());

                } else {
                    mensagemCep = "O CEP digitado não foi encontrado.";
                }
          }
            FacesContext.getCurrentInstance().addMessage("inputcep", new FacesMessage(mensagemCep));
       }

    public void cadastrar() {
        String mensagem = null;
        try {

            String captcha = (String) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
            boolean dadosValidos = true;

            if (usuario.getNome().length() < 3) {
                mensagem = "Digite um nome valido!";
                dadosValidos = false;
            } else if (usuario.getCpf().length() < 14) {
                mensagem = "Digite um CPF valido!";
                dadosValidos = false;
            } else if (usuario.getDatanascimento() == null) {
                mensagem = "Informe a data de nascimento!";
                dadosValidos = false;
            } else if (usuario.getCep().length() < 9) {
                mensagem = "Informe o seu CEP!";
                dadosValidos = false;
            } else if (usuario.getLogradouro().length() < 10) {
                mensagem = "Digite um endereço valido!";
                dadosValidos = false;
            } else if (usuario.getBairro().length() < 3) {
                mensagem = "Digite um bairro valido!";
                dadosValidos = false;
            } else if (usuario.getEstado() == null) {
                mensagem = "Digite um estado valido!";
                dadosValidos = false;
            } else if (usuario.getNumero() == null) {
                mensagem = "Informe o numero da residencia!";
                dadosValidos = false;
            } else if (usuario.getCidade().length() < 5) {
                mensagem = "Digite uma cidade valida!";
                dadosValidos = false;
            } else if (usuario.getEmail().length() < 8) {
                mensagem = "Digite um email valido!";
                dadosValidos = false;
            } else if (usuario.getSenha() == null) {
                mensagem = "Informe uma senha!";
                dadosValidos = false;
            } else if (usuario.getSenha().length() < 6) {
                mensagem = "Informe uma senha com pelo menos 6 digitos!";
                dadosValidos = false;
            } else if (new UsuarioDao().cpfExistente(usuario.getCpf())){
                mensagem = "Erro. O CPF digitado já está cadastrado.";
                dadosValidos = false;
            }
            

            if (dadosValidos) {
                if (captcha != null && imagem != null) {
                    if (imagem.equals(captcha)) {
                        if (usuario.getSenha().equals(senha2)) {
                            new UsuarioDao().salvar(usuario);
                            usuario = new Usuario();
                            mensagem = "Usuário cadastrado com sucesso!";
                        } else {
                            mensagem = "As senhas não coincidem! Digite novamente.";
                        }
                    } else {
                        mensagem = "Erro, digite a imagem corretamente!";
                    }
                }
            }

        } catch (Exception e) {
            mensagem = e.getMessage();
        }
        FacesContext.getCurrentInstance().addMessage("formcadastrousuario", new FacesMessage(mensagem));
    }

    public Usuario getUsuario() {
        return usuario;
    }

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

    public String getImagem() {
        return imagem;
    }

    public void setImagem(String imagem) {
        this.imagem = imagem;
    }

    public String getSenha2() {
        return senha2;
    }

    public void setSenha2(String senha2) {
        this.senha2 = senha2;
    }

    public HtmlInputText getInputBairro() {
        return inputBairro;
    }

    public void setInputBairro(HtmlInputText inputBairro) {
        this.inputBairro = inputBairro;
    }

    public HtmlInputText getInputCep() {
        return inputCep;
    }

    public void setInputCep(HtmlInputText inputCep) {
        this.inputCep = inputCep;
    }

    public HtmlInputText getInputCidade() {
        return inputCidade;
    }

    public void setInputCidade(HtmlInputText inputCidade) {
        this.inputCidade = inputCidade;
    }

    public HtmlInputText getInputLogradouro() {
        return inputLogradouro;
    }

    public void setInputLogradouro(HtmlInputText inputLogradouro) {
        this.inputLogradouro = inputLogradouro;
    }

    public HtmlInputText getInputUf() {
        return inputUf;
    }

    public void setInputUf(HtmlInputText inputUf) {
        this.inputUf = inputUf;
    }
       
    
}
R

bom dia meu amigo, qual o escopo do seu backbean?

B

request

Criado 29 de outubro de 2010
Ultima resposta 4 de nov. de 2010
Respostas 19
Participantes 4