Midlets + servlets + conexÃo

15 respostas
hayase

PESSOAL TENHO O SEGUINTE CÓDIGO PARA UMA MIDLET

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

public class GetNpost extends MIDlet implements CommandListener
{
	private Display display;
	private Form fmMain;
	private Alert alError;
	private Command cmGET;
	private Command cmPOST;
	private Command cmExit;
	private TextField tfAcct;
	private TextField tfPwd;
	private StringItem siBalance;
	private String errorMsg = null;
	
	public GetNpost()
	{
		display = Display.getDisplay(this);
		cmGET = new Command("GET", Command.SCREEN, 2);
		cmPOST = new Command("POST", Command.SCREEN, 2);
		cmExit = new Command("Sair", Command.EXIT, 1);
		tfAcct = new TextField("Conta: ", "", 5, TextField.NUMERIC);
		tfPwd = new TextField("Password: ", "", 10, TextField.ANY|TextField.PASSWORD);
		siBalance = new StringItem("Saldo: $", "");
		fmMain = new Form("Informação da Conta");
		fmMain.addCommand(cmExit);
		fmMain.addCommand(cmGET);
		fmMain.addCommand(cmPOST);
		fmMain.append(tfAcct);
		fmMain.append(tfPwd);
		fmMain.append(siBalance);
		fmMain.setCommandListener(this);
	}

	public void startApp()
	{
		display.setCurrent(fmMain);
	}
	
	public void pauseApp( ) { }
	
	public void destroyApp(boolean unconditional) { }

	public void commandAction(Command c, Displayable s)
	{
		if (c == cmGET || c == cmPOST)
		{
			try
			{
				if(c == cmGET)
					lookupBalance_withGET();
				else
					lookupBalance_withPOST();
			}
			catch (Exception e)
			{
				System.out.println("Msg: " + e.toString());
			}
		}
		else if(c == cmExit)
		{
			destroyApp(false);
			notifyDestroyed();
		}
	}

	private void lookupBalance_withGET() throws IOException
	{
		Thread t = new Thread(new Runnable()
		{
			public void run()
			{
				HttpConnection http = null;
				InputStream iStrm = null;
				boolean ret = false;
				String url = "http://localhost:8080/GetNpostServlet" + "?" + "account=" + tfAcct.getString() + "&" + "password=" + tfPwd.getString();
				try
				{
					http = (HttpConnection) Connector.open(url);
					http.setRequestMethod(HttpConnection.GET);
					iStrm = http.openInputStream();
					ret = processServerResponse(http, iStrm);
				}
				catch (IOException e){ e.printStackTrace(); }
				finally
				{
					if(iStrm != null)
						try
						{
							iStrm.close();
						}
						catch (IOException e)
						{
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					if(http != null)
						try
						{
							http.close();
						}
						catch (IOException e)
						{
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
				}
				if(ret == false)
					showAlert(errorMsg);
			}
		});
		t.start();
	}

	private void lookupBalance_withPOST() throws IOException
	{
		Thread t = new Thread(new Runnable()
		{
			public void run()
			{
				HttpConnection http = null;
				OutputStream oStrm = null;
				InputStream iStrm = null;
				boolean ret = false;
				String url = "http://localhost:8080/GetNpostServlet";
				try
				{
					http = (HttpConnection) Connector.open(url);
					oStrm = http.openOutputStream();
					http.setRequestMethod(HttpConnection.POST);
					http.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
					http.setRequestProperty("Conexão", "close");
					byte data[] = ("account= " + tfAcct.getString()).getBytes();
					oStrm.write(data);
					data = ("&password= " + tfPwd.getString()).getBytes();
					oStrm.write(data);
					oStrm.flush();
					iStrm = http.openInputStream();
					ret = processServerResponse(http, iStrm);
				}
				catch (IOException e){ e.printStackTrace(); }
				finally
				{
					if(iStrm != null)
						try
						{
							iStrm.close();
						}
						catch (IOException e)
						{
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					if(http != null)
						try
						{
							http.close();
						}
						catch (IOException e)
						{
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
				}
				if(ret == false)
						showAlert(errorMsg);
			}
		});
		t.start();
	}

	private boolean processServerResponse(HttpConnection http, InputStream iStrm) throws IOException
	{
		errorMsg = null;
		if(http.getResponseCode() == HttpConnection.HTTP_OK)
		{
			int length = (int) http.getLength();
			String str;
			if(length != -1)
			{
				byte servletData[] = new byte[length];
				iStrm.read(servletData);
				str = new String(servletData);
			}
			else
			{
				ByteArrayOutputStream bStrm = new ByteArrayOutputStream();
				int ch;
				while((ch = iStrm.read()) != -1)
					bStrm.write(ch);
				str = new String(bStrm.toByteArray());
				bStrm.close();
			}
			siBalance.setText(str);
			return true;
		}
		else
			errorMsg = new String(http.getResponseMessage());
			return false;
	}

	private void showAlert(String msg)
	{
		alError = new Alert("Erro", msg, null, AlertType.ERROR);
		alError.setTimeout(Alert.FOREVER);
		display.setCurrent(alError, fmMain);
	}
}

o que acontece é que a servlet não está no ar pq estou tendo problemas em algo q não sei o qé
aeuheaiuheaiuhueai

veja o código da servlet

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

public class GetNpostServlet extends HttpServlet
{
	protected void doGET(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
	{
		String acct = req.getParameter("account"), pwd = req.getParameter("password");
		String balance = accountLookup(acct, pwd);
		if(balance == null)
		{
			res.sendError(res.SC_BAD_REQUEST, "Não foi possível localizar a conta...");
			return;
		}
		res.setContentType("text/plain");
		PrintWriter out = res.getWriter();
		out.print(balance);
		out.close();
	}
	
	protected void doPOST(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
	{
		String acct = req.getParameter("account"), pwd = req.getParameter("password");
		String balance = accountLookup(acct, pwd);
		if(balance == null)
		{
			res.sendError(res.SC_BAD_REQUEST, "Não foi possível localizar a conta...");
			return;
		}
		res.setContentType("text/plain");
		PrintWriter out = res.getWriter();
		out.print(balance);
		out.close();
	}
	
	private String accountLookup(String acct, String pwd)
	{
		Connection con = null;
		Statement st = null;
		StringBuffer msgb = new StringBuffer("");
		try
		{
			Class.forName("com.mysql.jdbc.Driver");
			con = DriverManager.getConnection("jdbc:mysql://localhost/cissa?charSet=ISO8859-1", "root", "123456789");
			Statement stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery("select balance from acctInfo where account = " + acct + " and password = '" + pwd + " ' ");
			if(rs.next())
				return rs.getString(1);
			else
				return null;
		}
		catch(Exception e)
		{
			return e.toString();
		}
	}

	public String getServletInfo()
	{
		return "GetNpostServlet 1.0 - www.corej2me.com";
	}
}

o código da midlet e da servlet executam perfeitamente
porém na midlet retorna um erro, que a página foi removida enqto q na servlet, retorna um HTTP Status 405 - HTTP method GET is not supported by this URL ....

só por Deus mesmo....

a estrutura de pastas da servlet é a seguinte

GetNpostServlet
--> WEB-INF
--> classes (aqui está o arquivo GetNpostServlet.class)

eu não criei nenhum web.xml, nenhum jsp, nenhum html....
o q poderá ser?

obrigada

15 Respostas

marcos.junqueira

O que acontece quando vc acessa o servlet pelo browser?

Vc disse q nao criou o web.xml, vc tem q mapear o seu servlet no web.xml, senão o servlet nao
irá funcionar

hayase

então
tipo
o estranho é q nomesmo fazendo o web.xml ñ dá certo
tipo
sou obrigada a fazer uma pagina html pra midlet acessar a servlet?
isso q ñ estou entendendo pq nos exemplos, só tem a servlet, sem descritor, sem html, sem nada… ou esse livro ta passando só metade do código, ou sei lá o q é…
vai entende…
me de sua opinião
como vc faria?
obrigada

S

olá amigos pegando uma carona.

meu problema é um pouco parecido. Gostaria de saber de vcs alguns modelos de celular q aceitam a conexão HttpConnection por q eu testei em um sony ericsson w810 ele chama o servlet, mas os parametros enviados pelo midlet nao no servlet, ou seja chega como null.
entre neste link talvez te ajudar.
http://www.guj.com.br/posts/list/0/67263.java

marcos.junqueira

hayase:
então
tipo
o estranho é q nomesmo fazendo o web.xml ñ dá certo
tipo
sou obrigada a fazer uma pagina html pra midlet acessar a servlet?
isso q ñ estou entendendo pq nos exemplos, só tem a servlet, sem descritor, sem html, sem nada… ou esse livro ta passando só metade do código, ou sei lá o q é…
vai entende…
me de sua opinião
como vc faria?
obrigada

Primeiro execute o servlet pelo browser pra ver se ele estah funcionando corretamente
Não precisa fazer pagina html algum

teste seu servlet pelo browser com algo do tipo:

http://://
Ex.: http://localhost/teste/ServletTeste

Se conseguir acesar pelo browser e tiver acessando pelo midlet pode ser que o celular ou o emulador nao estejam com acesso ao servidor onde sua aplicação esteja rodando.

hayase

obrigada pela sua dica
porém
descobri q qdo acesso a servlet pelo browser, dá um erro de resource…
bom… agora ñ entendi bem essa coisa do celular nao tem acesso?
tipo, eu tenho um servidor web pra mim, montei e talz, ta td no ar… passei os parametros corretos na midlet pra q ela pudesse acessar …
é meio confuso isto…
o q está retornando na midlet é o seguinte

porém em inglês…
eu testei com a URL de outra servlet q tenho (na verdade jsp) que está funcionando corretamente… e tb deu o mesmo erro…
ficarei grata com sua opinião

marcos.junqueira

Tem certeza que o servidor está de pé?

Se você não consegue acessar pelo browser, muito menos pelo celular. Se conseguir acessar pelo browser e ainda não estiver conseguindo pelo celular, certifique-se de que sua conexão a internet pelo celular esteja ativa.

até mais.

hayase

então
obrigada pela sua atenção
eu ñ sei o q exatamente ocorreu, mas a servlet funcionou ehheheheeh
agora a midlet tb funcionou mas preciso retornar uma tela na midlet pa ter certeza d q estou fazendo o acesso ao banco de dados pela servlet ehhehehehehehehe
obrigada mesmo, agora qto aos erros… só Deus sabe pq tava acontecendo akelas coisas heheehhehe

DEAD

Ai Hayase é só vc mandar um .writeUTF via a interface DataOutputStream e no celular recebendo .readUTF via um DataInputStream, e vc chamar um Alert logo depois, se o atributo que receber seu .readUTF for == null vc exibirá que não foi possivel mostrar.
Caso contrário mostre a mensagem qual vc quer… sete o timeOut do alert para FOREVER.
O ideal quando construímos um Midlet é ter um método chamado showAlert ou errorAlert algo do tipo, sendo que esse recebe como parâmetro uma String e exibe a mesma na tela via um alert. O método seta o próprio alert como corrente no final do mesmo… é um método simples que pode lhe ajudar muito!

hayase

oi então
isso eu tb queria saber
eu estou usando aki INPUTSTREAM… qual a diferença entre usar inputstream e dataoutputstream?
tipo… na servlet depois tenho q alterar algo se trabalhar com dataoutput stream?

Raff

hayse eu estou tentando fazer a mesma aplicação que você (eu tirei do CoreJ2me ) mas naun estou conseguindo você poderia me ajudar ? já que você passou por isso ?

hayase

hi

C

então

C

é o seguinte

C
cassiojoselito:
cassiojoselito:
Boa dia galera, quando rodo a midlet no wireless tookit aparece o seguinte erro:Uncaught exception java/lang/IllegalArgumentException: no ':' in URL. o codigo segue abaixo, desde ja grato pela atenção.
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class HitMIDlet extends MIDlet implements CommandListener {

    private Display mDisplay;
    private Form mMainForm;
    private StringItem mMessageItem;
    private Command mExitCommand, mConnectCommand;

    public HitMIDlet() {
        
        mMainForm = new Form("HitMidlet");
        mMessageItem = new StringItem(null,"");
        mExitCommand = new Command("Exit",Command.EXIT,0);
        mConnectCommand = new Command("Connect",Command.SCREEN,0);
        mMainForm.append(mMessageItem);
        mMainForm.setCommandListener(this);
    }

    public void startApp() {
       
        mDisplay = Display.getDisplay(this);
        mDisplay.setCurrent(mMainForm);

    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }

    public void commandAction(Command c, Displayable s) {
       
        if (c == mExitCommand)
            notifyDestroyed();
        else if (c == mConnectCommand){
            Form waitForm = new Form("Waiting...");
            mDisplay.setCurrent(waitForm);
            Thread t = new Thread(){
                public void run(){
                    connect();
                }
            };
            t.start();
        }
    }
    private void connect(){
        HttpConnection hc = null;
        InputStream in = null;
        String url = getAppProperty("HitMIDlet.URL");
        try {
                hc = (HttpConnection)Connector.open(url);
                in = hc.openInputStream();

                int contentLength = (int)hc.getLength();
                byte[] raw = new byte[contentLength];
                int length = in.read(raw);
                in.close();
                hc.close();
                //show the response to the user
                String s = new String(raw,0,length);
                mMessageItem.setText(s);
             }
               catch (IOException ioe) {
                   mMessageItem.setText(ioe.toString());
                                       }
    mDisplay.setCurrent(mMainForm);
                            }
}
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class HitServlet extends HttpServlet {
     private int mCount;
     
     public void doGet(HttpServletRequest request,HttpServletResponse response)
     throws ServletException , IOException{
    	 String message = "Hits:" + ++mCount;
    	 response.setContentType("text/plain");
    	 response.setContentLength(message.length());
    	 PrintWriter out = response.getWriter();
    	 out.println(message);
     }
     
}
C

ja resolvi valeu galera.

o valor de HitMIDlet no settings, users definer, e http://localhost:8080/bar/hits eu tinha colocado só hits.

Criado 23 de agosto de 2007
Ultima resposta 10 de jul. de 2010
Respostas 15
Participantes 6