我试图在.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类中使用它,这可以正常工作。我该怎么做?
答案 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。因此,在整个应用程序中,只会创建和共享一个连接实例。