Avatar billede quaid Nybegynder
28. januar 2003 - 23:45 Der er 16 kommentarer og
2 løsninger

servlet og midlet

Jeg har lavet en simpel servlet der sender en string til en midlet når den kaldes.

Kan man have mere end en metode i en servlet?
Den skulle helst have en post, og get, der var uafhængige.
Umiddelbart har jeg svært ved at se hvordan når man ikke adresserer til en bestemt metode i kaldet fra midleten.
Har lavet flere lignende midlets hvor man så har kaldt en webservice på en konkret metode, og det virker umiddelbart smartere, men desværre også langsommere.
QD;;
Avatar billede quaid Nybegynder
28. januar 2003 - 23:46 #1
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;

public class HitServlet extends HttpServlet

    public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException
    {
    String message = "1234512345123451234512345123451234512345123451234512345123451234512345123451234512345123451234512345";   
    response.setContentType("text/plain");
    response.setContentLength(message.length());
    PrintWriter out = response.getWriter(); 
    out.println(message); 
  }   
 
}
Avatar billede quaid Nybegynder
29. januar 2003 - 01:14 #2
HMMM jeg forstår ikke dette, som jeg troede burde virke.
Selve opkaldet fra midleten ser sådan ud:

private void connect()
  {
    HttpConnection hc = null;   
    OutputStream out = null;// ny
    String url = "http://localhost:8080/midp/hits";
   
    try {
       
      hc = (HttpConnection)Connector.open(url); 
      hc.setRequestMethod  (HttpConnection.POST);                 
      out = hc.openOutputStream();     
      out.write("soeren".getBytes());
      out.flush();               

         
    }
    catch (IOException ioe)
    {
      mMessageItem.setText(ioe.toString());
    }


Dette kalder denne servlet:
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;

public class HitServlet extends HttpServlet
{
  public void doPost( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException
  {

       

        ServletInputStream in =  request.getInputStream();
        DataInputStream    din =  new DataInputStream( in );

        String text = din.readUTF();
        System.out.println(text);
        din.close();
  }
 
}

Hvorfor virker dette ikke?
QD;;
Avatar billede disky Nybegynder
29. januar 2003 - 07:34 #3
Du kan godt havde flere metoder i en midlet, faktisk ligeså mange do har lyst til.

Post request handles via doPost() get request via doGet()

Hvad sker der når du udfører dit program ?
Avatar billede arne_v Ekspert
29. januar 2003 - 07:38 #4
En servlet svarer på HTTP requests. Der er et vel-defineret antal
HTTP metoder.

Normalt bruger man kun GET og POST.

Men du kan sende data med en GET eller POST som fortæller hvad
du vil.

http://www.domain.dk/servlet/Foobar?mymethod=special

vil gøre at

String mymethod = request.getParameter("mymethod");

i Foobar servletten vil få værdien "special" og det kan
du så bruge til at bestemme hvad den skal returnere.
Avatar billede arne_v Ekspert
29. januar 2003 - 07:39 #5
Hvda sker der med dit POST eksempel som ikke virker ?
Avatar billede quaid Nybegynder
29. januar 2003 - 09:32 #6
Ja den øverste servlet virker upåklageligt.
Disky:Det kompiler fint, men der kommer ikke noget frem til servleten.
Hov.. måske burde jeg kigge på om det kan tænkes at det er den System.out.println i servleten der ikke bliver udført...det er jo edet eneste bevis på om stringen kommer frem. Umiddelbart burde serveren bare skrive den ud i den DOS prompt den kører i! Chekker lige.
Men du mener at det burde virke?
Arne: Skal det forståes som at serletten hedder foobar og metoden hedder mymethod?
QD::
Avatar billede arne_v Ekspert
29. januar 2003 - 09:43 #7
Nej.

Servletten hedder Foobar. Java metoden hedder stadig doGet.

Men inde i doGet henter du den parameter der hedder "mymethod"
og kan så udføre forskellige ting alt efter hvad værdien er.
Avatar billede disky Nybegynder
29. januar 2003 - 09:57 #8
quaid:
God ide.

Ellers fang mig på ICQ i aften, så tester vi det på min server, der har jeg 100% styr over hvad der sker.
Avatar billede quaid Nybegynder
29. januar 2003 - 10:14 #9
Nej servletten virker ikke.
Min tanke var at lave en servlet som den øverste, men bare også med en metode der kunne modtage en string fra midleten.
Hvis du arbejder meget med dette, kunne du så ikke lige vise mig hvordan man udbygger den første, så den også kan modtage en string?
Eller evt et kodeeksempel. Jeg har som sagt arbejdet meget med dette, men bare baseret på xml-webservices, hvor der klare metoder.
QD::
QD::
Avatar billede disky Nybegynder
29. januar 2003 - 10:19 #10
Ret din servlet til at bruge doGet() istedet, og ret

    String url = "http://localhost:8080/midp/hits";

til

    String url = "http://localhost:8080/midp/hits?data=soeren";

I din doGet() laver du så

String data=request.getParameter("data");

Så indeholder 'data' variablen det som er sendt med fra din midlet.
Avatar billede quaid Nybegynder
29. januar 2003 - 14:11 #11
Kræver dette en speciel opsætning af serveren? Eller findes der et bibliotek på den, hvor den default leder efter servlets?
QD::
Avatar billede quaid Nybegynder
29. januar 2003 - 15:55 #12
Det er godt nok tomcat, som mange ikke bryder sig om, men den virker sammen med den servlet jeg har lavet.
Hvis jeg kalder den i browseren og giver den parametre med, svarer den fin tilbage.

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

public class MinServlet extends HttpServlet
{
  protected void doGet(HttpServletRequest req, HttpServletResponse res)
                      throws ServletException, IOException
  {
    // Read the parameters sent from MIDlet
    String acct = req.getParameter("account"),
            pwd = req.getParameter("password");   
   
    if (acct == null || pwd == null)
    {
      res.sendError(res.SC_BAD_REQUEST, "Unable to lase parameters");
      return;
    }

    res.setContentType("text/plain");   
    PrintWriter out = res.getWriter();
    out.print("acct:" + acct + "\npwd:" + pwd);
    out.close();
  }

  /*--------------------------------------------------
  * Information about servlet
  *-------------------------------------------------*/   
  public String getServletInfo()
  {
    return "";
  }
}




Desværre virker midleten ikke;

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

public class CallServletGET extends MIDlet implements CommandListener
{
  private Display display;        // Reference to display object
  private Form fmMain;        // The main form
  private TextField tfAcct;    // Get account number
  private TextField tfPwd;    // Get password
  private Command cmCall;      // Command to call the servlet
  private Command cmExit;      // Command to exit

  public CallServletGET()
  {
    display = Display.getDisplay(this);

    // Textfields
    tfAcct = new TextField("Account:", "", 5, TextField.NUMERIC);
    tfPwd = new TextField("Password:", "", 10, TextField.ANY | TextField.PASSWORD);       

    // Define commands
    cmCall = new Command("Call", Command.SCREEN, 2);
    cmExit = new Command("Exit", Command.EXIT, 1);

    // Create the form, add components and commands
    fmMain = new Form("Data from servlet");
    fmMain.append(tfAcct);
    fmMain.append(tfPwd);
    fmMain.addCommand(cmExit);
    fmMain.addCommand(cmCall);   

    // Capture events
    fmMain.setCommandListener(this);   
  }

  // Called by application manager to start the MIDlet.
  public void startApp()
  {
    display.setCurrent(fmMain);
  }

  public void pauseApp()
  { }
 
  public void destroyApp(boolean unconditional)
  { }

  private void callServlet() throws IOException
  {
    HttpConnection http = null;
    InputStream iStrm = null;       

    // Data is passed at the end of url for GET
   
    String url = "http://localhost:8080/para/MinS" + "?" +
                "account=" + tfAcct.getString() + "&" +
                "password=" + tfPwd.getString();
               
    try
    {
      http = (HttpConnection) Connector.open(url);

      //----------------
      // Client Request
      //----------------
      // 1) Send request method
      http.setRequestMethod(HttpConnection.GET);
      // 2) Send header information - none
      // 3) Send body/data -  data is at the end of URL

      //----------------
      // Server Response
      //----------------
      if (http.getResponseCode() == HttpConnection.HTTP_OK)
      {
        iStrm = http.openInputStream();     
        // 2) Get header information - none
     
        // 3) Get body (data)
        int length = (int) http.getLength();
        if (length > 0)
        {
          byte servletData[] = new byte[length];
          iStrm.read(servletData);
 
          // Update the string item on the display
          fmMain.append("You passed to the servlet: \n" + new String(servletData));
        }
        else
          fmMain.append("Unable to read data");
      }
    }
    catch (Exception e)
    {
      fmMain.append("Network error");
      System.out.println(e.toString());
    }
    finally
    {
      // Clean up
      if (iStrm != null)
        iStrm.close();
      if (http != null)
        http.close();
    }
  }

  public void commandAction(Command c, Displayable s)
  {
    if (c == cmCall)
    {
      try
      {
        callServlet();
      }
      catch (Exception e)
      {
        System.out.println(e.toString());
      }
    }
    else if (c == cmExit)
      {
        destroyApp(false);
        notifyDestroyed();
      }     
  }
}

Et bud på hvad der er galt???
QD::
Avatar billede arne_v Ekspert
29. januar 2003 - 19:48 #13
Der er ganske rigtigt nogen som ikke kan lide Tomcat.

Men der er skam også nogen (heriblandt undertegnede) som er meget
glade for Tomcat.

Hvis det virker fra browser, så lyder det ikke som et servlet
engine problem. Den bør reagere fuldstændigt ens uanset, hvor
requesten komemr fra.

Så problemet er nok ovre på midlet siden.

(og det er jeg ikke den rette til at hjælpe med)
Avatar billede disky Nybegynder
29. januar 2003 - 21:06 #14
Har du sat tomcat op til at lede efter din servlet der hvor den ligger ?

Tomcat kan bruges, der findes bare langt bedre og lettere produkter.
Avatar billede quaid Nybegynder
29. januar 2003 - 21:59 #15
Ja det hele er sat op som jeg plejer at have det.
Har til dels fundet fejlen. Den afsendte parameter kommer godt frem til servleten.
Som det ses prøvede jeg at sætte en System.out for at se hvor langt det kom frem.

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

public class MinServlet extends HttpServlet
{
  protected void doGet(HttpServletRequest req, HttpServletResponse res)
                      throws ServletException, IOException
  {
      System.out.println("Got a GET");
    // Read the parameters sent from MIDlet
    String acct = req.getParameter("account"),
            pwd = req.getParameter("password");
            System.out.println(acct); 
   
    if (acct == null || pwd == null)
    {
      res.sendError(res.SC_BAD_REQUEST, "Unable to lase parameters");
      return;
    }

    res.setContentType("text/plain");   
    PrintWriter out = res.getWriter();
    out.print("acct:" + acct + "\npwd:" + pwd);
    out.close();
  }

  /*--------------------------------------------------
  * Information about servlet
  *-------------------------------------------------*/   
  public String getServletInfo()
  {
    return "";
  }
}

Begge System.out bliver skrevet ud i den prompt serveren kører, så det er noget af det snot længere nede der skal smide parametrene tilbage der laver koks i det.
Nu er der da hul igennem, så resten skal jeg nok finde ud af.
Tak for at i gad deltage i marathon debatten.
QD::
Avatar billede disky Nybegynder
29. januar 2003 - 22:31 #16
Held og lykke

Forresten har du brug for din konto på min server endnu ?
Avatar billede quaid Nybegynder
29. januar 2003 - 22:40 #17
Ja den ville jeg blive ked af at miste. Jeg bruger den ret ofte hvis du ikke vidste det.
Egentligt burde jeg vel kune sætte min egen op til at tage de 2 mime typer!
Det andet er bare så let, men hvis det er i vejen må du lige varskoe mig før
du lukker den.
QD::
Avatar billede disky Nybegynder
30. januar 2003 - 08:09 #18
Det er helt okay du bruger den, skulle bare lige høre om du brugte den endnu :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester