Java Magazine edição 66
Esse artigo faz parte da revista Clube Java Magazine edição 66. Clique aqui para ler todos os artigos desta edição

DWR 2.0

De uma maneira como você nunca viu

Aprenda de forma simples como utilizar um dos melhores frameworks Ajax para Java do mercado

 

De que se trata o artigo:

Apresentação do DWR de uma maneira simples e direta. O DWR é um framework Ajax para Java 100% Open Source, de fácil utilização e implementação. Veremos uma visão aprofundada de como o DWR funciona, seus conceitos, integrações, suportes e funcionalidades com uma apresentação das suas principais funcionalidades e exemplos de utilização.

 

Para que serve:

O DWR facilita o acesso às classes Java de uma maneira simples e transparente utilizando-se principalmente de JavaScript. Ele também fornece uma maneira simples para a integração com vários frameworks Java do mercado, assim como proporcionar acesso Ajax às suas funcionalidades.

 

Em que situação o tema é útil:

Além de ser considerado um dos melhores frameworks Ajax para Java do mercado, o DWR é muito útil para adicionar funcionalidades Ajax em suas aplicações web, tornando a sua aplicação mais interativa. Caso você deseje adicionar funcionalidades em Ajax em sua aplicação (nova ou legada), com certeza o DWR irá resolver seu problema com facilidade.

 

DWR 2.0:

O DWR é um framework OpenSource Ajax para Java que está ligado diretamente a camada de controle do seu sistema. Ele ficará responsável pela comunicação Ajax de uma aplicação web, mantendo uma transparência nas chamadas para os seus métodos Java.

Com uma simples configuração e utilização o DWR se mostra muito eficaz e útil na hora de adicionar funcionalidades Ajax à sua aplicação. Possui ainda uma vasta integração com os principais frameworks Java do mercado, facilitando assim o seu uso em aplicações legadas ou não.

O DWR tem as suas principais funcionalidades localizadas no util.js e engine.js, cujo a sua utilização é muito simples e intuitiva.

Métodos como o setValues() e getValues(), onde é possível preencher um formulário a partir de um objeto Java ou receber dados de um formulário apenas com uma linha e enviá-los para a classe Java são funcionalidades marcantes do DWR.

Temos ainda várias outras funcionalidades úteis para o desenvolvimento de aplicações com Ajax. Tudo isso de uma maneira simples e objetiva, fazendo com que o DWR se torne muito produtivo.

 

Já vimos vários artigos sobre DWR (Direct Web Remoting) espalhados na internet. No meu site existem vários publicados, e temos também no portal DevMedia e na revista da Java Magazine (Edição 48), mas este framework ainda é novidade para muitos; existem desenvolvedores que ainda não entenderam bem o seu objetivo e suas funcionalidades. Apresentaremos neste artigo de uma maneira simples e objetiva como o DWR funciona, como configurá-lo e utilizar as suas principais funcionalidades e facilidades.

Não temos a intenção de mostrar ao leitor com exemplos “reais” (já temos artigos sobre isso) as funcionalidades do DWR. A intenção principal deste artigo é apresentar uma visão aprofundada de como o DWR funciona, suas utilidades e finalidades e o contexto geral do framework, com foco detalhado e objetivo sobre cada funcionalidade.

Para quem ainda imagina que o DWR seja apenas “um a mais”, apresentaremos todas as suas vantagens, funcionalidades e a sua importância e utilidade como um excelente framework Ajax para Java. O DWR é conhecido pela sua facilidade, simplicidade e robustez, isso tudo em uma API que possui uma enorme e funcional integração com a maioria dos frameworks Java do mercado.

O que é o DWR?

É um framework Open Source 100% Java, que foi criado com um único objetivo: facilitar o acesso a uma classe Java utilizando-se de Ajax para a sua comunicação.

Em outras palavras, o DWR faz a comunicação via Ajax de uma classe Java, permitindo você acessar de maneira simples e transparente seus métodos (veja a Figura 1). Dessa forma, torna mais fácil a chamada de JavaScript para Java e Java para JavaScript (ReverseAjax ou COMET).

O DWR conta com uma vasta integração com vários frameworks Java, tais como: Spring, Spring Security (antigo Acegi), EJB 2.x e 3.0, Mentawai, WebWork, Struts 1.x e 2.0 (a validação em Ajax é com o DWR), Hibernate, JSF, dentre outros. E claro, a integração com qualquer framework JavaScript como ExtJS, DOJO, JQuery, Yui e Scriptaculous, alguns dos quais já vêm na API do DWR (DOJO e Scriptaculous).

Outro ponto forte é a facilidade de utilizar Ajax em sua aplicação de uma maneira bem fácil e totalmente cross-browser (funciona em vários browsers), acabando com as preocupações de qualquer programador web que queira utilizar Ajax nas suas aplicações.

Uma das dificuldades que temos ao desenvolver aplicações em Ajax é garantir o mesmo comportamento para vários browsers. Por isso, não seria prudente hoje em dia desenvolver aplicações sem frameworks/API´s que ofereçam este suporte (execução homogênea em diferentes browsers). Com o DWR todas as suas funcionalidades nativas são cross-browsers.

imagem

Figura 1. Acesso do JavaScript a uma método da classe Java.

Temos ainda a funcionalidade de ReverseAjax (veja Edição 49) que está disponível desde o DWR 2.0, que consiste em permitir códigos Java em execução no servidor se comunicarem com os clientes (usuários). O DWR pode enviar códigos JavaScript (através da API do próprio DWR, assim como no GWT) ou executar uma determinada função JavaScript no cliente, fazendo com que o servidor se comunique sem a necessidade do usuário disparar a ação. Tudo isso pode ser feito para várias páginas que estão na sessão do servidor (observe a Figura 2).

 

imagem

Figura 2. Classe Java acessando várias páginas de vários browsers.

A técnica utilizada para esse acesso Servidor-Cliente é chamada de COMET, mas o DWR tem seu próprio nome, denominada Reverse Ajax. É uma poderosa técnica que visa atualizar os clientes sem a necessidade dos mesmos dispararem uma ação. O DWR ainda disponibiliza várias técnicas de se fazer Reverse Ajax – todas bem simples.

Como o DWR funciona?

O DWR é constituído por duas partes principais:

·         Um Servlet Java (DwrServlet) em execução que processa pedidos e respostas, e envia de volta para o navegador;

·         JavaScript no navegador que envia os pedidos e pode atualizar a página dinamicamente.

O DWR gera o JavaScript dinamicamente com base em classes Java. Uma chamada JavaScript é executada e o DWR executa seu código no servidor. Logo depois ele encaminha os dados de volta, fazendo assim o Ajax, que ainda pode ser configurado de uma maneira bem simples para modo assíncrono ou síncrono.

Este método que o DWR utiliza é bastante familiar com os mecanismos de RPC (Remote Procedure Call) convencionais como RMI ou SOAP, com a vantagem de que ela será executada sem que seja necessário nenhum plugin ou configurações complexas.

Para quem não gosta de codificar em JavaScript, o DWR vem com várias APIs que os desenvolvedores podem utilizar no lado Java para criar os JavaScripts (algo semelhante ao GWT). Atualmente temos várias APIs em Java integradas com o DWR, entre elas: TIBCO GI (TIBCO General Interface), Dojo Toolkit, Scriptaculous.

Podemos confiar?

O DWR é apadrinhado/patrocinado pela TIBCO e tem uma parceria com a DOJO Foundation, assim como outras que também apostam no framework. Isso garante que o framework continuará sendo ativamente desenvolvido, pois os investimentos e parcerias são constantes.

O seu criador Joe Walker faz parte da OpenAjax Alliance, cuja missão é criar um eco-sistema para aplicações Ajax, incluindo a capacidade de misturar e combinar várias bibliotecas em soluções únicas, explicando assim o porquê do DWR ter essa vasta integração.

Podemos comentar sobre algumas das várias grandes empresas que utilizam este framework, por exemplo: American Arlines, Walmart, Jira e Confluence, DZone, InfoQ, LinkedIn, MasterCard, Citigroup e Dow Jones. No desenrolar deste artigo conheceremos todo o potencial do DWR.

Configurações

O DWR oferece duas opções de configuração: Annotations ou XML. Eu particularmente prefiro configurá-lo via XML, pois evita a intrusão nas classes por causa das Annotations. O XML facilita a remoção ou adição de novas classes Java que serão utilizadas via Ajax sem ter que alterá-las para isso. Vários desenvolvedores tem aversão a arquivos de configuração longos e complexos, eu sou um deles; mas no caso do DWR, a configuração via XML é tão simples que não será um tormento.

Essa é outra vantagem do DWR, pois você poderá integrar/adicionar recursos Ajax em qualquer aplicação Java, sem a necessidade de alterar seu código original no lado Servidor. Assim, se você tem uma aplicação com Struts, por exemplo, e deseja reutilizar certo método para uma chamada Ajax, basta adicionar o DWR, realizar algumas configurações e apontar para a Action desejada, e a sua funcionalidade estará utilizando AJAX, sem alterar o seu código fonte original.

No período da escrita deste artigo a versão atual do DWR é a 2.0.5. Fizemos o download do dwr.jar (http://directwebremoting.org/dwr/download) e o adicionamos à pasta WEB-INF\lib do projeto.

Adicione o servlet do DWR no web.xml (Listagem 1) e logo depois crie o arquivo dwr.xml (Listagem 2), todos eles na pasta WEB-INF/.

 

Listagem 1. Configurando o DWR no web.xml.

1     <servlet>

2     <servlet-name>dwr-invoker</servlet-name>

3     <display-name>DWR Servlet</display-name>

4     <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>

5     <init-param>

6         <param-name>debug</param-name>

7         <param-value>true</param-value>

8     </init-param>

9     </servlet>

10    <servlet-mapping>

11       <servlet-name>dwr-invoker</servlet-name>

12       <url-pattern>/dwr/*</url-pattern>

13    </servlet-mapping>

 

Listagem 2. Criando o dwr.xml.

1     <!DOCTYPE dwr PUBLIC

2     "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"

3     "http://getahead.org/dwr/dwr20.dtd">

4     <dwr>

5     <allow>

6         <create creator="new" javascript="ClasseJava" scope="session">

7            <param name="class" value="com.javamagazine.ClasseJava"/>

8         </create>

9         <convert converter=”bean” match=”com.javamagazine.beans.*”/>

10      </allow>

11    </dwr>

 

 

Como mostrado na Listagem 1, é bem simples adicionar o DWR, basta criar um mapeamento comum de um Servlet. E na Listagem 2 é onde iremos definir quais classes queremos ter acesso no JavaScript. Veremos agora as configurações mais detalhadas do dwr.xml.

 

Allow(<allow>...</allow>)

É onde definimos os creators para as classes que desejamos acessar via JavaScript.

 

Create(<create...>...</create>)

Tag que fica dentro da allow, onde definimos qual classe iremos acessar no JavaScript. Veja mais algumas configurações do create na Tabela 1.

 

imagem

Tabela 1. Entendendo a tag create do dwr.xml.

Param(<param...>...</param>)

Tag localizada dentro da tag create, onde apontamos qual classe o DWR deve “conhecer” no JavaScript. Veja algumas configurações na Tabela 2.

 

Parâmetro

Valor

Exemplos

Descrição

name

class

<param name=”class”…/>

Define que o parâmetro será uma classe Java.

value

Endereço da classe

<param … value=”pacote.Classe”/>

Onde é definido o endereço completo da classe que você deseja ter acesso no JavaScript.

Tabela 2. Entendendo a tag param do dwr.xml.

Convert(<convert...>...</convert>)

Essa tag tem como funcionalidade definir o tipo de objeto que será transitado entre o cliente (browser) e o servidor. Poderá ser um JavaBean, POJO, List ou qualquer tipo do Java. Vejamos a sua configuração na Tabela 3.

 

Parâmetro

Valor

Exemplos

Descrição

converter

bean, servlet, collection, map, dom, dom4j, jdom, xom, exception….

<convert converter=”bean”…/>

Define o tipo de objeto que você deseja transitar (converter) entre a camada Java e a JavaScript e vice-versa.

match

Endereço do objeto/classe

<convert ... match=”pacote.Objeto”/>
<convert ... match=”pacote.bean.*”/>

Localização ou endereço do objeto. Se você quer utilizar todos os objetos de um pacote, basta colocar o endereço do pacote e no lugar de adicionar as classes apenas coloque “*”.

Tabela 3. Entendendo a tag converter do dwr.xml.

Seguindo essas configurações percebe-se o quão simples é configurar o DWR, bastando adicionar o servlet no web.xml, e no dwr.xml adicionar a classe Java que você deseja acessar seus métodos com AJAX.

Para você ter uma idéia da facilidade para adicionar o DWR em uma aplicação já existente (utilizando XML), crie uma aplicação em qualquer framework e depois adicione o DWR a uma funcionalidade ou em toda a aplicação. O impacto é mínimo, ou dependendo do tipo da aplicação, é zero.

Ambientes e browsers suportados

O DWR atualmente é suportado por vários tipos de ambientes e browsers. Abaixo apresentamos a relação dos que foram testados e homologados.

Ambientes – Tomcat, Weblogic, WebSphere, JBoss, Jetty, Resin, Sun One, Glassfish.

Browsers – Firefox: 1.x, 2.x e 3.x; Internet Explorer: 5.x, 6.x e superiores; Netscape e família Mozilla: 1.7 e superiores; Opera: 7.5.4 e superiores; Safari: 1.2 e superiores.

Alguns exemplos

Veremos agora algumas situações para melhor entendimento das funcionalidades do DWR. Para isso, criaremos alguns exemplos para aplicar os conceitos que serão passados, exemplos simples, mas suficientes para o entendimento e a resposta às perguntas: Para que serve? Onde utilizar?

Para os exemplos definiremos alguns objetos que serão utilizados em quase todos os códigos, mas, lembre-se que estes exemplos são apenas uma prova de conceito, não são regras, você pode utilizar e aplicar da forma que você desejar.

...

Quer ler esse conteúdo completo? Tenha acesso completo