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újo



Este é o terceiro da série de 4 artigos que são resultado de um trabalho de faculdade realizado no semestre passado, nossa abordagem neste artigo será a criação de um cliente j2me que pode consumir webservices escritos em Apache Axis ou .NET.

Aqui 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á!

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