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

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

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

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

JSP

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

Java

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

servlet

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

Q&A

解決済

javaでログイン機能の実装

taki.muramatsu
taki.muramatsu

総合スコア7

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

JSP

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

Java

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

servlet

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

1回答

0グッド

2クリップ

1119閲覧

投稿2022/10/16 11:17

編集2022/10/18 06:20

前提

javaでログイン機能の学習をしている最中に
教材と同じ手順でやっていたのにも関わらず
エラーになってしまいました
どなたかご教示ください

データベースはpdAdmin4を使用
カラムは
id
password
name
comment
login_time

下記フォルダ階層になります
イメージ説明
html,jspはwebapp下です

下記よりソースコードになります

EmployeeBean.java

java

1package been; 2/** 3 * ・社員情報データ(モデル) 4 */ 5public class EmployeeBean { 6 private String Id; 7 private String PassWord; 8 private String Name; 9 private String Comment; 10 private String Login_Time; 11 public void setId(String Id) { 12 this.Id = Id; 13 } 14 public String Id() { 15 return Id; 16 } 17 public void setPassWord(String PassWord) { 18 this.PassWord = PassWord; 19 } 20 public String getPassWord() { 21 return PassWord; 22 } 23 public void setName(String Name) { 24 this.Name = Name; 25 } 26 public String getName() { 27 return Name; 28 } 29 public void setLogin_Time(String Login_Time) { 30 this.Login_Time = Login_Time; 31 } 32 public String getLogin_Time() { 33 return Login_Time; 34 } 35 public void setComment(String Comment) { 36 this.Comment = Comment; 37 } 38 public String getComment() { 39 return Comment; 40 } 41}

EmployeeController.java

java

1package controller; 2/** 3 * 社員情報管理コントローラー 4 */ 5import java.io.IOException; 6 7import javax.servlet.RequestDispatcher; 8import javax.servlet.ServletContext; 9import javax.servlet.ServletException; 10import javax.servlet.http.HttpServlet; 11import javax.servlet.http.HttpServletRequest; 12import javax.servlet.http.HttpServletResponse; 13 14import been.EmployeeBean; 15import service.EmployeeService; 16 17public class EmployeeController extends HttpServlet { 18 public void doPost(HttpServletRequest request, HttpServletResponse response) 19 throws ServletException, IOException { 20 21 try { 22 // 問① index.htmlから送信されたIDとPassWordの値を取得できるように修正しましょう。 23 String id = request.getParameter("id"); 24 String password = request.getParameter("pass"); 25 26 /* 27 * IDとPassWordと元に、社員情報を検索する関数の呼び出し、結果をJSPに渡す処理 28 * ※ EmployeeBeanとEmployeeServiceをimportするのを忘れないでください。 29 */ 30 31 // 問② EmployeeServiceクラスをインスタンス化する。 32 EmployeeService employeeservice = new EmployeeService(); 33 // 問③ EmployeeBeanに、EmployeeServiceよりsearch関数を呼び出し、返り値を格納する。 34 EmployeeBean returndata = employeeservice.search(Id,password); 35 // 問④ nullの部分に適切な引数をセットする。 36 request.setAttribute("EmployeeBean",returndata); 37 38 } catch (Exception e) { 39 e.printStackTrace(); 40 } finally { 41 ServletContext context = this.getServletContext(); 42 RequestDispatcher dispatcher = context.getRequestDispatcher("/index.jsp"); 43 dispatcher.forward(request, response); 44 } 45 } 46}

EmployeeService.java

java

1mployeeBean; 2 3/** 4 * ・社員情報検索サービス 5 */ 6 7public class EmployeeService { 8 9 // 問① 接続情報を記述してください 10 /** ドライバーのクラス名 */ 11 private static final String POSTGRES_DRIVER = "org.postgresql.Driver"; 12 /** ・JDBC接続先情報 */ 13 private static final String JDBC_CONNECTION = "jdbc:postgresql://localhost:5432/Employee_table"; 14 /** ・ユーザー名 */ 15 private static final String USER = "postgres"; 16 /** ・パスワード */ 17 private static final String PASS = "taiki0316"; 18 /** ・タイムフォーマット */ 19 private static final String TIME_FORMAT = "yyyy/MM/dd HH:mm:ss"; 20 21 // 問② 入力された値で、UPDATEする文 22 /** ・SQL UPDATE文 */ 23 private static final String SQL_UPDATE = "update employee_table set ? = to_char(current_timestamp, 'yyyy/MM/dd HH24:MI:SS') where id = ?"; 24 // 問③ 入力されたIDとPassWordをキーにして、検索するSELECT文 25 /** ・SQL SELECT文 */ 26 private static final String SQL_SELECT = "SELECT * FROM Employee_table WHERE id=?AND password = ?"; 27 28 EmployeeBean employeeDate = null; 29 30 // 送信されたIDとPassWordを元に社員情報を検索するためのメソッド 31 public EmployeeBean search(String id, String password) { 32 33 Connection connection = null; 34 Statement statement = null; 35 ResultSet resultSet = null; 36 PreparedStatement preparedStatement = null; 37 38 try { 39 // データベースに接続 40 Class.forName(POSTGRES_DRIVER); 41 connection = DriverManager.getConnection(JDBC_CONNECTION, USER, PASS); 42 statement = connection.createStatement(); 43 44 // 処理が流れた時間をフォーマットに合わせて生成 45 Calendar cal = Calendar.getInstance(); 46 SimpleDateFormat sdFormat = new SimpleDateFormat(TIME_FORMAT); 47 48 // PreparedStatementで使用するため、String型に変換 49 String login_time = sdFormat.format(cal.getTime()); 50 51 /* 52 * 任意のユーザーのログインタイムを更新できるように、プリペアドステートメントを記述。 53 */ 54 55 // preparedStatementに実行したいSQLを格納 56 preparedStatement = connection.prepareStatement(SQL_UPDATE); 57 // 問④ preparedStatementを使って、一番目のindexに今の時間をセットしてください。2番目のindexにIDをセットしてください。 58 preparedStatement.setString(1,login_time); 59 preparedStatement.setString(2,id); 60 61 // 問⑤ UPDATEを実行する文を記述 62 preparedStatement.executeUpdate(); 63 /* 64 * UPDATEが成功したものを即座に表示 65 * 任意のユーザーを検索できるように、プリペアドステートメントを記述。 66 */ 67 preparedStatement = connection.prepareStatement(SQL_SELECT); 68 //問⑥ 一番目のindexにIDをセットしてください。2番目のindexにPASSWORDをセット。 69 preparedStatement.setString(1, id); 70 preparedStatement.setString(2, password); 71 // SQLを実行。実行した結果をresultSetに格納。 72 resultSet = preparedStatement.executeQuery(); 73 74 while (resultSet.next()) { 75 // 問⑦ tmpName,tmpComment,tmpLoginTimeに適当な値を入れてください。 76 String tmpName = resultSet.getString("name"); 77 String tmpComment = resultSet.getString("comment"); 78 String tmpLoginTime = resultSet.getString("login_time"); 79 80 // 問⑧ EmployeeBeanに取得したデータを入れてください。 81 employeeDate = new EmployeeBean(); 82 employeeDate.setName(tmpName); 83 employeeDate.setComment(tmpComment); 84 employeeDate.setLogin_Time(tmpLoginTime); 85 } 86 87 // forName()で例外発生 88 } catch (ClassNotFoundException e) { 89 e.printStackTrace(); 90 91 // getConnection()、createStatement()、executeQuery()で例外発生 92 } catch (SQLException e) { 93 e.printStackTrace(); 94 95 } finally { 96 try { 97 98 if (resultSet != null) { 99 resultSet.close(); 100 } 101 if (statement != null) { 102 statement.close(); 103 } 104 if (connection != null) { 105 connection.close(); 106 } 107 108 } catch (SQLException e) { 109 e.printStackTrace(); 110 } 111 } 112 return employeeDate; 113 } 114}

index.css

css

1@charset "utf-8"; 2 3.wrapper{ 4 margin: 0 auto; 5 width: 400px 6} 7.header{ 8 float: auto; 9 margin-top: 10px; 10 width: 400pX; 11 text-align: left; 12 /* 問① 背景を青色にする */ 13 background-color: blue; 14 /* 問② 文字の色を白にする */ 15 color:white; 16 /* 問③ 背景に対して文字を縦方向に中央揃え */ 17 align-items: center; 18 19} 20 21ul li { 22 margin-top: 10px; 23 list-style: none; 24 } 25 26label { 27 width: 100px; 28 float: left; 29} 30 31ul { 32 width: 400px; 33 margin: 0 auto; 34} 35input#button { 36 display: block; 37 margin: 0 auto; 38} 39ul li.pass { 40 margin-bottom: 15px; 41} 42 43.footer{ 44 float: auto; 45 margin-top: 10px; 46 width: 400pX; 47 text-align: left; 48 /* 問④ 背景を青色にする */ 49 background-color:blue; 50 51 /* 問⑤ 文字の色を白にする */ 52 color:white; 53 54 /* 問⑥ 背景に対して文字を縦方向に中央揃え */ 55 align-items: center; 56 57}

index.html

html

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>社員情報システム</title> 6<link rel="stylesheet" type="text/css" href="./CSS/index.css"> 7</head> 8<body> 9 <form action="/8-1/search" method="post"> 10 <div class="wrapper"> 11 <div class="header">社員情報システム</div> 12 <ul> 13 <!-- ID入力欄 --> 14 <li class="id"> 15 <label for="id">ID</label> 16 <input type="text" name="id" value="" size="20"> 17 </li> 18 <!-- パスワードを入力する欄を作成してください --> 19 <li class="pass"> 20 <label for="password">password</label> 21 <input type="text" name="password" value="" size="20"> 22 </li> 23 24 <!-- 検索ボタン --> 25 <li><input id="button" type="submit" name="button" value="検索"> 26 </li> 27 </ul> 28 <div class="footer">hoge.inc</div> 29 </div> 30 </form> 31</body> 32</html>

index.jsp

java

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<%@ page import="been.EmployeeBean"%> 4 5<% 6 // 問① getAttributeに適切な引数をセットして、EmployeeControllerから渡されたBeanを取得する。 7 EmployeeBean employeeBean = (EmployeeBean) request.getAttribute("EmployeeBean"); 8%> 9<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 10<html> 11<head> 12<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 13<title>検索結果</title> 14</head> 15<body> 16 <div align="center"> 17 <!-- 検索が成功した場合の表示 --> 18 <% 19 if (employeeBean != null) { 20 %> 21 <table border="1"> 22 <tr> 23 <th>社員名</th> 24 <td><%=employeeBean.getName()%></td> 25 </tr> 26 <tr> 27 <th>コメント</th> 28 <td><%=employeeBean.getComment()%></td> 29 </tr> 30 <tr> 31 <th>ログインタイム</th> 32 <td><%=employeeBean.getLogin_Time()%></td> 33 </tr> 34 </table> 35 36 <!-- 問② それ以外の表示(エラーの場合)--> 37 <% } else { %> 38 【ここを修正】 39 <% } %> 40 </div> 41</body> 42</html>

web.xml

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0"> 3 <display-name>8-1</display-name> 4 <servlet> 5 <servlet-name>search</servlet-name> 6 <servlet-class>controller.EmployeeController</servlet-class> 7 </servlet> 8 <servlet-mapping> 9 <servlet-name>search</servlet-name> 10 <url-pattern>/search</url-pattern> 11 </servlet-mapping> 12 <welcome-file-list> 13 <welcome-file>index.html</welcome-file> 14 </welcome-file-list> 15</web-app> 16

実現したいこと

id,パスワードが正しい場合
画面遷移後に
社員名、コメント、ログインタイム表示
間違いの場合に
画面遷移後「ID,パスワードが間違ってます」と表示

ここに実現したいことを箇条書きで書いてください。

発生している問題・エラーメッセージ

id,password入力後検索すると以下の様になります

イメージ説明
イメージ説明

java

1org.apache.jasper.JasperException: JSPのクラスをコンパイルできません: 2

該当のソースコード

java

1 EmployeeBean employeeBean = (EmployeeBean) request.getAttribute("EmployeeBean");

試したこと

記載ミスがないかどうかの確認

補足情報(FW/ツールのバージョンなど)

java,エクリプスjdbc全て現在の最新です

解決方法

index.jsp内のimportが間違っていました。パッケージ名を「bean. EmployeeBean」としていたが正しくは「been. EmployeeBean」でした

追加の質問

id,パスワードを登録後検索ボタンで画面遷移し、データベース内の「社員名」「コメント」「ログインタイム」を表として表示したいのですが結果として[
id,パスワードが間違っています」と表示されます。
おそらくhtmlからの値をうまく取得出来ておらずデータベースに接続が出来ていないためデータベースの情報を取得出来ないのではないかと考えています。
有識者の皆様意見をいただきたいです
よろしくお願いいたします。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

ベストアンサー

例外のメッセージとコードを隅から隅まで確認してください。
間違いは実行する所だけとは限りません。


以下のコードで PreparedStatement が実際にどのような SQL を生成しているか確認出来ることを確認しました。
JDBC4 からは Class.forName(~) は不要になりました。
(postgresql-42.5.0.jar 使用)

java

1import java.sql.*; 2 3public class PostgreSQLTest { 4 public static void main(String[] args) throws SQLException { 5 try(Connection con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "password")) { 6 try(PreparedStatement pstmt = con.prepareStatement("SELECT * FROM table WHERE id=? AND name=?");) { 7 pstmt.setLong(1, 123); 8 pstmt.setString(2, "ABC"); 9 System.out.println("sql=" + pstmt.toString()); 10 } 11 } 12 } 13}

plain

1sql=SELECT * FROM table WHERE id=123 AND name='ABC'

サーブレットから必要なパラメータが取得出来ていることを確認出来れば、後はデータベース関連だけですので、以下のようなテストプログラムを作って SQL 文やコードが動くことを確認しながら本来のコードを修正することが出来ると思います。

java

1import java.sql.*; 2import java.text.SimpleDateFormat; 3import java.util.StringJoiner; 4 5public class PostgreSQLTest { 6 // set/get で長くなるので代用 7 static class EmployeeBean { 8 String id; 9 String password; 10 String name; 11 String comment; 12 String loginTime; 13 14 @Override 15 public String toString() { 16 StringJoiner sj = new StringJoiner(","); 17 sj.add("id=" + id); 18 sj.add("password=" + password); 19 sj.add("name=" + name); 20 sj.add("comment=" + comment); 21 sj.add("loginTime=" + loginTime); 22 return sj.toString(); 23 } 24 } 25 26 static final String TABLE = "employee_table2"; 27 28 static SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 29 30 public static void main(String[] args) throws SQLException { 31 initDB(); 32 33 test("", ""); 34 test("foobar", ""); 35 test("", "qwerty"); 36 test("foobar", "qwerty"); 37 test("123", "ABC"); 38 } 39 40 private static void test(String id, String password) throws SQLException { 41 System.out.println("----------------"); 42 System.out.println("parameter: id='" + id + "', password='" + password + "'"); 43 EmployeeBean bean = search(id, password); 44 System.out.println(" → " + bean); 45 } 46 47 private static EmployeeBean search(String id, String password) throws SQLException { 48 String loginTime = sdFormat.format(new java.util.Date()); 49 50 try(Connection con = createConnection()) { 51 try(PreparedStatement pstmt = con.prepareStatement( 52 "UPDATE " + TABLE + 53 " SET login_time=?" + 54 " WHERE id=?")) { 55 pstmt.setString(1, loginTime); 56 pstmt.setString(2, id); 57 System.out.println("sql=" + pstmt.toString()); 58 if(pstmt.executeUpdate() != 1) return null; //id が無い 59 } 60 try(PreparedStatement pstmt = con.prepareStatement( 61 "SELECT" + 62 " name,comment" + 63 " FROM " + TABLE + 64 " WHERE id=? AND password=?")) { 65 pstmt.setString(1, id); 66 pstmt.setString(2, password); 67 System.out.println("sql=" + pstmt.toString()); 68 try(ResultSet rset = pstmt.executeQuery()) { 69 if(rset.next()) { 70 EmployeeBean bean = new EmployeeBean(); 71 bean.id = id; 72 bean.password = password; 73 bean.name = rset.getString("name"); 74 bean.comment = rset.getString("comment"); 75 bean.loginTime = loginTime; 76 return bean; 77 } 78 } 79 } 80 } 81 return null; 82 } 83 84 //テーブル・データ準備 85 private static void initDB() throws SQLException { 86 try(Connection con = createConnection()) { 87 con.setAutoCommit(false); 88 try(Statement stmt = con.createStatement()) { 89 stmt.execute("DROP TABLE IF EXISTS " + TABLE); 90 stmt.execute( 91 "CREATE TABLE " + TABLE + " (" + 92 " id VARCHAR(32) PRIMARY KEY," + 93 " password VARCHAR(32)," + 94 " name VARCHAR(64)," + 95 " comment TEXT," + 96 " login_time VARCHAR(20)" + 97 " )"); 98 } 99 try(PreparedStatement pstmt = con.prepareStatement( 100 "INSERT INTO" + 101 " " + TABLE + " (id,password,name,comment,login_time)" + 102 " VALUES (?,?,?,?,?)")) { 103 pstmt.setString(1, "foobar"); 104 pstmt.setString(2, "qwerty"); 105 pstmt.setString(3, "USER"); 106 pstmt.setString(4, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 107 pstmt.setString(5, sdFormat.format(new java.util.Date())); 108 if(pstmt.executeUpdate() != 1) { 109 System.err.println("insert 失敗"); 110 return; //rollback 111 } 112 } 113 con.commit(); 114 } 115 } 116 117 private static Connection createConnection() throws SQLException { 118 return DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "password"); 119 } 120}

plain

1---------------- 2parameter: id='', password='' 3sql=UPDATE employee_table2 SET login_time='2022/10/18 20:09:01' WHERE id='' 4 → null 5---------------- 6parameter: id='foobar', password='' 7sql=UPDATE employee_table2 SET login_time='2022/10/18 20:09:01' WHERE id='foobar' 8sql=SELECT name,comment FROM employee_table2 WHERE id='foobar' AND password='' 9 → null 10---------------- 11parameter: id='', password='qwerty' 12sql=UPDATE employee_table2 SET login_time='2022/10/18 20:09:01' WHERE id='' 13 → null 14---------------- 15parameter: id='foobar', password='qwerty' 16sql=UPDATE employee_table2 SET login_time='2022/10/18 20:09:01' WHERE id='foobar' 17sql=SELECT name,comment FROM employee_table2 WHERE id='foobar' AND password='qwerty' 18 → id=foobar,password=qwerty,name=USER,comment=ABCDEFGHIJKLMNOPQRSTUVWXYZ,loginTime=2022/10/18 20:09:01 19---------------- 20parameter: id='123', password='ABC' 21sql=UPDATE employee_table2 SET login_time='2022/10/18 20:09:01' WHERE id='123' 22 → null

投稿2022/10/16 19:59

編集2022/10/18 11:21
jimbe

総合スコア10817

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

taki.muramatsu

2022/10/16 21:18

jimbeさん有難うございました。 エラーは解決したのですが 今度はid,passwordをデータベースで登録したものを入力して検索したものの欲しい情報が取得されませんでしたが エラーが出ている訳ではなく何処が間違っているのかわかりません 教えていただきたいです
taki.muramatsu

2022/10/16 22:10

db名が間違っていたため修正 EmployeeController.javaのgetParameter("pass");が間違っていたため("password")と修正したが変化ありませんでした
jimbe

2022/10/17 06:14 編集

>エラーは解決した 何が悪くてどう修正したのかをご提示ください。 terstail は質問者の問題の解決だけでなく、知識ベースとして情報を蓄積することも目的としています。 >欲しい情報が取得されませんでした 表現が抽象的です。 具体的なコードがあるのですから、どの行の時点でどの変数がどんな値になるはずなのにどんな値になっているのかを調査・ご提示ください。それを突き詰めれば問題箇所を絞り込めるはずで、それがデバッグの基本です。 また、質問は編集できます、 関係する問題が発生したのでしたら、その経緯と内容は質問を編集して追記してください。 prepareStatement で処理する SQL (プレースホルダーの使い方) は正しいでしょうか。 (データをセットした後の SQL を確認してみてください。)
taki.muramatsu

2022/10/17 13:03

jimbeさん回答有難うございます 欲しい情報 ログイン成功時にデータベースに入っている「社員名」「コメント」「ログインタイム」を最初のログイン画面から遷移して表として表示したいです。 自分の中ではそもそもログイン時のidとパスワードをhtmlから取得できておらずデータベースに接続が出来ていないと考えています。 ご指摘の通りプレースホルダーを確認しました自分的には「’」がいらないと判断し消して実行してみたが変わらず「id,パスワードが間違っています」と表示されます
jimbe

2022/10/17 13:52 編集

>自分の中ではそもそもログイン時のidとパスワードをhtmlから取得できておらずデータベースに接続が出来ていないと考えています。 「どの行の時点でどの変数がどんな値になるはずなのにどんな値になっているのかを調査」と申し上げましたが、されていますでしょうか。 問題が発覚し、その原因を推理されたのでしたら、次にすべきはその確認です。 (ちなみに "データベースへの接続" と "データベースの検索" は別モノです。) html からサーブレットにデータが渡されれば、 EmployeeController の問(1) の getParameter で id や password が入るはずですので、そこで両変数の値を確認すれば「考えています」という不確かな表現はしなくて済むでしょう。 >ご指摘の通りプレースホルダーを確認しました自分的には「’」がいらないと判断し消して実行してみたが変わらず「id,パスワードが間違っています」と表示されます 全てが思惑通りに動いていたとしても、データベースにどんな値が入っているのかこちらには分かりませんので、id や password があっているのかどうかは分かりません。 PreparedStatement は toString() でプレースフォルダに値を設定した状態の SQL を含む文字列を返してくれる(ことが多い)と思いますので、実行する前に表示確認しては如何でしょうか。
taki.muramatsu

2022/10/17 15:41

htmlからサーブレットへの値は上手くいっていました。 PreparedStatement は toString() でプレースフォルダに値を設定した状態の SQL を含む文字列を返してくれる> ? の箇所はそのまま?で表示されました
jimbe

2022/10/17 16:39

>htmlからサーブレットへの値は上手くいっていました。 であれば「ログイン時のidとパスワードをhtmlから取得できておらず」はクリアしていたことになります。 PostgreSQL にはコマンドレベルでデータベースを操作する機能があると思うのですが、それを使って、 preparedStatement で生成しているはずの SELECT 文でデータを取れるか試しては如何でしょうか。 >? の箇所はそのまま?で表示されました そうでしたか。 [JDBCでPreparedStatementを利用する際、実際に発行するクエリ文字列を取得する方法](https://qiita.com/tana6/items/05be43cd2fe99159f92b) では PostgreSQL でも toString で 確認出来たようですが、記事が古くドライバも古いでしょうから、新しくなって変わってしまったということでしょう。
jimbe

2022/10/17 17:23

>? の箇所はそのまま?で表示されました 試した所、プレースホルダーを埋めた SQL が確認出来ました。
cocoabreak

2022/10/17 23:31

>今度はid,passwordをデータベースで登録したものを入力して検索したものの欲しい情報が取得されませんでしたが EmployeeController の次の実装部分が原因ではないでしょうか。 リクエストパラメータからidとpasswordをサービス呼び出しの引数に設定せず、 固定値になっているようです。 // 問③ EmployeeBeanに、EmployeeServiceよりsearch関数を呼び出し、返り値を格納する。 EmployeeBean returndata = employeeservice.search("taiki","taiki0316");
jimbe

2022/10/18 03:54

ご提示のコードが間違っていたのでしたら、ご質問を編集してください。 後から見た人がこのコメントを読む前にご質問のコードを前提に回答を書かれる可能性があります。
taki.muramatsu

2022/10/18 06:20

修正させていただきました。 改めてご確認をお願い致します
jimbe

2022/10/18 07:59 編集

修正箇所が少ないからといって、ご質問のコードを手作業で直すのはあまりやらない方が良いです。変数名 Id ではなく id ですね? (私も同様にやってしまいますが。) 動作しているコードを丸ごとコピーしたほうが確実です。 それと、お使いのドライバで PreparedStatement.toString() でプレースホルダーが展開された SQL を確認することが出来ますので、「>? の箇所はそのまま?で表示されました」は展開出来なかった可能性があります。 具体的にどの個所に確認のコードを入れ、id と password がどのような値で、どのような SQL が表示がされたのかを教えてください。
taki.muramatsu

2022/10/18 10:43

// 問④ preparedStatementを使って、一番目のindexに今の時間をセットしてください。2番目のindexにIDをセットしてください。 preparedStatement.setString(1,login_time); preparedStatement.setString(2,id); System.out.println(preparedStatement.toString()); この様に記載したところ何も表示されませんでした。
taki.muramatsu

2022/10/18 10:45

No suitable driver found for jdbc:postgresql このようなエラーが発生しました
jimbe

2022/10/18 11:25

>この様に記載したところ何も表示されませんでした。 先のコメントでは >>? の箇所はそのまま?で表示されました 「そのまま」と言われていたので、SQL_SELECT に定義している文字列が「そのまま」表示されたものと思っていましたが…「何も表示されない」が正しい状況でしょうか? >No suitable driver found for jdbc:postgresql は、何を修正されて出たのでしょうか。
taki.muramatsu

2022/10/18 11:35

System.out.println(preparedStatement.toString()); の記載箇所に違いです。 最初は private static final String SQL_SELECT = "SELECT * FROM employee_table WHERE id=? AND password = ?"; の直下に記載しておりその際は「?」のまま出力されました その後先ほどコメントした箇所に記載したところ No suitable driver found for jdbc:postgresqlのエラーが出ました
taki.muramatsu

2022/10/18 11:54

解決しました 内容としては update employee_table set ? = to_char(current_timestamp, ‘yyyy/MM/dd HH24:MI:SS’) where id = ?”; が間違っていました。 // PreparedStatementで使用するため、String型に変換 String login_time = sdFormat.format(cal.getTime()); この部分を見落としていました 結果として update employee_table set login_time = ? where id = ?”; としたところ無事に取得出来ました ありがとうございました

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

JSP

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

Java

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

servlet

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