Hello web services!
Um tutorial com o JWSDP
Criação de um web service usando o Ant e o Java Web Services Developer Pack
Sem dúvida, os web services têm sido ultimamente o centro de atenções no mercado de tecnologia. Já na primeira edição da Java Magazine, observamos vários depoimentos sobre esta nova técnica para a distribuição de serviços:
"Java e XML são duas tecnologias que caminham de mãos dadas desde o surgimento do XML e, portanto, o suporte a web services em Java foi algo bastante rápido"...
Bruno Souza
"O grande foco da próxima versão do J2EE são os web services" .
Júlio César Lins
"Hoje todo mundo só quer saber de web services, e não vamos fugir à regra" .
Osvaldo Doederlein
Na primeira edição apresentei conceitos gerais desta tecnologia.. Neste, tratamos alguns dos conceitos em mais detalhes e criamos um web service e um cliente simples, usando o kit de desenvolvimento de web services da Sun.
JWSDP
Basicamente, qualquer serviço distribuído existente pode ser transformado em um web service. Podemos encarar os web services como uma "casca" a ser colocada em aplicações prontas para que façam as mesmas coisas que faziam antes, só que agora usando alguns padrões de mercado como XML e HTTP.
Fica claro então a razão de os livros sobre web services trazerem como tema principal as APIs para manipulação de documentos XML. Elas formam a essência da criação de web services. No entanto, apenas estas APIs não são suficientes para a construção destes serviços. São necessárias também outras ferramentas para atender às demandas de todo o ciclo de desenvolvimento.
Foi nesse contexto que a Sun, a fim de facilitar a vida dos desenvolvedores de web services, agrupou todos os recursos necessários em um único produto e o chamou de Java Web Services Developer Pack, ou simplesmente JWSDP. Atualmente o JWSDP encontra-se na versão 1.0_01 e inclui APIs para manipulação de XML, o Tomcat (container web) e o Ant (ferramenta de automação de builds).
As APIs de Java para XML são certamente o núcleo do JWSDP. Podem ser categorizadas em dois grupos: as voltadas para o processamento de documentos XML (JAXP) e as destinadas à chamada remota de procedimentos (JAXM, JAXR e JAX-RPC):
JAXP - Java API for XML Processing. Para a manipulação de XML, estas APIs são a base de todo o JWSDP. Veja mais detalhes sobre JAXP no artigo “Processando XML em Java” de Rogério Liesenfeld (Edição 2).
JAX-RPC - Java API for XML-based RPC. Para a invocação de serviços distribuídos, com propósito semelhante ao RMI e ao CORBA, a JAX-RPC traz como novidade o XML como padrão para a invocação de métodos e procedimentos remotos.
JAXM - Java API for XML Messaging. Utilizada para a troca de mensagens XML.
JAXR - Java API for XML Registries. Com JAXR é possível realizar o registro e a descoberta de serviços em “páginas amarelas” virtuais, com consultas pelo tipo do serviço ou segmento de mercado da empresa que o disponibiliza, por exemplo.
Instalação e configuração
Apresentadas as principais APIs do JWSDP, podemos começar a preparação do ambiente. O download do JWSDP pode ser feito em:
java.sun.com/webservices/downloads/webservicespack.html
A instalação é muito simples (basta clicar em "Avançar", na maioria das vezes). Será necessário responder a algumas questões, dentre elas (possivelmente) configurações de proxy, nome de usuário e senha (não utilizados neste tutorial) e – se você tiver mais de um JDK instalado – escolha da versão a ser utilizada. Alguns passos da instalação são mostrados na Figura 1.
Será também necessário configurar algumas variáveis de ambiente com as informações específicas da sua instalação:
JAVA_HOME = <LOCAL de instalação do JDK>
JWSDP_HOME = <LOCAL de instalação do JWSDP>
Coloque também o diretório das ferramentas do JWSDP (\jwsdp\bin) no PATH do sistema. Isso conclui a instalação.
Testes iniciais
Para testar se a instalação foi realizada corretamente, inicie o Tomcat (de agora em diante, será usado c:\jwsdp ou /jwsdp para indicar o diretório de instalação do JWSDP):
No Windows: c:\jwsdp\bin\catalina run
No Linux: /jwsdp/bin/catalina.sh run
Ao concluir a inicialização, digite no browser:
Se for mostrada uma página como a da Figura 2, parabéns; podemos passar ao próximo passo.
Diretórios
Vamos criar um ambiente de desenvolvimento para homogeneizar nossa discussão. Crie a estrutura de diretórios mostrada na Figura 3. Os arquivos que criaremos serão distribuídos da seguinte maneira:
jwsdp1 – build.xml, config.xml
src – (arquivos .java)
srv – código fonte do web service
clt – código fonte da aplicação cliente do web service
shr – códigos fontes comuns ao web service e ao cliente
web
WEB-INF- web.xml
Script Ant
Para facilitar todo o processo de compilação, integração e testes do web service, utilizaremos um script Ant criado especialmente para este artigo (veja mais sobre o Ant no artigo "Automação de Builds com Ant", por Júlio César Lins, na Edição 2). O script completo (build.xml) é mostrado na Listagem 1 (este e outros arquivos criados estão disponíveis para download no site da Java Magazine). Deve ser salvo no diretório jwsdp1. Dentro dele, há uma propriedade chamada jwsdp.home que deve ser alterada para refletir o path de instalação do JWSDP em sua máquina:
Dentro do arquivo build.xml existem definições de tarefas para auxílio na construção do web service. As tarefas estão divididas em dois grupos: aquelas voltadas ao desenvolvedor, chamadas tasks públicas ou externas e outras a serem utilizadas apenas internamente, para auxiliarem outras tarefas: tasks internas ou privadas.
O Quadro mostra como cada task pública do Ant poderia ser substituída por comandos do console. Todas estas tarefas podem ser executadas de uma vez, digitando ant no diretório jwsdp1.
Hello web services
Nosso exemplo de web service fará a inscrição de equipes em eventos, mais especificamente no evento "Java Arena", uma mistura de torneio de robôs virtuais com maratona de programação. No exemplo, o usuário envia o nome de sua equipe usando uma mensagem XML; o web service extrai os dados da mensagem e processa a inscrição retornando uma confirmação.
Faremos a criação do web service apenas incrementando as funcionalidades de uma simples classe Java:
package javamagazine;
public class JavaArenaSimples {
public String inscrever(String nomeEquipe) {
return "Equipe " + nomeEquipe +
" inscrita com sucesso!";
}
}
De volta aos conceitos
Antes de fazermos qualquer mudança nesta classe vale lembrar que a invocação local de métodos se dá entre objetos em um mesmo espaço de endereçamento de memória (Figura 4).
...