現在簡易的なログイン機能をサーブレットとjspを用いて実装しています。,
後述しているLoginServletのコメントアウトしている箇所を付け加えると
java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/14
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
at dao.AccountDao.findByLogin(AccountDao.java:21)
at bo.LoginLogic.execute(LoginLogic.java:10)
at servlet.LoginServlet.doPost(LoginServlet.java:33)(以下省略)
というメッセージがコンソールに表示されてしまいます。
以下が実装したコードとなります。
package servlet; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import bo.LoginLogic; import entity.Login; @WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/login.jsp"); dispatcher.forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // request.setCharacterEncoding("utf-8"); // // String userId = request.getParameter("userId"); // String pass = request.getParameter("pass"); // // Login login = new Login(userId, pass); // LoginLogic logic = new LoginLogic(); // boolean result = logic.execute(login); // // if(result) { // HttpSession session = request.getSession(); // session.setAttribute("userId", userId); RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/mypage.jsp"); dispatcher.forward(request, response); // }else { // response.sendRedirect("/14/LoginServlet"); // } } }
package dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import entity.Account; import entity.Login; public class AccountDao { private final String JDBC_URL = "jdbc:mysql://localhost/14"; private final String DB_USER = "root"; private final String DB_PASS = "*********";//セキュリティ上米印とさせていただきます。 public Account findByLogin(Login login) { Account account = null; try(Connection con = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS)){ String sql = "SELECT USER_ID, PASS, MAIL, NAME, AGE FROM `14`.account WHERE USER_ID = ? AND PASS = ?"; PreparedStatement ptmt = con.prepareStatement(sql); ptmt.setString(1, login.getUserId()); ptmt.setString(2, login.getPass()); ResultSet rs = ptmt.executeQuery(); 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(); return null; } return account; } }
package bo; import dao.AccountDao; import entity.Account; import entity.Login; public class LoginLogic{ public boolean execute(Login login) { AccountDao aDao = new AccountDao(); Account account = aDao.findByLogin(login); return account != null; } }
package entity; public class Account{ private String userId; private String pass; private String mail; private String name; private int age; public Account() {} public Account(String userId, String pass, String mail, String name, int age) { this.userId = userId; this.pass = pass; this.mail = mail; this.name = name; this.age = age; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public String getMail() { return mail; } public void setMail(String mail) { this.mail = mail; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package entity; public class Login{ private String userId; private String pass; public Login() {} public Login(String userId, String pass) { this.userId = userId; this.pass = pass; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } }
ログイン画面(login.jsp) <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>スッキリ商店</title> </head> <body> <form action="/14/LoginServlet" method="post"> ログインID:<input type="text" name="userId"><br/> パスワード:<input type="password" name="pass"><br/> <input type="submit" value="ログイン"> </form> </body> </html>
エラーメッセージからデータベースとの接続に問題があると考え、Junitでテストを行いました
以下のテストコードは正常に作動しています(DaoとLoginLogicのテストです)。
この時はデータベースの値を変更するとテスト結果も変わってくるため、接続はうまくいっていると思われます。
package test; import org.junit.jupiter.api.Test; import dao.AccountDao; import entity.Account; import entity.Login; public class AccountDaoTest { @Test public void testFindByLogin1() { Login login = new Login("minato","1234"); AccountDao aDao = new AccountDao(); Account result = aDao.findByLogin(login); if(result != null && result.getUserId().equals("minato") && result.getPass().equals("1234") && result.getMail().equals("minato@gmail.com") && result.getName().equals("湊雄介") && result.getAge() == 23) { System.out.println("testFindByLogin1:成功しました" ); }else { System.out.println("testFindByLogin1:失敗しました" ); } } @Test public void testFindByLogin2() { Login login = new Login("minato", "1235"); AccountDao aDao = new AccountDao(); Account result = aDao.findByLogin(login); if(result == null) { System.out.println("testFindByLogin2:成功しました" ); }else { System.out.println("testFindByLogin2:失敗しました" ); } } }
package test; import org.junit.jupiter.api.Test; import bo.LoginLogic; import entity.Login; public class LoginLogicTest { @Test public void loginLogicTest1() { Login login = new Login("minato", "1234"); LoginLogic logic = new LoginLogic(); boolean result = logic.execute(login); if(result) { System.out.println("LoginLogicTest1:成功しました"); }else { System.out.println("LoginLogicTest1:失敗しました"); } } @Test public void loginLogicTest2() { Login login = new Login("minato", "1235"); LoginLogic logic = new LoginLogic(); boolean result = logic.execute(login); if(!result) { System.out.println("LoginLogicTest2:成功しました"); }else { System.out.println("LoginLogicTest2:失敗しました"); } } }
なぜログイン画面から入力した場合はログインできないのでしょうか。ご教授いただけると幸いです。
開発環境
Eclipse IDE(version:2021-06 (4.20.0))
サーバ:Tomcat9_Java16
データベース:MySQL(8.0)
JDBCドライバの状態
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。