Erro ao tentar connectar a um Servlet. [Resolvido]

Olá. Tenho a seguinte classe:


package connect;

import java.io.IOException;
import java.io.InputStream;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class ConnectMyServlet extends MIDlet implements CommandListener {

    private Display display;
    private Command exitCommand;
    private Command connectCommand;
    private Form form;

    public ConnectMyServlet() {
        form = new Form("Connect2Servlet");
        exitCommand = new Command("Exit", Command.EXIT, 0);
        connectCommand = new Command("Conn",Command.OK,1);
        form.addCommand(exitCommand);
        form.addCommand(connectCommand);
        form.setCommandListener(this);
    }

    public void startApp() {
        display = Display.getDisplay(this);
        display.setCurrent(form);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
        notifyDestroyed();
    }

    private void httpConnect() {
       HttpConnection connection = null;
       InputStream is = null;
       StringBuffer buffer = new StringBuffer();
       String url = "http://hostjspmysql.s156.eatj.com/"; // meu servlet, com tomcat 6. eu tenho que ativa-lo periodicamente (para durar 6 hrs online). Mas, agora ele esta on.
       try{
           connection = (HttpConnection) Connector.open(url);
           connection.setRequestProperty("Content-Type", "text/html");
           is = connection.openInputStream();
           int ch;
           
           while((ch = is.read()) != -1){             
                   buffer.append((char)ch);              
           }
           
       }catch(IOException e){
           Alert alert = new Alert("Error", "Cannot connect", null, null);
          alert.setTimeout(Alert.FOREVER);
          alert.setType(AlertType.ERROR);
          display.setCurrent(alert);
       }
        finally
       {
           connection.close();
           is.close();
       }              
    }

    public void commandAction(Command c, Displayable d) {
       if(c.equals(exitCommand))
       {
           destroyApp(false);
       }
       if(c.equals(connectCommand))
       {
            try {
                httpConnect();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
       }
    }
}

Ao executar esta aplicação eu esperava que o bufferString fizesse a contatenação da página (embora eu precisasse que a página fosse exibida em html. mas isso é apenas um teste ainda). Mas ao iniciar o emulador e clicar no botão corresponde ao “Conn” Não acontece nada. Acreditava que pelo menos ia entrar no Exception que iria mostar o Alert. Mas, nem isso ocorreu.

No console:

Starting emulator in execution mode
Installing suite from: http://127.0.0.1:50077/ConnectMyServlet.jad
[WARN] [rms ] javacall_file_open: _wopen failed for: C:\Users\user\javame-sdk\3.0\work\0\appdb_delete_notify.dat

printScreen do servlet:

Pq o emulador fica em estado de “espera” , sem fazer nada, alguém pode me explicar?

Atenciosamente, ArchV.

Vc precisa colocar a conexão dentro de uma Thread.

Fiz a Thread de Conexão:

package connect;

import java.io.*;
import javax.microedition.io.*;

public class ThreadConnection implements Runnable {

    public void run() {
        try{
            httpConnect();
        }catch(IOException ex){
            ex.printStackTrace();
        }
    }
    private void httpConnect() throws IOException {
       HttpConnection connection = null;
       InputStream is = null;
       StringBuffer buffer = new StringBuffer();
       String url = "http://hostjspmysql.s156.eatj.com/";
       try{
           connection = (HttpConnection) Connector.open(url);
           connection.setRequestProperty("Content-Type", "text/html");
           is = connection.openInputStream();
           int ch;

           while((ch = is.read()) != -1){
                   buffer.append((char)ch);
           }

       }catch(IOException e){
           e.printStackTrace();
       }
       finally
       {
           connection.close();
           is.close();
       }
    }
}

E o código ficou:


package connect;

import java.io.IOException;
import java.io.InputStream;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class ConnectMyServlet extends MIDlet implements CommandListener {

    private Display display;
    private Command exitCommand;
    private Command connectCommand;
    private Form form;
    private Thread thread;

    public ConnectMyServlet() {
        form = new Form("Connect2Servlet");
        exitCommand = new Command("Exit", Command.EXIT, 0);
        connectCommand = new Command("Conn",Command.OK,1);
        form.addCommand(exitCommand);
        form.addCommand(connectCommand);
        form.setCommandListener(this);
    }

    public void startApp() {
        display = Display.getDisplay(this);
        display.setCurrent(form);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
        notifyDestroyed();
    }

   

    public void commandAction(Command c, Displayable d) {
       if(c.equals(exitCommand))
       {
           destroyApp(false);
       }
       if(c.equals(connectCommand))
       {
          thread = new Thread(new ThreadConnection());
          thread.start();
       }
    }
}

Ao executar acontece a mesma coisa: - fica em estado de “espera” e no console aparece o mesmo erro. Alguém pode me informar se estou errando em alguma parte da conexão? (incluse esse fragmento da conexão eu construi baseando-se no livro J2ME - Osbourne - The Complete Reference.

Arguando uma possível resposta. Vlw.

Aparece a mensagem de confirmação de conxexão?
Já tentou debugar pra ver?

[quote=j0nny]Aparece a mensagem de confirmação de conxexão?
Já tentou debugar pra ver?[/quote]

Estou usando o J2ME SDK da sun 3.0 não consegui ainda colocar os break point para debuggar, irei procurar um tutorial. Mas, eu vi um erro meu: eu estava executando a aplicação normalmente. Agora que eu reparei no ícone: [b] Run app O.T.A (Over The Air).

//Estou tentando evitar o máximo postar o código inteiro das classes, mas dessa vez foi meio inevitável, já que está aparecendo um NullPointerException estranho.

Mas, continuo com problema : não estou conseguindo abrir a página (mas, agora ao menos ele avisa que abriu a conexão). Erro no console:

Starting emulator in execution mode
Installing suite from: http://127.0.0.1:49721/ConnectMyServlet.jad
The suite was succesfully installed, ID: 2
TRACE: <at java.lang.NullPointerException:   0>, Exception caught in Display class  // erro no display NullPointerException???? não faço a mínima idéia do porque disso, sendo que foi tudo instânciado corretamente.
java.lang.NullPointerException:   0 
 - connect.ConnectMyServlet.commandAction(), bci=67
 - javax.microedition.lcdui.Display$ChameleonTunnel.callScreenListener(), bci=46
 - com.sun.midp.chameleon.layers.SoftButtonLayer.processCommand(), bci=74
 - com.sun.midp.chameleon.layers.SoftButtonLayer.soft2(), bci=173
 - com.sun.midp.chameleon.layers.SoftButtonLayer.keyInput(), bci=78
 - com.sun.midp.chameleon.CWindow.keyInput(), bci=38
 - javax.microedition.lcdui.Display$DisplayEventConsumerImpl.handleKeyEvent(), bci=17
 - com.sun.midp.lcdui.DisplayEventListener.process(), bci=277
 - com.sun.midp.events.EventQueue.run(), bci=179
 - java.lang.Thread.run(), bci=11

O código agora ficou assim:

Classe ThreadConnection:


package connect;

import java.io.*;
import javax.microedition.io.*;

public class ThreadConnection implements Runnable {

    private StringBuffer buffer;

    public void run() {
        try{
            httpConnect();
        }catch(IOException ex){
            ex.printStackTrace();
        }
    }
    private void httpConnect() throws IOException {
       HttpConnection connection = null;
       InputStream is = null;
       buffer = new StringBuffer();
       String url = "http://hostjspmysql.s156.eatj.com/";
       try{
           connection = (HttpConnection) Connector.open(url);
           connection.setRequestProperty("Content-Type", "text/html");
           is = connection.openInputStream();
           int ch;

           while((ch = is.read()) != -1){
                   buffer.append((char)ch);
           }

       }catch(IOException e){
           e.printStackTrace();
       }
       finally
       {
           connection.close();
           is.close();
       }
    }
    public StringBuffer getStringBuffer()
    {
        return buffer;
    }
}

Classe MIDlet


package connect;

import java.io.IOException;
import java.io.InputStream;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class ConnectMyServlet extends MIDlet implements CommandListener {

    private Display display;
    private Command exitCommand;
    private Command connectCommand;
    private Form form;
    private Form stringForm;
    private Thread thread;
    private ThreadConnection threadConnection;

    public ConnectMyServlet() {
        stringForm = new Form("StringForm");
        form = new Form("Connect2Servlet");
        exitCommand = new Command("Exit", Command.EXIT, 0);
        connectCommand = new Command("Conn",Command.OK,1);
        form.addCommand(exitCommand);
        form.addCommand(connectCommand);
        form.setCommandListener(this);
    }

    public void startApp() {
        display = Display.getDisplay(this);
        display.setCurrent(form);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
        notifyDestroyed();
    }

   

    public void commandAction(Command c, Displayable d) {
       if(c.equals(exitCommand))
       {
           destroyApp(false);
       }
       if(c.equals(connectCommand))
       {
          threadConnection = new ThreadConnection();
          thread = new Thread(threadConnection);
          thread.start();
          String toForm = threadConnection.getStringBuffer().toString();
          stringForm.append(toForm);
          display.setCurrent(stringForm);
       }
    }
}

Alguém consegue entender o porque a página não esta sendo exibida ? Porque eu armazeno a página toda na StringBuffer e depois pego essa StringBuffer e “append” ela em um novo Form, e chamo o display para mostrar.

Muito simples:

Vc precisa estudar mais sobre threads.
Se vc dá um start nela, como vc quer que logo abaixo já exiba o resultado ! Caca !

2 soluções:

1 - Após o start, use a técnica do while e wait()…
2 - Dentro da thread, ao final dela, coloque o código que exiba o resultado na tela

Cara, no seu caso, enquanto ele está executando a thread, vc já está tentando adicionar a string.
Faça uma interface com a funcionalidade de ‘escutara’ sua thread, e quando ela terminar a execução, vc adiciona a String na sua tela.
Deu pra entender? :lol:
Alguém me corriga se eu estiver errado.

Ae! Senhores, deu certo.
:smiley: :smiley: :smiley:
Na classe da ThreadConnection eu associei o “stringForm” e o “display”, quando acaba o processo ele exibe certinho. Muito obrigado mesmo.

Senhores, antes de colocar a tag resolvido neste tópico. Quero pedir um conselho à vocês.

Estou implementando um projeto de J2ME que irá ter acesso ao servlet (screen que eu postei no ínicio do tópico).

Em resumo o meu projeto será :
Criar uma aplicação J2ME que connecte a este servlet e efetue o login, para ter acesso aos conteúdos das páginas destes. No entanto, preciso manter a página de login no servlet pois não quero que um cidadão qualquer entre no servlet e consiga os dados que lá estão.

Andei pesquisando aqui, usando o método “post” o qual envida dados ao servlet eu conseguiria fazer o login e precionar o “botão” (Submit) para confirmar o login?
Desculpe o incômodo, senhores. Mas, resolvendo esta parte o resto é apenas obtendo os “get” através do StringBuffer, tal como já foi feito.

Atenciosamente, ArchV.

Grato!