Servlet e java ME

6 respostas
Sesshoumaru
Bom dia!! Pessoal estou com um problema para acessar uma servlet por meio de uma Midlet segue o codigo da Midlet:
package acessaServlet;

import java.io.IOException;
import java.io.InputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;

public class LoginMidlet extends MIDlet implements CommandListener, Runnable {
    private Display display;
    private Form tlogin;
    private TextField nome;
    private TextField senha;
    private TextBox tlogado;
    private Alert alertalogin;
    private Alert alertaerro;
    private Command cancelar;
    private Command login;
    private Thread t = null;
    
    String URL_servidor = "http://localhost:8080/servidor/login.do";
    
    public LoginMidlet() {
        tlogin = new Form("Login do Aplicativo");
        tlogado = new TextBox("Usuario Validado","", 20, TextField.ANY);
        cancelar = new Command("Cancelar", Command.EXIT, 0);
        login = new Command("OK", Command.OK, 1);
        alertaerro = new Alert("Login Incorreto", "Tente Novamente", null, AlertType.ERROR);
        nome = new TextField ("Nome:", "", 20, TextField.ANY);
        senha = new TextField ("Senha:", "", 10, TextField.PASSWORD);
    }
    
    public void startApp() {
        display = Display.getDisplay(this);
        tlogin.append(nome);
        tlogin.append(senha);
        tlogin.addCommand(cancelar);
        tlogin.addCommand(login);
        tlogin.setCommandListener(this);
        display.setCurrent(tlogin);
        tlogado.addCommand(cancelar);
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
        notifyDestroyed();
    }
    
    public void tenteNovamente() {
        alertaerro.setTimeout(Alert.FOREVER);
        nome.setString("");
        senha.setString("");
        display.setCurrent(alertaerro, tlogin);
    }
    
    public void chamaServlet() throws IOException {
        String URL_enviada = URL_servidor+"?nome="+nome.getString()+"&senha="+senha.getString();
        HttpConnection conexao = null;
            InputStream IS = null;
            try {
                  conexao = (HttpConnection)Connector.open(URL_enviada);
                  conexao.setRequestMethod(HttpConnection.GET);
                  conexao.setRequestProperty("IF-Modified-Since", "20 Jan 2001 16:19:14 GMT");
                  conexao.setRequestProperty("User-Agent","Profile/MIDP-1.0 Configuration/CLDC-1.0");
                  conexao.setRequestProperty("Content-Language", "en-CA");
                  IS = conexao.openInputStream();
                  int tamConteudo = (int)conexao.getLength();
                  byte[] dados = new byte[tamConteudo];
                  IS.read(dados);
                  String resposta = new String (dados, 0, tamConteudo);
                  if (resposta.startsWith("validado")) { //usuario cadastrado
                      alertalogin = new Alert ("Login","Usuário validado!",null, AlertType.CONFIRMATION);             
                      alertalogin.setTimeout(Alert.FOREVER);
                      tlogado.setString("Bem vindo(a)!");
                      tlogado.setCommandListener(this);
                      display.setCurrent(alertalogin,tlogado);    
                   } else { //usuario não encontrado
                       tenteNovamente();
                   }
            } finally {
                   if(IS!= null) {
                           IS.close();
                    }
                   if(conexao != null) {
                       conexao.close();
                   }
            }
        }     
    
    private void connectThread(){
           t = new Thread(this);
            t.start();
        }
    
    public void run(){
         try{chamaServlet();}catch (Exception e){}
        }

    public void commandAction(Command c, Displayable d) {
              if(c == cancelar) {
                destroyApp(true); // fecha a aplicação
              }else if(c==login) {
                  connectThread();
          }
        }
}
abaixo o codigo da servlet:
package controle;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class LoginServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		response.setContentType("text/plain");
		PrintWriter out = response.getWriter();
		
		String nome = request.getParameter("nome");
		String senha = request.getParameter("senha");
		
		String mensagem = "";
		
		System.out.println("dentro doGet");//esta mensagem não esta sendo executada
		
		if (nome.equals("Maria") || senha.equals("123")) {
			mensagem = "validado";
		}
		out.println(mensagem);
	}
}
não consigo recuperar os parametros passados pela midlet para o servlet se alguem puder me ajudar...agradeço.

6 Respostas

F

Olá amigo. Teu código ta tudo ok, o que está acontecendo é que ao inicializar o servlet será gerada um NullpointerException o metodo doGet recebe um request sem paramentros só isso!!Espero ter ajudado!

Sesshoumaru

Blz valeu pela resposta ta resolvido vou dar uma melhorada no codigo
e postar novamente, mas, gostaria de perguntar qual a função
de algumas das propriedades abaixo:

conexao = (HttpConnection) Connector.open(URL_enviada); conexao.setRequestMethod(HttpConnection.GET); conexao.setRequestProperty("Content-Language", "en-CA");// devo utilizar? qual a função? conexao.setRequestProperty("IF-Modified-Since", "20 Jan 2001 16:19:14 GMT");// devo utilizar? qual a função? conexao.setRequestProperty("User-Agent","Profile/MIDP-2.1 Configuration/CLDC-1.1");// devo utilizar? qual a função? IS = conexao.openInputStream();//utilizei o InputStream para enviar dados para o servlet // não deveria ter utilizado OutputStream para enviar os dados?
usando apenas as duas linhas abaixo funcionou blz:

conexao = (HttpConnection) Connector.open(URL_enviada); conexao.setRequestMethod(HttpConnection.GET);
se alguem puder me ajudar!!

F

Blz,
o metodo da classe httpConnection setRequestProperty(“User-agent”, “my agent name”); Envia informações de cabeçalho exigido para o post de sue servlet funcionar.
E quando você faz IS = conexao.openInputStream(); você esta abrindo um fluxo para ler a resposta de seu servlet, entendeu?

F

Só para complementar

conexao = (HttpConnection)Connector.open(URL_enviada);   
                  conexao.setRequestMethod(HttpConnection.GET);   
  //após a conexão ter sido estabelescida 
  uma canal de resposta do servlet é aberto
  IS = conexao.openInputStream();   
   //tamanho total  da resposta que vem de seu servlet
   int tamConteudo = (int)conexao.getLength();
   //array de bytes que irá conter todos os bytes   da resposta
   byte[] dados = new byte[tamConteudo];   
  // irá pupular seu array de bytes
    IS.read(dados);
Sesshoumaru
certo entendi...e o procedimento para gravar ta funcionando agora preciso ler utilizando dao:
public List getLista() {
		List lista = new ArrayList();
		String sql = "select * from clientes";

		try {
			PreparedStatement ps = conexao.prepareStatement(sql);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				// cria um objeto
				Cliente cliente = new Cliente();
				cliente.setNome(rs.getString("nome"));
				cliente.setFone(rs.getString("telefone"));

				// adiciona o objeto à lista
				lista.add(cliente);
			}// fim do while
			rs.close();
			ps.close();
			return lista;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
este metodo retorna uma lista como faço para mandar essa lista para o java ME? como posso acessar o dao com esse codigo:
IS = conexao.openInputStream();     
   //tamanho total  da resposta que vem de seu servlet  
   int tamConteudo = (int)conexao.getLength();  
   //array de bytes que irá conter todos os bytes   da resposta  
   byte[] dados = new byte[tamConteudo];     
 // irá pupular seu array de bytes  
    IS.read(dados);
Sesshoumaru

No servlet estou escrevendo os dados dessa forma:

DataOutputStream os = new DataOutputStream((OutputStream)response.getOutputStream()); os.writeUTF("parametro");
na midlet leio dessa forma:

DataInputStream dis = (DataInputStream) conexao.openDataInputStream(); lista.append(dis.readUTF(), null);
funciona consigo inserir e consultar, mas, gostaria de utilizar um loop
que executasse enquanto houver dados(Strings) a serem lidos. No momento
a leitura e feita com base na quantidade de registros armazenados no banco,
se tenho 5 registros, utilizo cinco comandos: lista.append(dis.readUTF(), null);
entao como proceder?

Criado 25 de agosto de 2010
Ultima resposta 27 de ago. de 2010
Respostas 6
Participantes 2