2012-04-24 88 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

相關問題