0

我在我的 jsp 页面的正文部分插入了以下 java 代码,以从 Oracle 10g 数据库中检索表 FLIGHTDATA 的记录。但是在执行 Class.forName(...) 行之后,程序直接进入 finally 阻塞并关闭连接而不返回任何数据。关于我做错了什么的任何建议?谢谢 - 索姆纳特

<%@ page import="java.sql.*" %>
<%@ page import="java.io.*" %>

<%
out.println("<table border='1'><tr>");
Connection connection = null;
Statement statement = null;
ResultSet rs_1hop = null;
ResultSetMetaData rsm_1hop = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String connectionURL = "jdbc:oracle:thin:@localhost:1521:xe";
connection = DriverManager.getConnection(connectionURL, "system", "system");
statement = connection.createStatement();
// sql query to retrieve values from the secified table.
String QueryString = "SELECT * from FLIGHTDATA";
rs_1hop = statement.executeQuery(QueryString);
rsm_1hop = rs_1hop.getMetaData();
int colCnt = rsm_1hop.getColumnCount();

for (int i=1; i<=colCnt; ++i) {
    out.println("<th>" + rsm_1hop.getColumnName(i) + "</th>");
}
out.println("</tr>");

while (rs_1hop.next()) {
    out.println("<tr>");
    for (int i=1; i<=colCnt; ++i)
        out.println("<td>" + rs_1hop.getString(i) + "</td>");
    out.println("</tr>");
}

} catch (Exception e) {

} finally {
    if (statement != null)
        statement.close();
    if (connection != null)
        connection.close();
}
out.println("</table><br><br>");
%>

在按照 BalusC 的注释在 catch 块中添加 ServletException 并在 /WEB-INF/lib 下添加 odbc6.jar 文件后,我收到以下错误消息,我认为这是由于找不到 jdbc 驱动程序。

我还尝试在 Apache Tomcat 安装目录 /ROOT/web-apps/WEB_INF/lib 下添加 jar 文件,以便它们可用于所有 Web 应用程序,但问题仍然存在。

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: javax.servlet.ServletException: DB interaction failed!           org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:500)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:410)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

根本原因

javax.servlet.ServletException: DB interaction failed!
     org.apache.jsp.retrievePossibleRoutes_jsp._jspService(retrievePossibleRoutes_jsp.java:96)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

根本原因

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
    org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
    org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:128)
    org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:66)
    java.lang.Class.forName0(Native Method)
    java.lang.Class.forName(Unknown Source)
    org.apache.jsp.retrievePossibleRoutes_jsp._jspService(retrievePossibleRoutes_jsp.java:73)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
4

1 回答 1

3

但是在 Class.forName(...) 行执行后,程序直接进入 finally 块

只有ClassNotFoundException在抛出 a 时才会发生这种情况。这意味着给定类名指定的具体类根本不在 webapp 的运行时类路径中。该类是 Oracle JDBC 驱动程序的一部分。将 Oracle JDBC 驱动程序 JAR 文件放在/WEB-INF/libwebapp 的文件夹中应该可以解决该问题。

此外,我强烈建议您在该空块中执行某些catch (Exception e) {}操作以指示发生了异常。现在,你在黑暗中对真正发生的事情一无所知。如果您将它重新抛出为ServletException,那么您将得到一个更加不言自明的错误页面,而不是半生不熟的 JSP 结果。

} catch (Exception e) {
    throw new ServletException(e);    
}

最后但同样重要的是,在 JSP 文件中编写 Java 代码是一种不好的做法。如何正确解决这个问题,请查看以下答案:Show JDBC ResultSet in HTML in JSP page using MVC and DAO pattern


根据您的更新进行更新

在按照 BalusC 的注释在 catch 块中添加 ServletException 并在 /WEB-INF/lib 下添加 odbc6.jar 文件后,我收到以下错误消息,我认为这是由于找不到 jdbc 驱动程序。

那么它是错误的 JAR 文件(即它不是包含oracle.jdbc.driver.OracleDriver该类的文件),或者您没有正确重建/重新部署/重新启动 web 应用程序。确保您已下载此处列出的适用于您的 Oracle 数据库版本的正确 JDBC 驱动程序。确保您已正确重建/重新部署/重新启动 web 应用程序。


我还尝试在 Apache Tomcat 安装目录 /ROOT/web-apps/WEB_INF/lib 下添加 jar 文件,以便它们可用于所有 Web 应用程序,但问题仍然存在。

这是无稽之谈。撤消此更改。要使 JAR 可用于所有已部署的 Web 应用程序,请将其放在 Tomcat 自己的/lib文件夹中(直接在 Tomcat 安装文件夹中)。但是如果它是错误的 JAR 文件,那将无法解决您的问题。

于 2012-04-24T20:07:26.177 回答