Desenvolvimento - Java
Desenvolvendo Aplicações j2me com integração via WebServices usando Apache AXIS ou Webservices .NET
A abordagem neste artigo será a criação de um cliente j2me que pode consumir webservices escritos em Apache Axis ou .NET.
por Rogério Pereira AraújoAqui estaremos abordando a codificação, o empacotamento e o instalação do cliente em j2me. Usaremos o webservice criado do artigo anterior neste artigo.
Pré-requisitos:
Instalando o Eclipse 3.0.2:
Descompacte o arquivo zip em uma pasta de sua preferência, por exemplo /opt, após a descompactação você vai encontrar o eclipse dentro de /opt/eclipse.
Instalando o J2ME Wireless Toolkit:
Somente execute o arquivo e siga as instruções para a instalação do toolkit.
Instalando o EclipseME 0.9.1:
Abra o eclipse e selecione [Help -> Software Updates -> Find and Install...], surgirá uma janela, selecione então a segunda opção e clique em [Next], surgirá uma outra tela, nesta tela clique no botão [New Archived Site...] e então localize o arqivo zip EclipseME que você acabou de fazer o download. Surgirá então a opção [eclipseme.feature_0.9.1_site.zip] na lista de opções ao lado dos botões desta tela, marque esta opção e clique em [Next], confirme todas as outras opções seguintes para concluir a instalação do plugin.
Configurando o plugin EclipseME no Eclipse:
Abra o eclipse e selecione [Window -> Preferences], surgirá uma janela.
Clique com o botão direito do mouse em [Wireless Toolkits] e selecione a opção [Add Wireless Toolkit] no menu popup, logo após localize a pasta onde está instalado o Wireless Toolkit.
Gerando as classes de conexão com o WebService:
Abra o J2ME Wireless Toolkit e selecione [Project -> Stub Generator], surgirá uma janela.
Informe na primeira caixa de texto o caminho do arquivo wsdl ou a url do wsdl do webservice em questão, logo após informe o pacote ao qual as classes de conexão do webservice vai pertencer.
Desenvolvendo a midlet:
Vamos agora criar a classe principal da aplicação do celular, esta classe é (e tem que ser) herdada de MIDlet, que é a classe principal de uma aplicação Java para dispositivos móveis, vamos chamar esta classe de DoacaoPrincipal, veja o código abaixo:
/* * Created on 25/10/2004 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */ package net.sf.doacao; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.List; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; /** * @author rogerio * * Esta é a classe principal do programa, ela tem que herdar de MIDlet * e implementa a interface CommandListener para suporte à eventos * dos botões de comando. */ public class DoacaoPrincipal extends MIDlet implements CommandListener { private static Display display; private List menu; private Command comandoSair; public static Display getDisplay() { return display; } /** * */ public DoacaoPrincipal() { super(); // TODO Auto-generated constructor stub } /* * Método que é executado toda a vez que o programa é iniciado */ protected void startApp() throws MIDletStateChangeException { display = Display.getDisplay(this); comandoSair = new Command("Sair", Command.EXIT, 1); menu = new List("Menu", List.IMPLICIT); menu.append("Doar", null); menu.addCommand(comandoSair); display.setCurrent(menu); menu.setCommandListener(this); } /* (non-Javadoc) * @see javax.microedition.midlet.MIDlet#pauseApp() */ protected void pauseApp() { // TODO Auto-generated method stub } /* (non-Javadoc) * @see javax.microedition.midlet.MIDlet#destroyApp(boolean) */ protected void destroyApp(boolean arg0) { // TODO Auto-generated method stub } //Método que captura os eventos de clique nos botões //de comando. public void commandAction(Command c, Displayable s) { if (c == comandoSair) { destroyApp(false); notifyDestroyed(); } else if (c == List.SELECT_COMMAND) { int item = menu.getSelectedIndex(); switch(item) { case 0: display.setCurrent(new DoacaoDoar(menu)); break; } } } }
Agora criaremos a janela que vai receber as informações necessárias para chamar o webservice, esta classe neste caso ela herdade da classe Form da API do J2ME, vamos chamar esta classe de DoacaoDoar, veja o código abaixo:
/* * Created on 25/10/2004 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */ package net.sf.doacao; import javax.microedition.lcdui.Alert; import javax.microedition.lcdui.AlertType; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import javax.microedition.lcdui.Displayable; import javax.microedition.lcdui.Form; import javax.microedition.lcdui.Item; import javax.microedition.lcdui.TextField; //Esta biblioteca foi gerada com o Stub Generator do Wireless Toolkit import net.sf.doacao.service.*; /** * @author rogerio * * Esta classe tem que herdar da classe Form e implementar a interface Runnable, para * suporte à Threads como também a interface ComandListener para tratar eventos * relacionados à botões de comando. */ public class DoacaoDoar extends Form implements Runnable, CommandListener { //Declarando os componentes utilizados nesta tela private Command comandoVoltar; private Command comandoDoar; private Displayable _pai; private TextField _edtLogin; private TextField _edtSenha; private TextField _edtNomeProduto; private TextField _edtQuantidade; /** * @param arg0 */ public DoacaoDoar(Displayable pai) { //Definindo o título da tela super("Doar"); _pai = pai; //Instanciando os componentes _edtLogin = new TextField("Login:", "", 20, TextField.ANY); _edtSenha = new TextField("Senha:", "", 10, TextField.PASSWORD); _edtNomeProduto = new TextField("Produto:", "", 40, TextField.ANY); _edtQuantidade = new TextField("Quantidade:", "", 5, TextField.NUMERIC); //Adicionando componentes na tela append(_edtLogin); append(_edtSenha); append(_edtNomeProduto); append(_edtQuantidade); //Adicionando os botões de navegação na tela comandoDoar = new Command("Doar", Command.ITEM, 1); comandoVoltar = new Command("Voltar", Command.BACK, 1); addCommand(comandoDoar); addCommand(comandoVoltar); //Definindo o responsável por capturar os eventos desta classe setCommandListener(this); } /** * @param arg0 * @param arg1 */ public DoacaoDoar(String arg0, Item[] arg1) { super(arg0, arg1); // TODO Auto-generated constructor stub } //O método run é responsável contém o código a ser executado a partir da thread criada public void run(){ try{ //Iniciando uma instância do webservice DoarService_Stub service = new DoarService_Stub(); if(service.doar(_edtLogin.getString(), _edtNomeProduto.getString(), Integer.parseInt(_edtQuantidade.getString()), _edtSenha.getString())){ //Se a doação foi realizada com sucesso então dispara um aviso na tela Alert aviso = new Alert("Sucesso!", "Doação efetuada!", null, AlertType.INFO); aviso.setTimeout(Alert.FOREVER); DoacaoPrincipal.getDisplay().setCurrent(aviso); } else{ //Se ocorreu um erro ao registrar a doação então dispara um aviso na tela Alert aviso = new Alert("Erro!", "Doação não confirmada!", null, AlertType.ERROR); aviso.setTimeout(Alert.FOREVER); DoacaoPrincipal.getDisplay().setCurrent(aviso); } } catch(Exception Error){ Alert aviso = new Alert("Erro!", "Impossível enviar doação!\nErro:" + Error.getMessage(), null, AlertType.ERROR); aviso.setTimeout(Alert.FOREVER); DoacaoPrincipal.getDisplay().setCurrent(aviso); } } //Este é o método que vai responsável por capturar os comandos e que foi definido //através de setCommandListener(this); na instanciação da janela. public void commandAction(Command comando, Displayable controle) { //Se clicou no botao voltar então exiba a tela principal da MIDlet if(comando == comandoVoltar){ DoacaoPrincipal.getDisplay().setCurrent(_pai); } //Caso contrário inicia a thread e envia a doação else if(comando == comandoDoar){ new Thread(this).start(); } } }
Distribuindo a aplicação
Para distribuir a aplicação basta pegar o arquivo doacao_mobile.jar e doacao_mobile.jad gerados pelo EclipseME e instalá-los no celular juntamente com o arquivo j2me-ws.jar e jsr75.jar que são responsáveis pelo suporte à webservices no J2ME.
Conclusão
J2ME Wireless Toolkit é possível criar aplicações móveis em Java que também podem acessar webservices .NET tornado o seu celular em um grande utilitário no seu dia-a-dia profissinal.
Nos próximos artigos a criação de clientes em .NET, até lá!