プロが教えるわが家の防犯対策術!

いつもお世話になっております。

・windows2000
・j2sdk-1_4_1_07-windows-i586
・jakarta-tomcat-4.1.31
・mysql-4.0.25-win32
で開発学習をしています。

頭を抱えている問題は、
サーブレットでデータの絞込み→Beanに格納→JSPでデータの表示
という部分で、実行すると

org.apache.jasper.JasperException: タイプ 'hellojava.ConnectBean' のbean中の属性 'Id' の情報を発見できませんでした
at org.apache.jasper.runtime.JspRuntimeLibrary.getReadMethod(JspRuntimeLibrary.java:650)
at org.apache.jasper.compiler.Generator$GenerateVisitor.visit(Generator.java:652)
at org.apache.jasper.compiler.Node$GetProperty.accept(Node.java:507)
             ・
             ・
             ・
とエラーがかえってきます。

1)Tomcatに
  java.sql.SQLException: After end of result set・・・
  と出てきてしまう。

2)HTMLのテキストボックスに英数字のみの入力制限をしていても、データ[Id]がint型なのに対して異なった型で検索もしくは格納しようとしているためにエラー・・・?

このようなことが原因かと思い調べているのですが、解決に結びつきません。

いつも申し訳ありませんが、
どなたかご教授願えませんでしょうか。
よろしくお願いいたします。

A 回答 (6件)

>Tomcatのエラーはなくなりました。


あ、SQLの処理は通るようになったようですね(^^

>bean中の属性 'Id' の情報を発見できませんでした
もしかして、<jsp:getPropety name="reqObject" property="Id" />
としていませんか?property="Id"をproperty="id"としてみてください。
BeanでsetFooBar/getFooBarとメソッド定義している場合、
property名はfooBarという風に先頭は小文字にして扱います。
これが違っていたら、今度はJSPでidを表示しようとしている辺りのソースをお願いします。


>if (count == 0) {
>catch (Exception e)
この2つは、各エラー処理が終わったらreturnしておきましょう。
if文を処理した後や、catch内でErr.jspへのフォワードを終了した後、
その後に記述されている処理(kekka.jspへのフォワード部分)が
実行されてしまっています。


>>リクエストにセットされたConnectBeanは空っぽのまま方っておかれているようですが…
>申し訳ございませんが、詳しく説明していただけないでしょうか?
#4の補足を見ると、リクエストにセットする処理とDBから値を取り出す処理の
位置が最初と変わっているようなので、ちょっと違っていました。
最後の物だけが出力される状態です。
仕様の是非は決めの問題なので、課題で明示されていなければ問題ないです。
(パフォーマンス上は最初の一件表示の方がいいです。無駄なループがなくなるので)
    • good
    • 0
この回答へのお礼

deadlock様 ご回答本当にありがとうございます。

>property="Id"をproperty="id"としてみてください。
をしたところ・・・
解決しました!!!本当にうれしいです!!
deadlock様にはなんとお礼いっていいのやら、本当に感謝いたします。
>property名はfooBarという風に先頭は小文字にして扱います。
深く考えずにコードを書いていました。本当にご迷惑おかけいたしました。

>>if (count == 0) {
>>catch (Exception e)
>この2つは、各エラー処理が終わったらreturnしておきましょう。
さっそく修正いたします。

>#4の補足を見ると、リクエストにセットする処理とDBから値を取り出す処理の
位置が最初と変わっているようなので、ちょっと違っていました。
最後の物だけが出力される状態です。
丁寧なご回答ありがとうございました。

一つ一つ丁寧に教えていただき、本当にどうもありがとうございました。
今後ともよろしくお願いいたします。

お礼日時:2005/09/08 08:15

Jasperに関しては、以下に過去ログがあります。

言うまでもなく、現在、ConnectBean.classは、classesフォルダ内にて、新規に作成したhellojavaフォルダの中に格納されているはず、ですよね?

http://oshiete1.goo.ne.jp/kotaeru.php3?q=1495409

以上の内容でもまだ、エラーが出るようでしたら、手当たり次第にデバッグ文を追加しまくって、エラーの切り分けをしていって下さい。具体的には、リクエストパラメータ「txtKensaku」がちゃんと渡ってきているのかどうかとか、はたまた、Beanにプロパティ値の設定を行う前に、sql文より取得したデータ「rs.getInt("ID")」がちゃんとあるのかどうか、など。

それから、プロパティ「Id」の型などが気になるようでしたら、getIntメソッドの引数を、現行のカラム名ではなく、列番号にて指定するようにしてみて下さい。本来は、こちらの方が処理的に早いので、変更しておくことをお勧めします。

それにもかかわらず、やはりバグが何なのか分からないようでしたら、あとはもう、Beanしか残っていませんね。ソースの公開がしにくいようでしたら、以下の過去ログなどを元に、もう一度、ConnectBean.javaの内容を確認してみて下さい。

http://oshiete1.goo.ne.jp/kotaeru.php3?qid=1544044


ゴールはもうすぐですよ、がんばってね~~。
    • good
    • 0
この回答へのお礼

choconamacream様 ご回答ありがとうございます。

>Jasperに関しては、以下に過去ログがあります。
教えていただいた情報を元に、勉強させていただきます。

choconamacream様の励ましうれしかったです。
もっと勉強を頑張っていきたいと思います。

アドバイスありがとうございました。
今後ともよろしくお願いいたします。

お礼日時:2005/09/08 08:19

>しかし、同じエラーが発生してしまいます。


同じエラーとは何を指していますか?JSPとSQLがありましたよね?
SQLでエラーが発生しているのであれば、JSPは後回しです。
まだSQLExceptionのスタックトレースは見せてもらっていません。
回答者はソースやログを直に見れるわけではないので「エラーが発生した」では分かりません。
・SQLExceptionのスタックトレース
・修正後のソース全体
・エラー発生行が提示されたソースのどの箇所にあたるのか
この3つをお願いします。

>1.ResultSet#next()を呼んでいない
の対処ですが、レコードは複数になるべきものですか?
そうでないなら配列にする必要はありません。
>4.リクエストからのBean取り出し
の修正をあわせてみた限りでは、リクエストにセットされたConnectBeanは空っぽのまま方っておかれているようですが…

この回答への補足

deadlock様 お返事どうもありがとうございます。
>回答者はソースやログを直に見れるわけではないので「エラーが発生した」では分かりません。
本当に申し訳ありません・・・。

>・SQLExceptionのスタックトレース
Tomcatのエラーはなくなりました。

>・修正後のソース全体
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import hellojava.*;
import hellojava.DBConnectionPool;

public class RequestServKensaku extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

PrintWriter out = response.getWriter();

response.setContentType("text/html; charset=Shift-JIS");

request.setCharacterEncoding("Shift_JIS");

String strId = request.getParameter("txtKensaku");
int intId = (Integer.parseInt(strId));
Integer integer = new Integer(intId);

int count = 0;
ConnectBean reqObject = new ConnectBean();

ConnectBean record[] = new ConnectBean[10];

int i = 0; //レコードループ用カウント変数

//DB
DBConnectionPool pool;

Connection con = null;
Statement stmt = null;
try {

pool = DBConnectionPool.getInstance();

con = pool.getConnection();

stmt = con.createStatement();

String sql = "SELECT * FROM kadai_table Where ID = " + integer ;

ResultSet rs = stmt.executeQuery(sql);

while(rs.next()){
count++;
}

if (count == 0) {
out.println("<HTML>");
out.println("<BODY>");
out.println("一致するものがありません"+ "<br>");
out.println("</BODY>");
out.println("</HTML>");
}else{
//reqObject = (ConnectBean)request.getAttribute("reqObject");
rs.beforeFirst();
for(i=0; rs.next(); i++){
reqObject = new ConnectBean();
reqObject.setId(rs.getInt("ID"));
reqObject.setName(rs.getString("NAME"));
reqObject.setBiko(rs.getString("BIKO"));
record[i] = reqObject;

}

request.setAttribute("reqObject", reqObject);

}

} catch (Exception e) {

request.getRequestDispatcher("Err.jsp").forward(request, response);

e.printStackTrace();
}

RequestDispatcher rd = request.getRequestDispatcher("/kekka.jsp");
rd.forward(request, response);

}

}
と修正しました。

>・エラー発生行が提示されたソースのどの箇所にあたるのか
[HTTP Status 500 -エラー]
org.apache.jasper.JasperException: タイプ 'hellojava.ConnectBean' のbean中の属性 'Id' の情報を発見できませんでした
すみません、ソースのどの箇所か理解できません・・・

>リクエストにセットされたConnectBeanは空っぽのまま方っておかれているようですが…
申し訳ございませんが、詳しく説明していただけないでしょうか?

お手数をおかけしてしまって本当に申し訳ないです。
よろしくお願いいたします。

補足日時:2005/09/07 17:44
    • good
    • 0

> なにかお気づきの点がございましたら


いろいろありますが、まずはスタックトレースの見方を勉強しましょう。
エラーが発生したソースと行が表示されているはずです。

1.ResultSet#next()を呼んでいない
>ResultSet rs = stmt.executeQuery(sql);
>reqObject = (ConnectBean)request.getAttribute("reqObject");
  ~略~
>reqObject.setId(rs.getInt("ID"));
>reqObject.setName(rs.getString("NAME"));
>reqObject.setBiko(rs.getString("BIKO"));
ここですが、ResultSet#next()を呼ばないといけないです。
件数に関係なく、rs.getInt()とやった時点でSqlExceptionが発生してしまいます。
一行取得ならif(rs.next()){/* データ取り出し */}
複数のBeanを生成するならwhile(rs.next()){/* データ取り出し */}
です。

2.エンコーディング名
名前が違っています。 ×Shift-JIS ○Shift_JIS

3.Exceptionが発生した時
エラー用JSPを作って、そちらにforwardさせましょう。
2のcontent-typeの指定なども、JSP内に移動してください。

4.リクエストからのBean取り出し
ConnectBean reqObject = null;
 ~略~
 reqObject = (ConnectBean)request.getAttribute("reqObject");
 if (reqObject == null) {
とやっていますが、これは毎回nullです。
 ConnectBean reqObject = new ConnectBean();
 // DBからの値の取り出し処理
 req.setAttribute(~~~~)
でいいです。

ほかにもありますがちょっと書ききれないので、
正常時の処理を通すようにしましょう。
上記の部分を1つ直して試してください。

この回答への補足

deadlock様 ご回答ありがとうございます。

>1.ResultSet#next()を呼んでいない
ConnectBean record[] = new ConnectBean[10];
 for(i=0; rs.next(); i++){
reqObject = new ConnectBean();
reqObject.setId(rs.getInt("ID"));
//out.println(rs.getInt("ID"));
reqObject.setName(rs.getString("NAME"));
reqObject.setBiko(rs.getString("BIKO"));
record[i] = reqObject;

}
としました。

>2.エンコーディング名
訂正しました。

>3.Exceptionが発生した時
申し訳ございません。調べて実行してみます。

>4.リクエストからのBean取り出し
ConnectBean reqObject = new ConnectBean();
request.setAttribute("reqObject", reqObject);
としました。

しかし、同じエラーが発生してしまいます。
お手数をおかけして申し訳ございませんが、
ご指摘のほどよろしくお願いいたします。

補足日時:2005/09/07 16:15
    • good
    • 0

いまいちそれぞれの症状の関係がわかりません。


JasperException と SQLException は同時に発生しているのでしょうか?

この回答への補足

yusukey様 返事が送れて申し訳ありません。

>JasperException と SQLException は同時に発生しているのでしょうか?

おそらく同時に発生していると思います。
IDによる検索を行おうとしているのですが、IDを入力し検索ボタンをクリックすると

Tomcatに「SQLException」が表示され、かつHTTP Status 500 -で「JasperExceptio」が発生する

という状況です。

何かお気づきの点がございましたらご教授願います。
よろしくお願いいたします。

補足日時:2005/09/07 07:54
    • good
    • 0

SQLが間違っているのが原因で例外が発生して、Beanがセットできていないのだと思いますが…



>java.sql.SQLException: After end of result set
このスタックトレースはどうしました?
こっちの方が肝心そうです。メッセージを見る限り、
カーソル(Javaの中ではResultSet, RowSetなどの形で扱います)が
最後の行まで来ているのに無理に処理をしているのではないかと思いますが。
SQLを発行して処理する部分のソースと、発行したSQLそのものが欲しいです。

>データ[Id]がint型なのに対して異なった型で検索もしくは格納しようとしている
Idが何者か、どう扱っているのか分からないとなんともいえないですね…
英数字じゃBeanのintには格納できないでしょうし、それが原因でSQLでエラーが発生しているのかもしれないです。
SQLの検索条件部分がId=nullになっていて0件
→検索結果をチェックせずにResultSet#getInt()等を呼び出して例外発生
なんてのもありそうです。
とりあえず、上記の通り発行しているSQLとその周りのコードがあれば切り分けができます。

この回答への補足

deadlock様 返事が送れて申し訳ありませんでした。

>SQLを発行して処理する部分のソースと、発行したSQLそのものが欲しいです。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import hellojava.*;→(Beanを格納しているフォルダ)
import hellojava.DBConnectionPool;→(DBに接続をプールしているもの)

public class RequestServKensaku extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

PrintWriter out = response.getWriter();

response.setContentType("text/html; charset=Shift-JIS");
request.setCharacterEncoding("Shift-JIS");

String strId = request.getParameter("txtKensaku");
int intId = (Integer.parseInt(strId));

ConnectBean reqObject = null;

DBConnectionPool pool;

Connection con = null;
Statement stmt = null;
try {

pool = DBConnectionPool.getInstance();

con = pool.getConnection();

stmt = con.createStatement();

String sql = "SELECT * FROM kadai_table Where ID = " + intId ;
ResultSet rs = stmt.executeQuery(sql);
reqObject = (ConnectBean)request.getAttribute("reqObject");
if (reqObject == null) {
reqObject = new ConnectBean();
request.setAttribute("reqObject", reqObject);

}
reqObject.setId(rs.getInt("ID"));
reqObject.setName(rs.getString("NAME"));
reqObject.setBiko(rs.getString("BIKO"));
} catch (Exception e) {
out.println("<HTML>");
out.println("<BODY>");
out.println("エラー"+ "<br>");
out.println("</BODY>");
out.println("</HTML>");
e.printStackTrace();
}

RequestDispatcher rd = request.getRequestDispatcher("/kekka.jsp");
rd.forward(request, response);

}

}

と書いています。
なにかお気づきの点がございましたらご教授ください。
よろしくお願いいたします。

補足日時:2005/09/07 08:01
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!