Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将一个简单的Servlet与JDBC结合起来?代码导致ClassNotFoundException_Java_Mysql_Servlets_Jdbc_Classnotfoundexception - Fatal编程技术网

Java 如何将一个简单的Servlet与JDBC结合起来?代码导致ClassNotFoundException

Java 如何将一个简单的Servlet与JDBC结合起来?代码导致ClassNotFoundException,java,mysql,servlets,jdbc,classnotfoundexception,Java,Mysql,Servlets,Jdbc,Classnotfoundexception,我已经编写了一个简单的JDBC,它工作得很好(我使用java和javac在命令提示符下运行它) 我还编写了一个简单的HelloworldServlet,它运行良好(使用ApacheTomcat7.0)。 我使用浏览器访问servlet,它显示Helloworld 现在我尝试将一个简单的servlet和JDBC结合起来。 我想对表进行查询选择,并使用在浏览器中显示它 此URL: 在文件夹/WEB-INF/classes中,我有两个文件:DirectorsViewServlet.java和Direc

我已经编写了一个简单的JDBC,它工作得很好(我使用java和javac在命令提示符下运行它)

我还编写了一个简单的HelloworldServlet,它运行良好(使用ApacheTomcat7.0)。 我使用浏览器访问servlet,它显示Helloworld

现在我尝试将一个简单的servlet和JDBC结合起来。 我想对表进行查询选择,并使用在浏览器中显示它 此URL:

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

以下是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>

DirViewServlet
DirectorsViewServlet
DirViewServlet
/董事观点
问题是,当我用这个本地URL在浏览器中访问它时

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

我读到有人说servlet和JDBC有点正交技术。 对这意味着什么有进一步的解释吗?为什么


谢谢。

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

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

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
    at ....
这又是自我解释的:JDBC驱动程序类(或者在本例中,包含JDBC驱动程序类的JAR文件)在运行时类路径中丢失

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

另见:


与具体问题无关我建议仔细阅读这篇文章,了解JSP+Servlet+JDBC的一个合适的启动示例:。代码不仅在处理异常方面很差,而且在处理数据库资源方面也很差。如果出现异常,这些内容可能会泄漏。

如果您获取的类未找到'com.mysql.jdbc.Driver'类,则表示您的项目缺少jdbc drivers jar文件。您需要根据数据库下载jdbc驱动程序,并将该.jar文件放在项目的“WebContent\WEB-INF\lib”中

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


我希望这有帮助。

“正交”意味着servlet做的事情与JDBC完全不同,本质上servlet不需要JDBC做任何事情,JDBC也不需要servlet做任何事情。他们解决的问题是独立的。结果是,要将两者结合起来,不需要做任何特别的事情。通常,任何工作的JDBC代码都可以包含在工作的servlet代码中的任何位置。(当然,这并不意味着在任何地方都可以用JDBC做任何你想做的事情,只要你能做到。)@BalusC:谢谢你的回答。你帮我节省了很多时间!我知道我的代码很差。我在路上学习如何编写一个更好的代码。@ BaluSc:同样,这个简单的servlet代码只是我开始学习了解servlet如何工作的开始。在此之后,我将转到JSP和MVC(Spring、JSF、Hibernate等)。