jsp和servlet的独立数据库连接方法

时间:2012-06-24 06:26:42

标签: java jsp servlets

我试图在.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类中使用它,这可以正常工作。我该怎么做?

3 个答案:

答案 0 :(得分: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;
}

以下是如何在servlet的doGet()doPost()中使用DAO类。

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方法的HttpServlet子句中。 servletcontainer将在找到错误页面时解包SQLException

答案 1 :(得分:1)

如果抛出异常,则返回null值。如果从方法中获取空值,请处理异常并且不执行任何数据库操作。

另外,请记住将数据库逻辑(连接,语句执行)与业务逻辑和表示分开。在您的实际方法中,此代码

response.sendRedirect("studentserr.html");

永远不应该在数据库逻辑中,因为它是表示逻辑。

更多信息:

答案 2 :(得分:0)

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

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