2


jsp を介してデータベースにアクセスしようとしていますが、次のコードがあります。

<% 
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String value = "vuoto";


        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/onlinebookstore", "root", "sesame");
        Statement statement = connection.createStatement();
        ResultSet result = statement.executeQuery("SELECT * FROM users WHERE email = '" + username + "' " + "AND" + " password = '" + password + "'");
        if(result.next()) {
           value = "eccomi";
        }
        connection.close();
%>

Class.forName を使用する必要がある理由がわかりません。なぜなら、JDBC 4.0 から読む必要がないからですが、そのステートメントを削除すると機能しません。ライブラリに MySQL JDBC Driver -mysql-connector-java-5.1.23-bin.jar を追加しました

4

4 に答える 4

3

質問で公開されている JSP で Java コードを記述するというプログラミングの悪い慣行は無視します。HTML ではなく生の Java コードを使用して HTTP 要求/応答を傍受したいときはいつでも、サンドボックス サーブレットの作成に慣れ始める必要があります。


具体的な問題に関しては、これは確かに予想される動作です。まず、JDBC 4.0 ドライバーはServiceLoaderAPI を使用して自動ロードされます。そのjavadocを見てみましょう。ここに関連性の抜粋があります(javadocの5番目の段落;強調鉱山):

特定の具象プロバイダ クラスが複数の構成ファイルで指定されている場合、または同じ構成ファイルで複数回指定されている場合、重複は無視されます。特定のプロバイダーを指定する構成ファイルは、プロバイダー自体と同じ jar ファイルまたは他の配布ユニットにある必要はありません。プロバイダーは、構成ファイルを見つけるために最初に照会されたのと同じクラス ローダーからアクセスできる必要があります。これは必ずしもファイルが実際にロードされたクラスローダーではないことに注意してください。

JAR の/META-INF/servicesフォルダー内の構成ファイルを照会するのは、webapp ではなく、サーブレットコンテナー自体です。したがって、基本的に、JAR は Web アプリケーションの独自のランタイム クラスパスではなく、サーブレット コンテナの独自のランタイム クラスパスに配置する必要があります。webapp の/WEB-INF/libフォルダーは、servletcontainer のフォルダーではなく、webapp のランタイム クラスパスによってカバーされているため、本質的に間違った場所です。

使用されている servletcontainer については何も教えてくれませんでしたが、他の質問で見つかったスタック トレースに基づいて、Apache Tomcat だと思います。その場合、メカニズム/libによる JDBC ドライバーの自動ロードを適切に利用するには、JDBC ドライバーの JAR ファイルを Tomcat の独自のフォルダーに配置する必要があります。ServiceLoader

于 2013-08-23T02:53:43.943 に答える
0

私の環境では、このコードはなくても機能しClass.forNameます。

public class Test {
  public static void main(String[] args) {

    //Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "sesame");

    // do some query
  }
}

したがって、あなたの問題はクラスローダーの問題である可能性があると思います。Tomcat を使用している場合は、この回答が役に立ちます。

于 2013-08-23T02:38:32.150 に答える