DWR + coleção de beans

8 respostas
paulopatto

Olá pessoal, boa tarde.

Atualmente eu tenho um método Java que retorna uma java.util.ArrayList<BeanObject>, e o método agora vai ficar disponível por ajax através do DWR. O cara que falo para usar o dwr disse que a grande vantagem dele é que você tem um objeto java no javascript no final. Por isso gostaria de saber, o javascritp vai interpretar o retono como um objeto ou um array?

Alguem sabe alguma forma de contronar caso ele interprete como um array (ou hash).

Grato.

8 Respostas

aleck

Sim, ele faz a conversão ida e volta automaticamente.

ex:

no javascript:

var objetoUsuario = new Object();
objetoUsuario.nome = “Alexandre”;

Se o java retornar um objeto do tipo usuario, vc vai poder acessa-lo da mesma maneira que faria no java.

paulopatto

Então esse exemplo genérico seria Válido (efetuando os devidos imports de scripts no javascript):

// Método java

public ArrayList&lt;MeusBeans&gt; buscar(String nome, String categoria){
	return DAO.buscar(String nome, String categoria);
}

//MeusBeans.java
public class MeusBeans{
	int id;
	String imagem;
	String nome;
	String categoria;
	
	public MeusBeans(){}
	
	// Aqui Getters e Setters
}


// funcoes.js
function buscar(n, c){
	Banco.buscar(n,c,tratador);
}
function tratador(data){
	for(i = 0; i &lt;= data.size(), i++){
		obj = data.get(i)
		window.alert(obj.getNome());
	}
}

Por que não tem nada sobre isso na documentação do dwr??? Um detalhe importante é o uso de Generics, mas se eu retornando um ArrayList sem gnerics e ele entendendo que lá dentro existem objetos MeusBeans blz.

aleck

Na documentação eles referenciam isto como signatures.

Realmente a documentação do dwr é muito fraca, provavelmente pq eles ganham com o suporte. Mas a comunidade está ae pra isso.

rodrigoK

Como seu objeto MeusBeans tem o atributo nome, você no javascript não vai usar getNome() ou data.get(i) como no Java, mas sim como um array do próprio javascript e acessar o atributo do objeto direto pelos nomes dos atributos.

Ficando assim:

function tratador(data){  
    for(i = 0; i &lt;= data.length, i++){  
        obj = data[i];
        window.alert(obj.nome);
        //ou pode fazer simplesmente
        alert(data[i].nome); 
    }  
}

Abraços,

paulopatto

Ou seja, falando no popular, o DWR não consegue trabalhar com coleções e generics.

Somente Hashs, arrays.

E no final eu não tenho um objeto java no javascript, ou tenho uma represetação de objeto java num hash javascript.

aleck

paulopatto:
Ou seja, falando no popular, o DWR não consegue trabalhar com coleções e generics.

Somente Hashs, arrays.

E no final eu não tenho um objeto java no javascript, ou tenho uma represetação de objeto java num hash javascript.

Claro que consegue, não entendi muito bem sua dúvida mas os objetos trafegam livremente entre as duas camadas graças ao DWR.

Vc pode usar suas coleções normalmente, a única coisa que muda é a maneira de acessar um objeto, referenciando o seu atributo e nao utilizando get e set, mas isso não tem nada a ver com o DWR, é a maneira que o javascript tem para utilizar um objeto.

paulopatto

Ok Aleck, mas é que eu fiquei com uma falsa ilusão e fiz esse comentário meio que menino chorão decepcionado.

Vlw a ajuda.

paulopatto

Enfim segue ai a minha solução né...

InvHeaderJDBC.java
package com.paulopatto.dwr;

import com.mysql.jdbc.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class InvHeaderJDBC extends _DWR{ // _DWR extende DwrServlet
    private static Connection conexao;
    static{
        try{Class.forName("com.mysql.jdbc.Driver");}catch(ClassNotFoundException e){e.printStackTrace();}
        try{conexao = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/lab", "dev", "o_cravo_brigou_com_a_rosa...");}
        catch(SQLException e){ e.printStackTrace(); }
        System.out.println("Iniciado com sucesso?");
    }
    /// GUJ::" Rafael Steil "
    /// @see http://www.guj.com.br/posts/list/21957.java
    public Collection get(){
         Map reply = new HashMap();
         
         String sql = "Select * from invheader" ;
         try{
            java.sql.PreparedStatement stmt = conexao.prepareStatement(sql);
            ResultSet record = stmt.executeQuery();
            while(record.next()){
                Map reply2 = new HashMap();
                reply2.put("id", record.getInt("id"));
                reply2.put("data", record.getString("invdate"));
                reply2.put("cliente", record.getInt("client_id"));
                reply2.put("preco", record.getDouble("amount"));
                reply2.put("taxa", record.getDouble("tax"));
                reply2.put("total", record.getDouble("total"));
                reply2.put("notas", record.getString("note"));
                reply.put(record.getInt("id") , reply2);
            }
         }
         catch(SQLException e){
            e.printStackTrace();
         }
         return reply.values();
    }
}
InvHeader.html
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;&lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/&gt;
    &lt;script type="text/javascript" src="../ajax/engine.js"&gt;&lt;/script&gt;
    &lt;script type="text/javascript" src="../ajax/util.js"&gt;&lt;/script&gt;
    &lt;script type="text/javascript" src="../ajax/interface/InvHeader.js"&gt;&lt;/script&gt;
    &lt;script&gt;
        function ClassInvHeader(hash){
            var id = hash["id"];
            var data = hash["data"];
            var cliente = hash["cliente"];
            var preco = hash["preco"];
            var taxa = hash["taxa"];
            var total = hash["total"];
            var notas = hash["notas"];

            this.getId = getId;
            this.getData = getData;
            this.getCliente = getCliente;
            this.getPreco = getPreco;
            this.getTaxa = getTaxa;
            this.getTotal = getTotal;
            this.getNotas = getNotas;

            function getId(){return id;}
            function getData(){return data;}
            function getCliente(){return cliente;}
            function getPreco(){return preco;}
            function getTaxa(){return taxa;}
            function getTotal(){return total;}
            function getNotas(){return notas;}

        }
    &lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;script&gt;
        function mostrar(){InvHeader.get(listar);}
        function listar(reply){
            for(var reply2 in reply){
                desmontaHash(reply[reply2]);
            }
        }
        function desmontaHash(hash){
            for(var dado in hash){
                document.write(&quot;- &quot;+hash[dado]);
            }
            var obj = new ClassInvHeader(hash);
            var alerta = &quot;id=&gt;&quot;+hash[&quot;id&quot;]+&quot;; nota=&gt;&quot;+hash[&quot;notas&quot;]+&quot;;&quot;;
            var alertaOBJ = &quot;id=&gt;&quot;+obj.getId()+&quot;; nota=&gt;&quot;+obj.getNotas()+&quot;;&quot;;
            window.alert(alerta);
            window.alert(&quot;COM OBJETO: &quot;+ alertaOBJ);
            document.write(&quot;<br/>&quot; + alertaOBJ + &quot;&lt;<br/>");
            document.write("<br/>")
        }
        mostrar();
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;

Essa foi uma implementação de teste mas o core dela será usado na aplicação, obrigado a todos, pela ajuda.

Criado 18 de maio de 2009
Ultima resposta 26 de mai. de 2009
Respostas 8
Participantes 3