Desenvolvimento - Web Services

Desenvolvendo WebServices com Apache AXIS

Este será o primeiro de uma série de 4 artigos, nossa abordagem neste primeiro arquivo será a criação de um webservice compatível com clientes .NET e J2ME usando a implementação Apache AXIS.

por Rogério Pereira Araújo



Este será o primeiro de uma série de 4 artigos, nossa abordagem neste primeiro arquivo será a criação de um webservice compatível com clientes .NET e J2ME usando a implementação Apache AXIS.

O Apache AXIS é uma das implementações mais versáteis do protocolo SOAP, ele permite a criação de webservices tanto no padrão xml/rcp como doc/literal (.NET).

Aqui estaremos abordando a codificação, o empacotamento e o instalação do webservice.

Instalando o Apache AXIS:

  • Baixe o arquivo http://archive.apache.org/dist/ws/axis/1_2RC2/axis-1_2RC2-bin.tar.gz

  • Descompacte para uma pasta de sua escolha usando o Fillzip ou outro compactador qualquer capaz e extrair conteúdo de arquivos .tar.gz ou .tgz

  • Crie uma pasta para sua aplicação web, neste caso vamos chamá-la de doacao, dentro dela crie uma pasta chamada WEB-INF.

  • Dentro da pasta WEB-INF crie outras duas pastas, classes e lib.

  • Copie todos os arquivos .jar do conteúdo extraído do arquivo axis-1_2RC2-bin.tar.gz para a pasta lib.

  • Coloque todos os arquivos .jar da pasta lib na sua variável de ambiente CLASSPATH, pois elas serão necessárias futuramente para compilar o código do backing bean.

    A estrutura da pasta de sua aplicação web ficará assim:

Preparando o banco de dados no MySQL:

  • Dentro do utilitário de acesso ao servidor MySQL, digite os seguintes comandos:
    update mysql.users set password = PASSWORD("root") where user = "root";
    
    flush privileges
    
    create database doacao
    
    use doacao
    
    CREATE TABLE Doador (
    
    idDoador int(11) NOT NULL auto_increment,
    
    nomeDoador varchar(40) default NULL,
    
    endereco varchar(80) default NULL,
    
    bairro varchar(30) default NULL,
    
    cep varchar(10) default NULL,
    
    login varchar(20) default NULL,
    
    senha varchar(10) default NULL,
    
    idCidade int(11) default NULL,
    
    PRIMARY KEY (`idDoador`)
    
    );
    
    CREATE TABLE Produto (
    
    idProduto int(11) NOT NULL auto_increment,
    
    nomeProduto varchar(40) default NULL,
    
    quantidade int(11) default NULL,
    
    validade int(11) default NULL,
    
    dataEntrada date default NULL,
    
    dataEntrega date default NULL,
    
    dataCancelamento date default NULL,
    
    situacao varchar(10) default NULL,
    
    idCidade int(11) NOT NULL default 0,
    
    idTipoProduto int(11) NOT NULL default 0,
    
    idTipoTransporte int(11) NOT NULL default 0,
    
    idInstituicao int(11) default NULL,
    
    idDoador int(11) NOT NULL default 0,
    
    PRIMARY KEY (idProduto)
    
    )
    

  • Você vai encontrar o driver JDBC do MySQL neste link:

    http://www.linorg.usp.br/mysql/Downloads/Connector-J/mysql-connector-java-3.1.4-beta.zip

  • Descompacte esse arquivo e coloque o arquivo mysql-connector-java-3.1.4-beta-bin.jar no local indicado pela figura 1.
Configurando uma conexão com o MySQL no contexto do Tomcat:

  • Crie um arquivo chamado context.xml e dentro do arquivo copie e cole o conteúdo a seguir:
    <?xml version="1.0"?>
    <Context privileged="true" antiResourceLocking="false" antiJARLocking="false">
       <Resource name="jdbc/DoacaoDB" auth="Container" type="javax.sql.DataSource"
          maxActive="100" maxIdle="30" maxWait="10000"
          username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/doacao?autoReconnect=true"/>
    </Context>
    

  • Este arquivo deverá estar dentro da pasta META-INF conforme exibido na figura 1, o context.xml é usado para configurar o contexto da aplicação web, os recursos por ela utilizado e etc.

Configurando sua aplicação web para trabalhar com o Apache Axis:

  • Crie um arquivo chamado web.xml e dentro do arquivo copie e cole o conteúdo a seguir:
    <?xml version="1.0"?>
    
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
    "http://java.sun.com/dtd/web-app_2_3.dtd">
    
    <web-app>
       <filter-mapping>
          <filter-name>multipartFilter</filter-name>
          <url-pattern>*.jsf</url-pattern>
       </filter-mapping>
    
       <!-- Listener, que faz todo o trabalho de inicializacao (configuracao e etc). -->
       <listener>
           <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
       </listener>	
    
       <!-- Axis Servlet -->
       <servlet>
          <servlet-name>AxisServlet</servlet-name>
          <display-name>Apache-Axis Servlet</display-name>
          <servlet-class>
             org.apache.axis.transport.http.AxisServlet
          </servlet-class>
       </servlet>
    
    
       <!-- mapeamentos -->
       <servlet-mapping>
          <servlet-name>AxisServlet</servlet-name>
          <url-pattern>/servlet/AxisServlet</url-pattern>
       </servlet-mapping>
    	
       <servlet-mapping>
          <servlet-name>AxisServlet</servlet-name>
          <url-pattern>*.jws</url-pattern>
       </servlet-mapping>
    	
       <servlet-mapping>
          <servlet-name>AxisServlet</servlet-name>
          <url-pattern>/services/*</url-pattern>
       </servlet-mapping>		
    
       <resource-ref>
          <description>Conexao com o banco</description>
          <res-ref-name>jdbc/DoacaoDB</res-ref-name>
          <res-type>javax.sql.DataSource</res-type>
          <res-auth>Container</res-auth>
       </resource-ref>
    
       <!-- arquivos de indice da pasta virtual-->
       <welcome-file-list>
          <welcome-file>index.jsf</welcome-file>
          <welcome-file>index.jsp</welcome-file>
          <welcome-file>index.html</welcome-file>
       </welcome-file-list>
    </web-app>
    

  • Este arquivo deverá estar dentro da pasta WEB-INF conforme exibido na figura 1, o web.xml é usado para configurar a aplicação web e quaisquer mecanimos que a mesma utiliza.

  • Agora crie o arquivo deploy-DoarService.xml, ele é o resposável por publicar o webservice, copie e cole dentro do mesmo o conteúdo a seguir:
    <?xml version="1.0"?>
    
    <deployment 
       xmlns="http://xml.apache.org/axis/wsdd/" 
       xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
       xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
    
       <!--Publica o webservice no estilo doc/literal (compativel com o .NET)--> 
       <service name="DoarService" provider="java:RPC" style="document" >
    
       <!--Indica a classe que vai atender as requisicoes dos clientes-->
       <parameter name="className" value="net.sf.doacao.DoarService" />
    
       <!--Indica quais sao os metodos que podem ser invocados pelos clientes-->
       <parameter name="allowedMethods" value="doar " />
       <parameter name="scope" value="request"/>
    
       <!--Faz o mapeamento da classe Doacao uma vez que ela e 
          utilizada como parametro do metodo doar-->
       <beanMapping qname="nsdoar:Doacao" xmlns:nsdoar="urn:DoarService" 
          languageSpecificType="java:net.sf.doacao.data.Doacao"/>
       </service>
    </deployment>
    

  • Este arquivo pode ser colocado em qualquer lugar dentro da pasta doacao, ele é utilizado na publicação do webservice dentro do Tomcat gerando assim o arquivo server-config.wsdd que indica quais são os webservices que aquela aplicação web dispõe para os clientes.

Desenvolvendo a webservice:

  • Vamos agora criar uma classe java que será a classe utilizada no envio de dados para o webservice, vamos chamar esta classe de Doacao, veja o código abaixo:
    package net.sf.doacao.data;
    
       public class Doacao {
    
       private String login;
       private String senha;
       private String produto;
       private int    quantidade;
    	
       /**
        * 
        */
       public Doacao() {
          // TODO Auto-generated constructor stub
       }
    
       /**
        * @return Returns the login.
        */
       public String getLogin() {
          return login;
       }
       /**
        * @param login The login to set.
        */
       public void setLogin(String login) {
          this.login = login;
       }
       /**
        * @return Returns the produto.
        */
       public String getProduto() {
          return produto;
       }
       /**
        * @param produto The produto to set.
        */
       public void setProduto(String produto) {
          this.produto = produto;
       }
       /**
        * @return Returns the quantidade.
        */
       public int getQuantidade() {
          return quantidade;
       }
       /**
        * @param quantidade The quantidade to set.
        */
       public void setQuantidade(int quantidade) {
          this.quantidade = quantidade;
       }
       /**
        * @return Returns the senha.
        */
       public String getSenha() {
          return senha;
       }
       /**
        * @param senha The senha to set.
        */
       public void setSenha(String senha) {
          this.senha = senha;
       }
       }
    

    Por fim, e finalmente, o código do webservice, crie o arquivo DoarService.java e coloque dentro deste arquivo o conteúdo abaixo:

    package net.sf.doacao;
       import net.sf.doacao.data.*;
    
       import java.sql.Connection;
       import java.sql.PreparedStatement;
       import java.sql.ResultSet;
    
       import javax.naming.Context;
       import javax.naming.InitialContext;
       import javax.sql.DataSource;
    
       /**
        * @author Rogério Pereira Araújo
        *
        * Esta classe é responsável pelo webservice que vai atender 
        * às doações feitas por celular ou qualque outro cliente .NET, Java, PHP e etc...
        * 
        * @axis.service 
        * urn="DoarService" 
        * provider="java:RPC" 
        * scope="request"
        * style="document"
        *  
       */
       public class DoarService {
    	
       public DoarService() {
    		
       }
    
       /**
        * 
        * @axis.method
        * 
        */
    
       //Metodo doar, observe que a classe Doacao e o parametro deste metodo e por isso 
       //precisa ser mapeada pelo Axis.
       public boolean doar(Doacao doacao){
       try{
          Context initContext = new InitialContext();
          Context envContext  = (Context)initContext.lookup("java:/comp/env");
          DataSource ds       = (DataSource)envContext.lookup("jdbc/DoacaoDB");
          Connection conexao  = ds.getConnection();
    
          PreparedStatement comandoBanco; 
          comandoBanco = conexao.prepareStatement("SELECT * FROM Doador WHERE login = ? AND senha = ?");
          comandoBanco.setString(1, doacao.getLogin()); 
          comandoBanco.setString(2, doacao.getSenha());
    	
          ResultSet dados = comandoBanco.executeQuery(); 
          if(dados.next()){
            comandoBanco = conexao.prepareStatement("INSERT INTO Produto(nomeProduto, quantidade, 
    idCidade, idDoador, idTipoProduto, idTipoTransporte) VALUES(?, ?, ?, ?, 0, 0)");
            comandoBanco.setString(1, doacao.getProduto()); 
            comandoBanco.setInt(2, doacao.getQuantidade()); 
            comandoBanco.setInt(3, dados.getInt("idCidade")); 
            comandoBanco.setInt(4, dados.getInt("idDoador")); 
    		
            comandoBanco.executeUpdate(); 
          }
          else{
            return false;	
          }
          conexao.close();  			
        }
        catch(Exception erro){
           System.err.println(erro.getMessage());
           return false;
        }		
        return true;
        }
      }
    

Distribuindo a aplicação

Para preparar a aplicação para distribuí-la em um servidor como o Tomcat ou JBoss, basta compactar a pasta doacao dentro do arquivo doacao.zip e logo após renomeando a extensão para .war e então copie este arquivo compactado para a pasta webapps do tomcat, se o tomcat estiver em execução ele vai efetuar o deploy da aplicação automaticamente.

Após isso você terá que publicar o webservice, para tanto utilize a seguinte linha de comando:

java org.apache.axis.client.AdminClient -lhttp://localhost:8080/doacao/services/AdminService deploy-DoarService.xml

Tenha em mente a presença dos arquivos DoarService.class dentro da pasta doacao/WEB-INF/classes/net/sf/doacao e Doacao.class dentro da pasta doacao/WEB-INF/classes/net/sf/doacao/data

Conclusão

Com o Apache Axis é possível criar webservices que funcionam com qualque outro cliente de webservice, seja em .NET, PHP, Perl como o Java em si.

No próximo artigo estaremos abordando a criação de cliente deste webservice em J2ME e nos próximos artigos a criação de clientes em .NET, até lá!

Rogério Pereira Araújo

Rogério Pereira Araújo - Consultor de Informática da Druid Internet Systems, desenvolvedor de soluções em busca corporativa, mobilidade e gestão de negócios, possui experiência em diversas tecnologias como Python, Bash, SQL, Perl, Java (JSF, J2ME, EJB), .NET (ASP.NET, Compact Framework), PHP, XML (SOAP e XQuery) e Delphi. Colaborador da revista webmobile e de vídeo-aulas para a JavaMagazine.
http://faces.eti.br