2012-04-24 63 views
0

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

<%@ 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>"); 
%> 

下/ WEB-INF/lib目录添加在catch块的ServletException由BalusC评论,并添加odbc6.jar文件后,我得到它,我想是因为以下错误消息找不到jdbc驱动程序。

我也尝试在Apache Tomcat安装dir/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) 

回答

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


更新按您的更新:

下/ WEB-INF/lib目录添加在catch块的ServletException由BalusC评论,并添加odbc6.jar文件后,我收到以下错误消息,我认为这是由于未找到jdbc驱动程序。

然后,它是错误的JAR文件(即它不包含oracle.jdbc.driver.OracleDriver类的),或者你没有重建/重新部署/重新启动正常web应用程序。确保您已经下载了here所列Oracle数据库版本的正确JDBC驱动程序。确保你已经正确地重建/重新部署/重新启动了webapp。


我也尝试添加下Apache Tomcat安装目录/ ROOT /网络应用/ WEB_INF/lib下的jar文件,以便它们适用于所有网络应用程序,但问题仍然存在。

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

+0

嗨,我已经在我的项目构建路径的Libraries选项卡下添加了ojdbc6.jar。这不够吗? – somnathchakrabarti 2012-04-24 20:14:25

+1

不需要。您需要在项目属性的* Deployment Assembly *部分配置它,以便让JAR文件最终在构建的WAR的'/ WEB-INF/lib'文件夹中结束。但这很笨拙。只需在项目的'/ WEB-INF/lib'文件夹中手动删除物理JAR文件即可。不要忘记在构建路径中撤消您之前所做的更改。这些变化是不必要的,可能会冲突。当您将JAR文件放在项目的'/ WEB-INF/lib'文件夹中时,IDE将自动处理正确的构建路径设置。 – BalusC 2012-04-24 20:16:26

+0

是的,我从项目构建路径 - >库中删除了这些文件,并将它们添加到/WebContent/WEB-INF/lib以及/web-apps/ROOT/WEB-INF/lib可用于所有网络应用程序。但是现在由于在catch块中添加了ServletException而引发了详细的错误消息,问题依然存在。 – somnathchakrabarti 2012-04-24 20:35:33