我对 servlet 概念真的很陌生。只是用谷歌搜索了一些理论,进行了研究,现在我想要一个实践经验。我想要做的就是创建一个可以访问 mysql 数据库的 servlet。一个简单的 JSP 页面,它接受“名称”和“标记”,然后点击 servlet,后者依次访问数据库并将名称和标记输入数据库。
我已经创建了一个数据库和一个 JSP 页面。我也创建了一个 servlet。我的库中有 mysql 连接器,我用 Class.forname() 概念引用它。但是当我在我的服务器(Tomcat v6.0)上运行它时,它给出了一个类未找到'com.mysql.jdbc.Driver'的异常。但是当我在另一个不是 servlet 的项目(它只是一个简单的 java 项目)中运行这个 mysql 部分时,它会正确执行并且数据库也会更新。
只有当我在带有 servlet 的服务器上使用那段代码时才会出现问题。我尝试谷歌搜索,它说我必须在 tomcat 的 WEB-INF/lib 中包含 mysql 连接器。但我根本找不到这条路。关于这方面的任何建议都会对我有所帮助。提前致谢。 :) 这是我的 mysql 部分代码, protected void 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();
}
}
最佳答案
像 Tomcat 这样的 Servlet 容器运行 WAR(Web ARchive)文件或文件夹。 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/classes
中的内容和 WEB-INF/lib
中的 JAR 会自动包含在应用程序的类路径中。
在你的应用程序文件夹中,你应该创建一个WEB-INF
文件夹,里面有一个lib
文件夹,并放置mysql-connector-XXX.jar
在那里。这将解决您的类路径 问题。 servlet 容器不会自动创建文件夹结构。
或者,您可以将mysql-connector-XXX.jar
驱动程序复制到Tomcat 的lib
文件夹中。这将使它对所有应用程序可用。
话虽如此,请同时考虑以下几点:
总是在 finally block 中关闭连接:
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) {} } }
一直使用
DriverManager.getConnection
会损害现实生活中的性能。在您对自己的基础知识充满信心之后,请查看连接池和javax.sql.DataSource
。 以后,不是现在!
关于mysql - 在 servlet 中使用 JDBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18957317/