在JSP中使用MySQL连接到Tomcat服务器

时间:2011-01-14 01:09:31

标签: java mysql jsp tomcat jdbc

所以我试图让一些教程代码工作,而且我被卡住了。我在Eclipse中有一个Web应用程序,它包含一个DBConnector.java文件,一个Tomcat 6服务器(本地)和一个简短的JSP脚本:

package com.atj.db;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;


public class DBConnector {
private static DBConnector connector_ = null;

public static DBConnector getInstance() throws Exception {
    if (connector_ == null) {
        connector_ = new DBConnector();
    }
    return connector_;
}

public Connection getConnection() throws Exception {
    // Get DataSource
    Context ctx = new InitialContext();
    DataSource ds = (DataSource) ctx
            .lookup("java:comp/env/jdbc/mydatabase");
    Connection c = ds.getConnection();
    return c;
}

public String getFirstName() throws Exception {
    String first = "";
    try {
        Connection con = getConnection();
        Statement st = con.createStatement();
        ResultSet res = st.executeQuery("SELECT * FROM employees");
        while (res.next()) {
            first = res.getString("first");
            System.out.println(first);
        }
        con.close();
    } catch (SQLException s) {
        System.out.println("SQL code does not execute.");
    }
    return first;
}
}

我正在尝试发布JSP,但StackOverflow正在解析我的HTML ... argh..sorry..how我可以逃避这个吗?这是教程代码:

http://jspjdbc.blogspot.com/

这是一个非常简短的JSP脚本,有两条主线:

DBConnector dbConn = DBConnector.getInstance();
String name = dbConn.getFirstName(); <---error line

无论如何,当我在浏览器中打开它时,它会向控制台输出“SQL Code不执行”。我可以看到在抛出SQLException时会发生这种情况。我在getConnection中调试了这一行:

DataSource ds = (DataSource) ctx
        .lookup("java:comp/env/jdbc/mydatabase");

执行此行后,ctx主要填充空值(除了id)

然后这一行:

Connection c = ds.getConnection();

抛出SQLException,并立即将控制权交给catch块。

此外,Eclipse正在对此导入发出警告,并说“由于对所需库的限制而无法访问类型DataSource /System/Library/Frameworks/JavaVM.framework/Versions/1.4.2/Classes/ classes.jar

import javax.sql.DataSource; //<---Eclipse is complaining about this line, but still compiling

这是项目树:

project
  Java Resources: src
    com.atj.project
      DBConnector.java
    Libraries
      EAR Libraries
    JRE System Library
    Web App Libraries
      mysql-connector-java-5.1.14-bin.jar
  Web Content
    META-INF
      content.xml
      MANIFEST.MF
    Web-INF
      lib
        mysql-connector-java-5.1.14-bin.jar
      web.xml
    db.jsp
Servers
  Tomcat v6.0 server at localhost-config
    catalina.policy
    catalina.properties
    content.xml
    server.xml
    tomcat-users.xml
    web.xml

非常感谢任何帮助。

编辑 - 这是我的.xml文件

content.xml中

<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- Specify a JDBC datasource -->
<Resource name="jdbc/mydatabase"
auth="Container"
type="javax.sql.DataSource"
username="demo"
password="demo"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://www.coincan.net:3306/demo?autoReconnect=true"
validationQuery="select 1"
maxActive="2"
maxIdle="1"/>
</Context>

(新)的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"     "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp_ID">
    <display-name>db</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <resource-ref>
      <description>mydatabase</description>
      <res-ref-name>jdbc/mydatabase</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
  <res-sharing-scope>Shareable</res-sharing-scope>

1 个答案:

答案 0 :(得分:1)

我觉得你还很遥远。

您没有说明是否有一个META-INF / context.xml文件来在Tomcat中设置数据源池;你需要一个。

您没有说是否在web.xml中声明了数据源;你应该。

看看那些是否排除了你。

您可能还想阅读this。我认为JNDI名称应该是“jdbc / mydatabase”。

您当然没有在您的方法中正确关闭资源;你根本不关闭ResultSet,你应该关闭finally块中的所有内容。

在web.xml的末尾添加:

   <resource-ref>
      <description>mydatabase</description>
      <res-ref-name>jdbc/mydatabase</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
      <res-sharing-scope>Shareable</res-sharing-scope>
   </resource-ref>