2013-09-23 42 views
1

我對servlet概念非常陌生。只是發現了一些理論,研究過,現在我想要一個實踐經驗。我想要做的就是創建一個可以訪問mysql數據庫的servlet。一個簡單的JSP頁面,它接受'name'和'marks',然後命中servlet,然後訪問數據庫並在數據庫中輸入名稱和標記。在servlets中使用JDBC

我已經創建了一個數據庫和一個JSP頁面。我也創建了一個servlet。我在我的庫中有mysql連接器,我用Class.forname()的概念來指代它。但是當我在我的服務器上運行這個(Tomcat v6.0)時,它給出了一個沒有發現「com.mysql.jdbc.Driver」異常的類。但是當我在另一個不是servlet的項目(它只是一個簡單的java項目)中運行這個mysql部分時,它會正確執行並且數據庫也會被更新。

只有當我使用servlet的服務器上的這段代碼的問題。我試着用Google搜索,它說我必須在Tomcat的WEB-INF/lib中包含mysql連接器。但我根本找不到這條路。任何有關這方面的建議都會對我有所幫助。提前致謝。 :)這是代碼的我的MySQL部分, 保護無效的doGet(HttpServletRequest的請求,HttpServletResponse的響應)拋出了ServletException,IOException異常{

PrintWriter out = response.getWriter(); 
    String name = request.getParameter("name"); 

    int marks = Integer.parseInt(request.getParameter("marks")); 

    try { 
     System.out.println("0"); 
     Class.forName("com.mysql.jdbc.Driver"); 

     Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/testdb123","root","root"); 

     String qr= "INSERT INTO stuinfo " + 
        "VALUES ('"+name+"',10)"; 
     System.out.println(qr); 

     System.out.println("1"); 
     Statement stmt = conn.createStatement(); 
     System.out.println("2"); 
     stmt.executeUpdate(qr); 
     System.out.println("3"); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

回答

0

Servlet容器如Tomcat運行WAR(Web歸檔)文件或文件夾。一個戰爭的標準文件夾結構爲:

(ROOT) 
| 
+- (content files and folders) 
| 
+- META-INF (optional) 
| | 
| +- MANIFEST.MF (standard Java manifest file, optional) 
| | 
| +- (other files and folders, optional) 
| 
+- WEB-INF (Tomcat considers it optional for ease of use) 
    | 
    +- web.xml (the deployment descriptor) 
    | 
    +- classes (folder that contains all the classes for this web application) 
    | 
    +- lib (contains all library JARs for this application THIS IS WHAT YOU WANT) 
    | 
    +- (other files and folders, optional) 

東西在WEB-INF/classesWEB-INF/lib JAR文件會自動包含在您的應用程序的classpath。

在您的應用程序文件夾中,您應該創建一個WEB-INF文件夾,其中包含一個lib文件夾,並將mysql-connector-XXX.jar放置在那裏。這將解決你的類路徑的問題。 servlet容器不會自動創建文件夾結構。

另外,您可以將mysql-connector-XXX.jar驅動程序複製到Tomcat的lib文件夾中。這將使其可供所有應用程序使用。


說了這麼多,請考慮以下還有:在finally塊

  1. 始終密切的聯繫:

    Connection conn = null; 
    try { 
        ... 
        conn = // get it somehow 
    } 
    catch(/* any exception you can handle, throw or let go of the rest */) { 
        ... 
    } 
    finally { 
        // close other JDBC resources (e.g. Statements, ResultSets etc) in a similar way 
        if(conn != null) { 
         try { conn.close(); } 
         catch(Exception(ignore) {} 
        } 
    } 
    
  2. 使用DriverManager.getConnection所有的時間會傷害性能現實生活。在您對基本知識有信心後,請查看連接池和javax.sql.DataSource後來,不是現在!

+0

非常感謝Nikos !!!!!有效!!!你告訴我,一旦我對這些東西感到有信心,我必須查看javax.sql.DataSource,以獲取訪問數據庫的一些有效方法。請讓我知道我應該知道什麼讓自己準備好邁出下一步? 截至目前,我有一個簡單的jsp頁面,有兩個字段 - 名稱和標記。從這裏當用戶輸入數據時,我敲擊一個將這些詳細信息輸入到數據庫的servlet。現在我正在嘗試不同的表結構,如主鍵等的限制,如果我很幸運從你那裏得到一些指導,會真的發現它有幫助。 –

+0

你應該遵循[這個例子](http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html)。然後使用[this](http://wiki.apache.org/tomcat/UsingDataSources)('InitialContext')的代碼來代替使用'DriverManager.getConnection'。簡而言之,'DataSource'是一個連接池。因爲獲取與數據庫的連接速度很慢,所以它會獲得一些連接並使用它們,從而節省重新連接的時間。 –

+0

「在您的應用程序文件夾中,您應該創建一個WEB-INF文件夾,其中包含一個lib文件夾,並將mysql-connector-XXX.jar放在該文件夾中,這將解決您的類路徑問題.Servlet容器不會自動創建文件夾結構「。 - nikos,這個方法不起作用,實際上m不能將mysql連接器添加到我的項目文件夾中爲什麼? –