質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

7381閲覧

javaの、servletでデータベースのあたいを取得できません。どうぞよろしくお願いします。

edoooooo

総合スコア476

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2015/11/27 09:21

編集2015/11/29 07:23

h2databaseです。
cosoleにエラーはでていないのですが、
testExecute1:失敗しました。
testExecute2:成功しました。
となってしまいます。

自分の考えとしては、LoginLogicでのselectで値を得ることができていないのですが、
//SELECT文を準備
String sql="SELECT USER_ID,PASS,MAIL,NAME,AGE FROM ACCOUNT WHERE USER_ID=? AND PASS=?";
PreparedStatement pStmt=conn.prepareStatement(sql);
pStmt.setString(1,login.getUserId());
pStmt.setString(2, login.getPass());

しかし、このコード内のSELECT USER_ID,PASS,MAIL,NAME,AGE FROM ACCOUNT をh2databaseで実行すると、しっかりと一覧表が出力されます。
そのため、pStmt.setString(1,login.getUserId());
pStmt.setString(2, login.getPass()); のgetUserや、getPassができていないのかと思い、login.javaをみて、loginメソッドや、getPassメソッドや、getUserメソッドを確認したのですが、問題はありませんでした。

!!!!!!----LoginLogicTestです。

package test;

import model.Login;
import model.LoginLogic;

public class LoginLogicTest {
public static void main(String[] args){
testExecute1();//ログイン成功のテスト
testExecute2();//ログイン失敗のテスト
}

public static void testExecute1(){
Login login=new Login("minato","1234");
LoginLogic bo=new LoginLogic();
boolean result=bo.execute(login);
if(result){
System.out.println("testExecute1:成功しました。");
}else{
System.out.println("testExecute1:失敗しました。");
}
}

public static void testExecute2(){
Login login =new Login("minato","12345");
LoginLogic bo=new LoginLogic();
boolean result=bo.execute(login);
if(!result){
System.out.println("testExecute2:成功しました。");
}else{
System.out.println("testExecute2:失敗しました。");
}
}
}

!!!!!-----LoginLogicTestはここまでです。

!!!!!-----Login.javaです。
package model;

public class Login {
private String userId;
private String pass;

//Loginメソッド public Login(String userId,String pass){ this.userId=userId; this.pass=pass; } //getUserId・getPassメソッド public String getUserId(){return userId;} public String getPass(){return pass;}

}
!!!!!----Login.javaはここまでです。

!!!!!-----AccountDAOです。

package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import model.Account;
import model.Login;

public class AccountDAO {
@SuppressWarnings("finally")

//findByLoginメソッド
public Account findByLogin(Login login){
Connection conn=null;
Account account=null;
try{
//JDBCドライバを読み込み
Class.forName("org.h2.Driver");

//データベースに接続 conn=DriverManager.getConnection("jdbc:h2:file:/Users/taichi/Documents/networkspace/newsns/h2data.dat","sa",""); //SELECT文を準備 String sql="SELECT USER_ID,PASS,MAIL,NAME,AGE FROM ACCOUNT WHERE USER_ID=? AND PASS=?"; //ちょっと複雑 PreparedStatement pStmt=conn.prepareStatement(sql); pStmt.setString(1,login.getUserId()); pStmt.setString(2,login.getPass()); //SELECT文を実行し、結果表を取得 ResultSet rs=pStmt.executeQuery(); //一致したユーザーが存在した場合 //そのユーザーを表すAccountインスタンスを生成 if(rs.next()){ //結果表からデータを取得 String userId=rs.getString("USER_ID"); String pass=rs.getString("PASS"); String mail=rs.getString("MAIL"); String name=rs.getString("NAME"); int age=rs.getInt("AGE"); //これで作る、これはクラスの引数 account=new Account(userId,pass,mail,name,age); } }catch(SQLException e){ e.printStackTrace(); }catch(ClassNotFoundException e){ e.printStackTrace(); return null; }finally{ //データベースを切断 if(conn!=null){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); return null; } } //見つかったユーザーまたは、nullを返す。 return account; }

}

//creteメソッド
public boolean create(Account account){
Connection conn=null;
try{
//データベースへ接続
conn=DriverManager.getConnection("jdbc:h2:file:/Users/taichi/Documents/networkspace/newsns/h2data.dat","sa","");

//insert文の準備(idは自動連番なので、指定しなくてもいい) String sql="ISERT INTO ACCOUNT (USER_ID,PASS,MAIL,NAME,AGE)VALUES(?,?,?,?,?)"; PreparedStatement pStmt=conn.prepareStatement(sql); //insert文中の「?」に使用する値を指定し、SQL文を完成 pStmt.setString(1, account.getUserId()); pStmt.setString(2, account.getPass()); pStmt.setString(3, account.getMail()); pStmt.setString(4, account.getName()); pStmt.setInt(5, account.getAge()); //insert文を実行 int result=pStmt.executeUpdate(); if(result !=1){ return false; }

}catch(SQLException e){
e.printStackTrace();
return false;
}finally{
//データベースを切断
if(conn!=null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
return true;
}
}
!!!!!---AccountDAOはここまでです。

!!!!!-----LoginLogic.javaです。

package model;

import dao.AccountDAO;

public class LoginLogic{

//executメソッド public boolean execute(Login login){ AccountDAO dao=new AccountDAO(); Account account=dao.findByLogin(login); return account !=null; }

}
!!!!!-----LoginLogic.javaはここまでです。

どうぞよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

LoginLogicがどういう処理をしているのかが分からないので何とも言えませんが、プログラム通りの動きになっているのではないかと思います。
LoginLogicを他の質問に書いているのでしたら、その質問のリンクを貼っていただけると分かり易いです。


(追記)

調査した結果、DBの値が誤っていることが判りました。
DB登録する際には、誤って余計なカンマやスペースや記号などが含まれないように気をつけましょう。

投稿2015/11/28 05:22

編集2015/11/29 14:14
argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

edoooooo

2015/11/28 07:51 編集

 testExecute1では、1234に一致すると、きちんと動いているかのテストに成功するが、データベースのデータは、1234にもかかわらず、一致しない。  testExecute2では、12345を指定して、データベースのパスワード番号は、1234なので、一致しないと、テストに成功しました。となるのですが、それは、一致しないため、成功しない、ということです。  つまり、なぜ、データベースのパスワードは、1234にもかかわらず、1234で指定しているのにテストに成功しないのかがわかりません、どうぞよろしくお願いします。   package model; import dao.AccountDAO; public class LoginLogic{ //executメソッド public boolean execute(Login login){ AccountDAO dao=new AccountDAO(); Account account=dao.findByLogin(login); return account !=null; } } すみません、LoginLogicです。どうぞよろしくお願いします。
argius

2015/11/28 08:40

失礼しました。私が読み誤っていました。 LoginLogicありがとうございます。 できれば、コメント欄はコードが読みづらいので、回答欄を編集して追加してください。 今回はサーブレットはあまり関係なさそうなので、一番後ろにするか、消してしまった方が読みやすくなります。 それと、各Javaファイルの切れ目が分かりにくいので、 できれば回答欄はマークアップをしてください。 ```lang-java ``` で囲むか、ファイルの区切りに --- を入れてください。 上手くできたかどうか、プレビューで確認してみてください。
argius

2015/11/28 09:45

言い訳っぽくなりますが、質問が読みにくいと、回答側もミスをしやすくなります。
edoooooo

2015/11/28 10:50

すみません、自分でも見返さないといけない質問をしていました。相手を考えた見やすい質問を心がけていきます。
argius

2015/11/28 11:14

対応ありがとうございました。 さて、そうなると、以前のどれかの質問のときと同じような状況になってしまいますね。 なので、少しずつ確認をしていただくことになります。 SQLのSELECT文を文法エラーにしたときにエラーになるかを見てみたいです。 なんでも良いですが、例えば、SELECTの前に余計な1文字 zSELECT のようにして実行してみてください。 エラーは出力されましたか?
edoooooo

2015/11/28 12:00

エラーとなりました。consoleです。 jdbc.JdbcSQLException: SQLステートメントに文法エラーがあります "ZSELECT[*] USER_ID,PASS,MAIL FROM ACCOUNT WHERE USER_ID=? AND PASS=? " Syntax error in SQL statement "ZSELECT[*] USER_ID,PASS,MAIL FROM ACCOUNT WHERE USER_ID=? AND PASS=? "; SQL statement: zSELECT USER_ID,PASS,MAIL FROM ACCOUNT WHERE USER_ID=? AND PASS=? [42000-190]
argius

2015/11/28 12:24

了解です。 ちゃんとエラーの時はエラーが出力されますね。 z付けたのを元に戻してしまってください。 次は、SQLの最後に、スペース空けて or true を追加してみて、testExecute1,2がどうなるかを見てみてください。
edoooooo

2015/11/28 13:59

//SELECT文を準備 String sql="SELECT USER_ID,PASS,MAIL FROM ACCOUNT WHERE USER_ID=? AND PASS=? or true" ; としたところ、無事、minatoさん、ようこそ!と次の画面にうつることができました。 ありがとうございました。調べてはみたのですが、or trueをすると、select を実行許可するということなのでしょうか?
argius

2015/11/28 14:04

> select を実行許可するということなのでしょうか? 違います。 どこに問題があるのかを切り分けるためで、まだ解決はしていません。 いまはどんなユーザーでもログイン出来てしまう状態です。 バグがあったときには、何かしらの方法で、問題個所を絞り込んでいくのが常套手段です。 どうしてこうしたのかを説明します。 (続きます)
argius

2015/11/28 14:14

やりたかったのは、WHEREの条件をすべて取り除いてしまうことです。 こうすることで、DAOのプログラムにはほぼ問題ないことを確認するためです。 消去法ですね。 ほぼ、と言ったのは、DAOを修正した状態で確認しているからです。 そうしないようにするには色々とテクニックが要るので、簡単な方法にしました。 or trueをつけたのは、修正箇所が多いと混乱するので、こうすれば最小限にできるからそうしたまでです。 今度は、PASS=? or trueの部分を、 (PASS=? or true) のようにカッコでくくってください。 これは先に説明しておくと、user_idの方だけがちゃんとSQLの条件通りに取得できているかを確認しています。 今度はどのような結果になりますか?
edoooooo

2015/11/29 00:48

ありがとうございます。WHERE USER_ID=? AND (PASS=? or true)" ;のようにしたところ、 重大: Servlet.service() for servlet [servlet.newRegistrationServlet] in context with path [/newsns] threw exception [サーブレットの実行により例外を投げました] with root cause java.lang.Error: Unresolved compilation problems: User cannot be resolved to a type User cannot be resolved to a type Syntax error on tokens, delete these tokens userId cannot be resolved to a variable userId cannot be resolved to a variable のようなエラーが出ました。
argius

2015/11/29 00:53

それは、修正内容とは関係ないコンパイルのエラーです。 Unresolved compilation problemsは以前にも何度か出ているので、これが出たらちゃんとコンパイルがされていないんだと覚えてください。 Eclipseで見た目上のエラーが出ていないのでしたら、タイミングの問題かもしれません。 Tomcatを再起動してみて、ダメなら再ビルドなどしてもう一度試してみてください。
edoooooo

2015/11/29 01:10

tomcatを再起動したり、eclipseを一度消したのですが、 実行してみてみると、ログインのところでuserIdとpasswordを入力しても、次の画面に進めず、画面が何も変わりません。 404などの類は、出ないのですが、consoleでは、警告が出ています。 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:i' did not find a matching property. 11 29, 2015 10:06:04 午前 org.apache.tomcat.util.digester.SetPropertiesRule begin です。 matching に問題があるとのことでした。どうぞよろしくお願いします。
argius

2015/11/29 01:36

その警告はおそらく毎回出ているはずですので、無視して良いです。 あと、メッセージの意味は見れば分かるので、matching に問題があるとのことでした、よりも、ご自身で調べて考えた上での見解を書いてほしいです。 再ビルドはしましたか? 修正はSQL文字列を変えているだけなので、 それによってコンパイルの問題や致命的な問題が発生することはありえません。 ダメなら、一旦(PASS=? or true)を忘れて下さい。元に戻しましょう。 とにかく、何とかして最初の状態に戻していただくしかありません。
edoooooo

2015/11/29 01:55

Build Automatically にチェックが付いていたので自動的にビルドされるのかと思います。 ほかにも、Build All の表示の自体は、薄色になっていたので、ビルドはできているかと思います。最初の状態とは、()とor tureを消すだけではないのでしょうか?
argius

2015/11/29 02:05

おっしゃるとおり、Build Automatically がオンになっていれば、自動的にビルドはしてくれますが、なんらかの問題でコンパイルしたファイルが壊れてしまった場合は、それだけでは復旧しない可能性が有ります。 そのため、もう一度全てのJavaファイルをコンパイルし直す、という意味で再ビルドと言っています。 Eclipseの場合、クリーンビルドというべきでしたね。 > 最初の状態とは、()とor tureを消すだけではないのでしょうか? 私はそうだと思いますが、実際の環境(=taichitaichiさんのMac上のファイル) は直接見られないためそれだと確実に戻っているかわからないので、 それを消すのでも良いですし、今回修正する前にどこかに取っておいたのがあればそれを戻しても良いですので、とにかく元の状態になれば動くはずですよね? ということです。
edoooooo

2015/11/29 03:00

ありがとうございます。アドバイスをいただく前まで戻してしまうと、ログイン情報の入力から次の画面に移動することはできないのですが、or trueをつけると、先ほど通り、ようこそminatoさん・・・ とroginOK.jspへと画面遷移ができます。
argius

2015/11/29 03:11

わかりました。 もう一度、(PASS=? or true)をつけて実行してみてください。 画面の確認は要りません。 testExecute1,2はどうなるでしょうか? それともまたcompilation problemになるでしょうか。
edoooooo

2015/11/29 03:55

or true をつけたところ、無事、testExcute1で指定した1234とdatabaseの1234が一致して、成功しました。となり、12345を指定する、testExcute2では、12345 を指定していて、それとdatabaseが1234のif(result=null)で成功しました。となるのですが、成功するはずが、失敗しました。となりました。 compilation problemとはなりませんでした。
argius

2015/11/29 04:16

説明が悪かったかもしれませんが、 もとの状態から PASS=? を (PASS=? or true) に変えて、です。 or trueだけでなく、カッコも必要ですが、つけていますか? > testExcute1で指定した1234とdatabaseの1234が一致して 条件は質問に書いてあるので書いていただかなくてもけっこうです。 それに、この場合は一致しているから成功しているとは限りません。 わざと、正しくない動作をさせて状態を探っています。
edoooooo

2015/11/29 04:24

そうなのですね。 カッコをつけていませんでした。つけて実行したところ testExecute1:成功しました。 testExecute2:失敗しました。 となりました。  
argius

2015/11/29 04:24

2015/11/29 09:48 からの作業は横道にそれた(関係ないことの対処をしただけ)ので、 そこまで戻ってやり直し、ということです。
argius

2015/11/29 04:27

なるほど、ということは、userの条件はあってますね。 (つづく)
argius

2015/11/29 04:34

では、DAOの//結果表からデータを取得 のところの、 String pass=rs.getString("PASS"); の次の行に、 System.out.println("pass=[%s]%n", pass); を追加して、もう一度testを実行してください。 コンソールに出たpass=の行を教えてください。 その行をそのままコピペで良いです。
edoooooo

2015/11/29 04:37

再度クリーンしたところ結果は、 testExecute1:成功しました。 testExecute2:失敗しました。 と、同じ結果になりました。
argius

2015/11/29 04:40 編集

13:34 のコメントのを実行したということでしょうか?
edoooooo

2015/11/29 04:51 編集

すみません、13:34分のアドバイスを見る前に先ほどは、返信をしていました。 System.out.println("pass=[%s]%n", pass); printlnに赤波線がつき  コンパイルエラーが出ているまま実行すると、testExecute1:失敗しました。 testExecute2:成功しました。 となりました。
argius

2015/11/29 04:53

あ、失礼いたしました。 System.out.printf("pass=[%s]%n", pass); でした。 printlnでなく、printfです。 ちなみに、コンパイルエラーが出ているまま実行する意味はありません。 単に、修正前の状態で実行されるだけです。
edoooooo

2015/11/29 04:59

printfでも試していたのですが、同じ結果でした。 コンパイルエラーとは、そういうものなのですね
argius

2015/11/29 05:05

もう一度13:34のコメントを読んでみてください。 printfを誤ったのはすみませんでしたが、それ以外は説明の通りにやっていただかないと話が進みません。 知りたいのは、コンソールに出たpass=の内容です。 そのためにprintfのをいれたのです。 > コンパイルエラーとは、そういうものなのですね というか、ソースコードに問題があってコンパイルができない状態なので、ごく当たり前の結果なんです。
edoooooo

2015/11/29 07:21

consoleにはtestFindByLogin1:失敗しました。 testFindByLogin2:成功しました。しか表示されていなくコードをみて、なぜか探していたら、LoginLogicTestでLoginLogic.javaをよびだし、その中でAccount.javaを呼び出していて、そのAccount.javaのコードでは、return true;を返し、LoginLogic.javaのコードでは、return account !=null;をLoginLogicTestに返すため、Account.javaに書いた、System.out.printf("pass=[%s]%n", pass);が表示されないのかと思いました。どのようにすれば、表示できるのでしょうか?
argius

2015/11/29 07:26

testFindByLogin1,2って、どこから出てきたんですか? testExecute1,2ではないのですか? これまで通り、testExecute1,2を実行すれば、先ほどのprintfのところを通るはずですよね?
edoooooo

2015/11/29 07:47

間違えました。testFindByLogin1,2は別のテストでした。 testExecute1,2です。 通るのですが、てっきり通ってSystem.out.printlnをしても、return ... しか効果を持たないものと思ってました。  なぜか通っているはずなのにSytem.out.printlnが表示されません。
argius

2015/11/29 07:58

そこを通っているのにprintが出力されないのは、 コンパイルされていない、つまりファイルを保存していないくらいしかありえないです。 もう一度、私が説明した通りの場所に、printを書いたのか確認してみてください。 クリーンビルドも試してください。 いっそ、Eclipseを再起動して、起動した直後にtestExecuteを実行してみてください。 デバッグ機能がわかるのでしたら、それで処理を追っかけてみても良いです。
edoooooo

2015/11/29 09:45 編集

printfは教えていただいたところに入れてありました。  ファイルは保存してありました。コンパイルは自動にされるということで大丈夫でしょうか? クリーンビルドをして、デバックをしようとしたのですが、できませんでした。
argius

2015/11/29 09:53

> ファイルは保存してありました。コンパイルは自動 これは念のために聞いたまでです。 コンパイルされていない可能性があったら、保存忘れを疑ってください、ということです。 「コンパイルエラーが無い状態で」保存さえすれば、コンパイルされます。 (何らかの原因でコンパイルしたクラスファイルが壊れてしまうと別ですが、よほど変なことをしなければ壊れたりしないはず) > ファイル名や、コードの出力欄が出なくなってしまいました。 それはおそらく、パースペクティブが切り替わったのでしょう。 Eclipseは、機能によってビューなどの組み合わせのセットを切り替える機能があります。 右上あたりに、緑色の虫みたいなアイコンが出てそれが選択された状態になっていませんか? 違うアイコンのかも知れませんが もとに戻すには、ちょっと判りにくいですが、右上にJが付いているアイコンをクリックすればもとに戻ります。 それぞれ、「デバッグパースペクティブ」「Javaパースペクティブ」と呼びます。 もしくは、最小化ボタンを押して隠れてしまったのかもしれません。 ウィンドウの右端あたりに、アイコンが並んでいませんか? それをクリックすれば元に戻ります。 ビューを閉じてしまったのなら、メニューの[Window]->[Show View]から、目的のビューを探して再表示させることができます。 直ったら、もう一度実行して、 testExecute1と2の結果と、 pass=のprint結果を教えてください。
edoooooo

2015/11/29 10:00

show View でpackageexploler で表示できました。  コンパイルエラーはなかったので、コンパイルもできていると思います。 実行してみたところ、testExecute1:失敗しました。 testExecute2:成功しました。 となってしまいました。 AccountDAO.javaにこのように書いているのにもかかわらず、なぜかconsoleに出ませんでした。 //一致したユーザーが存在した場合 //そのユーザーを表すAccountインスタンスを生成 if(rs.next()){ //結果表からデータを取得 String userId=rs.getString("USER_ID"); String pass=rs.getString("PASS"); System.out.printf("pass=[%s]%n", pass); String mail=rs.getString("MAIL"); どうぞよろしくお願いします。
argius

2015/11/29 10:08

今の状態なら、 testExecute1:成功しました。 testExecute2:失敗しました。 にならないとおかしいので、今度はDAOが正常に実行できなくなってしまったようです。 エラーは出ていませんか? H2コンソールを起動していたりしませんか? 何も情報が得られないと、以前のDAOのときの問題みたいになってしまい、お手上げです。
edoooooo

2015/11/29 10:34

エラーは出ていません、何もいじった覚えはないのですが、testExcute1:失敗しました。testExcute2:成功しました。となってしまいます。 tomcatをさいきどうして、eclipseを再起動して、保存を確認して、cleanしても同じでした。こうなると、ちょっと、後回し、でしょうか?
argius

2015/11/29 10:41

何度も言いますが、結果は、できるだけ省略しないで書いていただきたいのですが。 確認を忘れたのか、確認したけど問題ないのかが判断つきませんから。 H2コンソールも上がっていないと判断します。 今は、元の状態に ・SQL文の、PASS=?を(PASS=? or true)に変えている ・printfを追懐している であってますよね? testExecute1,2を実行する時は、Tomcatはたぶんいらないと思いますので、Tomcatを停止した状態にしてみてください。 上記の状態が全てそろった状態で、もう一度、 testExecute1,2を実行してみてください。
edoooooo

2015/11/29 11:00

すみません、H2databaseは一度起動して、切断マークを押して、切断してから実行しました。 SQL文のPASS=?を(PASS=? or true)に変えています。 printfも追加しています。 わかりました。tomcatを停止して、実行します。 結果は、testExecute1:失敗しました。 testExecute2:成功しました。 でした。 実行方法なのですが、 Run As java application で大丈夫でしょうか?
argius

2015/11/29 11:02

了解しました。 > Run As java application はい、それでOKです。 先ほどもRun Asで実行していましたか?
edoooooo

2015/11/29 11:25

はい、していました。
argius

2015/11/29 11:27

判りました。 実行してみてください。
edoooooo

2015/11/29 11:31

console に testExecute1:失敗しました。 testExecute2:成功しました。 のように表示されました。 それ以外にエラーや警告なのの情報は、ありませんでした。 printfの情報もありませんでした。
argius

2015/11/29 11:43

SQLを今度は、(PASS=? or true)のところを、 PASS=? or user like '%minato%' にしてください。カッコをとります。 それと、printfをもう一つ追加してください。 先のprintfの前の行で良いです。 System.out.printf("user=[%s]%n", user); これでもう一度実行してみてください。
edoooooo

2015/11/29 11:51

ありがとうございます。 //結果表からデータを取得 String userId=rs.getString("USER_ID"); String pass=rs.getString("PASS"); System.out.printf("user=[%s]%n", user); System.out.printf("pass=[%s]%n", pass); String mail=rs.getString("MAIL"); のようになり、userのところがコンパイルエラーになっているのですが、userIdでよかったでしょうか?
argius

2015/11/29 11:53

また見間違えました。userIdでした。
edoooooo

2015/11/29 11:55

org.h2.jdbc.JdbcSQLException: 列 "USER" が見つかりません Column "USER" not found; SQL statement: SELECT USER_ID,PASS,MAIL FROM ACCOUNT WHERE USER_ID=? AND PASS=? or user like '%minato%' [42122-190] testExecute1:失敗しました。 org.h2.jdbc.JdbcSQLException: 列 "USER" が見つかりません Column "USER" not found; SQL statement: SELECT USER_ID,PASS,MAIL FROM ACCOUNT WHERE USER_ID=? AND PASS=? or user like '%minato%' [42122-190] testExecute2:成功しました。 userIdでコンパイルエラーがきえたので実行してみたところ、このようになりました。
edoooooo

2015/11/29 11:57

h2databaseにinsertしたのは、USER_ID,PASS,MAIL,NAME,AGEなのですが、selectで、指定しているのは、USER_ID,PASS,MAIL,の3つだけなのですが、問題ないでしょうか?
argius

2015/11/29 12:02

すみません。 また間違えてますね。 ちょっと事情があって元のコードを読むのが難しかったので。ごめんなさい。 SQLの、 user like のところは、 USER_ID like にしてください。 もう一度実行してみてください。
edoooooo

2015/11/29 12:15

ありがとうございます。お忙しい中申し訳ありません。 //SELECT文を準備 String sql="SELECT USER_ID,PASS,MAIL FROM ACCOUNT WHERE USER_ID=? AND PASS=? or USER_ID like '%minato%'" ; //ちょっと複雑 PreparedStatement pStmt=conn.prepareStatement(sql); pStmt.setString(1,login.getUserId()); pStmt.setString(2,login.getPass()); //SELECT文を実行し、結果表を取得 ResultSet rs=pStmt.executeQuery(); //一致したユーザーが存在した場合 //そのユーザーを表すAccountインスタンスを生成 if(rs.next()){ //結果表からデータを取得 String userId=rs.getString("USER_ID"); String pass=rs.getString("PASS"); System.out.printf("userId=[%s]%n", userId); System.out.printf("pass=[%s]%n", pass); String mail=rs.getString("MAIL"); このようにコードをしたところで、実行してみたところ、 org.h2.jdbc.JdbcSQLException: 列 "USER" が見つかりません Column "USER" not found; SQL statement: SELECT USER_ID,PASS,MAIL FROM ACCOUNT WHERE USER_ID=? AND PASS=? or user like '%minato%' [42122-190] testExecute1:失敗しました。 org.h2.jdbc.JdbcSQLException: 列 "USER" が見つかりません Column "USER" not found; SQL statement: SELECT USER_ID,PASS,MAIL FROM ACCOUNT WHERE USER_ID=? AND PASS=? or user like '%minato%' [42122-190] 2:成功しました。 となりました。
argius

2015/11/29 12:19

エラーをみてわかる通り、SQLの修正が反映されていないようですね。 クリーンビルドして、もう一度やってみてください。 それか、まちがって、他に似たようなところを直していませんか?
edoooooo

2015/11/29 12:28 編集

org.h2.jdbc.JdbcSQLException: 列 "USER" が見つかりません Column "USER" not found; SQL statement: SELECT USER_ID,PASS,MAIL FROM ACCOUNT WHERE USER_ID=? AND PASS=? or user like '%minato%' [42122-190] testExecute1:失敗しました。 org.h2.jdbc.JdbcSQLException: 列 "USER" が見つかりません Column "USER" not found; SQL statement: SELECT USER_ID,PASS,MAIL FROM ACCOUNT WHERE USER_ID=? AND PASS=? or user like '%minato%' [42122-190] testExecute2:成功しました。 と先ほどと同じ結果でした。 確認してみたのですが、この操作に関係する、メソッドや、クラスは、いじっていませんでした。間違えて直してはいなかったです。  しかし、今までは、本を写すだけで、このsnsが初めて、自分で考え本のsnsを拡張して作っているため、いろいろなこと(変数の名前)などがごちゃまぜになり、とても混乱しています。 すみません。
argius

2015/11/29 13:10

SQL文のuser like '%minato%' は USER_ID like '%minato%' に直しているんですよね?
edoooooo

2015/11/29 13:15

本当に失礼いたしました。 保存をしていませんでした。 直した後に実行したところ、userId=[minato,] pass=[1234] testExecute1:成功しました。 userId=[minato,] pass=[1234] testExecute2:失敗しました。 のようにconsoleに出力されました。
argius

2015/11/29 13:19

混乱してしまうのは分かりますが、 確認が疎かになるとさらに混乱してしまいます。 くれぐれも、ご注意ください。 これでわかったのは、UserID=minato,(カンマがついてる) のと、Pass=1234 が登録されているということです。 これ以外にも、"minato"に近い文字列のUserIdが登録されていますか?
edoooooo

2015/11/29 13:23

一つずつステップを抜かすことなく確認していきます。Account の中のuserIdはminatoだけです。
argius

2015/11/29 13:30

私の予想では、おそらくUserIDかPASSのどちらかに、 スペースかそれ以外の記号が余計に付いているというもので、 これまでの手順はそれを確認するものでした。 結果として、 UserID=minato, が見つかりました。 余計なカンマが末尾についているので、 where USER_ID='minato' ではヒットしなかったわけです。 敢えてH2コンソールで確認しなかったのは、 スペースだった場合に見分けがつきにくいからです。 なので、最も確実に特定できる方法を採りました。 結果的には時間はかかりましたが、想定どおりのことができました。 ご理解いただけたでしょうか。
edoooooo

2015/11/29 13:52

USER_ID like '%minato%'でminatoであるかを確認して、その後にSystem.out.printlnでuserIdとpassを値を表示することで文字が間違えていないかを確認するのですか、いろいろと出てきたconsoleの情報から、minatoやpassが間違えていないかと予想があったのですね、このように出された情報からエラーの原因を見極める方法を一連の流れで、細かく指導頂き、大変勉強になりました。ありがとうございました。  無事、実行してみたところ、testExcute1:成功しました。testExecute2:失敗しました。となることが、できました。ありがとうございました。  今回の質問とは、別件担ってしまうのですが、本を写して実行することは、もうできなくなり、本で与えられたサンプルコードに新たな機能を追加していくという、難易度の上がった状況にいます。今は、snsの新規登録をログインのサンプルコードに連結させている状況です。今までの本や、ネットを元に、少しずつ理解を深めているのですが、このような手段で良いのでしょうか?アドバイスのほどよろしくお願いします。  立て続けに申し訳ありません。今回も、ありがとうございました。
argius

2015/11/29 14:10

確認の方法は、先ほどの理由などがあって、結果的に面倒なやり方になってしまいましたが、今回のケースであればH2consoleで確認しても見つけられたということもご理解いただければと思います。 せっかくなので、SQLを元に戻してDBの値を修正して、testExecute1,2が両方とも成功になることも確認しておいてくださいね。 できればここにも成功したことを書いて報告しておいてください。 勉強の進め方は、WebアプリとかSNSとか具体的なものよりも、もっとJavaの基礎を固めたほうが良いと思います。 と言っても、教材は今作っているもので良いので、その中で分からないことをできるだけ無くしていくことです。 なんとなく動いている、ではSNSを完成させるのは難しいと私は思います。 一方では、外から持ってきたコードを連結していき、 また一方では、それらが何をしているのかを理解するように努める、といった感じです。 あとはデバッグの方法をマスターすることです。 今回printで値を出力する方法は「デバッグプリント」と言いまして、初歩的かつ原始的なデバッグ手法です。 これだと毎回プログラムを修正したり無駄なprintでコードが埋まってしまったりするので、 できればEclipseのデバッグ機能を使って確認できると良いです。 あとは、作ったものを保存するためのバージョン管理システムも少し学んでいく必要があるでしょうね。 今すぐには難しいと思いますが、作ったものを管理するのに必要になってきます。 こんな感じで良いですか?
edoooooo

2015/11/29 15:03

ありがとうございました。先ほど、SQLを元に戻してDBの値を修正して、実行して、無事成功し、コピペしてコメント欄に載せたと思っていたのですが、違うものをコピペしていました。 testExecute1:成功しました。 testExecute2:成功しました。 こちらでした。 本当にありがとうございます。 勉強の進め方は、WebアプリとかSNSとか具体的なものよりも、もっとJavaの基礎を固めたほうが良いと思います。 と言っても、教材は今作っているもので良いので、その中で分からないことをできるだけ無くしていくことです。 なんとなく動いている、ではSNSを完成させるのは難しいと私は思います。 一方では、外から持ってきたコードを連結していき、 また一方では、それらが何をしているのかを理解するように努める、といった感じです。 あとはデバッグの方法をマスターすることです。 今回printで値を出力する方法は「デバッグプリント」と言いまして、初歩的かつ原始的なデバッグ手法です。 これだと毎回プログラムを修正したり無駄なprintでコードが埋まってしまったりするので、 できればEclipseのデバッグ機能を使って確認できると良いです。 あとは、作ったものを保存するためのバージョン管理システムも少し学んでいく必要があるでしょうね。 今すぐには難しいと思いますが、作ったものを管理するのに必要になってきます。 この文章を画像化して、頻繁に確認し効率の良い勉強をしこうと思います。そして1日でも早く考えているsnsを作りたいと思います。 少し前に紹介した、もう一つのtestもこのように成功しました。 testFindByLogin1:成功しました。 testFindByLogin2:成功しました。  本当にありがとうございました。 
argius

2015/11/29 15:10

もう一つのテストも含めてすべて成功になったのですね。良かったです。 ついでに言っておくと、この手のテストはJUnitという仕組みを使うのが一般的です。 EclipseではJUnitを標準で使えるので、そちらも合わせて学習されると良いかと思います。 画像にして、というのは何か大袈裟な気がしますが、参考になったのでしたら良かったです。 最後に、すべて完了したと思いますので、解決済みにしていただけるとうれしいです。 お疲れ様でした。
edoooooo

2015/11/29 15:18

本当に勉強になりました。解決ずみを忘れていました。申し訳ありません。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問