Whats new? | Login | Parceiros
Cadastre-se | Atendimento | RSS
+ Java:
artigos   |   vídeos   |    cursos   |    mais

DWR – Directed Web Remoting – Parte II.I

Neste artigo vamos abordar algumas funcionalidades um pouco mais avançadas do DWR.

HANDERSON BRITO FROTA
Handerson Brito Frota (handersonbf@gmail.com), cursando 8º semestre do curso de Bacharel em Ciências da Computação pela Faculdade Lourenço Filho, trabalha com desenvolvimento de sites e sistemas web desde 1998 e com Java desde 2001. Já atuando como A...


Ver space do autor


Estatísticas:
Visualizações:
25788
Favoritado:
 7 vez(es)

Serviços:



DWR – Directed Web Remoting – Parte II.I

 

Dando continuidade ao nosso artigo vamos iniciar a segunda parte. Neste artigo vamos abordar algumas funcionalidades um pouco mais avançadas do DWR.

Vamos também utilizar alguns exemplos com acesso ao banco de dados (MySql).

 

Parte 2 – Combos e Grids(addOptions(), addRows())

 

Introdução

 

Vimos como instalar, configurar e rodar o DWR, agora vamos ver como é feito um preenchimento de uma combo utilizando o DWR.

 

Vamos utilizar um banco de dados(MySql), temos as seguintes tabelas de exemplo como foi citado no artigo anterior. Vemos agora a estrutura que iremos utilizar no MySql.

 

Nome do Banco: test

 

Tabela: pessoa

Colunas:

Tipo:

Id

integer

Nome

varchar

Endereço

varchar

Cidade

varchar

Telefone

varchar

 

Tabela: usuário

Colunas:

Tipo:

Id

int

Login

varchar

Senha

varchar

 

Sql para gerar o banco:

http://www.milfont.org/blog/wp-content/upload/artigoDWR/BancoArtigoDWR0061107_1509.sql

Agora o próximo passo será criar uma simples classe para conexão com o banco, chamaremos essa classe de ConectaBanco.java localizada no pacote com.celulajava.palestradwr.dao

 

Precisaremos também de algumas classes DAO’s para executarem os sql’s. Então criaremos os seguintes DAO’s: DAOPessoa.java e DAOUsuario.java, que também estarão localizadas no pacote DAO.

 

Não vamos muito focar nos DAO’s e nem no banco, apenas saiba que estaremos utilizando um banco de dados para recuperar valores.

 

Bem agora temos nosso ambiente pronto para acessarmos o banco de dados, vamos dar inicio então aos tão esperados exemplos.

 

Parte 2.1 – Combos (addOptions())

 

Criando combos(DWRUtil.addOptions())

 

O DWR tem uma lib chamada util.js, que é nela que se localiza as principais funcionalidades do DWR. Vamos falar agora sobre o addOptions() que tem como finalidade gerar e popular uma comboBox(<select></select>), e/ou uma lista numerada ou de símbolos do html(<ul></ul>, <ol></ol>).

 

Reutilizando a estrutura do nosso projeto anterior vamos criar um jsp chamado combos.jsp, e logo em seguida um link na nossa index.jsp que tenha acesso ao combos.jsp, criaremos também só por motivo didático um novo js, destinado apenas para as combos, vamos chama-lo de combos.js, veja abaixo:

 

Trecho de código na index.jsp.

<br>

<a href=”combos.jsp”>Exemplos de Combos</a>

 

dwrp21fig012.JPG

Figura 1. Combo.jsp

 

Observe que os importes das bibliotecas .js são os mesmo, exceto pelo novo importe, que é o do nosso combos.js.

 

Explicando o addOptions();

O addOptions é uma função da biblioteca util.js que tem a finalidade de gerar uma combo dinâmica utilizando o conceito de ájax e que rode em qualquer browser. Com ela você poderá gerar uma combo com dados de um banco, com o formato de arrays, map, list de beans e ainda gerar uma lista numerada.

 

Utilizando o addOptions:

Primeiro entenda a sintaxe de um select.

<select>

      <option value=”valor”>Texto</option>

</select>

 

  1. Array:  Recebe um simples Array com texto e valor.
    1. DWRUtil.addOptions(selectid, array);

 

  1. Array de Objetos (texto da <option> = valor da <option>): Cria a combo a partir de um array de objetos, e definindo que o valor da <option> será o mesmo do texto da <option> do elemento <select>
    1. DWRUtil.addOptions(selectid, arrayObjects, propriedade);
    2. Exemplo de Array de Objetos: List de Beans, List de Maps, Collection etc.
    3. Exemplo da option gerada:

DWRUtil.addOptions(“combo”, listBeans, “nome”);

    <option value=”Handerson”>Handerson</option>

 

  1. Array de Objetos (texto da <option> != valor da <option>): Cria a combo a partir de um array de objetos, definindo que o valor da <option> será diferente do texto da <option> do elemento <select>
    1. DWRUtil.addOptions(selectid, arrayObjects, valorPropriedade, valorTexto);
    2. Exemplo de Array de Objetos: List de Beans, List de Maps, Collection etc
    3. Exemplo da option gerada:

DWRUtil.addOptions(“combo”, listBeans, “id”, “nome”);

<option value=”2”>Handerson</option>

 

  1. Objeto: Gerar a combo a partir de um Objeto qualquer, caso você utilize um Bean(Pessoa) com as seguintes propriedades(cidade, endereço, nome, telefone), ele irá carregar no campo value o valor da propriedade e no texto ele irá colocar o nome da propriedade.
    1. DWRUtil.addOptions(selectid, arrayObjects, valorPropriedade);
    2. Exemplo de Objeto: Beans
    3. Exemplo da option gerada:

DWRUtil.addOptions(“combo”, bean, “nome”);

<option value=”1”>id</option>

<option value=”Handerson”>nome</option>

<option value=”Fortaleza”>cidade</option>

<option value=”Rua Francisco”>endereco</option>

<option value=”3444444”>telefone</option>

 

  1. Mapa de Objetos: Gera uma combo a partir de um Map.
    1. DWRUtil.addOptions(selectid, map);
    2. Exemplo de Objeto: Map, Hashtable, HashMap.
    3. Exemplo da option gerada:

DWRUtil.addOptions(“combo”, map);

<option value=”2”>Handerson</option>

 

 

  1. Lista de <ol> ou <ul>:  Gera uma lista numerada ou com símbolo.
    1. DWRUtil.addOptions(ul, list, valorPropriedade);
    2. Exemplo de Objeto: List, Array, List de Beans.
    3. Exemplo da option gerada:

DWRUtil.addOptions(“ul”, listBean,  “nome”);

?  Chirstiano Milfont

?  Handerson Frota

Tag html: <ul id="ul"></ul>

DWRUtil.addOptions(“ol”, listBean,  “nome”);

1. Chirstiano Milfont

2. Handerson Frota

Tag html: <ol id="ol"></ol>

 

Agora para entendermos melhor, vamos visualizar como ficou na nossa camada do JAVA, que é o nosso FacadeAjax e DAO’s, para facilitar a compreensão de como serão utilizado os acessos e chamadas dos nossos métodos, e saberemos também o tipo de retorno e como esta sendo criado para o envio ao nosso JS. Vamos utilizar os seguintes métodos para acessar o banco de dados.

 

FacadeAjax:

/**

* Método que faz um simples select no banco e retorna um list de beans Pessoa.

       *

       * @return listResult - List de Object Bean Pessoa

       *

       * @throws Throwable

       * @throws Exception

       */

      public List selectAllPessoa() throws Throwable, Exception{

            List<Pessoa> listResult = new ArrayList();

           

            listResult = DAOPessoa.selectAllPessoa();

           

            return listResult;

      }

 

/**

* Executa um select na tabela pessoa, mais so retorna um objeto Pessoa.

       *

       * @return pessoa - Object Bean Pessoa.

       * @throws Throwable

       * @throws Exception

       */

      public Pessoa selectPessoa() throws Throwable, Exception{

            List<Pessoa> listResult = new ArrayList();

            Pessoa pessoa = new Pessoa();

           

            listResult = DAOPessoa.selectAllPessoa();

           

            pessoa = listResult.get(0);

           

            return pessoa;

      }

 

/**

* Executa um select na tabela pessoa e retorna um Map com os *valores(id, nome)

       *

       * @return mapResult - Map com os dados do select.

       *

       * @throws Throwable

       * @throws Exception

       */

      public Map selectPessoaMap() throws Throwable, Exception{

            Map mapResult = new HashMap<Pessoa, Pessoa>();

           

            mapResult = DAOPessoa.selectPessoaMap();

           

            return mapResult;

      }

 

 

DAOPessoa:

/**

* Método que faz um simples select no banco e retorna um list de beans Pessoa

       *

       * @return dadosPessoaList List de Object Bean Pessoa

       * */

      public static List selectAllPessoa() throws Throwable, Exception{

            List<Pessoa> dadosPessoaList = new ArrayList();     

 

        PreparedStatement stmt = null;

        ResultSet rs = null;

       

stmt = conecta.getConnection().prepareStatement("select * from pessoa order by nome asc");

     

        rs = stmt.executeQuery();

       

        Pessoa pessoa = null;

        while(rs.next()){

            pessoa = new Pessoa();

           

            String id         = rs.getString("id");

            String nome       = rs.getString("nome");

                  String endereco   = rs.getString("endereco");

                  String cidade     = rs.getString("cidade");

                  String telefone   = rs.getString("telefone");

                 

                  pessoa.setId(id);

                  pessoa.setNome(nome);

                  pessoa.setEndereco(endereco);

                  pessoa.setCidade(cidade);

                  pessoa.setTelefone(telefone);

                 

            dadosPessoaList.add(pessoa);                  

            }

       

        stmt.close();

        rs.close();

        conecta.closeConnection();

       

            return dadosPessoaList;

      }

     

/**

* Executa um select na tabela pessoa e retorna um Map com os valores(id, nome)

       *

       * @return mapResult - Map com os dados do select.

       *

       * @throws Throwable

       * @throws Exception

       */

      public static Map selectPessoaMap() throws Throwable, Exception{

            Map dadosPessoa = new HashMap();  

 

        PreparedStatement stmt = null;

        ResultSet rs = null;

       

stmt = conecta.getConnection().prepareStatement("select * from pessoa order by nome asc");

     

        rs = stmt.executeQuery();

       

        while(rs.next()){

            String id         = rs.getString("id");

            String nome       = rs.getString("nome");

                 

            dadosPessoa.put(id, nome);

            }

       

        stmt.close();

        rs.close();

        conecta.closeConnection();

       

            return dadosPessoa;

      }

 

Como foi visto temos métodos que acessão o banco de dados, métodos simples apenas para  exemplificar.

 

Bem agora que vimos os nossos métodos que iremos utilizar, vejamos os exemplos:

 

Criamos uma função JS para limpar as combos, sendo a mesma genérica, recebendo apenas o nome do select e/ou as tags de lista numerada que você deseja limpar:

 

function cleanAddOptions(local){

      DWRUtil.removeAllOptions(local);

}

 

Vou listar abaixo os exemplos equivalentes a explicação das assinaturas do addOptions(), e neles o respectivo código JSP e JS.

 

Exemplo 1 e 2(Array, Array de Objetos (texto da <option> = valor da <option>)):

 

JSP

<strong>1,2 - DWRUtil.addOptions("combo1_2", listBeans, "nome");</strong><br>

Exemplo combo 1 e 2:

<a href="javascript:carregaCombo1_2()">Carregar</a> /

<a href="javascript:cleanAddOptions('combo1_2')" >Limpar</a>

<select id="combo1_2"></select>

 

JS

/**

* Função que acessa o método da classe java(FacadeAjax), e retorna

* como callback para a função montaXXX();

 */

function carregaCombo1_2(){

      FacadeAjax.selectAllPessoa(montaCombo1_2);

}

 

/**

 * Função de callback que limpa a combo e depois a remonta.

 * O processo para remover a combo é necessário se não os valores

 * seram somados com os existentes.

 * @param {Object} listBeans

 */

function montaCombo1_2(listBeans){

      DWRUtil.removeAllOptions("combo1_2");

      DWRUtil.addOptions("combo1_2", listBeans, "nome");

}

 

Exemplo 3 (Array de Objetos (texto da <option> != valor da <option>):):

 

JSP

<strong>3 - DWRUtil.addOptions("combo3", listBeans, "id", "nome");</strong><br>

Exemplo combo 3:

<a href="javascript:carregaCombo3()" >Carregar</a> /

<a href="javascript:cleanAddOptions('combo3')" >Limpar</a>

<select id="combo3"></select>

 

JS

/**

* Função que acessa o método da classe java(FacadeAjax), e retorna

* como callback para a função montaXXX();

 */

function carregaCombo3(){

      FacadeAjax.selectAllPessoa(montaCombo3);

}

 

/**

 * Função de callback que limpa a combo e depois a remonta.

 * O processo para remover a combo é necessário se não os valores

 * seram somados com os existentes.

 * @param {Object} listBeans

 */

function montaCombo3(listBeans){

      DWRUtil.removeAllOptions("combo3");

      DWRUtil.addOptions("combo3", listBeans, "id", "nome");

}

 

Exemplo 4(Objeto):

 

JSP

<strong>4 - DWRUtil.addOptions("combo4", bean, "nome");</strong><br>

Exemplo combo 4:

<a href="javascript:carregaCombo4()" >Carregar</a> /

<a href="javascript:cleanAddOptions('combo4')" >Limpar</a>

<select id="combo4"></select>Até o próximo.

 

JS

/**

* Função que acessa o método da classe java(FacadeAjax), e retorna

* como callback para a função montaXXX();

 */

function carregaCombo4(){

      FacadeAjax.selectPessoa(montaCombo4);

}

 

/**

 * Função de callback que limpa a combo e depois a remonta.

 * O processo para remover a combo é necessário se não os valores

 * seram somados com os existentes.

 * @param {Object} listBeans

 */

function montaCombo4(bean){

      DWRUtil.removeAllOptions("combo4");

      DWRUtil.addOptions("combo4", bean, "nome");

}

 

Exemplo 5(Mapa de Objetos):

 

JSP

<strong>5 - DWRUtil.addOptions("combo5", maps);</strong><br>

Exemplo combo 5:

<a href="javascript:carregaCombo5()" >Carregar</a> /

<a href="javascript:cleanAddOptions('combo5')" >Limpar</a>

<select id="combo5"></select>

 

JS

/**

* Função que acessa o método da classe java(FacadeAjax), e retorna

* como callback para a função montaXXX();

 */

function carregaCombo5(){

      FacadeAjax.selectPessoaMap(montaCombo5);

}

 

/**

 * Função de callback que limpa a combo e depois a remonta.

 * O processo para remover a combo é necessário se não os valores

 * seram somados com os existentes.

 * @param {Object} listBeans

 */

function montaCombo5(maps){

      DWRUtil.removeAllOptions("combo5");

      DWRUtil.addOptions("combo5", maps);

}

 

 

 

Exemplo 6(Lista de <ol> ou <ul>):

 

JSP - <UL>

<strong>6 - DWRUtil.addOptions("ul", listBeans, "nome"); / DWRUtil.addOptions("ol", listBeans, "nome");</strong><br>

Exemplo 6:<br>

Exemplo com a tag UL<br><a href="javascript:carregaUl()" >Carregar UL</a> /

<a href="javascript:cleanAddOptions('ul')" >Limpar</a><br>

<ul id="ul"></ul>

 

JS

/**

* Função que acessa o método da classe java(FacadeAjax), e retorna

* como callback para a função montaXXX();

 */

function carregaUl(){

      FacadeAjax.selectAllPessoa(montaUl);

}

 

/**

 * Função de callback que limpa a combo e depois a remonta.

 * O processo para remover a combo é necessário se não os valores

 * seram somados com os existentes.

 * @param {Object} listBeans

 */

function montaUl(listBeans){

      DWRUtil.removeAllOptions("ul");

      DWRUtil.addOptions("ul", listBeans, "nome");

}

 

JSP –  <OL>

Exemplo com a tag OL<br><a href="javascript:carregaOl()" >Carregar OL</a> /

<a href="javascript:cleanAddOptions('ol')" >Limpar</a><br>

<ol id="ol"></ol>

 

JS

/**

* Função que acessa o método da classe java(FacadeAjax), e retorna

* como callback para a função montaXXX();

 */

function carregaOl(){

      FacadeAjax.selectAllPessoa(montaOl);

}

 

/**

 * Função de callback que limpa a combo e depois a remonta.

 * O processo para remover a combo é necessário se não os valores

 * seram somados com os existentes.

 * @param {Object} listBeans

 */

function montaOl(listBeans){

      DWRUtil.removeAllOptions("ol");

      DWRUtil.addOptions("ol", listBeans, "nome");

}

 

Estão listados acima as principais assinaturas do addOptions(). Podemos ver o quão fácil é gerar uma combo ou lista dinâmica com o DWR.

 

Para baixar esse projeto para executar os exemplos basta acessar o link abaixo:

http://www.milfont.org/blog/wp-content/upload/artigoDWR/versao2.1/PalestraDWR.rar

 

Veremos no próximo artigo (Parte 2.2) o addRows():

 

Handerson Frota

(handersonbf@gmail.com)





Participe! Inclua um comentário
[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.


HANDERSON BRITO FROTA
6/2/2007 03:58
Material Quem quiser baixar o projeto deste artigo basta acessar: http://www.handersonfrota.com.br/?page_id=12 Abraços

[responder]

 
Alessandro MArtins
6/2/2007 10:04
DWR e Banco de dados Gostaria de saber se é correto (e como fazer) para incluir dados na base via dwr. Por exemplo, uma classe que insira dados e retorne um valor booleano que possa ser capturado? É correto faz\er isot? COmo fazer?

[responder]

 
HANDERSON BRITO FROTA
26/2/2007 22:47
RE:   Cara depende de como voce quer fazer isso, envia um email pra mim que te explico melhor por email, se caso desejar blz, pq eh complicado explicar por aqui handersonbf@gmail.com

[responder]
 
Paulo Junior
22/4/2008 14:49
Excelente Esta exatamente procurando um artigo desse para começar a mecher com o DWR. Parabéns

[responder]

 
KALIL MENDONçA VALADARES PEIXOTO
23/7/2008 16:01
Problemas com select Handerson, gostaria de saber se é possível que o primeiro option do select fique vazio, e que ele popule apenas a partir do segundo....como eu estou fazendo isso de maneira dinâmica puxando do banco, e ele já me traz logo que eu acesso a página, não queria que já fosse mostrando o dado, mas sim o primeiro em branco, e só quando ele fosse na seta que mostrasse os outros...não sei se fui bem claro,mas se puder me ajudar eu agradeço...

[responder]

 

HANDERSON BRITO FROTA
26/7/2008 11:31
[Comentário do autor] RE:   Olá Kalil, deixa ver se entendi. Você tem alguns combos, o primeiro já é carregado imediatamente e quando você seleciona uma opção dele, logo em seguida ele carrega o outro combo é isso ? E agora você quer que ele NÃO carregue o primeiro, alias nenhum, e que VOCÊ dispare para ele carregar a primeira combo, ai logo em seguida ele continua com o processo que já estava. Bem se foi isso que entendi, é simples. No lugar de você ter a chamada da função que carrega a primeira combo, você cria um link, botão seja o que for, que o usuário tenha que clicar para disparar a chamada que carrega essa primeira combo. Bem é só isso. Ficou claro ? Se não pode enviar a sua dúvida. Abraços

[responder]
 

HANDERSON BRITO FROTA
26/7/2008 11:32
[Comentário do autor] RE:   Cara para facilitar já te respondi por email ok. Qualquer dúvida pode enviar direto para meu email se caso deseje. Abraços

[responder]
 



 


[Fechar]
Este post está disponível para assinantes da Java Magazine ou para quem possui Créditos DevMedia.

  Conheça os planos de créditos DevMedia e visualize esse post agora mesmo!

Plano conveniência – Neste plano este post custa R$ 0,00 (Compre agora)
Esse plano permite que você compre somente um post, pagando por ele seu preço sem desconto.

Plano ocasional: Aqui este post custa: R$ -1,00 (assinante) ou R$ -1,00 (não-assinante)
Este plano é ideal para quem tem interesse em mais de um post. Você compra um mínimo de R$ 50,00 em créditos e ganha, em média, 50% de desconto no preço do post. Compre Créditos agora!

Assinatura de Créditos (Plano econômico) – Aqui este post custa R$ -1,00
Este plano é ideal para quem tem interesse em muitos posts. Com esse plano você compra R$ 180,00 em créditos e ganha, em média, 80% de desconto no preço do post. Assine este plano agora!

> Saiba mais sobre o Sistema de Créditos DevMedia
DevMedia Group   www.devmedia.com.br   |   www.javafree.org   |   www.mrbool.com
2010 - Todos os Direitos Reservados a DevMedia Group - (21) 3382-5038