【问题标题】:ClassNotFoundException of com.mysql.jdbc.Driver, when using servlets使用 servlet 时 com.mysql.jdbc.Driver 的 ClassNotFoundException
【发布时间】:2014-10-11 08:31:34
【问题描述】:

这个奇怪的问题困扰了我很长时间。我在 Eclipse 的动态 Web 应用程序中有一个类名 Connector,使用以下代码:

public class Connector {

    private static final String dbURL = "jdbc:mysql://localhost:3306/";

    private Connection con;

    public Connector(String userName, String password) {
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(dbURL, userName, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
            catch (ClassNotFoundException e) {
            e.printStackTrace();
        } 
        catch (Exception e) {
            System.err.print("Unidentified exception has acurred!");
            e.printStackTrace();
        }
    }

当我从同一个包中的不同类(名为门户)中使用它时,它工作正常,但是当我尝试从包servlets 中的servlet 中使用它时,名为LoginHandle.java,我得到ClassNotFoundException。 该类位于所有类的构建路径中,我通过尝试从 servlet 导入它来检查它,但是当我创建新实例时,它没有被识别。我试图将 servlet 移动到连接器的包中,反之亦然,它没有影响。这是servlet的代码:

    package servlets;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import portal.Connector;
import portal.UserTableAnalyzer;


@WebServlet("/LoginHandle")
public class LoginHandle extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public LoginHandle() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String referer = request.getHeader("Referer");
        String pageName = referer.substring(referer.lastIndexOf('/') + 1);
        if(pageName.equals("Login.jsp"))
        {
            HttpSession session = request.getSession(false);
            Connector c = new Connector("root", "16180339887");

            c.executeUpdate("USE Main");
            String id = request.getParameter("id"), password = request.getParameter("password");
            String query = "SELECT FROM Users WHERE id ='" + id + "' AND password = '" + password + "'";
            String[][] result = c.executeQuery(query);

            UserTableAnalyzer uta = new UserTableAnalyzer(result);
            if(result.length > 0)
            {
                session.setAttribute("userID", uta.getID(0));
                session.setAttribute("role", uta.getRole(0));
                response.sendRedirect("Main.jsp");
            }
            else
            {
                request.setAttribute("wrongDetails", new Boolean(true));
                response.sendRedirect("Login.jsp");
            }
        }
        else
            response.getWriter().print(pageName);
    }

}

对不起,如果我的英语不好,或者缺少详细信息

【问题讨论】:

    标签: servlets web-applications jdbc classnotfoundexception


    【解决方案1】:

    您的驱动程序不在服务器类路径中,构建路径与此无关。 你没有写你正在使用哪个应用程序服务器。您还应该在 servlet 中使用 DataSource,而不是 DriverManager。 Here 是 Tomcat 的示例配置。

    更新

    对于 Tomcat 7,您需要执行以下操作:

    将mysql jar 放入$CATALINA_HOME/lib
    在上下文中配置Datasource

     <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
                           maxActive="100" maxIdle="30" maxWait="10000"
                           username="user" password="pass" 
                           driverClassName="com.mysql.jdbc.Driver"
                           url="jdbc:mysql://localhost:3306/databaseName"/>
    

    在servlet中使用数据源(伪代码)

    @WebServlet("/LoginHandle")
    public class LoginHandle extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        @Resource(lookup="jdbc/testDB")
        private DataSource ds;
    
        ...
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
       Connection c = ds.getConnection();
       ...
    

    【讨论】:

    • 好的,你是对的,服务器是apache tomcat 7。我真的不明白类路径是什么,我应该如何配置它,或者设置它,或者其他什么。我会检查数据源,但如果我在 JSP 文件中使用一个类,它应该可以工作,因为服务器将 JSP 转换为 servlet,我认为......
    • 好的,我在Connector类中使用了DataSource,还是不行,然后我把jar添加到$CATALINA_HOME/lib,就可以正常使用了,非常感谢!无论如何,我不必在 servlet 类中添加东西,因为问题是缺少 jar
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2015-05-18
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多