0

AndroidアプリからJavaサーブレットを介してローカルホスト上のmysqlデータベースにアクセスしたい。Javaクラスを介してデータベースにアクセスできましたが、Androidアクティビティで同じコードを試したところ、機能しません。以下は、Javaサーブレット、データベースへのアクセスに成功したJavaクラス、および機能していないAndroidコードのコードです。LogCatログでは、BufferedReaderクラスまでのすべてのログを取得しています。また、Androidで応答文字列を表示するために使用できるウィジェットを教えてください。現在、応答文字列にHTMLコードが含まれていることはわかっていますが、データベースにアクセスできるかどうかを知りたいだけでは問題ありません。ありがとうございました。Javaサーブレットコード:

package org.spark.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

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

/**
 * Servlet implementation class HelloServlet2
 */
@WebServlet("/HelloServlet2")

public class HelloServlet2 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void service(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException{
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>Hello World</title></head>");
        out.println("<body>");
        out.println("<h1>Hello World2</h1>");
        // connecting to database
        Connection con = null;    
        Statement stmt = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con =DriverManager.getConnection ("jdbc:mysql://localhost:3306", "root", "password");
            stmt = con.createStatement();
            rs = stmt.executeQuery("Use servlettest");
            rs = stmt.executeQuery("SELECT * FROM servlet");
            // displaying records
            while(rs.next()){
                out.print(rs.getObject(1).toString());
                out.print("\t\t\t");
                out.print(rs.getObject(2).toString());
                out.print("<br>");
            }
        } catch (SQLException e) {
            throw new ServletException("Servlet Could not display records.", e);
          } catch (ClassNotFoundException e) {
              throw new ServletException("JDBC Driver not found.", e);
            } finally {
                try {
                    if(rs != null) {
                        rs.close();
                        rs = null;
                    }
                    if(stmt != null) {
                        stmt.close();
                        stmt = null;
                    }
                    if(con != null) {
                        con.close();
                        con = null;
                    }
                } catch (SQLException e) {}
            }
            out.println("</body></html>");  
            out.close();
        }
    }

Javaクラスコード:

package org.ProjectEuler;
import java.io.*;
import java.net.*;
public class HelloServlet {
    public static void main( String [] args ) {

        try {

            URL url = new URL("http://localhost:8080/HelloServlet/HelloServlet2");
            URLConnection conn = url.openConnection();
            conn.setDoOutput(true);

            BufferedWriter out = new BufferedWriter( new OutputStreamWriter( conn.getOutputStream()));
            out.write("username=javaworld\r\n");
            out.flush();
            out.close();
            BufferedReader in = new BufferedReader( new InputStreamReader( conn.getInputStream()));

            String response;
            while ( (response = in.readLine()) != null ) {
                System.out.println( response );
            }
            in.close();
        }
        catch ( MalformedURLException ex ) {
            // a real program would need to handle this exception
        }
        catch ( IOException ex ) {
            // a real program would need to handle this exception
        }
    }
}

Andriodコード:

package org.spark.mysqltest;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.util.Log;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.*;


public class MySqlTestActivity extends Activity {
    EditText test;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("checked","checked");
        System.out.println("check");
        Log.d("checked2","checked2");
        test = (EditText) findViewById(R.id.mtv);
        Log.d("checked3","checked3");
        setContentView(R.layout.main);
        Log.d("checked4","checked4");

        try {
            Log.d("checked5","checked5");

            URL url = new URL("http://localhost:8080/HelloServlet/HelloServlet2");
            URLConnection conn = url.openConnection();
            conn.setDoOutput(true);
            Log.d("checked6","checked6");
            BufferedWriter out = new BufferedWriter( new OutputStreamWriter( conn.getOutputStream()));
            Log.d("checked7","checked7");
            out.write("username=javaworld\r\n");
            Log.d("checke","checke");
            out.flush();
            Log.d("check","check");
            out.close();
            Log.d("chec","chec");
            BufferedReader in = new BufferedReader( new InputStreamReader( conn.getInputStream()));
            Log.d("che","che");
            String response;
            while ( (response = in.readLine()) != null ) {
                System.out.println( response );
              //  test.setText(response);
                Log.d("checked8","checked8");
            }
            Log.d("checked9","checked9");
            in.close();
        }
        catch ( MalformedURLException ex ) {
            // a real program would need to handle this exception
        }
        catch ( IOException ex ) {
            // a real program would need to handle this exception
        }
    }
}
4

1 に答える 1

2

最初の問題:を作成するときにエンコーディングを指定していませんInputStreamReader。これは、プラットフォームのデフォルトエンコーディングを使用することを意味します。これは、Web応答の作成に使用されるエンコーディングではない場合があります。(同様に、リクエストを作成するとき。)

2番目の問題:例外を無視しています:

catch ( MalformedURLException ex ) {
    // a real program would need to handle this exception
}
catch ( IOException ex ) {
    // a real program would need to handle this exception
}

私の推測では、例外スローされていると思いますが、ログを記録せずにそれらの例外を飲み込んだため、わかりません。少なくともここにログインを追加すると、何が問題になっているのかがわかると思います。このような空のcatchステートメントはほとんどありません。

ちなみに、このような低レベルのAPIを使用する理由はありますか?優れた高レベルのHTTPクライアントライブラリを使用すると、作業が大幅に簡素化される可能性があります。

于 2012-05-30T05:59:27.840 に答える