2

私は単純なJDBCを作成しましたが、それはうまく機能します(javaとjavacを使用してコマンドプロンプトで実行します)。

また、単純なHelloworldServletを作成しましたが、これはうまく機能します(Apache Tomcat 7.0を使用)。ブラウザhttp://www.myhost.com:8088/projecthello/servlethelloを使用してサーブレットにアクセスすると、Helloworldが表示されます。

今、私は単純なサーブレットとJDBCを組み合わせようとしています。テーブルに対してクエリSELECTを作成し、次のURLを使用してブラウザに表示したいと思います:http ://www.myhost.com:8088 / projectmovie / directors-view

/ WEB-INF / classesフォルダーには、DirectorsViewServlet.javaとDirectorSelect.javaの2つのファイルがあります。

これがDirectorsViewServlet.javaです:

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

 public class DirectorsViewServlet extends HttpServlet {

  public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
    res.setContentType("text/html");
    PrintWriter out = res.getWriter();
    DirectorSelect ds = new DirectorSelect();
    out.println(ds.selectDirectors());
  }

  public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
    doGet(req, res);
  }

}

そして、これがDirectorSelect.javaです。

 import java.sql.*;

 class DirectorSelect{
  public String selectDirectors() {
    Connection koneksi = null;
    Statement stat = null;
    String str = "";
    try{
        Class.forName("com.mysql.jdbc.Driver");
        koneksi = DriverManager.getConnection("jdbc:mysql://localhost/dbizza","root","");
        stat = koneksi.createStatement();
        ResultSet hasil = stat.executeQuery("SELECT * FROM directors");
        while (hasil.next()) {
            str = str + (hasil.getInt(1) + "\t" + hasil.getString(2)+ "\t" + hasil.getString(3)+ "\t" + hasil.getDate(4)+ "\t" + hasil.getString(5));
        }
        stat.close();
        koneksi.close();
    } catch (SQLException sqle) {
        str = "SQLException error";
    } catch (ClassNotFoundException cnfe) {
        str = "ClassNotFoundException error";
    }
    return str;
 }
}

そして、これが私のweb.xmlファイルです。

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 version="2.5"> 
<servlet>
    <servlet-name>DirViewServlet</servlet-name>
    <servlet-class>DirectorsViewServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>DirViewServlet</servlet-name>
    <url-pattern>/directors-view</url-pattern>
</servlet-mapping>
</web-app>

問題は、このローカルURLhttp://www.myhost.com:8088/projectmovie/directors-viewを使用してブラウザでアクセスした場合です

結果は「ClassNotFoundExceptionエラー」です。それを解決する方法は?

サーブレットとJDBCはやや直交する技術だと言っている人を読んだ。それが何を意味するのかについてのさらなる説明はありますか?なぜ?

ありがとう。

4

2 に答える 2

2

AClassNotFoundExceptionはかなり単純な例外であり、サーブレット/ JDBCとは関係ありません(パッケージからのものjava.langであり、基本的なJavaを示しており、サーブレットまたはJDBCの問題を示すパッケージからではありません)。これは、例外メッセージで言及されているクラスがランタイムクラスパスにないことを意味します。javax.servletjava.sql

残念ながら、言及された例外メッセージのクラスは、あなたの場合、どこにも印刷/記録されていません。与えられたコードでの例外処理はひどく貧弱です。コードは例外を完全に抑制し、DBからの結果であるかのようにカスタムメッセージを返します。そのコードの呼び出し元は、DBの相互作用が成功したかどうかさえ区別できませんでした。例外を適切にスローするように、または少なくともスタックトレースを出力するようにコードを書き直すと、次のような例外メッセージに欠落しているクラスが表示されるはずです。

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    at ....

これは自明です。JDBCドライバークラス(またはこの特定のケースでは、JDBCドライバークラスを含むJARファイル)がランタイムクラスパスにありません。

JDBCドライバーのJARファイルをwebappのランタイムクラスパスにドロップするだけです。この/WEB-INF/libフォルダーは、Webアプリケーションのランタイムクラスパスに参加します。JARファイルをそこに直接ドロップして、再構築/再デプロイ/再起動するだけです。

参照:


具体的な問題とは関係なく、JSP + Servlet + JDBCの適切なキックオフの例については、この投稿を注意深く読むことをお勧めします。MVCおよびDAOパターンを使用してJSPページでJDBCResultSetをHTMLで表示します。コードは例外の処理が不十分であるだけでなく、DBリソースの処理も不十分です。例外の場合、それらは漏れる可能性があります。

于 2013-03-25T02:22:18.640 に答える
-1

'com.mysql.jdbc.Driver'クラスのクラスが見つからない場合は、プロジェクトにjdbcdriversjarファイルがないことを意味します。データベースに基づいてjdbcドライバーをダウンロードし、その.jarファイルをプロジェクトの「WebContent \ WEB-INF\lib」に配置する必要があります。

MySQLを使用している場合は、ここからドライバーをダウンロードできます。

これがお役に立てば幸いです。

于 2015-11-01T05:52:16.643 に答える