Midlets + servlets + conexÃo

PESSOAL TENHO O SEGUINTE CÓDIGO PARA UMA MIDLET

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

[code]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);
}

} [/code]

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

[code]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";
}

}[/code]

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

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

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

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

[quote=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[/quote]

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.

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

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.

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

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!

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?

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 ?

hi

então

é o seguinte

[quote=cassiojoselito][quote=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.[/quote][code]
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);
                        }

}
[/code][code]
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);
 }

}
[/code][/quote]

ja resolvi valeu galera.

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