• 締切済み

JSPファイルからデータベースにアクセスできない

以下のサイトを参考にして、JSPからデータベースにアクセスして ブラウザに表示させようとしています。 http://www.atmarkit.co.jp/fjava/rensai/jsp10/jsp10.html 実行環境は以下です OS: Vine Linux 4.1 PostgreSQL: version 8.2.5 Tomcat: version 5.5.25 Java: Java 2 SDK, standard Edition, version 1.5.0_13 ブラウザからjspファイルにアクセスすると次のエラーがでてきます ーーー エラー文 ーーー HTTPステータス 500 - type 例外レポート メッセージ 説明 The server encountered an internal error () that prevented it from fulfilling this request. 例外 org.apache.jasper.JasperException: Exception in JSP: /dbaccess.jsp:16 13: db.open(); 14: 15: // メンバーを取得 16: ResultSet rs = db.getResultSet("select * from member"); 17: 18: // メンバー一覧表示用のテーブル 19: String tableHTML = "<table border=1>"; Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:451) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:355) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 原因 javax.servlet.ServletException: ERROR: relation "member" does not exist (略) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 原因 org.postgresql.util.PSQLException: ERROR: relation "member" does not exist org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1548) (略) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) ーーー ここまで ーーー 自分が行った手順なんですが、 1、postgresユーザで'sampledb'というdbを作り、そのなかにmemberという テーブルを作成し、select * from member; を実行したところテーブル はありました。 2、MyDBAccess.javaは参考サイトとほぼ同じです。 コンストラクタの設定のところを以下のようにしました。 ーーーーーーーーーーーー public MyDBAccess() { driver = "org.postgresql.Driver"; url = "jdbc:postgresql://localhost:5432/sampledb; user = "postgres"; password = "********"; } ーーーーーーーーーーーー コンパイルも通ったので TOMCAT_HOME/webapps/####/WEB-INF/classes/atmarkitに クラスファイルを置きました。 3、jspファイルはdbaccess.jspという名前でそのまま使いました。 TOMCAT_HOME/webapps/####/dbaccess.jsp 4、/usr/local/pgsql/data/postgresql.confの #listen_addresses = 'localhost' を listen_addresses = '*' に書き換え、その後に $ pg_ctl reload としました。 5、ブラウザから "http://localhost:8080/####/dbaccess.jsp" にアクセスするとエラーがでました。 例外の部分のエラーはいろいろいじっていると出たり出なかったりですが、 "relation "member" does not exist"というエラーは消えません。 自分でいろいろ調べてみたのですがうまくいかなくて行き詰まってしまいました。 どうか助言や解決策があれば教えてください。 お願いいたします。

みんなの回答

  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.4

確認したかったのは、JSPファイルでクエリ文を変更した場合のエラーの違いです。 クォートを付けた場合と付けない場合でエラーが変わっているのかと思ったためです。 少し状況を整理しましょうか。 今回の環境としては、 1.OSはVineLinux 2.データベースはPostgreSQL 3.JSPを利用してサンプルプログラムを実行している 大きく分けるとおよそこんな感じです。 原因もこのいずれかにあると思われます(おそらく) そこで、どこが悪く、どこが悪くないかを判断するため、以前の回答で確認していたわけです。 まず、Javaアプリケーションとして実行して問題ないかどうか、ですが、 これで動作すればPostgreSQLの方はおよそ問題なさそうと判断できます。 ※本当はそうとも言い切れないけど… プログラムとしては、データベースアクセス処理とResultSetの取得(クエリの実行)、 そして最後のクローズ処理があれば細かいところはなくても良いでしょう。 例えば以下のとおりです  // MyDBAccess のインスタンスを生成する  MyDBAccess db = new MyDBAccess();    // データベースへのアクセス  db.open();    //ResultSetの取得(クエリの実行)  ResultSet rs = db.getResultSet("select * from member");    //クエリ実行に成功したら表示  System.out.println("データベースに接続しました。");    // データベースへのコネクションを閉じる  db.close(); こんな感じでJavaファイルを作成し手動でコンパイルし、javaコマンドで実行したらどうなるか。 JSPと同じように「relation …」の例外が出ればデータベースに何か原因があるかも知れません。 クォートの方は、 … db.getResultSet("select * from member"); と、 … db.getResultSet("select * from \"member\""); という2つで違いがあるかどうか。 違いがあれば、このクエリの実行環境、つまりJSPやTomcatを実行する際には テーブル名にクォートを付けないといけない、というケースがあったようなので念のためです。 (これはググったら出てきただけなので、詳細な理由は不明ですが…) あとは最終手段に近くなりますが、先に挙げた1.2.に注目して、 ・PostgreSQLで他のデータベースを作成してそちらでも試してみる ・PostgreSQLをインストールし直す(Vineだと大変かなあ…) ・別のPCで環境を作って同じ現象が出るか確認(Winだとやりやすい?) 一応、自分のPC(WinXP)でもやってみましたが、動作しました。 ※かなりいいかげんに試したのでJSPが文字化けしてますが… 案外、環境をガラっと変えるとすんなり動いたりするかもしれませんね。

  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.3

>恐縮なのですけどJDBCから実行するというのは具体的にどういうことを意味しているのですか? すみません。間違った言い方してました。JDBCから実行って当たり前ですね。 JSPではなく、Javaアプリケーションとして実行、ということです。 例えば、 http://www.atmarkit.co.jp/fjava/rensai/jdbc02/jdbc02.html このサイトのような感じです。 TomcatやJSPを使うと、どうしてもサーバの設定などが関係して原因の特定が難しいので、 できるだけシンプルな構成で試して原因を探っていく、ということです。 >jspファイル内の記述もクォートを付けて試してみましたがエラー文が変わり解決しませんでした。 >jspファイルがコンパイルできないとは出つづけているので う~ん、コンパイルエラーが出るのは不思議ですね。 ちなみに「select * from "member"」のクォートはエスケープして、 「select * from \"member\"」とする、くらいはありますが… 変わったエラーはどんなものでしょうか?

tana0901
質問者

補足

>う~ん、コンパイルエラーが出るのは不思議ですね。 >変わったエラーはどんなものでしょうか? エラーは最初の質問内容にのせてあるものと同じことを言ってると思うのですがそのURLを何度かリロードするとなぜか違うエラーがでることがあるのです。一応長いのですが2つ載せてみます。 ーーー 1 ーーー HTTPステータス 500 - type 例外レポート メッセージ 説明 The server encountered an internal error () that prevented it from fulfilling this request. 例外 org.apache.jasper.JasperException: JSPのクラスをコンパイルできません: JSP FileName:/dbaccess.jsp Java FileName:/usr/local/tomcat5.5.25/work/Catalina/localhost/javaroad//org/apache/jsp/dbaccess_jsp.java JSPファイル: /dbaccess.jsp の中の6行目でエラーが発生しました Syntax error on token "member", , expected 3: contentType="text/html; charset=euc-jp" 4: %> 5: 6: <% 7: // 内容: データベースにアクセスする 8: 9: // MyDBAccess のインスタンスを生成する Stacktrace: org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:98) org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330) org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:435) org.apache.jasper.compiler.Compiler.compile(Compiler.java:298) org.apache.jasper.compiler.Compiler.compile(Compiler.java:277) org.apache.jasper.compiler.Compiler.compile(Compiler.java:265) org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:302) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) ーーー 2 ーーー HTTPステータス 500 - type 例外レポート メッセージ 説明 The server encountered an internal error () that prevented it from fulfilling this request. 例外 org.apache.jasper.JasperException: Exception in JSP: /dbaccess.jsp:6 3: contentType="text/html; charset=euc-jp" 4: %> 5: 6: <% 7: // 内容: データベースにアクセスする 8: 9: // MyDBAccess のインスタンスを生成する Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:451) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:355) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 原因 javax.servlet.ServletException: ERROR: relation "member" does not exist (略) 原因 org.postgresql.util.PSQLException: ERROR: relation "member" does not exist (略) JSPファイルのソースも同じなのに出力が違う("原因"が出る場合と出ない場合)のがなぜなのかわかりません。

  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.2

エラーメッセージからして、やはりデータベースもしくはテーブルに何かありそうですね。 「select * from member」というSQLを 「select * from "member"」となるように、つまりテーブル名をクォートで囲む、 というのがあるようなのですが、これは試してみましたでしょうか? あとは、原因の切り分けとして、 テーブルまたはデータベースを別のものを用意して、それでも同じかどうか (現在作成したテーブルに問題があるかどうか) JSPからではなく、JDBCから実行する(Tomcat側の問題があるかどうか) といったことを確認して、どこに原因があるかを探っていく、というのがトラブル解決の基本なので、 こういったことを試してみてはどうでしょう。

tana0901
質問者

お礼

回答ありがとうございます。 返答が遅くなってしまってもうしわけありません。 「select * from "member"」は jspファイル内の記述ではなくてpostgresのコマンドラインですよね? postgresのコマンドラインではクォートを付けなくても付けてもテーブルの参照はできました。 jspファイル内の記述もクォートを付けて試してみましたがエラー文が変わり解決しませんでした。そのエラー文なんですがjspファイルにアクセスして何度かリロードするとエラー文の原因の部分があったりなかったりします。これはどう解釈していいかわからず困っています。 jspファイルがコンパイルできないとは出つづけているのでやはり何か別の作業が必要なのではないかと思いました。 恐縮なのですけどJDBCから実行するというのは具体的にどういうことを意味しているのですか? やりかたが自分ではわかりませんでした。すいません。

  • yoshog
  • ベストアンサー率66% (6/9)
回答No.1

> org.postgresql.util.PSQLException: ERROR: relation "member" does not exist エラーから判断するに、JSPの問題ではなくて、データベースの問題ですね。 スキーマがpublicじゃないとかそうゆう問題かもしれないです。 Googleで「relation does not exist postgresql」をキーワードにして検索すると、参考になりそうなページが見つかりますよ。 http://www.google.co.jp/search?q=relation++does+not+exist+postgresql&sourceid=navclient-ff&ie=UTF-8&rls=GGGL,GGGL:2006-46,GGGL:ja

tana0901
質問者

お礼

回答ありがとうございます。 スキーマは以下のようにpublicでした sampledb=# \d List of relations Schema | Name | Type | Owner --------+----------------------+----------+---------- public | member | table | postgres public | member_member_id_seq | sequence | postgres エラー文の検索は質問を投稿する前にやってみてはいました。 回答をいただいてもう一度探してみたのですが やはり参考になりそうなページが見つかりませんでした;; ブラウザでjspにアクセスしたとき、 ターミナルでデータベースに入っている(?)状態にこちらにも 以下のようにエラー表示されます sampledb=# ERROR: relation "member" does not exist STATEMENT: select * from member LOG: unexpected EOF on client connection やはりデータベース側の問題なのでしょうか;;

関連するQ&A