ClassNotFoundException для com.mysql.jdbc.Driver при использовании сервлетов

эта странная проблема очень мешает мне в течение длительного времени. У меня есть имя класса Connector внутри динамического веб-приложения в eclipse с этим кодом:

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 с именем LoginHandle.java, я получаю ClassNotFoundException. Класс находится в пути сборки всех классов, и я проверил его, пытаясь импортировать его из сервлета, но когда я создаю новый экземпляр, он не распознается. Пробовал переместить сервлет в пакет коннектора и наоборот, не повлияло. Вот код сервлета:

    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);
    }

}

извините, если мой английский плохой, или если детали отсутствуют


person Doc0    schedule 18.08.2014    source источник


Ответы (1)


Ваш драйвер не находится в пути к классам сервера, путь сборки не имеет к этому никакого отношения. Вы не написали, какой сервер приложений вы используете. Вы также должны использовать DataSource в сервлетах, а не DriverManager. Вот пример конфигурации для Tomcat.

ОБНОВИТЬ

Для Tomcat 7 вам нужно сделать следующее:

Поместите банку mysql в $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"/>

Использовать источник данных в сервлете (псевдокод)

@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();
   ...
person Gas    schedule 18.08.2014
comment
хорошо, вы правы, сервер apache tomcat 7. Я действительно не понимаю, что такое путь к классам и как мне его настроить, установить или что-то еще. Я проверю источник данных, но если я использую класс в файле JSP, он должен работать, если сервлет, потому что сервер переводит JSP в сервлет, я думаю... - person Doc0; 18.08.2014
comment
Хорошо, я использовал DataSource в классе Connector, и он все еще не работал, а затем я добавил банку в $CATALINA_HOME/lib, и у меня все работает, большое спасибо! в любом случае, мне не нужно было добавлять что-то в класс сервлета, потому что проблема заключалась в отсутствующем банке - person Doc0; 18.08.2014