2012-06-24 57 views
0

我正試圖在.java文件中編寫一個單獨的數據庫連接方法,它可以通過任何需要數據庫連接的servlet或jsp文件調用。我的代碼是jsp和servlets的單獨數據庫連接方法


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); 
    }   
} 
} 

現在的問題是,我會返回一個連接類型,以便所有servlet(這需要數據庫連接),可以用它來執行各種報表。然而,在我的代碼中,我應該在catch塊中返回什麼(這意味着無法建立與數據庫的連接)?此外,在連接失敗的情況下,我將用戶重定向到以下頁面:


"studentserr.html" 

,如果我在一個servlet,但也不是.java類用它也能正常工作。我該怎麼做呢?

+0

您可能需要重新考慮使用sendRedirect。看例如http://stackoverflow.com/questions/2047122/requestdispatcher-interface-vs-sendredirect – Sridhar

回答

1

返回一個null值,以防引發異常。如果您的方法獲得空值,請處理該異常並且不要執行任何數據庫操作。

此外,請記住將業務邏輯和演示文稿中的數據庫邏輯(連接,語句執行)分開。在您的實際方法中,此代碼

response.sendRedirect("studentserr.html"); 

不應該在數據庫邏輯中,因爲是表示邏輯。

更多信息:

0

嘗試移動類 「ConnectionClass」 到一些包。然後在你需要的java類中調用這個包(似乎是java文件中的classpath問題),或者在jsp或servlet頁面中調用。 示例 您需要在Demo.java中爲 pkg1.ConnectionClass obj = new pkg1.ConnectionClass();

建議將數據庫連接類設置爲單例。因此,通過應用程序只會創建並共享單個連接實例。

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; 
} 

這裏是你應該如何在使用DAO類的servlet的doGet()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任何HttpServlet方法的throws條款。在找到錯誤頁面時,servletcontainer將打開SQLException