2

我编写了一个简单的 JDBC,它运行良好(我使用 java 和 javac 在命令提示符下运行它)。

我还编写了一个简单的 HelloworldServlet,它运行良好(使用 Apache Tomcat 7.0)。我使用浏览器http://www.myhost.com:8088/projecthello/servlethello访问 servlet ,它会显示 Helloworld。

现在我正在尝试结合一个简单的 servlet 和 JDBC。我想查询 SELECT 到一个表,并使用这个 URL 在我的浏览器中显示它:http ://www.myhost.com:8088/projectmovie/directors-view

在文件夹 /WEB-INF/classes 中,我有 2 个文件:DirectorsViewServlet.java 和 DirectorSelect.java

这是 DirectorViewServlet.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>

问题是,当我在浏览器中使用此本地 URL http://www.myhost.com:8088/projectmovie/directors-view访问它时

结果是“ClassNotFoundException 错误”。如何解决?

我读到有人说 servlet 和 JDBC 在某种程度上是正交技术。任何进一步的解释是什么意思?为什么?

谢谢。

4

2 回答 2

2

AClassNotFoundException是一个相当简单的异常,与 servlet/JDBC 无关(看,它来自java.lang包,表示基本 Java,而不是来自javax.servletjava.sql包,否则表示 Servlet 或 JDBC 问题)。这只是意味着运行时类路径中缺少异常消息中提到的类。

不幸的是,在您的情况下,异常消息中提到的类没有打印/记录。给定代码中的异常处理非常糟糕。该代码完全抑制异常并返回自定义消息,就好像它是来自数据库的结果一样。该代码的调用者甚至无法区分数据库交互是否成功。如果您以正确抛出异常的方式重写代码,或者至少打印其堆栈跟踪,那么您应该在异常消息中看到缺少的类,如下所示

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

这又是不言自明的:运行时类路径中缺少 JDBC 驱动程序类(或在此特定情况下,包含 JDBC 驱动程序类的 JAR 文件)。

只需将 JDBC 驱动程序 JAR 文件放到 webapp 的运行时类路径中。该/WEB-INF/lib文件夹参与 webapp 的运行时类路径。只需将 JAR 文件直接放在那里并重建/重新部署/重新启动。

也可以看看:


与具体问题无关,我建议仔细阅读这篇文章以获取 JSP+Servlet+JDBC 的正确启动示例:使用 MVC 和 DAO 模式在 JSP 页面中的 HTML 中显示 JDBC结果集。代码不仅在处理异常方面很差,而且在处理数据库资源方面也很差。如果出现异常,这些可能会泄漏。

于 2013-03-25T02:22:18.640 回答
-1

如果您得到 Class not found for 'com.mysql.jdbc.Driver' 类,则意味着您的项目缺少 jdbc 驱动程序 jar 文件。您需要根据您的数据库下载 jdbc 驱动程序,并将该 .jar 文件放在项目的“WebContent\WEB-INF\lib”中。

如果您使用的是 MySQL,那么您可以从这里下载驱动程序。

我希望这有帮助。

于 2015-11-01T05:52:16.643 回答