- PR -

JSPにおけるDBからのデータ抽出

1
投稿者投稿内容
takion
会議室デビュー日: 2007/05/10
投稿数: 9
お住まい・勤務地: 大阪府
投稿日時: 2007-05-24 10:38
JSPを始めたばかりの初心者です。
行き詰っているので教えていただきたいのですが、
現在DBにHSQLDBを使用し、開発環境はEclipseで、
下記のようにソースを書きました。

*JSPファイル一部抜粋

<p>当選番号入力</p>
<p>

<%
List list = (List)request.getAttribute("list");

if(int i=0;i<list.size();i++){
LotoPage page = (LotoPage)list.get(i);
}
out.println(page.getInt("kaisu"));
%>

</p>

これで実行すると下記のようなエラーが出てしまいます。

org.apache.jasper.JasperException: JSPのクラスをコンパイルできません

JSPファイル: /nyuryoku.jsp の中の4行目でエラーが発生しました
生成されたサーブレットのエラーです:
Syntax error on token(s), misplaced construct(s)

JSPファイル: /nyuryoku.jsp の中の4行目でエラーが発生しました
生成されたサーブレットのエラーです:
Syntax error on token(s), misplaced construct(s)

JSPファイル: /nyuryoku.jsp の中の4行目でエラーが発生しました
生成されたサーブレットのエラーです:
Syntax error on token ")", ; expected

しかし、JSPファイルのソースを下記のように書き換えるとうまくいきます。

<p>当選番号入力</p>
<p>

<%
List list = (List)request.getAttribute("list");
%>
<c:forEach var="list" items="${list}">
${list.kaisu+1}
</c:forEach>

</p>

なぜ最初のソースでうまくいかなかったのか分かりません。
すみませんが、教えていただけないでしょうか?
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2007-05-24 10:52
エラーに
JSPファイル: /nyuryoku.jsp の中の4行目でエラーが発生しました
て出ているじゃない。
4行目をまず見ましょう。

提示されたJSPの内容ではどこが4行目なのか分りません。

それはさておき、
提示されたソースから想像できる問題はあります。

・for文がif文になっています。
・out.println(page.getInt("kaisu"));
 で変数pageを使っていますが宣言されていません
・クラスLotoPageはimportされていますか?

ぱっと見えるだけでも3点。
問題だらけデスヨ。
ひろ@ya
大ベテラン
会議室デビュー日: 2006/02/23
投稿数: 168
投稿日時: 2007-05-24 13:01
pageって変数名は良くないですね。
JSPのクラスインスタンスを表す暗黙オブジェクトの名前と衝突しています。
http://www.atmarkit.co.jp/fjava/rensai2/jspservlet05/jspsevlet05_1.html


[ メッセージ編集済み 編集者: ひろ@ya 編集日時 2007-05-24 13:41 ]
takion
会議室デビュー日: 2007/05/10
投稿数: 9
お住まい・勤務地: 大阪府
投稿日時: 2007-05-24 15:27
あすか様、ひろ@ya>
ご指摘ありがとうございます。
お二方のご指摘を参考に下記のように修正いたしましたが、
まだエラーになってしまいます。あすか様ご指摘のインポートですが、
下記のようにheader.jspファイルでインポートしています。

<インポート>
<%@page import="java.util.List, java.sql.ResultSet, loto.LotoPage"%>

<エラー内容>
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません

JSPファイル: /nyuryoku.jsp の中の4行目でエラーが発生しました
生成されたサーブレットのエラーです:
lotopage cannot be resolved

<nyuryoku.jsp>
1 :<p>当選番号入力</p>
2 :<p>
3 :第
4 :<%
5 :List list = (List)request.getAttribute("list");
6 :
7 :for(int i=0;i<list.size();i++){
8 : LotoPage lotopage = (LotoPage)list.get(i);
9 :}
10:out.println(lotopage.getKaisu());
11:%>
12:回
13:</p>

あと、LotoPage.javaの内容は下記の様になっています。
<LotoPage.java>
package loto;

public class LotoPage {
private int kaisu;
public int getKaisu(){
return kaisu;
}

public void setKaisu(int kai){
this.kaisu = kai;
}
}

あれからかなり悩んでいますが、解決できていないので
どうか宜しくお願い致します。
takion
会議室デビュー日: 2007/05/10
投稿数: 9
お住まい・勤務地: 大阪府
投稿日時: 2007-05-24 15:44
すみません、解決しました。
For文の前に

LotoPage lotopage = new LotoPage();

で宣言を付け加えると解決しました。

あすか様からの助言でありましたが、
私は

LotoPage lotopage = (LotoPage)list.get(i);

で、宣言と同時にlistを入れていると勘違いしていました。

あすか様、ひろ@ya様、懇切丁寧な助言ありがとうございました。
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2007-05-25 10:13
ちょおおおおとまって!
引用:

takionさんの書き込み (2007-05-24 15:44) より:
すみません、解決しました。
For文の前に

LotoPage lotopage = new LotoPage();

で宣言を付け加えると解決しました。

あすか様からの助言でありましたが、
私は

LotoPage lotopage = (LotoPage)list.get(i);

で、宣言と同時にlistを入れていると勘違いしていました。

あすか様、ひろ@ya様、懇切丁寧な助言ありがとうございました。



変数の有効範囲ってわかってます?
forブロック内で宣言した変数は
forブロック内でしか有効になりません。

6 :LotoPage lotopage = new LotoPage();
7 :for(int i=0;i<list.size();i++){
8 : lotopage = (LotoPage)list.get(i);
9 :}
10:out.println(lotopage.getKaisu());

こう修正したってことですか?
これは
6 :LotoPage lotopage = (LotoPage)list.get(list.size()-1);
7 ut.println(lotopage.getKaisu());
とまったく同じ意味です。
for文が無駄です。
何をしたいのかわかりません。

どんなものを作りたいのかわかりませんが
質問用に適当に書いたロジックだった、
と言うのならいいのですが
とても心配です。

大丈夫でしょうか。
1

スキルアップ/キャリアアップ(JOB@IT)