はじめまして、上記本にて勉強させていただいています。
お忙しいところ恐縮ですが、質問なのですが、
第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>
もし何か考えられる原因があればご教授ください。
ちなみに 例外やエラーは発生していません。
お忙しいところ恐縮ですが、質問なのですが、
第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ファイルを入れるのを忘れていました。
失礼しました。
単に ライブラリにmysqlをつなぐjarファイルを入れるのを忘れていました。
失礼しました。
投稿:shimada[isamu]/2016年 11月 12日 19時 25分
/更新:2016年 11月 12日 19時 25分
あー、そうですか、解決して良かったです。
また何か分からないことがあればご質問ください。
また何か分からないことがあればご質問ください。
投稿:竹形 誠司[takegata]/2016年 11月 12日 19時 27分
/更新:2016年 11月 12日 19時 27分
すいません。ただ単に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 のインスンタンスに結果が返ってきてないようです。
なにか初歩的なことかもしれませんが、もしお時間余裕あるときで結構ですので
なにか考えられることを教えていただければありがたいです。
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分
このような場合は、エラーが起こるようなコードを書いてみて、期待したエラーが起こるかどうかやってみるといいかも知れません。
たとえば、エラーが起こるようなSQL文を送って、想定したエラーが起これば、そのSQL文はMySQLに届いているということです。
SQL文がMySQLに届いていることが確認できたら、mysqlのコンソールで、そのSQL文を実行してみてください。実行結果とResultSetの内容が違っている場合は、Connectionでの接続に問題があるかも知れません(別のdatabaseにつながっている等)
以上、参考になりますでしょうか。
たとえば、エラーが起こるようなSQL文を送って、想定したエラーが起これば、そのSQL文はMySQLに届いているということです。
SQL文がMySQLに届いていることが確認できたら、mysqlのコンソールで、そのSQL文を実行してみてください。実行結果とResultSetの内容が違っている場合は、Connectionでの接続に問題があるかも知れません(別のdatabaseにつながっている等)
以上、参考になりますでしょうか。
投稿:竹形 誠司[takegata]/2016年 11月 12日 22時 18分
/更新:2016年 11月 12日 22時 18分
ありがとうございます。やっていなかったアプローチなので
以上参考にやってみます。
以上参考にやってみます。
投稿:shimada[isamu]/2016年 11月 12日 22時 53分
/更新:2016年 11月 12日 22時 53分
結果ご報告
eclipse のDBViewerからcreate table でテーブルをつくっていたのですが、
マックのターミナルからcreateするとうまくいきました。
なぜかはわかりませんが、いろいろありがとうございました。
eclipse のDBViewerからcreate table でテーブルをつくっていたのですが、
マックのターミナルからcreateするとうまくいきました。
なぜかはわかりませんが、いろいろありがとうございました。
投稿:shimada[isamu]/2016年 11月 13日 12時 05分
/更新:2016年 11月 13日 12時 05分