我在jsp页面的正文部分插入了以下java代码,以从Oracle 10g数据库中检索表FLIGHTDATA的记录。但是在执行Class.forName(...)行之后,程序直接进入最后阻塞并关闭连接而不返回任何数据。对我做错了什么建议?谢谢 - 索姆纳特
<%@ 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)
答案 0 :(得分:3)
但是在执行Class.forName(...)行之后,程序直接进入最后阻止
只有在抛出ClassNotFoundException
时才会发生这种情况。这意味着由给定类名指定的具体类根本不在webapp的运行时类路径中。该类是Oracle JDBC驱动程序的一部分。将Oracle JDBC驱动程序JAR文件放在webapp的/WEB-INF/lib
文件夹中可以解决该问题。
此外,我强烈建议您在该空catch (Exception e) {}
块中执行某些以指示发生了异常。现在你在黑暗中无所事事地刺伤了真正发生的事情。如果你将它重新命名为ServletException
,那么你就会得到一个更加自我解释的错误页面,而不是半结果的JSP结果。
} catch (Exception e) {
throw new ServletException(e);
}
最后但并非最不重要的是,在JSP文件中编写Java代码是bad practice。如何正确挽救这一点,请查看以下答案: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
类的文件),或者您没有正确地重建/重新部署/重新启动webapp。确保已为列出的here下载了适用于Oracle数据库版本的正确JDBC驱动程序。确保您已正确重建/重新部署/重新启动了webapp。
我还尝试在Apache Tomcat安装目录/ ROOT / web-apps / WEB_INF / lib下添加jar文件,以便它们可用于所有Web应用程序,但问题仍然存在。
这是胡说八道。撤消此更改。要使JAR可用于所有已部署的Web应用程序,请将其放在Tomcat自己的/lib
文件夹(Tomcat安装文件夹中的一个文件夹)中。但如果它是错误的JAR文件,那将无法解决您的问题。