今だけ人気マンガ100円レンタル特集♪

だいたいのプログラム内容:
login.htmlでログインを試み、そこからメールアドレス、パスワードがerrormsg.jspにパラメータで送られ、errormsg.jspからLoginBean.java(bean)を使いSQLデータに入ってるメールアドレス、パスワードと照らし合わされ、データに登録されていなかったら、エラーメッセージが返され、合っていたらwelcom.htmlページに送られます。
たまたま@ITで似たような内容があったので、基本的には同じように作りました。
でも、うまくデータを照合し分けることができません。パラメータは調べたらきちんと通っており。ResultSetの所に問題があると分かりました。
以下はLoginBean.javaの主な問題コードです。
public boolean confirm(){
try{
//SQLへの接続省略してます
String sql_str = "SELECT email, password FROM customer where email='"+email+"'AND password='"+password+"'";
//ここが問題の部分です。
ResultSet rs = stmt.executeQuery(sql_str);
if(rs!=null){
rs.close();
stmt.close();
connection.close();
return true;
}
else{
rs.close();
stmt.close();
connection.close();
return false;}
}catch(SQLException e) {
return false;
}catch(Exception e){
e.printStackTrace();
return false;}}}
このように、パラメータからきたアドレスパスワードを使い、SQLのSELECTで検索されたものをrsに返し、rsが空でなければ、trueを返します。(このメソッドはerromsg.jspから呼ばれます。)しかしデータに登録さてないものでもrsがnullでないと判断され、trueが帰ってきます。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

 ResultSetオブジェクトは、行が無くてもnullにはなりませぬ。

つまり、「結果が1行も無いResultSetオブジェクト」になります。

 Java2 1.4.2 APIを参照しても、Returnsに「never null」と名言されています。

 なので行があるかないかは、ResultSet.next()やResultSet.getRow()で判断します。または
SELECT Count(email) FROM customer where email='"+email+"'AND password='"+password+"'"
というSQL文で、最初の行の最初のフィールドが0であれば存在しないという判断になるかと思います。
    • good
    • 1
この回答へのお礼

有難うございました。おかげさまでrs.next()でうまくいきました。ずっと解決方法を探し回ってたのに、ここですぐに間違いを指摘解決してもらえ、今まで探していた時間は、、と思いつつも、次にすすめホットしてます。どうもどうも。

お礼日時:2005/12/14 19:15

既に、既出ですが


if(rs.next)とすれば良いと思います。
以下APIからの抜粋です。
「ResultSet のカーソルは、初期状態では最初の行の前に位置付けられています。メソッド next の最初の呼び出しによって、最初の行が現在の行になります。」
よって、nextでfalseが返されれば、データが1件も取得できなかったという判断が出来ます。
ちなみに、ResultSet オブジェクトは、オブジェクトを生成した Statement オブジェクトが閉じられるとき、自動的にクローズされるので、
rs.close
stmt.close
ではなく
stmt.close
だけで問題ないですよ。
    • good
    • 0
この回答へのお礼

rs.nextで解決しました。皆さんの回答のすばやさに感謝です。rs.closeはなくてもいいという事なのでそこも削除しました。登録ページはこれでうまくいきました。うれしいです。どうもどうもありがとうございました。

お礼日時:2005/12/14 19:19

if(rs!=null)



の部分を、

if(rs.next())

ではどうでしょうか?
 要するに、データ項目の取得がfalseなら検索件数がゼロであると判断できるわけです。ResultSetは検索結果がゼロでもnullにはならないと思いましたが。検索された項目がなければ、ゼロ件のデータを持つテーブルを管理するインスタンスが返されるだけでしょう。
    • good
    • 0
この回答へのお礼

うまくrs.next()でうまくいきました有難うございました。こんな小さなミスでずっと色々探しまわっていて。。次にすすめるので良かったです。:)

お礼日時:2005/12/14 19:10

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QgetStringの値がNULLの時の処理

DB:SQL Server 2005
JDBCを使ってデータベースへアクセスし、SQL発行して結果をResultsetに格納、getStringで各項目の値を取得するところまでは確認できています。

外部結合したテーブルを参照していおり、getString()でnullを取得した場合にjava.lang.NullPointerExceptionが返ってエラーとなってしまいます。

回避策はあるのでしょうか?
抜粋したソースを下記に記します。

-- test.jsp --
<%
ResultSet rs = db.executeQuery(sql);
while(rs.next()){
String disp_object = rs.getString("object");
if(disp_object == null) disp_object="---";
}
%>
<tr>Object</tr>
<tr><%=disp_object%></tr>

Aベストアンサー

<%
ResultSet rs = db.executeQuery(sql);
String disp_object = "---";
while(rs.next()){
disp_object = rs.getString("object");
if (disp_object == null) {
disp_object = "---";
}
}
%>
<tr>Object</tr>
<tr><%=disp_object%></tr>

これでどうです?
※ ProKaseifuさんの回答にある記述でも
NullPointerは発生しないような気もしますが・・・?

Qequalsの逆

javaで、文字列の場合は比較演算子の「==」は用いずに

if ((str1.getText()).equals(str2)){
(※…str1,2は文字列)

と書きますよね?
この逆で、文字列str1とstr2は等しくないとき、にはif以下の条件文をどのように書けばよいでしょうか?

Aベストアンサー

>if !((str1.getText()).equals(str2)){

あくまで
if(){
}


!(str1.getText()).equals(str2)
が入っているので
if !((str1.getText()).equals(str2)){
じゃなくて
if (!(str1.getText()).equals(str2)){
こう。

Qデータ数をカウントしたいのですが

JAVAのJDBCを使いMySqlを操作しデータ数を取得するプログラムです。自分なりに考えたプログラムは
Connection con = null;
String sql = "select count(*) from テーブル名";

// コネクションを作成する。
con = DriverManager.getConnection(url, user, pass);
Statement st = con.createStatement();

// SQLを実行する。
ResultSet rs = st.executeQuery(sql);
String count = rs.getString("count(*)");

実行した結果上手く出来ないのですが、この部分での間違いはありますか?

Aベストアンサー

どう上手くいかないのかエラーメッセージなどがあると分かりやすいのですが・・・とりあえず、count(*)というカラム名は取得できなかったと思います。

sqlを
select count(*) as cnt from テーブル名
にして、

値を取得する部分を
String coung = rs.getString("cnt");
にしてみてください。
もしくはsqlはそのままで、
rs.getString(1)
で1番目のカラムが取得できます。
(カラム名が固定なら最初のやりかたの方が分かりやすいと思います。)

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

QResultSetインターフェイスでの next() の使い方

データベースからSQLをつかって受注件数を取得したい時に、なぜ、下記のように next() をしなければいけないのかが分かりません。
初心者なので、出来ましたら詳しく教えてください。
お願いします。

int count = 0 ;
Statement stmt = con.createStatement() ;
String sql = "select count(*) from 受注" ;
ResultSet res = stmt.executeQuery(sql) ;

if (res.next()) {
count = res.getInt(1) ;
}

Aベストアンサー

 このソースのselect文ではたまたまcount()関数の結果を得ていますので、その値は必ず1個の整数になります。

 しかし、条件に合うレコードを抽出するようなselect文では、結果は1個とは限りません。このような場合のためにnext()メソッドが必要になります。(参考URL)

参考URL:http://www.atmarkit.co.jp/fjava/rensai/jdbc02/jdbc02.html

Qレコード件数の表示

夜分失礼します。
上記内容について教えてください。
今JAVAを用いてレコード件数(200件)を表示させようとしています。
しかし、レコードセットの表示方法しか知らず、またレコード件数をPHPで表示させる方法くらいしか検索できませんでした。どこがいけないか指摘してください。
以下にコア部分を書きます。

// ドライバクラスをロード
Class.forName("org.gjt.mm.mysql.Driver");
// データベースへ接続
String url = "jdbc:mysql://localhost:3306/db";
con = DriverManager.getConnection(url,"root","**********")
stmt2 = con.createStatement();
strQuery2 = " select count(*) AS RecordNums from ********** ";
ResultSet rs2 = stmt2.executeQuery( strQuery2 );
SumNo = rs2.getFetchSize();

どうしてもSumNo=0となってしまいます。

夜分失礼します。
上記内容について教えてください。
今JAVAを用いてレコード件数(200件)を表示させようとしています。
しかし、レコードセットの表示方法しか知らず、またレコード件数をPHPで表示させる方法くらいしか検索できませんでした。どこがいけないか指摘してください。
以下にコア部分を書きます。

// ドライバクラスをロード
Class.forName("org.gjt.mm.mysql.Driver");
// データベースへ接続
String url = "jdbc:mysql://localhost:3306/db";
con = DriverManager.getConnect...続きを読む

Aベストアンサー

>「java.sql.SQLException: Before start of result set SQL 」
>というエラーが出ました。
>このエラーは何を表しているのでしょうか??(・_・?)

ResultSetのURLを見てもらうと書いていますが、「初期状態では、カーソルは~」という理由で
getInt(int columnIndex) メソッドを呼び出す前に
next() メソッドを呼び出す必要があります。

つまり、

Connection con =DriverManager.getConnection(~);
Statement stmt = con.createStatement();
String sql="";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next())
{
int int_a = rs.getInt(~);
String str_a = rs.getString(~);
String str_b = rs.getString(~);
}
stmt.close();
con.close();

という使い方がDBへアクセスするときのひとつの流れです。(select文の結果を全て表示したいときですが)



>「public int getInt(int columnIndex)」
>この宣言はするべきなのでしょうか?
>これを追加すると(public int getInt;)ここがエラーになります。
どのクラスに定義しようとしていて、どんなエラーが出たのかよくわからないのでなんともいえませんが、インターフェースResultSetにはこのメソッドがすでに定義されているので、あなたがResultSetをimplementsしたクラスを作ろうとしているのならともかく、ResultSetをimplementsしたクラスを使うだけならこのメソッドを定義する必要はありません。


ところで、改行の問題はうまくいったんですか?

>「java.sql.SQLException: Before start of result set SQL 」
>というエラーが出ました。
>このエラーは何を表しているのでしょうか??(・_・?)

ResultSetのURLを見てもらうと書いていますが、「初期状態では、カーソルは~」という理由で
getInt(int columnIndex) メソッドを呼び出す前に
next() メソッドを呼び出す必要があります。

つまり、

Connection con =DriverManager.getConnection(~);
Statement stmt = con.createStatement();
String sql="";
ResultSet rs = stmt.executeQ...続きを読む

QJava-jspの画面入力値保持について

画面にテキスト、ラジオボタン、リストボックス とボタンがあります。
ボタンを押すと、JAVAで処理を行い、jspのviewで表示します。

1.テキスト、ラジオボタン、リストボックスなどに値が入力、設定されている状態で
ボタンを押して処理後にテキスト、ラジオボタン、リストボックスの値が
変わらないようにしたいのですが、
その場合、たとえば、入力、設定値をセッションになどに格納しておき
jspの所で、セッションから値を設定すると言うような方法になるのでしょうか?

2.ボタン押して処理後、ラジオボタン、リストボックスの選択値も
  変えないようにしたいのですが、
  これはどのように実現するのが、適切なのでしょうか?


以上、よろしくお願いします。

Aベストアンサー

ボタンというのはフォームのサブミットボタンのことですよ?
つまり、画面遷移が起きることを前提とすると(元の同じ画面に戻るのも含みます)

テキスト、ラジオボタン、リストボックスの状態を「要求パラメータ」として
送信し、それを次画面に反映するというのが最も一般的な方法です。

フレームワーク struts のアクションフォーム&JSPカスタムタグを使うと比較的楽に
そういう画面が作れますが、多くのフレームワークでも大差ありません。
簡単な画面なら素のサーブレート+JSPでも十分作れます。

セッションでもできますが、 セッションはログイン情報などの保持など、
限定された範囲で使うのが普通です。また、結局セッションに最新の
テキスト、ラジオボタン、リストボックスの状態を送るには、「要求パラメータ」
を送信する必要があります。

AJAXを使うという方法もあります。この場合、ボタンは AJAX 処理だけを行い
画面遷移を起こさないので、サーバ側で画面のテキスト、ラジオボタン、
リストボックスの状態をもつ必要はありません。

QEclipseでのJDBCドライバについて

Eclipse3.1でデータベース(mysql)にアクセスするプログラムを作ったのですが下記のエラーが出ます。

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

これはJDBCドライバのセットアップがうまく出来ていないからなのでしょうか?
またEclipseでは、~.jarというファイルをプロジェクトのWEB-INFのlibフォルダに入れれば使える印象があるのですが、参考書(EclipseのではなくJAVAなどの)などにあるようにTomcatのインストールフォルダ以下common/libに入れて環境変数を変更しないといけないのでしょうか?

ご存知の方教えてください、よろしくお願いします。

Aベストアンサー

WEB-INF以下に入れると実行はできるのですが、エクリプスが.javaファイルをコンパイルすることができません。projectの一覧を右クリックしてpropertyを選択し、ダイアログ右側からJava Build Pathを選択し、タグからLibrariesを選び、Add JARsボタンをおして.jarファイルを登録して下さい。
たぶんこれでコンパイルできるはずです。

QJSPの処理の途中で、JavaScriptの処理をしたい

プログラムをJSPで記述している(<% %>タグ)のですが、
JavaScriptのalertやconfirmなどのポップアップするダイアログを
表示したいのです。それは可能なのでしょうか?

Aベストアンサー

No.2の回答に対する回答(変な日本語ですが)です。

JSPとJavaScriptの処理の行われる順番について考えていないと
エラーになることがありますよ。
大まかな流れは、
 JSPのソースをサーバ側で解釈、実行する(HTMLのソースを吐き出す)
  ↓
 クライアントに生成したソースを送信する
  ↓
 クライアント側のブラウザがソースを解釈する
  ↓
 ソースの中のJavaScriptを、ソースの上のほうから順次実行する
  ↓
 同時に、通常の表示(HTMLの解釈)も実行される

 と、こういう流れですので、例えば、JavaScriptで値を入力し、
JSPでその値を使おうとすると、エラーとなります。

 具体的にやりたいこと(やろうとしていること)を書いていただいたほうが
適切に回答できますが、上記が今考えられるエラーの原因です。

Qyyyymmddからyyyy/mm/ddへの変換

いつもお世話になっております。
Aと言う変数にはyyyymmddの値が入っていて
Aをyyyy/mm/ddにしてBの変数に入れたい場合の処理がわかりません。
調べたところ、SimpleDateFormatクラスと言うものを使えばよいと言うことが判明しました。
しかし、今まで使ったことがないのでよくわかりません。
変数Aと変数BはどちらもString型です。
ご教授お願い致します。

Aベストアンサー

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.parse(a);
  formatter.applyPattern("yyyy/MM/dd");
  String b = formatter.format(date);
  System.out.println(b);
}
catch (ParseException ex) {
  System.out.println("解析失敗");
}

 こんな感じでいいんじゃないでしょうか。

 こんにちは。

 本当に変数aの中の文字列が厳密にyyyyMMddの形式のなっているのなら、普通に

String b = a.substring(0, 4) + "/" + a.substring(4, 6) + "/" + a.substring(6, 8);

 これでいいと思いますが、いったんDate型にする必要があったり、ちゃんと日付として認識できるか確かめる必要がある場合は、

String a = "20051029";

SimpleDateFormat formatter = (SimpleDateFormat)DateFormat.getDateInstance();
formatter.applyPattern("yyyyMMdd");
try {
  Date date = formatter.p...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング