【问题标题】:Why do I get an error when running a method from a jsp page, but not from a main method?为什么从 jsp 页面运行方法时出现错误,而不是从 main 方法运行?
【发布时间】:2017-05-17 05:16:10
【问题描述】:

我正在 IntelliJ IDEA Ultimate 中创建一个 Java Web 项目。我有一个类,它的方法接受两个字符串作为输入,查询数据库并返回一个 int 值。 (这是一种登录方法 - 接受用户名和密码 - 如果它们有效,它应该返回用户 ID 的 int,否则返回 0)。

我通过使用 main 方法从“Tester”类调用它来测试此方法,它返回了预期值。但是,当从 jsp 页面调用此方法时,它会为我的 SQL 驱动程序 (com.sql.jdbc.Driver) 提供一个 ClassNotFound 异常。 (我知道是这个方法给了我错误,因为我添加了一个 System.out.println 来调试它)

为什么我只在从我的 jsp 页面调用方法时收到此错误?我该如何解决这个问题?

我在控制台中得到的确切错误:

LogIn method error java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

让我痛苦的登录方法:

public static int logIn(String username, String password) {
        try {

            Class.forName("com.mysql.jdbc.Driver");

            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/my_database", "root",
                    "password12345");
            Statement stmt = con.createStatement();
            ResultSet users = stmt.executeQuery("SELECT * FROM users");

            ArrayList<User> userList = new ArrayList<User>();
            while (users.next()) {
                userList.add(
                        new User(users.getInt("id"), users.getString("username"), users.getString("password"),
                                users.getString("full_name"),
                                users.getString("email"), users.getInt("admin") == 1));
            }
            for (int i = userList.size() - 1; i >= 0; i--) {
                if (username.equals(userList.get(i).getUserName()) && userList.get(i).testPassword(password)) {
                    System.out.println(userList.get(i).getId());
                    return userList.get(i).getId();
                }
            }
            return 0;
        } catch (Exception e) {
            System.out.println("LogIn method error " + e);
            return 0;
        }
    }

JSP 页面:

<%@ page import="com.neilbanerjee.SupportMeLogic,java.sql.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    int loggedInID = MyOtherClass.logIn(request.getParameter("username"), request.getParameter("password"));
    com.neilbanerjee.User loggedIn;
    if (loggedInID == 0) {
        loggedIn = null; %>
        <%--<jsp:forward page="index.jsp"></jsp:forward>--%>
<%
    } else {
        loggedIn = MyOtherClass.loggedInUser(loggedInID);
    }
%>
<html>
<head>
    <title>SupportMeDevices</title>
</head>
<body>

Welcome, <% out.print(loggedIn.getFullName());%>!

</body>
</html>

【问题讨论】:

  • 因为 JDBS 驱动 jar 文件不在您部署的 war 文件中的 WEB-INF/lib 下,因此不在您的 webapp 的运行时类路径中。

标签: java jsp jdbc intellij-idea


【解决方案1】:

当您的 Web 应用程序部署在服务器上时,它使用服务器的 lib 文件夹的 jar 和您的 WEB-INF/lib 文件夹的 jar。

建议您将javax.servlet.jsp.jstl-1.2.4.jarjavax.servlet.jsp.jstl-api-1.2.1.jar 放在WEB-INF/lib 中,以便能够在jsp 页面上使用jstl。

【讨论】:

  • 看来我在WEB-INF 中没有lib 文件夹,我应该创建一个并将相关的jar 放入其中吗?另外,这对我的 SQL 驱动程序的 ClassNotFound 异常有帮助吗?
  • 你是个传奇。谢谢!
【解决方案2】:

当您从 main 方法调用它时,JDBC Driver 类在类路径中,Java 可以正常运行应用程序。

但是当您尝试从 JSP 访问这些类时,部署的 war 应该在其中包含 JDBC Driver 类。为了使部署的战争文件具有所有必要的类,您需要将您的应用程序所需的所有库包含到“WEB-INF/lib”中。尝试添加它们并重新部署 war 文件并查看。

【讨论】:

    猜你喜欢
    • 2015-09-19
    • 2020-11-06
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2015-07-21
    • 2015-08-08
    相关资源
    最近更新 更多