Passo 1
(Este tutorial foi desenvolvido por Cleber Calvi)

 

Gravação de Dados!

Vamos criar a nossa tela (simples) onde pegaremos os dados a serem registrados na base de dados. Ex:

Mantendo um padrão de desenvolvimento, na pasta Source teremos as seguintes camadas:

View > beans;
Service > camada responsável por fazer a comunição entre a view e a dao, fazendo tratamentos e conversões de dados, passando os dados de maneira clara para ambas as camadas;
DAO > camada responsável por trabalhar com a base de dados.

 

Criaremos uma base de dados, nela criaremos uma tabela e a seguinte stored procedure:

create procedure gravar
  @nome varchar(20),
  @idade decimal(10,0)
  AS
  if exists (select nome from dados where nome=@nome)
    begin
       select ‘D’
  end
  else
    begin
      insert into dados
      values (@nome, @idade)
      select ‘O’
end

Obs.: lembrando que essa é uma procedure simples e que devemos evitar clausulas where comparando “Strings”.

Criada nossa procedure, vamos as classes Java.
Criaremos no bean o seguinte método:

public String gravar(){
   String retorno=null;
   String status;
   status = service.gravar(this.nome, this.idade);
   if(status.equals(“D”) || status.equals(“F”)){
      retorno = “falha”;
   }else{
      retorno = “sucesso”;
   }
   return retorno;
}

 

Agora iremos criar a classe service que deverá ficar semelhante ao código abaixo:

package br.com.web.control.service;
import br.com.web.control.dao.HibernateDAO;

public class HibernateService{
       private HibernateDAO dao = new HibernateDAO();
       //Construtor
       public HibernateService(){
       }
       public String gravar(String nome, int idade){
          String retorno;
          try{
             retorno = dao.gravar(nome, idade);
          }catch (Exception e) {
             retorno = “E”;
          }
       return retorno;
       }
}

Obs.: lembrando que o package e o importe irão variar de acordo com a estrutura e nomes do seu projeto.

E finalmente a classe DAO:

package br.com.web.control.dao;
import org.hibernate.Query;
import org.hibernate.Transaction;
import org.hibernate.classic.Session;

public class HibernateDAO{
    //Objeto para manuseio da classe de Conexao
    Conexao conexao = new Conexao();

    //Construtor
    public HibernateDAO(){
    }

    public String gravar(String nome, int idade) throws Exception{
        Session session = getConexao().getSession();
        String retorno = null;
        Query query = null;
        try{
           Transaction trans = session.beginTransaction();
           query = session.getNamedQuery(“gravar”);
           query.setString(0, nome);
           query.setInteger(1, idade);
           retorno = String.valueOf(query.uniqueResult());
           trans.commit();
        }catch(Exception he) {
           throw new Exception();
        } finally{
           session.close();
        }
        return retorno;
    }

    public Conexao getConexao() {
        return conexao;
    }

    public void setConexao(Conexao conexao) {
        this.conexao = conexao;
    }
}

E a classe conexão:

package br.com.web.control.dao;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

public class Conexao {
    //Objeto que irá conter a configuração de conexão
    private SessionFactory factory;
    //Método construtor
    public Conexao(){ };

    /* Método que configura a conexão com o hibernate
    * abre e retorna uma sessão */
    public Session getSession(){
        this.factory = new Configuration().configure().buildSessionFactory();
        Session session = this.factory.openSession();
        return session;
    }
}

 

Bom, até agora muito código e pouca explicação né! Vamos agora explicar um pouco o que foi feito.

O bean é responsável por pegar os dados da tela e enviar para a camada service, ao receber os dados de volta ele irá verificar para qual tela ele deve direcionar a aplicação através do status, que nada mais é que o retorno da classe Service.

A camada service está pegando os dados e enviando para a camada DAO, caso haja algum erro na camada DAO, a service irá tratar esse erro mandando uma mensagem de status “F” que trataremos como erro, caso não dê problema apenas repassa o valor recebido da stored procedure.

A camada DAO é responsável por toda a parte de base de dados, para isso criamos a classe “dao” que irá receber os valores da service, abrir uma sessão através da classe “Conexão” (Session session = getConexao().getSession();), montar e executar a query (Transaction trans = session.beginTransaction(); query = session.getNamedQuery(“gravar”); query.setString(0, nome); query.setInteger(1, idade); retorno = String.valueOf(query.uniqueResult()); trans.commit();) .

A classe Conexão apenas cria a sessionFactory baseado no arquivo hibernate.cfg.xml.

Porém para que tudo isso funcione ainda é necessário criar o “hbm.xml” que terá como primeiro nome, o mesmo que foi dado a sua base de dados, nesse caso “HBM.hbm.xml”.

<?xml version=“1.0″ encoding=“UTF-8″?>
<!DOCTYPE hibernate-mapping PUBLIC “-//Hibernate/Hibernate Mapping DTD//EN”
     “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>
<!– ************************************************************************************************ –>
<!– Mapeamento de Stored Procedures que usamos na aplicalção –>
<!– ************************************************************************************************ –>
<hibernate-mapping auto-import=”true” default-lazy=”false”>
      <sql-query name=“gravar” callable=“true”>
            <return-scalar column=“mensagem” type=“string” />
            { call gravar(?,?) }
      </sql-query>
</hibernate-mapping>

 

Nesse arquivo é que serão mapeadas as procedures que serão chamadas e seus retornos. No caso da gravação onde teremos apenas uma mensagem, o mapeamento é simples como o apresentado acima.

Conhecendo o ambiente servidor

 

Todo o Web Service precisa ficar ativo e esperando requisições, portanto, necessita ser executado em um servidor. Neste artigo será utilizado o servidor Tomcat para executar um framework de Web Service chamado Axis . Ambos são sub-projetos livres da Apache, sendo que o Tomcat está no projeto Jakarta e o Axis está no projeto Web Services.

O Tomcat é um container para JSP e Servlets muito conhecido e muito utilizado. Encontra-se vários tutoriais e artigos sobre ele espalhados em páginas na internet.

Já o Axis é um conjunto de ferramentas para desenvolver Web Services. Dentre suas principais funcionalidades estão:

  • implementação do protocolo SOAP ;

  • implementação de classes para agilizar a comunicação e a publicação de Web Services;

  • utiliza containers JSP para disponibilizar os Web Services na rede.

 

 

Preparação do ambiente de desenvolvimento

Primeiro, é necessário preparar o ambiente de desenvolvimento antes de iniciar a utilização das ferramentas do Apache Axis. É importante que as bibliotecas do Axis sejam configuradas no CLASSPATH corretamente. Adicione as seguintes bibliotecas (JAR) ao CLASSPATH:

• axis.jar
• commons-discovery-0.2.jar
• commons-logging-1.0.4.jar
• jaxrpc.jar
• saaj.jar
• wsdl4j-1.5.1.jar

Estas bibliotecas vêm junto com a distribuição do Apache Axis e estão no diretório lib.
Caso seja utilizada uma IDE para o desenvolvimento, como o Eclipse, por exemplo, adicione as bibliotecas ao projeto.
Caso utilize as ferramentas do Axis via linha de comando, configure o CLASSPATH como abaixo.


Linha de comando para Windows:

SET AXIS_HOME=c:/axis-1_3

SET CLASSPATH=%CLASSPATH%;./

SET CLASSPATH=%CLASSPATH%;%AXIS_HOME%/lib/axis.jar

SET CLASSPATH=%CLASSPATH%;%AXIS_HOME%/lib/saaj.jar

SET CLASSPATH=%CLASSPATH%;%AXIS_HOME%/lib/jaxrpc.jar

SET CLASSPATH=%CLASSPATH%;%AXIS_HOME%/lib/commonslogging-1.0.4.jar

SET CLASSPATH=%CLASSPATH%;%AXIS_HOME%/lib/commonsdiscovery-0.2.jar

SET CLASSPATH=%CLASSPATH%;%AXIS_HOME%/lib/wsdl4j-1.5.1.jar

SET AXIS_HOME=c:/axis-1_3

SET CLASSPATH=%CLASSPATH%;./

SET CLASSPATH=%CLASSPATH%;%AXIS_HOME%/lib/axis.ja

SET CLASSPATH=%CLASSPATH%;%AXIS_HOME%/lib/saaj.ja

SET CLASSPATH=%CLASSPATH%;%AXIS_HOME%/lib/jaxrpc.

SET CLASSPATH=%CLASSPATH%;%AXIS_HOME%/lib/commo

SET CLASSPATH=%CLASSPATH%;%AXIS_HOME%/lib/commo

SET CLASSPATH=%CLASSPATH%;%AXIS_HOME%/lib/w sdl4j

 

Linha de comando para Unix:

AXIS_HOME=c:/axis-1_3; export AXIS_HOME

CLASSPATH=%CLASSPATH%:./; export CLASSPATH

CLASSPATH=%CLASSPATH%:%AXIS_HOME%/lib/axis.jar; export CLASSPATH

CLASSPATH=%CLASSPATH%:%AXIS_HOME%/lib/saaj.jar; export CLASSPATH

CLASSPATH=%CLASSPATH%:%AXIS_HOME%/lib/jaxrpc.jar; export CLASSPATH

CLASSPATH=%CLASSPATH%:%AXIS_HOME%/lib/commons-logging-1.0.4.jar; export CLASSPATH

CLASSPATH=%CLASSPATH%:%AXIS_HOME%/lib/commons-discovery-0.2.jar; export CLASSPATH

CLASSPATH=%CLASSPATH%:%AXIS_HOME%/lib/wsdl4j-1.5.1.jar; export CLASSPATH

AXIS_HOME=c:/axis-1_3; export AXIS_HOME

CLASSPATH=%CLASSPATH%:./; export CLASSPATH

CLASSPATH=%CLASSPATH%:%AXIS_HOME%/lib/axis.jar; ex

CLASSPATH=%CLASSPATH%:%AXIS_HOME%/lib/saaj.jar; ex

CLASSPATH=%CLASSPATH%:%AXIS_HOME%/lib/jaxrpc.jar; e

CLASSPATH=%CLASSPATH%:%AXIS_HOME%/lib/commons-lo

CLASSPATH=%CLASSPATH%:%AXIS_HOME%/lib/commons-d

CLASSPATH=%CLASSPATH%:%AXIS_HOME%/lib/w sdl4j-1.5.

 

No caso do Windows é possível ainda configurar as variáveis de ambiente AXIS_HOME e CLASSPATH no menu de propriedades do ícone Meu Computador.

Os diretórios descritos devem conter:

• bin – binários gerados (.class)
• src – fontes Java (.java)
• config/META-INF – arquivos de configuração da aplicação J2EE (application.xml e jboss-app.xml)
• config/WEB-INF – arquivos de configuração da aplicação web e outros arquivos desta estrutura (web.xml)
• config/resource – outros arquivos de configuração (ex: o arquivo WSDL gerado)
• deploy – arquivos de deploy gerados (.jar, .war e .ear)
• web/jsp – arquivos JSP de aplicação
• web/html – arquivos HTML da aplicação.

O mais importante de tudo é você colocar as bibliotecas em seus devidos lugares e caso ocorra algum problema a IDE irá reclamar, possivelmente ocorreram erros nas classes Service e Call, ocorrendo o erro isso quer dizer que o JAR não está em seu devido lugar ou você nem tentou importá-lo.

 

 

Instalando o ambiente servidor.

Para criarmos o servidor é necessário baixar e instalar o Tomcat . Este tutorial foi desenvolvido utilizando a versão 5.0 do tomcat, que pode ser encontrada neste endereço: http://apache.usp.br/jakarta/tomcat-5/v5.0.28/bin/jakarta-tomcat-5.0.28.zip

Após baixar o Tomcat, deve-se descompactar o zip e criar a variável de ambiente CATALINA_HOME que deverá indicar o local onde será descompactado. Depois de concluído esse passo é possível iniciar o servidor executando o arquivo: CATALINA_HOME / bin / startup.bat no Windows ou CATALINA_HOME / bin / startup.sh no Linux.

Para verificar se o Tomcat está rodando, utiliza-se um navegador com o seguinte endereço: http://localhost:8080/ . Se a instalação estiver correta o Tomcat irá apresentar uma mensagem de ok. É claro, esta é a instalação padrão do Tomcat , você poderá modificar e adicionar mais segurança a ela.

O próximo a ser baixado e configurado é o Axis que tem um fonte em Java e um em C++.
Será utilizado o fonte em java na versão 1.1 que pode ser encontrado neste endereço: http://apache.usp.br/ws/axis/1_1/axis-1_1.zip

Após baixar o arquivo zip do Axis , e descompactá-lo, deve-se mover a pasta ” axis “, que encontra-se dentro do diretório webapps do arquivo, para a pasta webapps do Tomcat .

Agora basta reiniciar o servidor Tomcat , abrir um navegador e ir para à página: http://localhost:8080/axis . Uma página do Axis será apresentada concluíndo a instalação.

Nesta mesma página de apresentação, existirão dois links importantes:

  • um link para validar a instalação: clicando nele será apresentado uma lista de componenetes necessários (” Needed Components “). Caso algum desses não for encontrado ele irá solicitar a instalação. Com as versões trabalhadas neste artigo, o Tomcat e o Axis estarão completos portanto a validação OK;

  • um link para visualizar os Web Services já instalados: clicando nele, existirão dois Web Services e clicando no link (wsdl) você verá o arquivo de especificação de ambos. Se, ao clicar, não aparecer nenhuma informação, não se preocupe, alguns navegadores não exibem XML, outros exibem como HTML, sendo necessário abrir o fonte da página para ver o código. Mas ele estará lá e funcionando.

Introdução a Web Service utilizando Axis

A galera da Apache nos disponibilizou essa grande ferramenta que irá ajudar muito no desenvolvimento e implementação de Web Services, ela é super fácil de utilizar, sendo que faz quase todo o trabalho sozinha, escrevendo os XML, interpretando os métodos implementados nas classes JAVA e gerando o tal arquivo WSDL.

Um requisito básico de qualquer empresa é prover serviços, sejam os vendedores de uma empresa, o setor de custos e compras, os prestadores de serviço, etc. Cada empresa oferece serviços para a comunicação entre ela e outras pessoas, sejam pessoas físicas ou jurídicas, internas ou externas a empresa.
Alguns desses serviços podem ser automatizados. Por exemplo, não é necessário existir um representante de vendas se o seu cliente já tem, em mãos, o preço e todos os outros dados relevantes para constituir um pedido de compra. Este pedido pode e, em muitos casos, já é feito, via interfaces computacionais. O cliente entra em seu site, monta o pedido como desejar e confirma a compra. Isto é um serviço web, ou seja, um serviço que está publicado na web para que qualquer pessoa possa fazer uso.

Web Services foram criados para construir aplicações deste tipo, aplicações que são serviços na internet. Porém não faz parte do conceito de Web Service a criação de interfaces gráficas para os usuários, deixando esta parte para outras empresas ou pessoas desenvolverem. É comum encontrar textos afirmando que Web Services disponibilizam serviços somente para desenvolvedores, ou que Web Services nada mais são do que chamada de métodos usando XML. Estas definições estão corretas.

Web Services é a tecnologia ideal para comunicação entre sistemas, sendo muito usado em aplicações B2B. A comunicação entre os serviços é padronizada possibilitando a independência de plataforma e de linguagem de programação. Por exemplo, um sistema de reserva de passagens aéreas feito em Java e rodando em um servidor Linux pode acessar, com transparência, um serviço de reserva de hotel feito em. Net rodando em um servidor Microsoft.
Para comunicar-se com o Web Service, é necessário uma implementação do protocolo SOAP (Simple Object Access Protocol) definido no W3C . Este protocolo é o responsável pela independência que o Web Service precisa. Atualmente já encontra-se várias implementações disponíveis em várias linguagens. É só escolher uma e usar.

Na Figura abaixo encontra-se um diagrama mostrando as mensagens trocadas entre cliente e servidor em uma comunicação SOAP. Existem duas aplicações se comunicando, um Client Wrapper e um Server Wrapper que estão disponibilizando a transparência para as aplicações. Entre eles só trafega XML, seguindo o protocolo SOAP sobre HTTP.
Imagem: Descrição de um webservice
Um Web Service será publicado, e para que outras pessoas possam utilizá-lo é necessário definir como ele é, como deve ser acessado, e que valores ele retornará. Estas definições são descritas em um arquivo XML de acordo com a padronização Web Service Description Language (WSDL). Este arquivo deve ser construído para que os usuários do serviço possam entender o funcionamento do Web Service e, logicamente, será de acesso público.
Os Web Services também podem ser utilizados para implementar arquiteturas orientadas a serviços, as Service-Oriented Architectures (SOA). Neste modelo de arquitetura os principais requisitos viram serviços e são acessados por outros serviços, modularizando e aumentando a coesão dos componentes da aplicação.
O que será implementado neste artigo é um Web Service simples, para aprendizado da tecnologia e para desmentir a afirmação que Web Services são complexos de construir e complexos para utilizar.

Se você já está no mundo da programação Java, mesmo que a pouco tempo, já deve ter ouvido falar em JavaBean ou seu apelido mais carinhoso e utilizado na prática “Bean”, aqui mesmo, no projeto JSF falei várias vezes sobre beans, inserir códigos, inserir gets, insetir sets, etç, etç, mas não cheguei a me aprofundar neste assunto. Pois bem, agora é a hora!

Para ser mais exato e direto ao ponto, informarei logo alguns exemplo.

Digamos que você esteja trabalhando com JSF, com certeza existem métodos para pegar/setar valores em váriáveis.
Agora digamos que você foi trabalhar com Struts, e este por sua vez tem seu próprio padrão de nomenclatura para pegar/setar valores nas benditas variáveis.
Depois de um tempo, você teve que prestar suporte em um site que utiliza o componente da empresa XYZ-KY, porém quem desenvolveu este componente não conhecia os JavaBeans, e colocou nomes estranhos nos métodos que pegam/setam atributos em váriáveis, por exemplo o método “meuPai()” estava setando valores na variável “minha_mae”, e o método “minhaTia()” estava recolhendo as informações desta mesma variável. Ou seja, será praticamente impossível prestar manutenção para este componente.

Entendeu mais ou menos onde quero chegar?
A moral da história aqui, seriam os nomes dos métodos/classes/variáveis/etç/etç, e é basicamente isso que JavaBean significa, esta especificação foi criada visando ajudar os desenvolvedores a criar seu métodos de forma legível e compreensível por qualquer sistema ou programador, independente da sua origem (país).

Mas chega de teoria, vamos para a prática… opa não tem prática nessa matéria…
Vamos ao que interessa!

Padrões JavaBeans
Regras de Nomeação

Lembra das primeiras aulas de Java? Classe Pessoa tem características e métodos? É exatamente assim que devemos trabalhar, fazendo classes para cada tipo de coisa, sem misturar nada!
Em uma classe ContaCorrente, devemos ter APENAS as características (variáveis) de uma conta corrente, e os métodos BÁSICOS da mesma, métodos BÁSICOS são apenas os métodos de acesso às variáveis e ações simples, mas as ações simples não contém a lógica de negócio.

Esta classe tem variáveis, porém as variáveis precisam receber e informar valores, como fazer isso?
Através de métodos!
Um método para setar valores nesta variável e outro método para recolher o valor desta mesma variável.
Alguma sugestão para os nomes? setaVariavel? pegaValor? ERRADO! Devemos utilizar o padrão JavaBean!

:::::

Para recolher valores de variáveis (ou objetos) de qualquer tipo diferente de boolean, ou seja, int, double, String, char, float, etç, etç., deve-se utilizar a palavra get seguida do nome da variável iniciada com letra maíuscula.
Para setar valores de variáveis (ou objetos) de qualquer tipo ou seja, boolean, int, double, String, char, float, etç, etç., deve-se utilizar a palavra set seguida do nome da variável iniciada com letra maíuscula.

Exemplo:

private int meuNumero;

public int getMeuNumero(){
 return meuNumero;
}

public void setMeuNumero(int novoNumero){
 meuNumero = novoNumero;
}

Mas e para receber valores de variáveis booleanas?
Basta utilizar a palavra is seguida do nome da variável iniciada com letra maíuscula.

Exemplo:

private boolean azul;

public int isAzul(){
 return azul;
}

public void setAzul(boolean novoAzul){
 azul = novoAzul;
}

Entendeu? Não? Então comente e poste sua dúvida!
Boa sorte!

Sim isso mesmo, no lugar de “progredir” vamos “regredir” um pouco, por que não é sempre que podemos trabalhar com as melhores condições possíveis, muitas vezes também precisamos colocar a mão na sujeira e editar algum código um tanto quanto ultrapassado, que ainda trabalha com vetores.

Se você já trabalhou com vetores, mesmo que apenas na faculdade, deve saber que com eles não conseguimos manipular os dados incluindo ou excluindo, só conseguimos criar (e destruir).

Ex.: String[] meuVetor = new String[] {“A”, “B”, “C”, “D”, “E”};

Neste exemplo, criamos um vetor com 5 posições, até aqui tudo bem, podemos solicitar cada posição do vetor com a chamada meuVetor[n],  trocando “n” pela posição do vetor, é claro, no nosso caso de 0 a 4.

Mas e se for necessário, em tempo de execução, adicionar algum valor ao vetor? Não é possível fazer um meuVetor.add(), então como fazer?
Simples! Basta trabalhar com Array, List ou Collection e jogar esse vetor no lixo!
Mas e se a aplicação nos forçar a trabalhar com vetor, caso contrário seria necessário refazer todo o código?

Simples! Basta trabalhar com Array e converter para Vetor!
Como?

Vejamos o exemplo, em javanês:

ArrayList<String> meuArray = new ArrayList<String>();
String[] meuVetor = null;

for(int i = 0; i < 10; i++){
meuArray.add(“POSICAO: “ + i);
}

meuVetor = meuArray.toArray(new String[meuArray.size()]);

Explicando!

A primeira e segunda linha não tem segredo, ali estão sendo criadas nossas variáveis base, um ArrayList meuArray e um vetor String[] meuVetor.
O laço “for” também não tem muita complicação, de 0 até 9 ele está inserindo valores no Array.

Na ultima linha que a mágica acontece, vamos por partes:

Primeiro, estamos vazendo meuVetor = meuArray.toArray() este método (toArray) é da própria linguagem Java, e serve exatamente para isso que precisamos, ele prepara um Array para ser convertido em Vetor, mas este método sozinho não faz muita coisa, então precisamos informar o tipo de vetor que estamos querendo, no caso é um vetor de String, então dentro do toArray basta informar new String[n]. Mas que “n”? para criar um Vetor, precisamos informar a quantidade de posições que ele terá, e para conseguir esta façanha, basta invocar o método size() do meu Array, que devolve o tamanho do array, justamente o que precisamos para iniciar o Vetor!

Simples né?!
Boa sorte!

« Página anteriorPróxima Página »