tomcat - 在servlet中使用 JDBC

  显示原文与译文双语对照的内容
147 1

我对servlet概念实际上是新的。 只是谷歌了一些理论研究,现在我想要一个实际的体验。 我想做的就是创建一个可以访问mysql数据库的servlet 。 接受'姓名'和'标记'然后点击servlet访问数据库并在数据库中输入名称和标记的简单JSP页面。

我已经创建了一个数据库和一个JSP页面。 我也创建了一个 servlet 。 我在库中有mysql连接器,我用 Class.forname() 概念引用它。 但是当我在服务器( Tomcat v6.0 ) 上运行这个命令时,它会给'。com.mysql. jdbc驱动程序'提供一个没有发现异常的类。 但是当我在另一个项目中运行这个mysql部件而不是 servlet ( 它只是一个简单的java项目) 时,它会正确执行并且数据库也会更新。

只有当我使用servlet在服务器上使用那段代码时才会出现问题。 我尝试了 google,它说我必须在tomcat的WEB-INF/lib中包含mysql连接器。 但我根本找不到这个路径。 任何关于这方面的建议对我都有帮助。 这是我的mysql部分代码,protected void doGet(HttpServletRequest request, HttpServletResponse response) 抛出 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();
 }

}

时间: 原作者:

97 1

像Tomcat这样的Servlet容器运行 WAR ( 网络存档) 文件或者文件夹。 WAR的标准文件夹结构是:


(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/libWEB-INF/classes 和 jars 中的内容自动包含在应用程序的类路径中。

在应用程序文件夹中,你应该创建一个 WEB-INF 文件夹,在它的中一个 lib 文件夹并将 mysql-connector-XXX.jar 放在。 这将解决你的类路径问题。 servlet容器不会自动创建文件夹结构。

或者,你可以将 mysql-connector-XXX.jar 驱动程序复制到Tomcat的lib 文件夹。 这将使它对所有应用程序都可用。


Having 表示,请考虑以下事项:

  1. 始终在finally块中关闭连接:

    
    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 。 ,不是现在 !

...