如何将简单的 Servlet 与 JDBC 结合起来?代码导致 ClassNotFoundException
Posted
技术标签:
【中文标题】如何将简单的 Servlet 与 JDBC 结合起来?代码导致 ClassNotFoundException【英文标题】:How to combine a simple Servlet with JDBC? Code results in ClassNotFoundException 【发布时间】:2013-03-14 10:32:55 【问题描述】:我编写了一个简单的 JDBC,它运行良好(我使用 java 和 javac 在命令提示符下运行它)。
我还编写了一个简单的 HelloworldServlet,它运行良好(使用 Apache Tomcat 7.0)。 我使用浏览器访问 servlet,http://www.myhost.com:8088/projecthello/servlethello,它会显示 Helloworld。
现在我正在尝试结合一个简单的 servlet 和 JDBC。 我想查询 SELECT 到一个表,并在我的浏览器中使用 这个网址: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 在某种程度上是正交的技术。 任何进一步的解释是什么意思?为什么?
谢谢。
【问题讨论】:
“正交”意味着 servlet 做的事情与 JDBC 完全不同,而且本质上 servlet 不需要 JDBC,而 JDBC 也不需要 servlet。他们解决的问题是独立的。结果是结合一个和另一个,你不需要做任何特别的事情。通常,任何工作 JDBC 代码都可以包含在工作 servlet 代码中的任何位置。 (这当然并不意味着在任何地方都可以用 JDBC 做任何你想做的事,只要你能做到。) 【参考方案1】:如果您得到 Class not found for 'com.mysql.jdbc.Driver' 类,这意味着您的项目缺少 jdbc 驱动程序 jar 文件。您需要根据您的数据库下载 jdbc 驱动程序,并将该 .jar 文件放在项目的“WebContent\WEB-INF\lib”中。
如果您使用的是 MySQL,那么您可以从 here 下载驱动程序。
我希望这会有所帮助。
【讨论】:
【参考方案2】:ClassNotFoundException
是一个相当简单的异常,与 servlet/JDBC 无关(看,它来自 java.lang
包,表示基本 Java,而不是来自 javax.servlet
或 java.sql
包,否则会表示 Servlet 或 JDBC 问题)。这只是意味着运行时类路径中缺少异常消息中提到的类。
不幸的是,在您的情况下,异常消息中提到的类在任何地方都没有打印/记录。给定代码中的异常处理非常糟糕。该代码完全抑制异常并返回自定义消息,就好像它是来自数据库的结果一样。该代码的调用者甚至无法区分数据库交互是否成功。如果您以正确抛出异常的方式重写代码,或者至少打印其堆栈跟踪,那么您应该会在异常消息中看到丢失的类,如下所示
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at ....
这又是不言自明的:运行时类路径中缺少 JDBC 驱动程序类(或在这种特殊情况下,包含 JDBC 驱动程序类的 JAR 文件)。
只需将 JDBC 驱动程序 JAR 文件放到 webapp 的运行时类路径中。 /WEB-INF/lib
文件夹参与 webapp 的运行时类路径。只需将 JAR 文件直接放入其中并重新构建/重新部署/重新启动即可。
另见:
java.lang.ClassNotFoundException in spite of using CLASSPATH environment variable How to add JAR libraries to WAR project without facing java.lang.ClassNotFoundException? Classpath vs Build Path vs /WEB-INF/lib与具体问题无关,我建议仔细阅读这篇文章以获取 JSP+Servlet+JDBC 的正确启动示例:Show JDBC ResultSet in HTML in JSP page using MVC and DAO pattern。代码不仅在处理异常方面很差,而且在处理数据库资源方面也很差。如果出现异常,这些可能会泄漏。
【讨论】:
@BalusC:谢谢你的回答。你刚刚为我节省了很多时间!我知道我的代码真的很差。我正在学习如何编写更好的代码。 @BalusC:另外,这个简单的 servlet 代码只是我开始学习了解 servlet 如何工作的开始。之后,我将转向 JSP 和 MVC(Spring、JSF、Hibernate 等)。以上是关于如何将简单的 Servlet 与 JDBC 结合起来?代码导致 ClassNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章
Jsp学习笔记(包括Servlet,MySQL基本语法,JDBC,Struts2简单知识)