• ベストアンサー

jspでの表示の仕方

下記のような、jspへの受け渡しができずにいます。 ご回答お願いします。 Servletは、 String query = "SELECT * FROM test"; ResultSet resultset = statement.executeQuery( query ); request.setAttribute("obj",resultset); ServletContext context = getServletContext(); RequestDispatcher rd = context.getRequestDispatcher("/kekka.jsp"); rd.forward(request,respons); とした時、jsp側で、 <%@ page contentType="text/html;charset=Shift_JIS" %> <%@ page import = "java.sql.*" %> <%! ResultSet rs = (ResultSet)request.getAttribute("obj"); %> <% While(rs.next()){String hinmei = rs.getString("hinmei");} %> <html> <head> <title>JSP</title> </head> <body> <table border="0"> <tr> <td><%=hinmei%></td> </tr> </table> </body> </html> と、したいのですが、白い画面になりjspの表示ができません。 やはり、ResultSetオブジェクトのAttributeはできないのでしょうか? それとも、jspの構文に問題があるのでしょうか? Vector、Stringは、この形のやり方で表示できたのですが・・・。 間違いを指摘してください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • po-net
  • ベストアンサー率36% (172/477)
回答No.5

こんばんは、po-netと申します。 JSP側で取得したResultSetオブジェクトがnullでないという確認をしたかどうか・・・という記述がないので、nullでないと仮定して話を進めます。 表示が1つは表示されているようですのでその続きを。。。 サーブレットファイルを見てみますと、 >while(resultset.next()){ >hinmei = resultset.getString("hinmei"); >request.setAttribute("obj", hinmei); >} となっていますね。 コレでは、いくらwhileでループをかけても、セッションに格納する段階で"obj"というセッションに上書きしているだけです。 そのため、 >hinmeiに1件しかレコード内容が入っていません。 >servletの > >String hinmei; >while(result.next()){ >hinmei = resultset.getString("hinmei"); >の所で、hinmeiの中身は、 >バナナ >パイン >トマト >の予定なのです。 > >そして、今回の場合、while内で取得した最後の、"トマト" だけが表示されます。 >servletからjspにAttributeすると、取得した内容が、1件を除きあとの取得内容が消えてしまいます。 >どうしてなんでしょうか? こういう現象が起きていると考えられます。 int num; for(int i=0; i<5; i++) { num = i; } System.out.println(i); この場合、コマンドラインには4しか表示されないですよね。 これと同じ現象が起きているのではないでしょうか。 numを出力する前に、iでさらに上書きすることで、古いデータが消えてしまっているということです。 必ず「バナナ」「パイン」「トマト」という順番で出力されるクエリーを実行しているとき、もし仮に、 >while(resultset.next()){ >hinmei = resultset.getString("hinmei"); >request.setAttribute("obj", hinmei); >} というソースを if(resultset.next()){ hinmei = resultset.getString("hinmei"); request.setAttribute("obj", hinmei); } と書き換えて、「バナナ」が表示されましたら間違いありません。 対処法としては、 ・一つ一つを違うセッション名で格納。 ・Vectorクラスのオブジェクトに格納し、セッションに。 のどちらかが考えられますが、DBのように帰ってくる値の数が不特定の場合は、後者の方が適切かと思います。 ___________ それと、質問の「白い画面」の件です。 setAttribute() でセッションに格納した情報は、JSP側では  <jsp:useBean id="***" class="***" scope="***"/> で取得できますよ。 今回の場合ですと、  <jsp:useBean id="obj" class="java.sql.ResultSet" scope="session" /> でしょうか? また、while文の位置も少し気になります。 質問のソースを、以下のようにしたらどうでしょう? <%@ page contentType="text/html;charset=Shift_JIS" %> <%@ page import = "java.sql.*" %> <%! ResultSet rs = (ResultSet)request.getAttribute("obj"); %> <html> <head> <title>JSP</title> </head> <body> <table border="0"> <tr> <td> <%= while(rs.next()){out.println( rs.getString("hinmei") ); }%> </td> </tr> </table> </body> </html>

tosio_s
質問者

お礼

お返事送れましてすみません。 回答内容を、キチンと理解してお礼をしないと失礼 と思いまして、今になってしまいました。 丁寧な回答、そして、対処法ありがとうございます。 自分としましては、対処法で紹介くださった、Vectorを 使って、と思います。 今更・・・。とお思いでしょうが、DB内容を少し書くと、 hinmei     gensanti バナナ     フィリピン パイン      オーストリア    トマト      高知 でして、 Vector obj1 = new Vector(); Vector vhinmei = new Vector(); Vector vgensanti = new Vector(); while(rs.next()){ vhinmei.addElement(rs.getString("hinmei"); vgensanti.addElement(rs.getString("gensanti"); } obj1.addElement(vhinmei); obj1.addElement(vgensanti); request.Attribute("obj1",obj1); ですかね。 jspでの、取り出し方はもうちょっと、勉強が必要です。 でも、この方法は、ちょっとキレイじゃないですかね? sessionでのjsp表示も、もう少し勉強してみます。 今回は、本当にありがとうございました。

その他の回答 (4)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.4

まったくのあてずっぽうですが、ResultSet のインスタンスを渡すのではなくて、 servlet で、hinmei の文字列を取得して、文字列を request に入れて渡すと、 どうなりますか?

tosio_s
質問者

補足

たびたび、すみません。 a-kumaさんの、おっしゃる通りしてみました・・・。 今回は、whileをservletで行いました。 servletは、 String query = "SELECT * FROM test"; ResultSet resultset = statement.executeQuery( query ); String hinmei; while(resultset.next()){ hinmei = resultset.getString("hinmei"); request.setAttribute("obj", hinmei); } ServletContext context = getServletContext(); RequestDispatcher rd = context.getRequestDispatcher("/kekka.jsp"); rd.forward(request,respons); そして、jspを、 <%@ page contentType="text/html;charset=Shift_JIS" %> <% String hinmei; %> <% hinmei = (String)request.getAttribute("obj"); %> <html> <head> <title>JSP</title> </head> <body> <table border="0"> <tr> <td><%=hinmei%></td> </tr> </table> </body> </html> と、したところ、hinmeiに1件しかレコード内容が入っていません。 servletの String hinmei; while(result.next()){ hinmei = resultset.getString("hinmei"); の所で、hinmeiの中身は、 バナナ パイン トマト の予定なのです。 そして、今回の場合、while内で取得した最後の、"トマト" だけが表示されます。 servletからjspにAttributeすると、取得した内容が、1件を除きあとの取得 内容が消えてしまいます。 どうしてなんでしょうか? servlet内に、表示用htmlを生成した時には、キチンと表示されるのですが、 jspに遷すと、こういう状態です。 勉強不足で、すみません。

回答No.3

No2の回答をした者です。 私の回答内容は、a-kumaさんが指摘済でしたね。 ごめんなさい。

回答No.2

こんにちわ。 白い画面になるとのことですが、 jspのソース(HTML)が一切読み込まれていないのでしょうか? そうではなくて、 「hinmeiの値が表示されない」ということであれば・・・ 以下の原因ではありませんか? hinmeiがwhileループの中で宣言されており、 表示しようとしている部分では、 スコープ外になっていますよ。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

> <% While(rs.next()){String hinmei = rs.getString("hinmei");} %> <% String hinmei; %> <% while(rs.next()){hinmei = rs.getString("hinmei");} %> かな。while の w が大文字なのは、写し間違いですよね?

tosio_s
質問者

補足

回答ありがとうございます。 a-kumaさんの言うとおり、 > <% String hinmei; %> > <% while(rs.next()){hinmei = rs.getString("hinmei");} %> としましたが、jspでの表示ができません。 whileは、写し間違いでした。 Resultsetの中身はキチンと入ってるんですがね。

関連するQ&A