2010-07-15 5 views
5

J'essaie d'obtenir la sortie d'une servlet sur un téléphone Android.Call servlet Java à partir d'Android

Ceci est mon servlet:

/* 
    * To change this template, choose Tools | Templates 
    * and open the template in the editor. 
    */ 
    package main; 

    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; 

    /** 
    * 
    * @author Bert Verhelst <[email protected]> 
    */ 
    public class servlet1 extends HttpServlet { 

     /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. 
     * @param request servlet request 
     * @param response servlet response 
     * @throws ServletException if a servlet-specific error occurs 
     * @throws IOException if an I/O error occurs 
     */ 
     protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
       throws ServletException, IOException { 
      response.setContentType("text/html;charset=UTF-8"); 
      PrintWriter out = response.getWriter(); 
      out.println("<html>"); 
      out.println("<head>"); 
      out.println("<title>Servlet servlet1</title>"); 
      out.println("</head>"); 
      out.println("<body>"); 
      out.println("<h1>processing...</h1>"); 
      out.println("</body>"); 
      out.println("</html>"); 
     } 

     // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> 
     /** 
     * Handles the HTTP <code>GET</code> method. 
     * @param request servlet request 
     * @param response servlet response 
     * @throws ServletException if a servlet-specific error occurs 
     * @throws IOException if an I/O error occurs 
     */ 
     @Override 
     protected void doGet(HttpServletRequest request, HttpServletResponse response) 
       throws ServletException, IOException { 
      processRequest(request, response); 
      PrintWriter out = response.getWriter(); 
      out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " 
        + "Transitional//EN\">\n" 
        + "<html>\n" 
        + "<head><title>Hello WWW</title></head>\n" 
        + "<body>\n" 
        + "<h1>doget...</h1>\n" 
        + "</body></html>"); 
     } 

     /** 
     * Handles the HTTP <code>POST</code> method. 
     * @param request servlet request 
     * @param response servlet response 
     * @throws ServletException if a servlet-specific error occurs 
     * @throws IOException if an I/O error occurs 
     */ 
     @Override 
     protected void doPost(HttpServletRequest request, HttpServletResponse response) 
       throws ServletException, IOException { 
      processRequest(request, response); 
      PrintWriter out = response.getWriter(); 
      out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " 
        + "Transitional//EN\">\n" 
        + "<html>\n" 
        + "<head><title>Hello WWW</title></head>\n" 
        + "<body>\n" 
        + "<h1>dopost...</h1>\n" 
        + "</body></html>"); 
     } 

     /** 
     * Returns a short description of the servlet. 
     * @return a String containing servlet description 
     */ 
     @Override 
     public String getServletInfo() { 
      return "Short description"; 
     }// </editor-fold> 
    } 

Ceci est ma page principale Android:

 package be.smarttelecom.MyTest; 

    import android.app.Activity; 
    import android.os.Bundle; 
    import android.widget.TextView; 

    public class Main extends Activity { 
     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      TextView output = (TextView) findViewById(R.id.output); 
      try { 
       output.append("starting\n"); 
       RestClient client = new RestClient("http://10.0.0.188:8084/Servlet_1/servlet1"); 

       try { 
        client.Execute(RequestMethod.GET); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

       output.append("after execute\n"); 

       String response = client.getResponse(); 
       output.append("class - " + response + "\n"); 
       output.append(response); 
       output.append("done\n"); 
      } 
      catch (Exception ex) { 
       output.append("error: " + ex.getMessage() + "\n" + ex.toString() + "\n"); 
      } 
     } 
    } 

Et enfin nous avons la RESTClient:

 package be.smarttelecom.MyTest; 

    import java.io.BufferedReader; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.InputStreamReader; 
    import java.util.ArrayList; 

    import org.apache.http.HttpEntity; 
    import org.apache.http.HttpResponse; 
    import org.apache.http.NameValuePair; 
    import org.apache.http.client.ClientProtocolException; 
    import org.apache.http.client.HttpClient; 
    import org.apache.http.client.entity.UrlEncodedFormEntity; 
    import org.apache.http.client.methods.HttpGet; 
    import org.apache.http.client.methods.HttpPost; 
    import org.apache.http.client.methods.HttpUriRequest; 
    import org.apache.http.impl.client.DefaultHttpClient; 
    import org.apache.http.message.BasicNameValuePair; 
    import org.apache.http.protocol.HTTP; 

    public class RestClient { 
     private ArrayList <NameValuePair> params; 
     private ArrayList <NameValuePair> headers; 

     private String url; 

     private int responseCode; 
     private String message; 

     private String response; 

     public String getResponse() { 
      return response; 
     } 

     public String getErrorMessage() { 
      return message; 
     } 

     public int getResponseCode() { 
      return responseCode; 
     } 

     public RestClient(String url) 
     { 
      this.url = url; 
      params = new ArrayList<NameValuePair>(); 
      headers = new ArrayList<NameValuePair>(); 
     } 

     public void AddParam(String name, String value) 
     { 
      params.add(new BasicNameValuePair(name, value)); 
     } 

     public void AddHeader(String name, String value) 
     { 
      headers.add(new BasicNameValuePair(name, value)); 
     } 

     public void Execute(RequestMethod method) throws Exception 
     { 
      switch(method) { 
       case GET: 
       { 
        //add parameters 
        String combinedParams = ""; 
        if(!params.isEmpty()){ 
         combinedParams += "?"; 
         for(NameValuePair p : params) 
         { 
          String paramString = p.getName() + "=" + p.getValue(); 
          if(combinedParams.length() > 1) 
          { 
           combinedParams += "&" + paramString; 
          } 
          else 
          { 
           combinedParams += paramString; 
          } 
         } 
        } 

        HttpGet request = new HttpGet(url + combinedParams); 

        //add headers 
        for(NameValuePair h : headers) 
        { 
         request.addHeader(h.getName(), h.getValue()); 
        } 
        executeRequest(request, url); 
        break; 
       } 

       case POST: 
       { 
        HttpPost request = new HttpPost(url); 

        //add headers 
        for(NameValuePair h : headers) 
        { 
         request.addHeader(h.getName(), h.getValue()); 
        } 

        if(!params.isEmpty()){ 
         request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); 
        } 

        executeRequest(request, url); 
        break; 
       } 
      } 
     } 

     private void executeRequest(HttpUriRequest request, String url) 
     { 
      HttpClient client = new DefaultHttpClient(); 

      HttpResponse httpResponse; 

      try { 
       httpResponse = client.execute(request); 
       responseCode = httpResponse.getStatusLine().getStatusCode(); 
       message = httpResponse.getStatusLine().getReasonPhrase(); 

       HttpEntity entity = httpResponse.getEntity(); 

       if (entity != null) { 
        InputStream instream = entity.getContent(); 
        response = convertStreamToString(instream); 

        // Closing the input stream will trigger connection release 
        instream.close(); 
       } 
      } 
      catch (ClientProtocolException e) { 
       client.getConnectionManager().shutdown(); 
       e.printStackTrace(); 
      } catch (IOException e) { 
       client.getConnectionManager().shutdown(); 
       e.printStackTrace(); 
      } 
     } 

     private static String convertStreamToString(InputStream is) { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
      StringBuilder sb = new StringBuilder(); 

      String line = null; 
      try { 
       while ((line = reader.readLine()) != null) { 
        sb.append(line + "\n"); 
       } 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
      } 
      finally { 
       try { 
        is.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      return sb.toString(); 
     } 
    } 

Malheureusement, cela ne fonctionne pas . Voici ce que je reçois pour la sortie (null),

Screenshot of

Qu'est-ce que je fais mal?

Je demande la méthode DoGet de ma servlet et convertit la sortie en chaîne, mais elle semble vide.

je laissais la connexion Internet dans le fichier manifeste juste après le support de fermeture de l'application,

<uses-permission android:name="android.permission.INTERNET" /> 
+0

-vous obtenez ce que vous attendre si vous accédez au servlet à partir d'un navigateur? De plus, votre doGet() appelle processRequest, ce qui fait out.close(), alors que doGet essaie d'écrire plus de HTML sur un flux fermé (ne fermez jamais le flux de sortie dans une servlet). – nos

+3

L'appel parvient-il à la servlet? Que voit le serveur en cours d'envoi? Qu'est-ce que le serveur renvoie? –

Répondre

3

Romain Hippeau a écrit dans un commentaire:

Est-ce que l'appel jamais à la servlet? Que voit le serveur en cours d'envoi? Qu'est-ce que le serveur renvoie?

C'était le problème! J'ai désactivé mon pare-feu et maintenant il fonctionne :)

0

pourquoi avez-vous utilisé ce port IP

"http://10.0.0.188:8084" 

Je suppose que vous devez utiliser ce lieu pour le simulateur Android:

"http://10.0.2.2:8080" 
Questions connexes