0

我试图在 .java 文件中编写一个单独的数据库连接方法,任何需要数据库连接的 servlet 或 jsp 文件都可以调用该方法。我的代码是


import java.sql.*;
import java.lang.*;

public class ConnectionClass {

private String username="root";
private String password="passwd";

/* Adjust the above two as per the username
 * password combination of your MySql databse */

public Connection connect()
{
    try
    {
        Class.forName("com.mysql.jdbc.Driver");  
        String url="jdbc:mysql://localhost/schooldatabase";
        Connection con = DriverManager.getConnection(url,username,password);
        return con;
    }

    catch(Exception e)
    {
         response.sendRedirect("studentserr.html");
         out.println(e);
    }        
 }
}

现在,问题是我将返回一个 Connection 类型,以便所有 servlet(需要数据库连接)可以使用它来执行各种语句。但是,在我的代码中,我应该在 catch 块中返回什么(这意味着无法建立与数据库的连接)?此外,如果连接失败,我会将用户重定向到以下页面:


"studentserr.html"

如果我在 servlet 中使用它而不是在 .java 类中使用它,这可以正常工作。我该怎么办?

4

3 回答 3

2

您应该只在可以明智地处理异常的那一刻捕获异常。您无法在getConnection()方法中明智地处理它们,因此您应该将其抛出,以便调用者本身需要处理它。

然而,在特定异常的情况下显示错误页面是 servlet 容器本身的责任。您通常web.xml按如下方式配置错误页面:

<error-page>
    <exception-type>java.sql.SQLException</exception-type>
    <location>/WEB-INF/errorpages/database.jsp</location>
</error-page>

您只需要相应地更改您的代码,您就不会捕获异常,或者至少ServletException在必要时重新抛出。

这是一个小的重写:

public class Database {

    private String url = "jdbc:mysql://localhost/schooldatabase";
    private String username = "root";
    private String password = "passwd";

    static {
        try {
            Class.forName("com.mysql.jdbc.Driver"); // You don't need to load it on every single opened connection.
        } catch (ClassNotFoundException) {
            throw new ExceptionInInitializerError("MySQL JDBC driver missing in classpath", e);
        }
    }

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }

}

以下是您应该如何在 DAO 类中使用它:

public List<Student> list() throws SQLException {
    List<Student> students = new ArrayList<Student>();
    Connection connection = null;
    // ...

    try {
        connection = Database.getConnection();
        // ...
    } finally { // Note: no catch block!
        // ...
        if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
    }

    return students;
}

这里是你应该如何在你的 servletdoGet()doPost().

try {
    List<Student> students = studentDAO.list();
    request.setAttribute("students", students);
    request.getRequestDispatcher("/WEB-INF/students.jsp").forward(request, response);
} catch (SQLException e) {
    throw new ServletException(e);
}

它必须重新抛出,ServletException因为您不能添加SQLException到任何方法的throws子句中。HttpServletservletcontainer 将SQLException在定位错误页面时展开。

于 2012-06-25T14:24:56.017 回答
1

Return a null value in case an exception is thrown. In case of getting a null value from your method, handle the exception and don't perform any database operation.

Also, remember to separate the database logic (connection, statement execution) from the business logic and the presentation. In your actual method, this code

response.sendRedirect("studentserr.html");

should never be in the database logic, because is presentation logic.

More info:

于 2012-06-24T06:33:27.383 回答
0

尝试将类“ConnectionClass”移动到某个包中。然后在你需要这个的java类中调用这个包(似乎是java文件中的类路径问题)或jsp或servlet页面。示例 您需要在 Demo.java 中作为 pkg1.ConnectionClass obj = new pkg1.ConnectionClass ();

建议将数据库连接类设置为单例。因此,在整个应用程序中,只会创建和共享一个连接实例。

于 2012-06-25T07:17:52.790 回答