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

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

ただいまの
回答率

87.58%

Eclipse+mySql+Mac で 404エラーとDBへの接続失敗 の原因をご教示ください

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,867
退会済みユーザー

退会済みユーザー

前提・実現したいこと

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

該当のソースコード

package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import model.Account;
import model.Login;

    public class AccountDAO{
        private final String DRIVER_NAME = "com.mysql.jdbc.Driver";
       //private final String JDBC_URL="jdbc:mysql://localhost/sukkiliShop?autoReconnect=true&useSSL=false";
        private final String JDBC_URL="jdbc:mysql://localhost/sukkiliShop";
        private final String DB_USER = "root";
        private final String DB_PASS = " ";

        public Account findByLogin(Login login) {
            Connection conn = null;
            Account account =null;
            try {
                Class.forName(DRIVER_NAME).newInstance();
                conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS);
                String sql="SELECT user_id,pass,mail,name,age FROM ACCOUNT WHERE user_id = ? AND pass = ?";
                PreparedStatement pStmt = conn.prepareStatement(sql);
                pStmt.setString(1,login.getUserId());
                pStmt.setString(2,login.getPass());
                ResultSet rs = pStmt.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();
                System.out.println("接続に失敗しました");
                return null;
            }catch(ClassNotFoundException e) {
                e.printStackTrace();
                System.out.println("ドライバが見つかりません");
                return null;
            }catch(Exception e) {
                e.printStackTrace();
                System.out.println("接続に失敗しました");
                return null;
            }finally {
                if(conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        // TODO 自動生成された catch ブロック
                        e.printStackTrace();
                        return null;
                    }
                }
            }return account;
        }
    }


package test;

import dao.AccountDAO;
import model.Account;
import model.Login;

public class AccountDAOTest{
    public static void main(String[] args) {
        testFindByLogin1();
        testFindByLogin2();
    }
    public static void testFindByLogin1() {
        Login login = new Login("minato","1234");
        AccountDAO dao = new AccountDAO();
        Account result = dao.findByLogin(login);
        if(result!=null && result.getUserId().equals("minato")
                && result.getPass().equals("1234")
                && result.getMail().equals("minato@sukili.com")
                && result.getName().equals("湊 雄輔")
                && result.getAge()==23) {
            System.out.println("testFindByLogin1:succsess");
        }else {
            System.out.println("testFindByLogin1:failed");
        }
    }
    public static void testFindByLogin2() {
        Login login = new Login("minato","12345");
        AccountDAO dao =new AccountDAO();
        Account result=dao.findByLogin(login);
        if(result == null) {
            System.out.println("testFindByLogin2:succsess");
        }else {
            System.out.println("testFindByLogin2:failed");
        }
    }
}

試したこと

⑴接続先 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)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2019/05/16 16:01

    デバッグは, 常に確認することです. 自分ではそんなはずは無いと思っていても, それでもなお確認して可能性を潰していきます.
    向こうで動いているのを持ってきたはずなのにこちらでは動かないのですから, こちらのコードを向こうで動かそうしてみれば, 何か分かるかもしれないということを申し上げています.
    その際にまさか全部持っていくわけにも行かないでしょうから, 例外が発生している箇所を含む極力小さく他への影響の無いコードを準備されたほうが良いかと思いました. もちろんそれをこちらで実行して確実に例外が発生することを確認しないといけませんし, もしそれで発生しなかったら, それを含む元のコードの他の部分が原因になっている可能性が発生します.
    こちらで例外が発生し, 向こうではやはり発生しなかった, やはりやるだけ無駄だった…となるかもしれませんが, この実験によって, その小さいコードに影響する環境が小さくなれば, 確認が必要な範囲は減らせるのではないでしょうか.

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/05/17 19:09 編集

    jimbe 様
    理解力がなく申し訳ありません。
    ご丁寧に説明いただきありがとうございました。
    初心者なもので、ログを見ても、具体的にどのようにアプローチすれば良いのか、分からない部分が多かったのですが、例外の対処の仕方のヒントになりました。
    本日はまだ試しておりませんが、後日確認してみようと思います。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/05/22 06:15

    jimbe様
    投稿が遅くなり申し訳ありません。
    仰せの通り一つずつ対処している途中で無事接続できました。
    丁寧にご対応いただき有り難うございました。

    キャンセル

回答 1

check解決した方法

0

ひとつずつコメントアウト、部分的なサーブレットを作成し、
見直す方法で解決いたしました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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