1

おはよう、

これが私のJSPコードです(注:ここのOracleサンプルアプリケーションページからわずかに変更されたソースです:http://docs.oracle.com/cd/A97336_01/buslog.102/a83726/sampapp2.htm

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

<HTML>
<HEAD> <TITLE> The JDBCQuery JSP  </TITLE> </HEAD>
<BODY BGCOLOR=white>

<% String searchCondition = request.getParameter("cond"); 
if (searchCondition != null) { %>
  <H3> Search results for : <I> <%= searchCondition %> </I> </H3>
  <%= runQuery(searchCondition) %>
  <HR><BR>
  <% }  %>

<B>Enter a search condition:</B>
<FORM METHOD=get> 
<INPUT TYPE="text" NAME="cond" SIZE=30>
<INPUT TYPE="submit" VALUE="Ask Oracle">
</FORM>
</BODY>
</HTML>
<%! 
 private String runQuery(String cond) throws SQLException {
Connection conn = null; 
 Statement stmt = null; 
 ResultSet rset = null; 
 try {
    DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
    conn = DriverManager.getConnection((String)session.getAttribute  ("url"),
                                             "username", "pw");
          stmt = conn.createStatement();
          rset = stmt.executeQuery ("SELECT ename, sal FROM scott.emp "+ 
                                    (cond.equals("") ? "" : "WHERE " + cond ));
         return (formatResult(rset));
      } catch (SQLException e) { 
          return ("<P> SQL error: <PRE> " + e + " </PRE> </P>\n");
      } finally {
               if (rset!= null) rset.close(); 
               if (stmt!= null) stmt.close();
               if (conn!= null) conn.close();
      }
        }

   private String formatResult(ResultSet rset) throws SQLException {
     StringBuffer sb = new StringBuffer();
     if (!rset.next())      
       sb.append("<P> No matching rows.<P>\n");
     else {  sb.append("<UL><B>"); 
          do {  sb.append("<LI>" + rset.getString(1) + 
                             " earns $ " + rset.getInt(2) + ".</LI>\n");
             } while (rset.next());
          sb.append("</B></UL>"); 
     }
     return sb.toString();
   }
 %>

エラーは次の行で発生します。

    DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
    conn = DriverManager.getConnection((String)session.getAttribute("url"),
                                             "username", "pw");

ここで、セッションは例外をスローします。オラクルコードでは、getAttributeの代わりにgetValueが使用されますが、getValueは減価償却されることに注意してください。Class.forName()ステートメントを使用してみました。ただし、これでは問題が解決しないようです。このコードで見落としているものはありますか?どんな助けでも大歓迎です。私はojdbc14.jarパッケージを使用しています。

エラーを含めるように編集:

org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: 28 in the jsp file: /PGS/JDBCQuery.jsp
session cannot be resolved
 25:      ResultSet rset = null; 
 26:      try {
 27:         DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
 28:      conn = DriverManager.getConnection((String)session.getAttribute       ("url"),
 29:                                            "username", "pw");
 30:         stmt = conn.createStatement();
 31:         rset = stmt.executeQuery ("SELECT ename, sal FROM scott.emp"+ 
4

2 に答える 2

4

問題はドライバーとは関係ありません。存在しない変数を使用するメソッドを定義しているため、コードはコンパイルsessionされません。これはローカル変数でもメソッドの引数でもなく、JSP のフィールドでもありません。

私のアドバイス: スクリプトレットの使用をやめ、このコードを Java クラスに入れます。JSP はビュー コンポーネントです。これらは、JSP EL、JSTL、およびその他のカスタム タグを使用して、マークアップを生成するためにのみ使用する必要があります。データ アクセス コードは、サーブレットとして実装されたコントローラーから呼び出される別のクラスにある必要があります。

于 2013-03-07T17:20:00.183 に答える
3

問題はドライバーとは何の関係もありません。

すべてのデータロジックは、JSP宣言タグ(<%!%>)内にあります。その中のコードは、コードから生成されるサーブレットに追加されます。そのコンテキストでは、セッション変数は存在しません。

宣言(<%!%>)を単純なスクリプトレット(<%%>)に変更した場合、そのコンテキストではセッション変数が存在し、期待どおりに機能するため、達成しようとしていることは機能します。

しかし、誰もがすでに言っているように、jspページにスクリプトレットを追加するべきではありません。RequestDispatcherを含むサーブレットをjspファイルに使用し、jspファイルにいかなる種類のJavaコードも追加しないようにします。

于 2013-03-07T17:25:54.013 に答える