竹形誠司 ブログ
ご質問    »トピック一覧
掲示板へのスパムが多いため、「ご質問」のコーナーはユーザー登録制とさせていただきました。お手数ですが、上の「新規ユーザーの登録」メニューより登録をお願いします。
帳票Web
アプリケーション

受注開発始めました
詳しくは こちら
竹形 誠司 著/ラトルズ刊
JSP帳票アプリケーション実践開発入門
JSP帳票アプリケーション
実践開発入門

JSP業務アプリケーション短期開発入門
JSP業務アプリケーション
短期開発入門

Java+MySQL+Tomcatで始めるWebアプリケーション構築入門
Java+MySQL+Tomcatで始めるWebアプリケーション構築入門

Java+MySQL+Tomcatで作る掲示板とブログ
Java+MySQL+Tomcatで作る
掲示板とブログ
tsp 業務アプリケーション 短期開発入門 第9章について
by shimada[isamu]
はじめまして、上記本にて勉強させていただいています。

お忙しいところ恐縮ですが、質問なのですが、
第9章 の 9.2.2 ログイン処理の項で
ResultSet に結果が返ってこず、(admin,adminで入力しても「ログイン名またはパスワードが違いますとでてきます。)原因がわからず困っています。

SQLへの接続までは第5章の住所録で確認しています。
またSQL単独でコマンドで打ち込んでもそれは結果がきちんと解決します。


コード

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@ page import="java.sql.*" %>
<jsp:useBean class="java.util.HashMap" id="user" scope="session"/>
<%

    String strLogin = request.getParameter("login");
    String strPassword = request.getParameter("password");

    request.setCharacterEncoding("UTF-8");
   

    Class.forName("com.mysql.jdbc.Driver");
    String url = "jdbc:mysql://localhost:3306/*********";
    String name = "appuser";
    String pass = "*******";
    Connection conn = null;
    conn = DriverManager.getConnection(url,name,pass);

    String sql = "select * from user where  login = ? and password= ? ";
    PreparedStatement pStmt = conn.prepareStatement(sql);

pStmt.setString(1,strLogin);
pStmt.setString(2,strPassword);

ResultSet  rs = pStmt.executeQuery(); // ここでrsに結果がかえらない。
//仮にSQL分に ? ではなく、'admin' 'admin'と打っても
//strMessage には"ログイン名または・・・"が参照されるようになる。
//すなわち結果がかえらない。



//user がHashMap のインスタンスみたいなもの
String strMessage = null;

if (rs.next()) {
    user.put("id",rs.getInt("id"));
    user.put("name", rs.getString("name"));
    user.put("level",rs.getInt("level"));

} else {
    strMessage = "ログイン名またはパスワードが違います。";
}

//上で受け取ったものを下に代入しておく。
int userId = (Integer) (user.get("id"));
String userName = (String) user.get("name");
int userLevel = (Integer) (user.get("level"));


rs.close();
pStmt.close();
conn.close();

%>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="${pageContext.request.contextPath}/Css/style.css">
<title>ログイン</title>
</head>
<body>
<h1>ログイン</h1>
<div class="main">
<% if(strMessage == null) { %>
        <p>こんちには<%=userName %> さん</p>
        <p><a href="top.jsp">トップページ</a></p>
    <% } else { %>
        <p><%= strMessage %></p>
        <p><a href="javascript:history.back()">戻る</a></p>
    <% } %>
    <%=strLogin %>
    <p></p>
    <%=strPassword %>
</div>

</body>
</html>

もし何か考えられる原因があればご教授ください。
ちなみに 例外やエラーは発生していません。
投稿:shimada[isamu]/2016年 11月 12日 18時 12分 /更新:2016年 11月 12日 18時 12分
RE:tsp 業務アプリケーション 短期開発入門 第9章について
by shimada[isamu]
すいません、自己解決しました。
単に ライブラリにmysqlをつなぐjarファイルを入れるのを忘れていました。
失礼しました。
投稿:shimada[isamu]/2016年 11月 12日 19時 25分 /更新:2016年 11月 12日 19時 25分
RE:tsp 業務アプリケーション 短期開発入門 第9章について
by 竹形 誠司[takegata]
あー、そうですか、解決して良かったです。
また何か分からないことがあればご質問ください。
投稿:竹形 誠司[takegata]/2016年 11月 12日 19時 27分 /更新:2016年 11月 12日 19時 27分
RE:tsp 業務アプリケーション 短期開発入門 第9章について
by shimada[isamu]
すいません。ただ単にmysql コネクタ?を入れ忘れただけかと思いもう一度やってみましたがやはりだめです。

SQL の文を 極端に SELECT * FROM user;にして実行しても

String sql = "select * from user "; 

//where login = ? and password=password(?)";

    PreparedStatement pStmt = conn.prepareStatement(sql);
   
    // pStmt.setString(1, strLogin);
    //pStmt.setString(2, strPassword);
    ResultSet rs = pStmt.executeQuery();
   
    String strMessage=null;
    if(rs.next()) {
        user.put("id", rs.getInt("id"));
        user.put("name", rs.getString("name"));
        user.put("level", rs.getInt("level"));
    } else {
        strMessage = "ログイン名またはパスワードが違います";
    }

strMessage が"ログインの名または.."になるので ResultSet のインスンタンスに結果が返ってきてないようです。

なにか初歩的なことかもしれませんが、もしお時間余裕あるときで結構ですので
なにか考えられることを教えていただければありがたいです。
投稿:shimada[isamu]/2016年 11月 12日 22時 06分 /更新:2016年 11月 12日 22時 08分
RE:tsp 業務アプリケーション 短期開発入門 第9章について
by 竹形 誠司[takegata]
このような場合は、エラーが起こるようなコードを書いてみて、期待したエラーが起こるかどうかやってみるといいかも知れません。

たとえば、エラーが起こるようなSQL文を送って、想定したエラーが起これば、そのSQL文はMySQLに届いているということです。

SQL文がMySQLに届いていることが確認できたら、mysqlのコンソールで、そのSQL文を実行してみてください。実行結果とResultSetの内容が違っている場合は、Connectionでの接続に問題があるかも知れません(別のdatabaseにつながっている等)

以上、参考になりますでしょうか。
投稿:竹形 誠司[takegata]/2016年 11月 12日 22時 18分 /更新:2016年 11月 12日 22時 18分
RE:tsp 業務アプリケーション 短期開発入門 第9章について
by shimada[isamu]
ありがとうございます。やっていなかったアプローチなので
以上参考にやってみます。
投稿:shimada[isamu]/2016年 11月 12日 22時 53分 /更新:2016年 11月 12日 22時 53分
RE:tsp 業務アプリケーション 短期開発入門 第9章について
by shimada[isamu]
結果ご報告

eclipse のDBViewerからcreate table でテーブルをつくっていたのですが、
マックのターミナルからcreateするとうまくいきました。
なぜかはわかりませんが、いろいろありがとうございました。
投稿:shimada[isamu]/2016年 11月 13日 12時 05分 /更新:2016年 11月 13日 12時 05分