【发布时间】:2011-04-05 23:26:00
【问题描述】:
我已经通过 Eclipse 成功连接到 MySQL 数据库而没有涉及到 tomcat,所以至少这是一些不错的进展。但是当我从我的网页(Tomcat 6.0)尝试时,它会抛出一个错误。我按照教程,阅读文档并查看了无数论坛,但现在已经 2 天了。
让我们一步一步看。我正在运行tomcat 6.0.26,我已经安装了 MySQL,并且运行良好。
1.将连接器j 放置到CATALINA_HOME/lib
makun /home/makun/tomcat/apache-tomcat-6.0.26/lib ->ls | grep -i mysql*
mysql-connector-java-5.1.13-bin.jar
2。告诉 Tomcat 我的 MySQL 信息。 (声明资源需求)并映射用于调用 db test 的 servlet(即 /tmp_db_test)
(/WEB-INF/web.xml)
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>DatabaseTest</servlet-name>
<servlet-class>com.masatosan.tmp.Tmp</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DatabaseTest</servlet-name>
<url-pattern>/tmp_db_test</url-pattern>
</servlet-mapping>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/MasatoDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
3.配置tomcat资源工厂。
(CATALINE_HOME/conf/context.xml)
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!-- Masato added the line below to setup JDBC -->
<Resource
name="jdbc/MasatoDB"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="masato"
password="mypass"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/masatosan"/>
4.创建调用 servlet 的 JSP 页面
这只是一个带有发送 POST 请求的按钮的页面。
<html>
<head>
</head>
<body>
<!-- click button to send request to servlet -->
<form method="POST" action="tmp_db_test">
<p><input type="submit" value="Submit" name="submit_button"></p>
</form>
</body>
</html>
5.最后实现尝试连接 MySQL 数据库的 servlet。
(Tmp.java)
package com.masatosan.tmp;
import java.io.IOException;
//import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import com.masatosan.dateformatter.DateFormatter;
import com.masatosan.logger.Logger;
import com.mysql.jdbc.Connection;
public class Tmp extends HttpServlet {
private Connection conn;
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("jdbc/MasatoDB");
conn = (Connection) ds.getConnection();
String template = "INSERT INTO users(username, email, password, created_date) VALUES (?, ?, ?, ?);";
PreparedStatement inserter = conn.prepareStatement(template);
inserter.setString(1, "test_username");
inserter.setString(2, "test@test.com");
inserter.setString(3, "test_pass");
inserter.setString(4, DateFormatter.formatToSqlDate(null));
inserter.executeUpdate();
}
catch(Exception e) {
Logger.log(e.getMessage());
}
finally {
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
Logger.log(e.getMessage());
}
}
}
}
}
我编译了 Tmp.java 并放入 /WEB-INF/classes/com/masatosan/tmp/Tmp.class
然后重新部署Tomcat服务器并在浏览器上测试。当我点击提交按钮时,我收到错误:
javax.servlet.ServletException: Error instantiating servlet class com.masatosan.tmp.Tmp
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
java.lang.Thread.run(Thread.java:619)
root cause
java.lang.NoClassDefFoundError: Lcom/mysql/jdbc/Connection;
java.lang.Class.getDeclaredFields0(Native Method)
java.lang.Class.privateGetDeclaredFields(Class.java:2291)
java.lang.Class.getDeclaredFields(Class.java:1743)
org.apache.catalina.util.DefaultAnnotationProcessor.processAnnotations(DefaultAnnotationProcessor.java:181)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
java.lang.Thread.run(Thread.java:619)
root cause
java.lang.ClassNotFoundException: com.mysql.jdbc.Connection
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361)
java.lang.Class.getDeclaredFields0(Native Method)
java.lang.Class.privateGetDeclaredFields(Class.java:2291)
java.lang.Class.getDeclaredFields(Class.java:1743)
org.apache.catalina.util.DefaultAnnotationProcessor.processAnnotations(DefaultAnnotationProcessor.java:181)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
java.lang.Thread.run(Thread.java:619)
如果您需要更多说明,请告诉我。
编辑
根据建议,connectorj jar 保留在 CATALINA_HOME/lib 中
我已将 Tmp.java 中的导入行修复为:
import java.sql.Connection 而不是com.mysql.jdbc.Connection
现在点击浏览器上的提交按钮时出现新错误。
Cannot create JDBC driver of class '' for connect URL 'null'
我试图跟踪日志:
makun /home/makun/tomcat/apache-tomcat-6.0.26/logs ->tail -f localhost.2010-08-30.log
当我单击提交按钮时,什么也没有出现。 (我认为这是正确的日志,因为其他有错误的页面会在日志中输出消息)
更新
我不知道为什么,但是当我尝试将异常堆栈跟踪打印到我的日志时它开始工作。我一直在从管理器页面重新加载 Tomcat 很多次,这可能会导致一些奇怪的事情并得到相同的错误页面,即使我已经进行了代码更改(它吓坏了我 404 和 500 可以互换。我希望我能提供确切的细节但是我在问题部分中描述的步骤似乎有效(在修复了一些建议的事情之后)
【问题讨论】:
标签: java mysql jsp tomcat jdbc