0

Oracle 10g データベースからテーブル FLIGHTDATA のレコードを取得するために、jsp ページの本文部分に次の Java コードを挿入しました。しかし、 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)
4

1 に答える 1

3

しかし、 Class.forName(...) 行の実行後、プログラムは直接 finally ブロックに移動します

ClassNotFoundExceptionこれは、 aがスローされた場合にのみ発生します。これは、指定されたクラス名で指定された具象クラスが Web アプリケーションのランタイム クラスパスにまったくないことを意味します。そのクラスは、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 アプリで使用できるようにしましたが、問題は解決しません。

これはナンセンスです。この変更を元に戻します。デプロイされたすべての Web アプリケーションで JAR を使用できるようにするには、JAR を Tomcat の独自の/libフォルダー (Tomcat インストール フォルダー内のフォルダー) に配置します。しかし、それが間違った JAR ファイルである場合、問題は解決しません。

于 2012-04-24T20:07:26.177 に答える