Como atualizar CEP com JQuery e Struts2 [RESOLVIDO]

12 respostas
J

Olá,

estou com o seguinte problema: tenho um cadastrado em uma página JSP.
Um dos campos deste cadastrado é o CEP. A hora que o usuário informar o CEP, uma busca no banco deve ser realizada e, se for encontrado o CEP procurado, os demais campos (rua, cidade e bairro) são preenchidos.
Estou usando JQuery, Struts2 e Hibernate.

O código na página JSP está assim:

<tr>
                <td align="right">
                    CEP:
                </td>
                <td align="left">
                    <input name="CEP.cepCep" type="text"
                           onfocus="alterarCorDeCampo(this,'yellow')" onblur="alterarCorDeCampo(this,'white'); buscarCep(this);"
                           maxlength="20" />
                </td>
            </tr>
            <div id="atualizar">
            <tr>
                <td align="right">
                    Rua:
                </td>
                <td align="left">
                    <input name="CEP.cepRua" type="text"
                           onfocus="alterarCorDeCampo(this,'yellow');" onblur="alterarCorDeCampo(this,'white')"
                           maxlength="255" />
                </td>
            </tr>

A função buscarCEP é invocada a hora que o usuário sai do campo. Ele contém o seguinte código:

function buscarCep(cep) {
        $.post("buscaCep", {"id" : cep.value}, function(dados) {
            //Não sei como posso fazer para preencher os campos!!!
        });
    }

Note que ele invoca a ação buscaCep (na verdade, /cliente/buscaCEP porque a página está dentro do diretório cliente). O código na classe que tem essa ação tratada está assim:

private String id;
    private Cep CEP;

    @Action(value="/cliente/buscaCep", results= {
        @Result(name="ok", type="httpheader", params={"status", "200"})
    })
    public String buscarCEP() {
        CEP = new CEPPers().obterCep(id);
        return "ok";
    }

   //Métodos set e get para as variáveis de instância

E, por fim, o código na classe de persistência está assim:

public Cep obterCep(String cep) {
        Session s = HibernateUtil.getSessionFactory().openSession();
        List<Cep> l = s.createQuery("FROM Cep where cepCep = '" + cep + "'").list();
        s.close();
        if (!l.isEmpty())
            return l.get(0);
        return null;
    }

Como posso fazer para atualizar os campos com o conteúdo recuperado do banco?

Obs.: já depurei a aplicação. O método anotado como uma ação do Struts2 está sendo invocado e o método da persistência está conseguindo recuperar os dados corretos do banco.

Obrigado,
abraços!

=D

12 Respostas

jyoshiriro

Já tentou usar o Jquery Plugin para Struts2?
http://code.google.com/p/struts2-jquery/

Com ele esse tipo de tarefa fica bem mais transparente (o plugin usar o Jquery por você).

Inclusive há um componente de “text area” ajax: Veja a aba “Ajax Forms”, item “Ajax TextArea” no Showcase:

Acho que esse componente tem o que você deseja.

Um forte abraço.

J

jyoshiriro,

obrigado pela dica. Vou pesquisar a respeito do plugin.

Abraço,
:smiley:

J

Olá,

olhei o plugin recomendado. Quase não há documentação e não encontra-se tutoriais de como usá-lo.
Percebi que ele é bem simples de utilizar, dispensando tutoriais, porém não irei empregá-lo neste projeto devido à insegurança: mais para frente, posso precisar resolver algum problema mais complexo no projeto que dependa de um uso mais avançado do plugin, fazendo com que a falta de documentação torne-se um problema.

Agradeço muito a resposta e, sobretudo, a boa vontade :slight_smile:

Alguém saberia como posso fazer para resolver o meu problema?

Obrigado,
abraços

marcelo.bellissimo

Veja o link que o jyoshiro passou, e tente fazer uma implementação Ajax usando os próprios componentes do Struts2, ou use DWR que na minha opinião é um dos melhores plugins de Ajax que existem… não tem segredo, basta disparar seu método por Ajax, e usar o retorno dele (se houver) pra atualizar os campos dinamicamente pelo Javascript…

O

Olá, ali na sua função de buscar cep, utilize a estrutura de requisição do jquery, faça o retorno vir do java em formato que vc possa separar em javascript e com cada parte em “mãos” basta colocar nos campos devidos. Qual é sua dificuldade em fazer isso, criar a chamada a sua Action ou o quê?

J

Olá,

minha dificuldade é:
Eu populo um objeto tipo CEP (bean correspondente a um entidade no BD) na classe Action correspondente. Como faço para acessar os campos deste objeto a partir do js conforme vc disse?
Ou então:
o que seria um “retorno vir do java em formato que vc possa separar em javascript e com cada parte em “mãos” basta colocar nos campos devidos”? Qual seria o tipo deste retorno? Isto pode me ajudar muito!

Obrigado
:smiley:

O

ok… bem quando eu faço uma chamada a Action com o Jquery eu geralmente devolvo pra ele (js) da seguinte forma: response.getWriter().write(resposta.toString());…o que seria a ‘resposta’, pode ser uma string concatenando seus dados de endereço com algum caracter especial separando isso, algo como: Rua x :: Bairro Y :: Cidada K :: Estado B. Com essa string na sua function js vc pode aplicar a função split, ficando em seu js, pelo exemplo dado, da seguinte forma: var resposta = xml.responseText; var partes = resposta.split('::');…onde: partes[0] é a rua… partes[3] o estado.
Contudo, tenho visto muito outros programadores utilizarem JSon pra essas comunicações entre JS e Java. Eu pessoalmente ainda não utilizei, mas vi alguns exemplos e fica muito mais estruturada a sua resposta ao js.

J

one-dreamer,

muito obrigado pela resposta.
Se eu realmente conseguir acessar o objeto da maneira como vc disse, meu problema estará resolvido.

Mas surgiu uma dúvida:
Você colocou o seguinte código:

response.getWriter().write(resposta.toString());

Que é esse objeto response?
Lembre-se que não estou utilizando servlets diretamente, logo não tenho acesso a um objeto do tipo HttpServletResponse

Obrigado,
abraço

=D

O

uhmm… bem eu trabalho com o struts 1… e velocity…e meus métodos na Action tem a seguinte assinatura: public ActionForward salvar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {}… sendo assim, eu devolvo para o js desta forma que falei… e quando quero que seja carregada outra página uso os mappings do struts. Tenta aí ver como jogar pro js seu retorno, se não conseguir e ninguém que manje de struts2 falar nada, post o código do método que atende a requisição quero ver que objeto pode cuidar da saída.

marcelo.bellissimo

Pegar a session pelo Struts2:

ServletActionContext.getRequest().getSession();

Ou você pode usar o seu próprio “form” pra setar os valores, mas se você quer fazer isso sem atualizar a tela, tem que ser via Ajax… mas desse jeito, com a session, já dá pra fazer algo…

J

one-dreamer,

a assinatura do método é:

public String buscarCEP() { ... }

Anotado da seguinte maneira:

@Action(value="/cliente/buscaCep", results= {
        @Result(name="ok", type="httpheader", params={"status", "200"})
    })

Eu consegui acessar o objeto response da seguinte maneira:

((HttpServletResponse)ActionContext.getContext()
                    .get(StrutsStatics.HTTP_RESPONSE)).getWriter()
                    .write(string);

Consegui acessar os dados a partir da página da maneira como vc mostrou :smiley:

Problema Resolvido.

Muito obrigado pela ajuda,

Abraços.

R

Boa Tarde

Caro, colega estou tentando utilizar o exemplo acima mais estou com dificulde em implementalo sera que tinha como dar uma ajuda. Exmplo:

@Action(value = "buscaCep", results = {
        @Result(name = "ok", type = "httpheader", params = {"status", "200"})
    })
    
    public String execute() {
        try {
       

                 cep = new CepDAO().buscaPorId(id);
            ((HttpServletResponse)ActionContext.getContext()   
                        .get(StrutsStatics.HTTP_RESPONSE)).getWriter()   
                        .write(cep.toString()); //? Seria igual ao objeto?
                   
        } catch (IOException ex) {
            Logger.getLogger(BuscaCepAction.class.getName()).log(Level.SEVERE, null, ex);
        }


//E como retorna no script
            <script type="text/javascript">
            function buscarCep(cep) {   
                   
            
            }
            $.post("buscaCep", {"id" : cep.value}, function(dados) {   
           ?????????????????/
                   });   
                
            </script>

Muito Obrigado

Criado 5 de junho de 2010
Ultima resposta 4 de dez. de 2011
Respostas 12
Participantes 5