
Clique aqui para ler este artigo em PDF![]()
Java Mobile
Desenvolvendo uma aplicação JavaME com Netbeans – Parte III
Este é o ultimo artigo da série “Desenvolvendo uma Aplicação JavaME com Netbeans”. Antes de comentar o que faremos neste artigo vamos fazer um breve comentário sobre o que foi visto nos dois primeiros artigos desta série.
No primeiro artigo observamos, através de um simples exemplo, como o mobility pack do Netbeans é capaz de facilitar o trabalho de desenvolvimento da interface gráfica de uma aplicação JME.
No segundo artigo aprimoramos a nossa aplicação inserindo alguns elementos de persistência, através do uso de RMS Record Management System. Também vimos como desenvolver um gráfico utilizando elementos de baixo nível para a criação de interface gráfica (Canvas).
Neste artigo daremos continuidade ao processo de desenvolvimento da nossa aplicação. Faremos com que ela possa investigar o endereço do cliente a partir do seu código. Essa pesquisa será feita através de uma conexão http onde a nossa aplicação irá acessar uma aplicação web localizada em um servidor.
Dessa forma, o objetivo deste artigo é entendermos como podemos, em uma aplicação JME, obter dados de uma aplicação web através de uma conexão http.
A fim de alcançar o nosso objetivo faremos uso de um exemplo bem simples, mas que apesar disso é muito interessante para utilizarmos como ponto de partida para o desenvolvimento de soluções mais complexas.
Neste artigo, além do código utilizado para a criação de uma conexão http, também forneceremos o código necessário para a criação da aplicação com a qual o aplicativo JME irá fazer conexão. Contudo, nossa preocupação básica será explicar o código da aplicação JME.
No final do artigo veremos ainda algumas ferramentas do Netbeans que podem auxiliar no processo de desenvolvimento e que ainda não foram abordadas nesta série.
Ferramentas Utilizadas
Neste artigo fizemos uso das seguintes ferramentas.
Utilizamos o Netbeans 6.0.1 em conjunto com o Mobility Pack. Essa ferramenta pode ser obtida na página do projeto Netbeans. O endereço para obtê-la é http://download.netbeans.org /netbeans/6.0/final/start.html?bundles/netbeans-6.0.1-ml-mobility-windows.exe&platform= windows&lang=pt_BR&option=mobility.
No artigo anterior utilizamos a versão 6.0 do Netbeans, de modo que agora estamos trabalhando com uma versão mais nova dessa ferramenta. Adiante veremos como carregar um projeto da versão 6.0 para a versão 6.0.1.
Posso garantir que o procedimento é bastante simples, inclusive ele já foi feito no segundo artigo dessa série quando mudamos a versão do Netbeans.
Neste artigo também fizemos uso do Tomcat 6.0.16. O Tomcat foi o servidor web utilizado para armazenar a aplicação web com a qual a nossa aplicação JME irá interagir. O Tomcat pode ser obtido no endereço http://tomcat.apache.org/download-60.cgi na página cuja imagem podemos ver na Figura 1.

Figura 1. Página de Download do Tomcat 6.0.16.
Desenvolvendo a aplicação para que ela estabeleça conexões http
Como já foi comentado antes, o objetivo desse artigo é entendermos como fazer uma aplicação JME criar uma conexão http e assim obter informação de uma aplicação web.
Para isso iremos incluir uma nova funcionalidade no aplicativo que vem sendo desenvolvido a dois artigos.
Nossa aplicação será capaz de obter o endereço de um cliente passando como informação o código desse mesmo e estabelecendo uma conexão http com uma aplicação web.
Para cumprir tal objetivo, o trabalho que já desenvolvemos a dois artigos precisará de modificações. Visualmente falando, essa alteração consistirá na criação de uma nova opção na tela inicial da aplicação em seu menu de funcionalidades.
Essa nova opção levará o usuário para uma nova janela. Essa é composta por dois campos de texto. O primeiro campo tem por função receber o código do usuário de que se deseja obter o endereço e o segundo irá exibir as informações referentes ao endereço do usuário que receberemos da aplicação web.
Essa nova tela possuirá ainda três botões (Commands). Um que permitirá voltar à tela inicial, outro que será responsável por executar a pesquisa e por fim um que será responsável por encerrar a aplicação.
O nosso objeto Form, referente a está tela será pesquisaContatoForm. O nome do TextField que receberá o código do cliente de que se deseja obter o endereço será clienteCodigo. O TextField que receberá o endereço do cliente será enderecoCliente. O nome do Command que terá a tarefa de fazer a pesquisa do endereço do cliente será okCommand.
Para desenvolvermos essa parte gráfica faremos uso das facilidades do mobility pack. Como vimos no primeiro artigo dessa série, nosso trabalho para o desenvolvimento da interface gráfica com elementos de alto nível consistirá basicamente em 'arrastar' componentes.
Ao lado desse trabalho visual, será necessário para o desenvolvimento da nova tela da aplicação. Teremos também a atividade referente à criação de código para que a aplicação seja capaz de estabelecer uma conexão http com um servidor web.
Por uma questão didática fiz a opção por dividir esse processo de codificação da seguinte forma: como primeiro passo desenvolvemos uma classe, ConexaoHttp, responsável pelo trabalho de estabelecer conexões http. O segundo passo consistiu em fazer alterações na midlet da aplicação, Cobrador2, para que ela passe a fazer uso das funcionalidades da classe que estabelece conexões http.
A minha opção ao adotar essa postura frente à criação do código necessário para a execução da tarefa primordial da nossa aplicação, neste artigo, se deu em razão do fato de que assim será muito mais simples a análise do mesmo e a conseqüente compreensão de todos os procedimentos executados para a geração da tarefa.
Logo adiante veremos a classe responsável por criar conexões http e então faremos uma análise do seu código, bem como do código que foi inserido na midlet da aplicação para que ela faça uso dessa classe.
Para o trabalho de estabelecer conexões http, a nossa classe responsável por essa tarefa, ConexaoHttp, fez uso de um interessante framework cuja função é facilitar o trabalho com o estabelecimento das mais variadas formas de conexão. Estamos falando do Generic Connection Framework (GCF).
Antes de entrarmos no estudo do código da aplicação iremos fazer uma breve análise do GCF e em seguida veremos o código da aplicação web que será utilizada para interagir com a nossa aplicação JME.
Entendendo o GCF - Generic Connection Framework
O GCF é um framework que permite às aplicações JME estabelecer diversos tipos de conexão, entre elas podemos citar a conexão http.
A grande virtude desse framework é que ele permite ao desenvolvedor lidar com vários tipos diferentes de conexão de forma bastante genérica.
Basicamente, o trabalho com o GCF consiste em fazermos uso da classe Connector, que através de um método chamado open permite que vários tipos de conexão sejam estabelecidos. Mais informações sobre a classe Connector podem ser obtidas através de sua API no endereço http://java.sun.com/javame/reference/apis/jsr139/.
Na verdade, a classe Connector possui três métodos chamados open. Em sua forma mais simples, o método open recebe apenas um parâmetro, um String que representa a url responsável por fazer a conexão. Em sua forma mais completa, além da url ele também recebe como parâmetros um int que indica o modo de acesso da conexão e também o timeout da mesma.
O modo de acesso de uma conexão pode ser definido através das constantes da classe Connector, READ (apenas leitura), WRITE (apenas escrita) e READ_WRITE (leitura e escrita). Quando não especificamos o modo de acesso da conexão é utilizado como padrão o modo READ_WRITE.
Em nossa aplicação utilizaremos a versão mais simples do método open da classe Connector.
O método open da classe Connector tem como retorno um objeto Connection.
Na Figura 2 podemos ver a estrutura do GCF. Está figura foi extraída da página http://developers.sun.com/mobility/midp/articles/genericframework/.

Figura 2. Estrutura do GCF
Como podemos ver na Figura
Para fazermos, exclusivamente, conexão http, utilizaremos em conjunto com a classe Connector a interface HttpConnection. A interface HttpConnection mantém uma relação de herança com a interface ContentConnection.
Adiante, quando analisarmos o código da aplicação, veremos mais detalhadamente os métodos de HttpConnection.
Essa curta explicação a respeito do uso do GCF deixa explícito o quanto é simples utilizar esse framework para o estabelecimento de conexões.
Falando de forma simples, o nosso trabalho consiste basicamente em utilizarmos a classe Connector, que a partir do seu método open estabelecerá a conexão desejada.
Adiante veremos no código da nossa aplicação como tratar a informação que recebemos da aplicação web, contudo antes iremos visualizar o código da aplicação web que irá fornecer informações a nossa aplicação JME.
A aplicação web
Como foi dito antes, o foco deste artigo será entender de que forma uma aplicação JME é capaz de estabelecer uma conexão http para acessar uma outra aplicação que está em um servidor web.
Dessa maneira, o objetivo principal deste artigo é fazer uma análise do código que será adicionado em nossa aplicação JME. Em razão disso não analisaremos com profundidade o código da aplicação web que irá interagir com o programa JME.
A aplicação web que utilizaremos neste artigo será constituída de duas classes. Uma delas um servlet que será responsável por receber as requisições http e enviar as respostas ao dispositivo móvel. A outra terá como finalidade fornecer um Map ao servlet onde estão inseridos os endereços dos clientes da empresa.
Assim, iniciaremos nosso trabalho analisando o servlet. Em linhas gerais podemos definir um servlet como uma classe que herda da classe HttpServlet e implementa a interface Servlet. Servlets devem receber requisições de clientes web e enviar respostas, normalmente através do protocolo http.
Na Listagem 1 podemos ver o código do servlet da aplicação web. Chamamos esse servlet de ConsultaEnderecoServlet.
No tocante a esta classe talvez cabe uma atenção especial à linha 15 da Listagem 1 onde o ConsultaEnderecoServlet recebe o Map com os endereços dos clientes da empresa. Vale dizer que esse Map é definido em uma outra classe, que veremos na Listagem 2.
Ainda na Listagem 1 nas linhas
Na Listagem 2 possuímos uma outra classe que é utilizada pela aplicação web. Trata-se da classe ListaEnderecos. A função desta classe é disponibilizar ao servlet um Map onde estão contidos os endereços dos clientes da empresa.
A opção por uma classe que faça esse trabalho se deu por uma simples questão de simplicidade. Para uma situação real, uma saída muito melhor é a utilização de um banco de dados para o armazenamento de informação.
Ao lado do código dessas duas classes a nossa aplicação web irá necessitar de um outro arquivo, a que chamamos de web.xml. Esse é o arquivo descritor da aplicação onde entre outras coisas informamos a localização dos servlets e o endereço para que possamos invocá-los. Podemos ver o código referente ao web.xml na Listagem 3.
Como podemos ver na Listagem 3, dentro da tag <servlet>, nas linhas
Uma vez que vimos os arquivos que irão compor a nossa aplicação web, precisaremos agora observar a estrutura de pacotes que essa aplicação deverá obedecer para entendermos onde esses arquivos deverão ser colocados.
A Figura 3 procura mostrar como os arquivos devem ser organizados dentro de uma aplicação web. A primeira pasta que temos é a pasta raiz da aplicação, no caso da nossa aplicação a chamaremos de consultaEnderecos. Dentro dessa pasta ficarão as páginas que irão compor a aplicação, bem como os recursos utilizados por essas páginas, tais como figuras e arquivos java script. Ainda dentro dessa pasta raiz temos a pasta WEB-INF. No interior de WEB-INF temos o arquivo web.xml e outras duas pastas, uma chamada classes e outra chamada lib.
Dentro da pasta lib devemos colocar as bibliotecas que serão utilizadas pela nossa aplicação enquanto que dentro da pasta classes serão postos os arquivos .class referentes às classes que compõem a aplicação.
Essa é a estrutura básica de uma aplicação web. Uma vez organizada desta forma, para que a aplicação funcione dentro do tomcat, basta que ela seja colocada no interior da sua pasta webapps localizada na pasta raiz do servidor.
Dessa forma vimos de maneira geral o programa que irá interagir com a nossa aplicação JME, respondendo as suas requisições http. Feito isso, nos resta apenas passarmos a análise do código que foi adicionado à nossa aplicação para que ela possa estabelecer conexões http com um outro programa.
Listagem 1. Servlet ConsultaEnderecoServlet
1. import java.io.IOException;
...