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

Script de maneira simples

Conheça os fundamentos do framework Direct Web Remoting e os recursos poderosos oferecidos para a criação de aplicações Ajax

Veremos nesse artigo como o framework DWR (Direct Web Remoting) suporta a criação de aplicações Ajax avançadas, permitindo invocar código Java no servidor a partir de funções JavaScript e convertendo objetos e parâmetros entre as duas tecnologias.

Visão geral

O framework DWR permite que trechos de código JavaScript na camada cliente invoquem métodos em objetos Java no servidor. Estas invocações são simples, transparentes e ao mesmo tempo robustas. Não é necessário nenhum plug-in instalado no browser. Basta o suporte a JavaScript e Ajax.

O DWR gera código JavaScript baseado em classes Java expostas no servidor e registradas em sua configuração. Através dos objetos gerados, pode-se invocar os métodos do objeto Java. Ao chamar uma dessas funções no objeto JavaScript, acontece uma invocação remota nos métodos correspondentes do objeto residente no servidor .

O ponto central do DWR é o seu servlet, que é responsável pela geração do JavaScript e pelo tráfego e conversão dos dados entre o servidor e o browser. O servlet gera dinamicamente os arquivos .js que representam os objetos Java no servidor; também gera outros arquivos .js que compõem a infra-estrutura do DWR na camada cliente (veremos detalhes sobre isso adiante).

O DWR fornece ainda vários utilitários JavaScript que facilitam a realização de tarefas repetitivas e também o uso de DHTML. Entre as tarefas, podemos destacar a população de elementos, por exemplo de tabelas HTML. Como aplicações Ajax são fortemente baseadas em JavaScript, acabamos tendo que codificar muito na camada cliente, e esses utilitários reduzem bastante esta codificação.

Explorando os principais recursos do DWR

Nessa seção exploraremos alguns dos principais recursos do DWR através de um exemplo simples. Depois criaremos um exemplo mais complexo para ilustrar funcionalidades mais avançadas.

Instalando o primeiro exemplo

Os projetos de exemplo estão disponíveis para download no site da Java Magazine, sendo disponibilizados como WARs. Utilizaremos o Eclipse com WTP (Web Tools Platform) para importar esses WARs – mas você pode usar seu IDE preferido adaptando os passos mostrados no artigo. Também será necessário ter um container web instalado. Recomendamos o Apache Tomcat em sua versão 5.5 ou mais recente. Não será preciso utilizar um banco de dados para o primeiro exemplo. No segundo, utilizaremos o MySQL.

No Eclipse, importe o primeiro exemplo – dwr.war – usando File|Import>Web>WAR. Utilize o nome do projeto como o contexto da aplicação (“/dwr”) e na tela seguinte não selecione nenhum dos JARs para que sejam criados como projetos. A estrutura criada deverá ser similar à da Figura 1.

 

Figura 1. Estrutura do primeiro exemplo

Podem ocorrer problemas com a versão do código-fonte utilizada no projeto, se mais de uma versão do Java SE estiver configurada no Eclipse. Para corrigir esse problema, clique com o botão direito sobre o projeto, escolha Properties>Java Compiler e mude Compiler compliance level para 5.0. Pode haver problemas também se o “Facet” instalado para a versão do Java não for o da versão 5[1]. Neste caso, clique com o botão direito sobre o projeto e escolha Properties>Project Facet; depois clique em Add/Remove Project Facets.

Entendendo o primeiro exemplo

O primeiro passo na configuração do DWR é a declaração do seu servlet. Na Listagem 1, vemos essa declaração, mapeando o servlet para atender a todas as requisições no caminho /dwr.

 

Listagem 1. Configuração do web.xml para o DWR.

<?xml version="1.0" encoding="UTF-8"?>

<web-app ...>

  <servlet>

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

    <servlet-class>

      org.directwebremoting.servlet.DwrServlet

    </servlet-class>

    <init-param>

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

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

    </init-param>

  </servlet>

 

  <servlet-mapping>

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

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

  </servlet-mapping>

</web-app>

 

Nota 1: Os “Facets” são extensões do núcleo comum do WTP que dão suporte específico a alguma especificação ou API; por exemplo Java SE 5 ou Servlets 2.5. A escolha dos Facets faz o WTP adaptar vários comportamentos, por exemplo, validando arquivos de configuração com o XSD/DTD da versão exata pedida por um release específico da API utilizada.

 

Precisamos também de uma classe para disponibilizar como um objeto JavaScript. Para o exemplo, criamos a classe TimeService (Listagem 2), contendo apenas um método que retorna a data e a hora do servidor como uma string.  Podemos ver que esta classe é um simples POJO – não é necessário implementar nenhuma interface ou herdar de alguma classe para que possa ser utilizada com o DWR.

 

Listagem 2. Classe TimeService, responsável por retornar a data e a hora do servidor.

package br.com.jm.dwr;

 

import java.util.Date;

 

public class TimeService {

  public String getTime() {

    return new Date().toString();

  }

}

 

O próximo passo é criar o arquivo WEB-INF/dwr.xml. Nele declaramos os objetos que serão disponibilizados pelo DWR na camada JavaScript, além dos conversores responsáveis pela conversão entre Java e JavaScript e vice-versa. Aqui está um trecho desse arquivo:

 

<dwr>

  <allow>

    <create creator="new" javascript="timeService">

      <param name="class" value="br.com.jm.dwr.TimeService" />

    </create>

     ...

 

A declaração da classe TimeService a torna disponível na camada JavaScript. E o objeto JavaScript correspondente é definido como timeService, através do atributo javascript. Declaramos ainda o mecanismo de criação do objeto, que ocorrerá através do construtor padrão (usando creator="new").

É através do atributo creator que o DWR se integra com outros frameworks e tecnologias como Spring, Struts, JSF e EJB 3. Ao usar um “creator” customizado, o DWR delega a criação dos objetos para o framework em questão. 

A Listagem 3 apresenta uma página JSP capaz de invocar métodos no objeto Java (note como a chamada a timeService.getTime() é feita ao final). Repare que a página possui somente código JavaScript e HTML. ...

Quer ler esse conteúdo completo? Tenha acesso completo