Como recuperar os dados da consulta através do RPC

121 views
Skip to first unread message

Robinho de Morais

unread,
Jan 22, 2013, 7:26:00 PM1/22/13
to gwt-b...@googlegroups.com
Pessoal, peço ajuda para vocês porque realmente não sei como fazer, já pesquisei pela internet e não achei....
Na minha consulta RPC eu valido o numero do cnpj e senha, nessa consulta eu tenho que retornar uma informação, como eu faço isso ?


essa aqui é o meu loginEmpInterfaceImpl, nele faço a consulta na tabela inn_empresas...

package br.com.projeto.server;

import br.com.projeto.client.loginEmpInterface;
import br.com.projeto.server.utilitarios.conexaoMySisInn;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import java.sql.*;

public class loginEmpInterfaceImpl extends RemoteServiceServlet implements loginEmpInterface {

    @Override
    public String validaCnpjSenha(String nr_cnpj, String ds_senha) {
        //return "Do servidor retornou "+usuario+senha;
        return conexao(nr_cnpj, ds_senha);
    }
    conexaoMySisInn conUsuario;
    public String valido = "valido";
    public String sql;

    public String conexao(String nr_cnpj, String ds_senha) {


        try {
            conUsuario = new conexaoMySisInn();
            conUsuario.conecta();
            String sql = "select ds_banco from inn_empresas where nr_cnpj like '" + nr_cnpj
                    + "' and ds_senha like '" + ds_senha + "'";
            conUsuario.executeSQL(sql);
                        
            if (conUsuario.resultset.first() == true) {
               valido = "valido";
            } else {
                valido = "invalido";
            }
        } catch (Exception erro) {
            valido = "invalido";
        }
        return valido;
    }
}


onde se estiver ok, preciso capturar o ds_banco em uma váriavel String;


na classe onde faço a chamada do ValidaCnpjSenha eu chamo o serviço criado pelo click hander do botão logar e no AsyncCallback, nesse momento eu tinha que pegar a informação do ds_banco para incluir em uma variavel String.

Como posso fazer ?


//---Chamada getServico
btLogar.addClickHandler(new com.smartgwt.client.widgets.form.fields.events.ClickHandler() {
@Override
public void onClick(
com.smartgwt.client.widgets.form.fields.events.ClickEvent event) {
getServico().validaCnpjSenha(txCnpj.getValue().toString(), psSenhaEmp.getValue().toString(), callback);
}
});   

//--AsyncCallback
final AsyncCallback<String> callback = new AsyncCallback<String>() {

@Override
public void onFailure(Throwable caught) {
SC.say("Problema na comunicacao " + caught.getMessage());
}

@Override
public void onSuccess(String result) {
if (result.equals("valido")){
loginUsuario.setVisible(true);

                } else
                  lbErro.setText("Usu&eacute;rio ou senha inv&aacute;lido");
}
};

Vagner Araujo

unread,
Jan 23, 2013, 8:13:39 AM1/23/13
to gwt-b...@googlegroups.com
Então,


qual seria o erro ou problema ? Pois em uma olhada rápida eu não vi nada que impedir-se o retorno do valor armazenado na variável valido.


P.S: se quiser uma sugestão, reduza a vulnerabilidade de sua aplicação(principalmente no que diz respeito ao SQL Injection) e use PreparedStatement.

--
Vagner Araujo

Robinho de Morais

unread,
Jan 23, 2013, 8:20:36 AM1/23/13
to gwt-b...@googlegroups.com
Não seria um erro, mas um auxilio, pois por exemplo, não sei como fazer uma consulta na base e retornar esses dados em variáveis.

Vagner Araujo

unread,
Jan 23, 2013, 8:38:56 AM1/23/13
to gwt-b...@googlegroups.com
Então,

você vai retornar o objeto que contém essas variáveis. Se basei pelo artigo abaixo.

https://developers.google.com/web-toolkit/articles/using_gwt_with_hibernate?hl=en


--
Vagner Araujo

Robinho de Morais

unread,
Jan 23, 2013, 8:48:33 AM1/23/13
to gwt-b...@googlegroups.com
Ok, valew....vou tentar....

Robinho de Morais

unread,
Jan 23, 2013, 6:18:51 PM1/23/13
to gwt-b...@googlegroups.com
ixi...agora embolo minha cabeça....Vagner vc não tem algo mais simples ai ?
é porque ainda não vi como funciona, então não to entendendo nada....rs


Em quarta-feira, 23 de janeiro de 2013 11h38min56s UTC-2, Vagner Araujo escreveu:

Robinho de Morais

unread,
Jan 23, 2013, 7:57:50 PM1/23/13
to gwt-b...@googlegroups.com
tentei algo assim...

classe loginEmpInterfaceImpl.java


package br.com.sisinnovation.server;

import br.com.sisinnovation.client.loginEmpInterface;
import br.com.sisinnovation.server.utilitarios.conexaoMySisInn;

import com.google.gwt.user.client.Window;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import java.sql.*;

public class loginEmpInterfaceImpl extends RemoteServiceServlet implements loginEmpInterface {

    @Override
    public String validaCnpjSenha(String nr_cnpj, String ds_senha) {
        //return "Do servidor retornou "+usuario+senha;
        return conexao(nr_cnpj, ds_senha);
    }
    conexaoMySisInn conUsuario;
    public String valido = "valido";
    public String sql;

    public String conexao(String nr_cnpj, String ds_senha) {


        try {
            conUsuario = new conexaoMySisInn();
            conUsuario.conecta();
            String sql = "select nm_banco from inn_empresas where nr_cnpj like '" + nr_cnpj
                    + "' and ds_senha like '" + ds_senha + "'";
            conUsuario.executeSQL(sql);
            //conUsuario.resultset.next();
            //SC.say(conUsuario.resultset.getString("nm_banco"));
            if (conUsuario.resultset.first() == true) {
               valido = "valido";
               Window.alert(conUsuario.resultset.getString("nm_banco"));
            } else {
                valido = "invalido";
            }
        } catch (Exception erro) {
            valido = "invalido";
        }
        return valido;
    }
}


mas ao executar dá Problema na comunicacao 500 The call failed on the server; see server log for details, olhando o log;

Jan 23, 2013 10:56:30 PM org.apache.catalina.core.ApplicationContext log
SEVERE: Exception while dispatching incoming RPC call
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.lang.String br.com.sisinnovation.client.loginEmpInterface.validaCnpjSenha(java.lang.String,java.lang.String)' threw an unexpected exception: java.lang.NoClassDefFoundError: Could not initialize class com.google.gwt.user.client.Window
at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:389)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:579)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.google.gwt.user.client.Window
at br.com.sisinnovation.server.loginEmpInterfaceImpl.conexao(loginEmpInterfaceImpl.java:36)
at br.com.sisinnovation.server.loginEmpInterfaceImpl.validaCnpjSenha(loginEmpInterfaceImpl.java:17)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:561)
... 21 more

Vagner Araujo

unread,
Jan 24, 2013, 4:36:29 AM1/24/13
to gwt-b...@googlegroups.com
Então,

pelo que pude ver você ainda não entendeu os conceitos de abstração e de como transmitir objetos serializados via RPC. Embora eu não tome partido em questões assim, por serem bem básicas, vou abrir uma exceção, pois dessa forma essa thread poderá ser um guia de referência para novos iniciantes. :-)

A primeira coisa que você deve mudar é a forma de pensar, você não está pensando em objetos, vamos tomar como exemplo as strings que você usou na RPC, seja como argumento ou como tipo de retorno, embora uma string seja um conjunto de caracteres, você não deve pensar em uma string dessa forma, você deve pensar nela como uma classe e consequentemente como um objeto.

Outra coisa que você deve pensar é em como abstrair a suas tabelas de banco em classes, para que dessa forma você possa criar objetos.

Vamos tomar como exemplo um login de usuário, vamos imaginar que em seu banco de dados você tenha uma tabela chamada Usuarios, e que nessa tabela você tenha três campos; codigo, nome e senha. Veja o esquema abaixo.

----------------------------------------------------------------------
|                             Usuarios                                       |
----------------------------------------------------------------------
|codigo              |nome                   |senha               |
-----------------------------------------------------------------------
|0001                  |orsic                     |1234                  |
-----------------------------------------------------------------------

Então abstraindo essa tabela em uma classe ela seria dessa forma:

public class Usuario implements java.io.Serializable{

private long codigo;

private String nome;

private String senha;

public void setCodigo(long codigo) {
  this.codigo = codigo;
}//end setCodigo

public long getCodigo(){
  return codigo;
}//end getCodigo

public void setNome(String nome) {
  this.nome = nome;
}//end setNome

public String getNome(){
  return nome;
}//end getNome

public void setSenha(String senha){
  this.senha = senha;
}

public String getSenha(){
  return senha;
}//end getSenha

}//end class Usuario


Como escrito anteriormente, o objetivo dessa classe é ser uma abstração da tabela Usuarios, mas uma outra coisa que você deve notar é a presença da herança da interface Serializable, basicamente, uma classe que implemente essa interface pode ser armazenada em algum lugar, como  por exemplo em um banco de dados ou em um arquivo ou ainda uma classe que implemente Serializable pode ser transmitida pela rede. E por esse motivo as classes que serão utilizadas em um GWT-RPC deve implementar Serializable. Uma outra coisa que precisa ser observado é que no caso do GWT, essa classe deve ficar no pacote client ou shared, pois se essa classe vai ser utilizada pelo cliente e pelo servidor, a mesma deve residir em ambos, ou seja, a classe Usuario DEVE existir no lado cliente e servidor.

Se você conseguiu entender tudo até aqui, então você sabe o conceito que precisa para transmitir objetos serializados em uma GWT-RPC e utilizar os mesmo no lado servidor ou cliente. Mas de qualquer forma a abaixo segue uma explanação rápida desses conceitos em código.

public interface UserService extends RemoteService {

/*
* Metodo utilizado para autenticar um usuário.
* @returns Retorna o usuario autenticado ou
*   null se houve falha de autenticação.

**/
Usuario login(Usuario user);

}//end UserService


public interface UserServiceAsync {
  void login(Usuario user, AsyncCallback<Usuario> callback);
}//end UserServiceAsyc


Então, não vou explanar aqui o lado servidor, pois isso você já fez e além disso você encontra no último link que te enviei.

O que você precisa entender nessa explanação é que você utilizará objetos no lado cliente e servidor, e nesse caso se você precisa de um entendimento maior ou mais aprofundado sobre os conceitos de orientação a objetos e/ou de abstração dos mesmos, sugiro que você acesse o tutorial do java no link abaixo ou a seção específica também abaixo.

http://docs.oracle.com/javase/tutorial/

Learning the Java Language



--
Vagner Araujo

Victor Pinto

unread,
Jan 24, 2013, 6:22:40 AM1/24/13
to gwt-b...@googlegroups.com
Outra coisa que vale a pena você correr atrás é saber o papel de cada
camada: client, shared e server.

[]'s
Victor Pinto A. de Oliveira
> --
> Você está recebendo esta mensagem porque se inscreveu no grupo "GWT Google
> Web Toolkit Brasil" dos Grupos do Google.
> Para postar neste grupo, envie um e-mail para gwt-b...@googlegroups.com.
> Para cancelar a inscrição nesse grupo, envie um e-mail para
> gwt-brasil+...@googlegroups.com.
> Visite este grupo em http://groups.google.com/group/gwt-brasil?hl=pt-BR.
> Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
>
>

Robinho de Morais

unread,
Mar 6, 2013, 10:04:57 AM3/6/13
to gwt-b...@googlegroups.com
É tanta correria na vida que não pude prosseguir com o desenvolvimento....agora estou voltando....mas infelizmente ainda com as duvidas....

Realmente não estou entendendo....alguém não tem um exemplo funcional para me ajudar ?

Robinho de Morais

unread,
Mar 12, 2013, 8:06:20 PM3/12/13
to gwt-b...@googlegroups.com
Alguém ?
Reply all
Reply to author
Forward
0 new messages