被这个问题困扰三天了,查了不少资料,写了不少测试,真是痛苦啊。不过总算基本解决,赶紧把方法写下来,留待以后参考。
使用的软件版本:
Tomcat:Apache Tomcat 5.5.12
MySQL:MySQL Server 5.0.16
JDK:J2SE Development Kit 5.0
JRE:J2SE Runtime Environment 5.0
JDBC Driver:mysql-connector-java-3.1.13-bin.jar
别名:
$CATALINA_HOME: Tomcat的安装目录,例如D:serveTomcat 5.5
$APP_HOME:JSP网站工程所在的根目录,例如D:vstock
总问题:
如何在Tomcat环境下,使JSP和后台Java class与MySQL数据库建立连接并进行查询?
问题一:JDBC驱动到底应该放在哪里?
这个问题网上有很多回答,但是根据我的测试,根本不需要把JDBC驱动放到$CATALINA_HOMEcommonlib目录下,这个目录里面是进行Tomcat的全局配置的。为了程序的可移植和适应性考虑,只需要把JDBC的驱动mysql-connector-java-3.1.x-bin.jar放到$APP_HOMEWEB-INFlib下就可以实现在网站工程的JSP文件和$APP_HOMEWEB-INFclasses下的java bean的class里使用JDBC驱动。
问题二:应该使用哪个驱动?
有很多人不知道,jar文件其实是一种把class文件压缩到一起的一种压缩包。mysql-connector-java-3.1.x-bin.jar里一般包含两个包,一个是com.mysql.jdbc,另一个是org.gjt.mm.mysql。用WinRAR解压后可以发现,前者下面有很多class,而后者下面只有一个Driver.class,怀疑后者应该是为了兼容而设计的,而具体实现仍是在前者的包里实现,故虽然说两者使用结果上无甚区别,但最好还是用com.mysql.jdbc.Driver。
问题三:如何进行MySQL数据库的连接?
下面给出两个例子,分别是只在JSP文件里使用数据库连接和在class里使用连接。先是测试数据库的建立,后是两个MySQL数据库连接测试源文件。运行以后均输出一句话:Evil:Japanese。
1.测试数据库的建立(大小写无所谓):
进入mysql,执行以下语句:
drop database IF EXISTS datasource;
CREATE DATABASE datasource;
use datasource;
CREATE TABLE user(username varchar(50) NOT NULL,password varchar(50),PRIMARY KEY (username));
INSERT into user(username,password) values("Japanese","evil");
2.JSP文件里连接数据库,测试页面testDB.jsp,位置$APP_HOME下
testDB.jsp内容:
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.sql.*" %>
<%@ page import="javax.sql.*" %>
<%@ page import="javax.naming.*" %>
<%@ page session="false" %>
<html>
<head>
<title>test</title>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
<link href="vstock_style.css" rel="stylesheet" type="text/css">
</head>
<%
String driverName = "com.mysql.jdbc.Driver";
String userName = "MySQLuser";//你的MySQL用户名
String userPassword = "Password";//MySQL密码
String dbName = "datasource";
String tableName = "user";
String url = "jdbc:mysql://localhost/"+dbName+"?user="+userName+"&password="+userPassword;
try{
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection(url);
Statement state = conn.createStatement();
String strSql="select * from user";
ResultSet rs=state.executeQuery(strSql);
while(rs.next()){
out.print("Evil:"+rs.getString(1));
}
out.println("True");
}catch(Exception e)
{
out.println("Error");
}
%>
</head>
<body>
</body>
</html>
3.class里连接数据库,测试文件testDB.java,位于$APP_HOMEWEB-INFclassesJavaBean目录下,测试文件test.jsp,位于$APP_HOME下。
testDB.java内容:
package JavaBean;
import java.sql.*;
public class testDB{
public testDB(){}
String driverName = "com.mysql.jdbc.Driver";
String userName = "MySQLuser";
String userPassword = "Password";
String dbName = "datasource";
String tableName = "user";
String url = "jdbc:mysql://localhost/"+dbName+"?user="+userName+"&password="+userPassword;
public ResultSet getConn()
{
ResultSet rs = null;
try
{
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection(url);
Statement state = conn.createStatement();
String strSql="select * from user";
rs = state.executeQuery(strSql);
}
catch(Exception e)
{
System.out.println("Error");
}
return rs;
}
}
test.jsp内容:
<%@ page contentType="text/html;charset=GB2312" %>
<jsp:useBean id="test" scope="page" class="JavaBean.testDB"/>
<%@ page import="java.sql.*" %>
<html>
<head>
<title>test</title>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
<link href="vstock_style.css" rel="stylesheet" type="text/css">
</head>
<%
ResultSet rs = test.getConn();
while(rs.next())
{
out.print("Evil:"+rs.getString(1));
}
%>
<body />
</html>
问题四:可能的错误类型
一定要检查变量名、变量类型、函数的拼写,大小写,函数的括号,包的包含关系,数据库的路径。不要从网页上直接拷贝,最好手动输入,要检查全角的空格。唉,教训惨重啊!
结论:用以上的方法,可以把JDBC驱动只放到用户的网站工程里,移植时只需要在Tomcat里建立一个虚拟网站目录和把MySQL数据库拷贝到服务器的数据库目录下即可,不需要再有其他配置。
Copyright © 2005-2006 Solrex Yang. All rights reserved.