SOA TomCat-Axis
Autor: Arthur Tavares | Publicado: 2011-01-17T11:57:00-08:00

<!--[if !mso]> 
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
 <![endif]--><!--[if gte mso 9]>     Normal   0   21      <![endif]-->  
&nbsp;Guia para implementação de WebServices em Container TomCat: 
Introdução:
O objetivo deste guia é mostrar – passo a passo – como implementar um webService, com servidor e cliente, funcional, em ambiente TOMCAT.  Um WebService é qualquer aplicação que é dividia em cliente e servidor.  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O Servidor: É a parte do sistema responsável pelo processamento dos dados, CRUD e encaminhamento dentro da rede.  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O Cliente pode coletar (do usuário ou de outros aplicativos ou bancos), enviar e/ou receber dados do servidor e/ou apresentar os dados enviados pelo servidor (a usuários ou encaminhar a outras aplicações).  Através dos estudos de caso, notou-se que o Container Tomcat serve para publicar páginas e aplicações web, mas não possui muito suporte sobre o processamento dos serviços. Isso porque, pelo menos para JAVA, o TomCat não disponibiliza API’s necessárias para referência nas aplicações. Assim, o princípio do servidor, de processar dados, não pode ser alcançado pela falta de capacidade de interpretação de componentes necessários.  Foi aferido que existem outros Container’s que mostram mais suporte às aplicações, como o GlassFish e o JBossESB. Destes dois, em específico, o GlassFish mostrou-se o mais simples, apresentando pouco mais que as API’s básicas para uma aplicação CRUD convencionais. O Container JBossESB, por sua vez, além de suportar aplicações JAVA, estende-as com API’s específicas para implementação de barramentos web, auxiliando desde o processo de codificação (ampliando a gama de extensões suportadas pelo Eclipse com JbossTools, por exemplo), passando por automações na comunicação entre clientes e servidores chegando a oferecer até um ambiente gráfico mais eficiente para manipulação dos arquivos que participam do webService. Claro que cada facilidade apresentada por estes outros Container’s implica em tamanho maior do Container e demora significativa no tempo de execução das aplicações.
Ambiente de Trabalho:
O TomCat, sozinho, não possui capacidade de implementar webServices.Por isso, a Apache disponibiliza um complemento chamado Axis.
Executável TomCat:http://ftp.unicamp.br/pub/apache/tomcat/tomcat-7/v7.0.5-beta/bin/apache-tomcat-7.0.5.exe
Zip com a pasta Axis:http://linorg.usp.br/apache//ws/axis/1_4/axis-bin-1_4.zip
Complemento xerces:http://www.apache.org/dist/xerces/j/Xerces-J-bin.2.11.0.zip&nbsp; 1 – Instale o TomCat normalmente;2 – Descompacte o zip do Axis;3 – Mova a pasta "Axis", que encontra-se dentro do diretório webapps do arquivo, para a pasta webapps do TomCat;4 – Descompactar o zip do xerces;5 – Mover os arquivos “xercesImpl.jar” e “xml-apis.jar” da pasta xerces para a pasta axis\lib\ (do próprio diretório Axis, descompactado anteriormente).6 – Criar as seguintes variáveis de ambiente:(Criar as JAVA, caso ainda não estejam criadas, também.)
AXIS_HOME=C:\axis 
AXIS_LIB=%AXIS_HOME%\lib 
AXISCLASSPATH=%AXIS_LIB%\wsdl4j-1.5.1.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging- 1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar;%AXIS_LIB%\xml-apis.jar;%AXIS_LIB%\xercesImpl.jar;%AXIS_LIB%\jaxrpc.jar
7 – Mover o arquivo tools.jar da pasta lib do JAVA para a pasta lib do Axis, dentro do TomCat.
8 - Pode-se testar se o ambiente está ok abrindo o navegador e digitando a seguinte URL:
http://localhost:8080/axis
Se aparecer a tela do servidor Axis, estará tudo ok.
 Desenvolvimento do Servidor:
1 - Abra a IDE e crie a seguinte classe JAVA:
  /*&nbsp;* Esta classe foi desenvolvida para ser referencia de teste para implementação de SOA.&nbsp;* Este é um arquivo de servidor webService.&nbsp;* Recebe duas variáveis Inteiras do cliente e devolve a soma delas para o cliente&nbsp;*/
public class Calculadora {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int somar( int a, int b ) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return a + b;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }}
2 – Salve o arquivo do servidor;3 – Copie o arquivo do seu contexto para a pasta:C:\Arquivos de programas\Apache Software Foundation\Tomcat 7.0\webapps\axis\
4 – No Browser, digite a seguinte URL:http://localhost:8080/axis/Calculadora.jws
Aparecerá a seguinte tela:


Clicando no Link, você verá o arquivo WSDL:

&nbsp;Agora, o servidor TomCat/Axis já possui o arquivo de comunicação pronto, aguardando o envio de dados pelo cliente.

Desenvolvimento do Cliente:  
1 – Certifique-se que a IDE possui as Lib’s do Axis.No Eclipse, para incluir as Lib’s, Basta clicar o botão direito sobre a pasta do projeto -&gt; Propriedades.JavaBuildPaths -&gt; Libraries -&gt; Add External JAR’sSelecione todas as JAR’s da pasta LIB do Axis -&gt; OK.
2 – Abra a IDE e crie o seguinte arquivo:
  import javax.swing.*;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import org.apache.axis.encoding.XMLType;import javax.xml.rpc.ParameterMode;
public class Cliente {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Cliente(){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; private void invocaServico(String endpointURL, int mensagem1, int mensagem2){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int resposta = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Service &nbsp;service&nbsp; = new Service();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Call call;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call = (Call) service.createCall();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Atribuindo a URL do Servico&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setTargetEndpointAddress(new java.net.URL(endpointURL));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Definindo o metodo a ser invocado&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setOperationName("somar");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Definindo os parametros de entrada&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.addParameter("a", XMLType.XSD_INT, ParameterMode.IN);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.addParameter("b", XMLType.XSD_INT, ParameterMode.IN);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Definindo o tipo do parametro de retorno&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call.setReturnType(org.apache.axis.encoding.XMLType.XSD_INT);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Invocando o servico&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resposta = (Integer) call.invoke(new Object[] {mensagem1, mensagem2});
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Imprimindo a resposta&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JOptionPane.showMessageDialog(null, "Servico invocado...\n" + resposta);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception ex) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; public static void main(String args[]){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;args= new String[3];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;// Aqui é colocado o caminho que está indicado no arquivo WSDL.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; args[0]="http://localhost:8080/axis/Calculadora.jws?wsdl";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; args[1]="4";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; args[2]="4";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String endpointURL = null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;int mensagem1&nbsp;&nbsp; = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mensagem2&nbsp;&nbsp; = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (args.length &lt; 3){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Sintaxe errada. \nInforme a URL e a Mensagem");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Ex: java ClientHelloWorld http://localhost:8080/axis/HelloWorld.jws \"Ola mundo\"");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.exit(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Obtendo a URL do Servico Web&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endpointURL = args[0];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Obtendo a mensagem 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; args[1] = JOptionPane.showInputDialog("Digite o primeiro fator da Soma:");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mensagem1 = Integer.parseInt(args[1]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Obtendo a mensagem 2 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; args[2] = JOptionPane.showInputDialog("Digite o segundo fator da Soma:");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mensagem2 = Integer.parseInt(args[2]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception ex) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Criando uma instancia da classe ClientHelloWorld&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cliente client = new Cliente();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Invocando o metodo 'invocaServico'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.invocaServico(endpointURL, mensagem1, mensagem2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }}&nbsp; 3 – Compile e Rode.

Conclusão
1 – O cliente vai solicitar dois números para o usuário;2 – O usuário irá fornecer e clicar “OK” para cada número;3 – O cliente irá estabelecer uma conexão através do caminho do arquivo WSDL;3 – O cliente irá enviar dois parâmetros para o servidor: número 1 e número 2;4 – O servidor irá receber os parâmetros, efetuar a soma e devolver o resultado;5 – O cliente irá receber a resposta e mostrar na tela a resposta para sua solicitação.
Esta é uma aplicação básica, podendo apenas trabalhar com:1 – Sempre precisamos ter o fonte Java disponível;2 – A classe não pode fazer parte de nenhum pacote;3 – Não pode utilizar outros tipos, senão os básicos do Java (primitivos, wrappers e String).
Mesmo assim, este modo de aplicação pode muito bem ser utilizada como base para vários clientes enviando e recebendo informações para um servidor com vários métodos de controle, que reenvia para os clientes corretos as informações necessárias.