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 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"/>

Използвайте Datasource в сървлета (псевдо код)

@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

Можете да използвате оператора за нулево обединяване ??, за да насочите null стойностите на превключване към конкретен етикет, различен от default:

public static IEnumerable<String> AsStrings(this IEnumerable<Char[]> src)
{
    Char[] rgch;

    var e = src.GetEnumerator();
    while (e.MoveNext())
    {
        switch ((rgch = e.Current)?.Length ?? -1)
        {
            case -1:    // <-- value when e.Current is 'null'
                yield return null;
                break;
            case 0:
                yield return String.Empty;
                break;
            case 1:
                yield return String.Intern(new String(rgch[0], 1));
                break;
            default:   // 2...n
                yield return new String(rgch);
                break;
        }
    }
}
- person Doc0; 18.08.2014
comment
добре, използвах DataSource в класа Connector и пак не работи, а след това добавих буркана към $CATALINA_HOME/lib и работи добре, благодаря ви много! както и да е, не трябваше да добавям неща към класа сервлет, защото проблемът беше липсващият буркан - person Doc0; 18.08.2014