アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のような、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は、この形のやり方で表示できたのですが・・・。

間違いを指摘してください。
よろしくお願いします。

A 回答 (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>
    • good
    • 0
この回答へのお礼

お返事送れましてすみません。
回答内容を、キチンと理解してお礼をしないと失礼
と思いまして、今になってしまいました。
丁寧な回答、そして、対処法ありがとうございます。
自分としましては、対処法で紹介くださった、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表示も、もう少し勉強してみます。

今回は、本当にありがとうございました。

お礼日時:2002/10/07 17:58

まったくのあてずっぽうですが、ResultSet のインスタンスを渡すのではなくて、


servlet で、hinmei の文字列を取得して、文字列を request に入れて渡すと、
どうなりますか?

この回答への補足

たびたび、すみません。
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に遷すと、こういう状態です。
勉強不足で、すみません。

補足日時:2002/10/04 22:25
    • good
    • 0

No2の回答をした者です。


私の回答内容は、a-kumaさんが指摘済でしたね。
ごめんなさい。
    • good
    • 0

こんにちわ。



白い画面になるとのことですが、
jspのソース(HTML)が一切読み込まれていないのでしょうか?

そうではなくて、
「hinmeiの値が表示されない」ということであれば・・・
以下の原因ではありませんか?

hinmeiがwhileループの中で宣言されており、
表示しようとしている部分では、
スコープ外になっていますよ。
    • good
    • 0

> <% While(rs.next()){String hinmei = rs.getString("hinmei");} %>



<% String hinmei; %>
<% while(rs.next()){hinmei = rs.getString("hinmei");} %>

かな。while の w が大文字なのは、写し間違いですよね?

この回答への補足

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

a-kumaさんの言うとおり、
> <% String hinmei; %>
> <% while(rs.next()){hinmei = rs.getString("hinmei");} %>

としましたが、jspでの表示ができません。
whileは、写し間違いでした。
Resultsetの中身はキチンと入ってるんですがね。

補足日時:2002/10/04 15:22
    • good
    • 0

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