前提・実現したいこと
java 初学者です。初めて質問させて頂きます。質問の記載法や内容に不備があれば、ご指摘下さいませ。
「スッキリわかるサーブレット&JSP」という書籍を参考に、
eclipseで、WEBアプリケーションの設計を練習するための動的プロジェクト、"sukkiliShop"のログイン部分を作成中です。
書籍の設定では、
・ サーブレットからフォーワードされたJSPの画面にある「ログイン」をクリックすると、当該サーブレットにリンクされていて、一度こちらにリクエストしてからdoGetメソッドでログイン画面にフォーワードされる。
・ ログイン画面でuser_id と password を入力し、その情報が DB に保存されたものと相違がなければ、結果画面に遷移する、
という流れになっています。
設計手法として、まず「BO と DAO に当たるクラスと、そのテストを行うクラス(入力情報ではなく、テストクラスに直接値を代入する静的なテスト)のサーブレットを作成、実行して、この段階で誤りがないか確認する」 とあるのですが、
①テストクラスのサーブレット AccountDAOTest を右「クリック -> アプリケーションで実行」すると、接続に失敗します。
(例外処理の表示によりドライバクラスは見つかっているようです)
そこで、「試したこと」⑶ の状態にあって、行き詰まってしまいました。
書籍ではOSは Windows、データベースはH2 DBの使用を前提としているのですが、私はMac を使用していて、ネット上に H2DB + mac の情報が少なく、接続等が上手くいかなかったので、情報量が多かった mySql を使用しています。
エラーの原因として考えられることがあれば、ご教示いただけないでしょうか?
よろしくお願い致します。
発生している問題・エラーメッセージ
404 Not Found massage: /sukkiliShop/ 説明: The origin server did not find a current representation for the target resource or is not willing to disclose that one exists. 以上は、「試したこと」⑶ に関するエラー ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 以下は、「前提・実現したいこと」①に関するエラー Tue May 14 10:14:46 JST 2019 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3978) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3914) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871) at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1714) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1224) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2199) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2230) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2025) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:778) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:386) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330) at java.sql.DriverManager.getConnection(DriverManager.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:247) at dao.AccountDAO.findByLogin(AccountDAO.java:24) at test.AccountDAOTest.testFindByLogin2(AccountDAOTest.java:29) at test.AccountDAOTest.main(AccountDAOTest.java:10) 接続に失敗しました testFindByLogin2:succsess
該当のソースコード
Java
1 2package dao; 3 4import java.sql.Connection; 5import java.sql.DriverManager; 6import java.sql.PreparedStatement; 7import java.sql.ResultSet; 8import java.sql.SQLException; 9 10import model.Account; 11import model.Login; 12 13 public class AccountDAO{ 14 private final String DRIVER_NAME = "com.mysql.jdbc.Driver"; 15 //private final String JDBC_URL="jdbc:mysql://localhost/sukkiliShop?autoReconnect=true&useSSL=false"; 16 private final String JDBC_URL="jdbc:mysql://localhost/sukkiliShop"; 17 private final String DB_USER = "root"; 18 private final String DB_PASS = " "; 19 20 public Account findByLogin(Login login) { 21 Connection conn = null; 22 Account account =null; 23 try { 24 Class.forName(DRIVER_NAME).newInstance(); 25 conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS); 26 String sql="SELECT user_id,pass,mail,name,age FROM ACCOUNT WHERE user_id = ? AND pass = ?"; 27 PreparedStatement pStmt = conn.prepareStatement(sql); 28 pStmt.setString(1,login.getUserId()); 29 pStmt.setString(2,login.getPass()); 30 ResultSet rs = pStmt.executeQuery(); 31 if(rs.next()) { 32 String userId = rs.getString("user_id"); 33 String pass = rs.getString("pass"); 34 String mail = rs.getString("mail"); 35 String name = rs.getString("name"); 36 int age = rs.getInt("age"); 37 38 account = new Account(userId,pass,mail,name,age); 39 } 40 }catch(SQLException e) { 41 e.printStackTrace(); 42 System.out.println("接続に失敗しました"); 43 return null; 44 }catch(ClassNotFoundException e) { 45 e.printStackTrace(); 46 System.out.println("ドライバが見つかりません"); 47 return null; 48 }catch(Exception e) { 49 e.printStackTrace(); 50 System.out.println("接続に失敗しました"); 51 return null; 52 }finally { 53 if(conn != null) { 54 try { 55 conn.close(); 56 } catch (SQLException e) { 57 // TODO 自動生成された catch ブロック 58 e.printStackTrace(); 59 return null; 60 } 61 } 62 }return account; 63 } 64 } 65 66 67package test; 68 69import dao.AccountDAO; 70import model.Account; 71import model.Login; 72 73public class AccountDAOTest{ 74 public static void main(String[] args) { 75 testFindByLogin1(); 76 testFindByLogin2(); 77 } 78 public static void testFindByLogin1() { 79 Login login = new Login("minato","1234"); 80 AccountDAO dao = new AccountDAO(); 81 Account result = dao.findByLogin(login); 82 if(result!=null && result.getUserId().equals("minato") 83 && result.getPass().equals("1234") 84 && result.getMail().equals("minato@sukili.com") 85 && result.getName().equals("湊 雄輔") 86 && result.getAge()==23) { 87 System.out.println("testFindByLogin1:succsess"); 88 }else { 89 System.out.println("testFindByLogin1:failed"); 90 } 91 } 92 public static void testFindByLogin2() { 93 Login login = new Login("minato","12345"); 94 AccountDAO dao =new AccountDAO(); 95 Account result=dao.findByLogin(login); 96 if(result == null) { 97 System.out.println("testFindByLogin2:succsess"); 98 }else { 99 System.out.println("testFindByLogin2:failed"); 100 } 101 } 102}
試したこと
⑴接続先 DB の名前,テーブル名などの確認
⑵結局分からず中断しましたが、SSLを使用して接続しようとしてみましたが、関係あるのでしょうか??
⑶同じワークスペースで作った別の動的プロジェクト(DB使用)は完成していて、「プロジェクト名右クリック -> サーバで実行」で最後の処理まで問題なく表示できます。
そこで試しに、残りのビューやコントローラのサーブレット・JSPを作成し、プロジェクト名から実行できる様に、WEB-INF直下に最初の画面を表示するindex.jspを作成しましたが、今度は 404 NotFound が表示されてしまいます。
※DB名は sukkiliShop にして、ログイン情報をテーブル ACCOUNT に保存しています。JDBCのURL、ユーザーネーム、パスワードは当該別プロジェクトと同じmのを使用しています。
補足情報(FW/ツールのバージョンなど)
※「該当のソースコード」は全てではありませんが、多くなるので、とりあえず接続部分とテストのコードを記載します。
Server version: Apache Tomcat/7.0.91
OS Name: Mac OS X
OS Version: 10.14.4
Eclipse Java EE IDE for Web Developers.
Version: 2018-09 (4.9.0)
mysql-connector-java-5.1.47
mysql Ver 8.0.16 for osx10.14 on x86_64 (Homebrew)
回答1件
あなたの回答
tips
プレビュー