ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Java質問&情報提供サイトコミュのJSPファイルからデータベースにアクセスできない

  • mixiチェック
  • このエントリーをはてなブックマークに追加
教えてgooでも質問したのですがこちらでも質問させてください

以下のサイトを参考にして、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"というエラーは消えません。
自分でいろいろ調べてみたのですがうまくいかなくて行き詰まってしまいました。
どうか助言や解決策があれば教えてください。
お願いいたします。

コメント(16)

エラー文に
例外

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

というものが出たので
javacでコンパイルしてみましたがエラー7に警告100ありました
警告はエンコーディングのもので、その他のjspファイルを変換したjavaファイルは
同じように警告がでていても問題がなかったのでとりあえず警告は気にしないことにしました
コンパイルエラーは

ーーー エラー ーーー
(略)
dbaccess_jsp.java:63: 警告:この文字は、エンコーディング EUC_JP_LINUX にマップできません。
^
dbaccess_jsp.java:55: ')' がありません。
// ?<????????
^
dbaccess_jsp.java:72: 文ではありません。
kana = new String(kana.getBytes("8859_1"), "EUC_JP");
^
dbaccess_jsp.java:32: 'try' への 'catch' または 'finally' がありません。
try {
^
dbaccess_jsp.java:95: 型の開始が不正です。
out.write("</p>?n");
^
dbaccess_jsp.java:105: <identifier> がありません。
}
^
dbaccess_jsp.java:106: 'class' または 'interface' がありません。
} finally {
^
dbaccess_jsp.java:107: 'class' または 'interface' がありません。
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
^
エラー 7 個
警告 100 個
ーーーーーーーーー
でした。
エンコーディグが異なるために、文字化けした文字に、なくてはならない文字(ブロックコメントの終了の、*/の*とか、文字列を閉じている、"とか)が、食われてませんか?
おそらく以前は、たまたま、そーゆー位置に文字がなかっただけて、今回は気にする必要がある(というのが、エラーから判断できる)のではないかと。

「以前は大丈夫だったから」ではなく、今回、大丈夫かどうかを、エラーメッセージ/警告メッセージと、そこで指摘されている行番号を基にして判断してください。
# というか、元のソースとあわせてエラーメッセージを見てみない限り、エラーだけ見せられても、さっぱりわかりません・・・
申し訳ありません。2000文字超えたみたいで書き込めなかったようでした
以下が実行できないjspファイルです。

ResultSet rs = db.getResultSet("select * from "member"");

のところがエラーなのですが記述の誤りなのかその他の
要因(何か設定が必要なのか)があるのか
わからずに行き詰まっています。
ソースのなかで何か間違っている記述はありますか?
よろしかったらアドバイスお願いします。

<%@
page import="java.sql.*, atmarkit.MyDBAccess"
contentType="text/html; charset=euc-jp"
%>

<%
// 内容: データベースにアクセスする

// MyDBAccess のインスタンスを生成する
MyDBAccess db = new MyDBAccess();

// データベースへのアクセス
db.open();

// メンバーを取得
ResultSet rs = db.getResultSet("select * from "member"");

// メンバー一覧表示用のテーブル
String tableHTML = "<table border=1>";
tableHTML += "<tr bgcolor=?"000080?"><td><font color=?"white?">メンバーID</font></td>"
+ "<td><font color=?"white?">名前</font></td>"
+ "<td><font color=?"white?">カナ</font></td>";

// 取得された各結果に対しての処理
while(rs.next()) {
int id = rs.getInt("member_id"); // メンバーIDを取得
String name = rs.getString("name"); // メンバー名を取得
String kana = rs.getString("kana"); // メンバー名(カナ)を取得

// 文字コードをEUCからUnicode へ変換
name = new String(name.getBytes("8859_1"), "EUC_JP");
kana = new String(kana.getBytes("8859_1"), "EUC_JP");

// テーブル用HTMLを作成
tableHTML += "<tr><td align=?"right?">" + id + "</td>"
+ "<td>" + name + "</td><td>" + kana + "</td></tr>";
}

tableHTML += "</table>";

// データベースへのコネクションを閉じる
db.close();

%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>データベースへのアクセス</title></head>
<body>
<p>-- データベースへのアクセス --</p>
<p>
<b>メンバーの一覧</b><br>
<%= tableHTML %>
</p>
</body>
</html>
// メンバーを取得
ResultSet rs = db.getResultSet("select * from "member"");
→ResultSet rs = db.getResultSet("select * from member");
これでだめかな?

SQLのテーブル名に"はいらないし。
"select * from "ここで文字列が終わってるから、JSPから変換されたServletクラスのJava構文がおかしくなってます。
Exceptionもそれらしいので出力されてますし。
文字列内に"を使うときはエスケープシーケンスを忘れずに。
>どんさん
テーブル名をクォートで囲まないで実行してだめだったので
クォートを付けて実行して、そのままにしてありました。
元に戻してtomcatを再起動して実行してみてもやはりだめでした。

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

この実行環境でなにかバージョンが合わないということなどもあるのでしょうか
postgres,tomcat,apacheなどの設定で注意することはありますか?
質問だらけですいません
SQLExceptionを解決したいのか、
Compile errorを解決したいのかよくわからず。

SQLExceptionの方は…
違うとこに接続してるとか。

>1、postgresユーザで'sampledb'というdbを作り、そのなかにmemberという
>テーブルを作成し、select * from member; を実行したところテーブル
>はありました。

\cしました?
\?した時に
\c[onnect] [DBNAME|- [USER]]
connect to new database (currently "postgres")
とかデフォルトdbに接続されてませんか?
>米国@テロ国家さん
いろいろ触っているとエラーが6行目で出たり16行目ででたりします。

6 :<%

16: ResultSet rs = db.getResultSet("select * from member");

参考サイトのソースとはテーブル名くらいしか違いがないので
記述は間違っていないと思っているのですが
テーブルがないとエラーが出続けています
>Cappuccinoさん

>>SQLExceptionを解決したいのか、
>>Compile errorを解決したいのかよくわからず。
すいません、相互に関連しているのだと思っていました。
>>SQLExceptionの方は…
>>違うとこに接続してるとか。
どのようにして確認すればよいのかがわかりません
よろしければ方法を教えていただけますか?

>>?cしました?
>>??した時に
>>?c[onnect] [DBNAME|- [USER]]
>>connect to new database (currently "postgres")
>>とかデフォルトdbに接続されてませんか?

?cと??をしてみると
sampledb=# ?c
You are now connected to database "sampledb".
sampledb=# ??
sh: line 1: more: command not found
この結果が出ました
なぜか??ができませんでした。
?hとしても同じくできませんでした。
posgresがきちんとインストールされていないということなのでしょうか?
11 たなさん

>すいません、相互に関連しているのだと思っていました。

短いjavaのプログラムを書いてdbに接続することで、jspとの切り分けは楽になりそうです。

>sampledb=# ?c

できてそうですね。

>?hとしても同じくできませんでした。

私の環境ではバックスラッシュですが、あなたの環境ではクエスチョンなのでしょうか。
postgresql-client-8.1 8.1.9-0etch1

確実にあるシステムテーブルにjavaからアクセスしてみたらいかがでしょう。
select * from pg_tables;
私のバージョンであるだけなので、ご自分のバージョンであるテーブルを\dSで確認してください。
接続先のDBのテーブルがあるかどうか確認してみましたか?
シンプルなjavaのクラス(mainクラス)等からアクセスしてみて、確認できたらそのソースを今度はJSPにて実行してみるというのも手かもしれません。

あとは、postgresqlだったらpgAdminなどのjavaとは無関係なソフトからDBのテーブルがあることを確認してみるとか。

openでステートメントを取得するところに書いてみたりしてみました。
/**
* データベースへの接続を行う
*/
public synchronized void open() throws Exception {
Class.forName(driver);
connection = DriverManager.getConnection(url, user, password);
statement = connection.createStatement();
ResultSet rs = statement.execute("select * from member");
while(rs.next()) {
System.out.println("メンバーIDを取得 : " + rs.getInt("member_id"));
}
}
まずはDBにアクセスするクラスをコマンドライン上で実行してDBにアクセスできるかどうか確認して下さい。

コマンドライン上でDBにアクセスできるのにTomcat上でできないのであればTomcatのポリシーファイルが原因ではないかと思います。
その場合はTomcatのポリシーファイルの適切な位置に
permission java.net.SocketPermission "localhost:5432","connect";
と追加すればいけると思います。

コマンドライン上からさえDBにアクセスできない場合は他に問題があると思います。
その場合/var/log以下にあるログファイルのどこかに有用な情報があるはずです。
例えば、PostgreSQLのログファイルではJSPからDBにアクセスした形跡が無ければPostgreSQLにたどり着く前に問題が生じているはずです。
その他、SQLが間違っているとかのログもとられるので確認してみてください。
14 ちひろさん

>コマンドライン上でDBにアクセスできるのにTomcat上でできないのであればTomcatのポリシーファイルが原因ではないかと思います。

確認してませんが、SecurityExceptionになりませんかね。

0>ERROR: relation "member" does not exist

無いところまで判断してるので、接続後postgresが返してるような気がします。
javaで書いてどこで例外発生してるのか見ればわかりやすいと思いますが。
15 Cappuccinoさん
私も上記の環境では確認してません(笑)

以前、Debian、Tomcat4、MySQLの環境の時に
/etc/tomcat4/policy.d/04webapps.policyに同様の記述をした際は問題ありませんでした。
まぁ、PostgreSQLにアクセスできているのであれば関係ないですね。

ログインすると、残り3件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Java質問&情報提供サイト 更新情報

Java質問&情報提供サイトのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。