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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

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

Q&A

解決済

1回答

1093閲覧

【Eclipse】Servlet&jspでMySQLのDBから情報が取り出せない問題について

tomomomo

総合スコア22

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

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

0グッド

0クリップ

投稿2022/02/11 02:48

編集2022/02/11 04:46

現状と問題

現在、javaで初めてWebアプリ(todoアプリ)を作成しております。
参考にさせていただいている記事はこちらになります。
参考のサイトではpostgreDBを使用していますが、私はMySQLで行っております。
DBは作成済みで、サンプルとしてレコードを一つ登録してある状況です。
問題としましては、登録してあるDBのレコードを取得できていないということです。
下記に対象のコード、コンソールに出力されたものを記述いたします。
ファイル構成はした図のような感じです。
イメージ説明

対象のコード

DBConnection.java

1package model; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.SQLException; 6 7public class DBConnection { 8 9 public static Connection getConnection() throws SQLException, ClassNotFoundException { 10// データベースのURL 11 final String URL = "jdbc:mysql://localhost:3306/java_todo_db"; 12// データベースにアクセスするユーザー 13 final String USER = "root"; 14// パスワード 15 final String PASSWORD = "*******"; 16 17 Class.forName("com.mysql.jdbc.Driver"); 18 Connection con = DriverManager.getConnection(URL, USER, PASSWORD); 19 return con; 20 } 21 22} 23

TodoListDAO.java

1package model.dao; 2 3import java.sql.Connection; 4import java.sql.Date; 5import java.sql.PreparedStatement; 6import java.sql.ResultSet; 7import java.sql.SQLException; 8import java.util.ArrayList; 9import java.util.List; 10 11import model.DBConnection; 12import model.dao.dto.TodoDTO; 13 14public class TodoListDAO { 15 public List<TodoDTO> getTodoList() throws ClassNotFoundException, SQLException { 16 17 // 返却用Listの初期化 18 List<TodoDTO> todoList = new ArrayList<>(); 19 20 // 実行するSQL 21 String sql = "SELECT id, todo, timeLimit from todo"; 22 23 // DBに接続し、Todo一覧を取得する 24 try (Connection con = DBConnection.getConnection(); 25 PreparedStatement pstmt = con.prepareStatement(sql)) { 26 27 // SQLを実行しResultSetの変数に結果を格納する 28 ResultSet res = pstmt.executeQuery(); 29 // 実行結果を順番に取り出す 30 while (res.next()) { 31 // それぞれid, todo, timeLimitを取得する 32 int id = res.getInt("id"); 33 String todo = res.getString("todo"); 34 Date timeLimit = res.getDate("timeLimit"); 35 36 // 取得したid, todo, timeLimitでTodoDTOを初期化してListに追加 37 todoList.add(new TodoDTO(id, todo, timeLimit)); 38 } 39 } 40 41 return todoList; 42 43 } 44 45} 46

ListServlet.java

1package servlet; 2 3import java.io.IOException; 4import java.sql.SQLException; 5import java.util.ArrayList; 6import java.util.List; 7 8import javax.servlet.RequestDispatcher; 9import javax.servlet.ServletException; 10import javax.servlet.annotation.WebServlet; 11import javax.servlet.http.HttpServlet; 12import javax.servlet.http.HttpServletRequest; 13import javax.servlet.http.HttpServletResponse; 14 15import model.dao.TodoListDAO; 16import model.dao.dto.TodoDTO; 17 18/** 19 * Servlet implementation class ListServlet 20 */ 21@WebServlet("/list-servlet") 22public class ListServlet extends HttpServlet { 23 private static final long serialVersionUID = 1L; 24 25 /** 26 * @see HttpServlet#HttpServlet() 27 */ 28 public ListServlet() { 29 super(); 30 // TODO Auto-generated constructor stub 31 } 32 33 /** 34 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 35 */ 36 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 37 // todoの一覧を保持する変数を宣言 38 List<TodoDTO> todoList = new ArrayList<>(); 39 40 // DAOを生成し、Todo一覧を取得する 41 TodoListDAO dao = new TodoListDAO(); 42 try { 43 // todo一覧を取得する 44 todoList = dao.getTodoList(); 45 }catch(SQLException | ClassNotFoundException e) { 46 e.printStackTrace(); 47 } 48 49 // todo一覧をリクエストスコープに設定する 50 request.setAttribute("todoList", todoList); 51 // todo一覧画面に遷移する 52 RequestDispatcher rd = request.getRequestDispatcher("list.jsp"); 53 rd.forward(request, response); 54} 55 56 /** 57 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 58 */ 59 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 60 // TODO Auto-generated method stub 61 doGet(request, response); 62 } 63 64} 65

list.jsp

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8" import="java.util.List, java.util.ArrayList, model.dao.dto.TodoDTO"%> 3<!DOCTYPE html> 4<html> 5<head> 6<meta charset="UTF-8"> 7<title>Todo List</title> 8</head> 9<body> 10 <% 11 List<TodoDTO> todoList = (List) request.getAttribute("todoList"); 12 %> 13 14 <% for(TodoDTO todo: todoList){ %> 15 <%=todo.getTodo() %> 期限:<%=todo.getTimeLimit() %><br> 16 <% } %> 17 18 19</body> 20</html>

home.html

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>Insert title here</title> 6</head> 7<body> 8 <h1>Todo管理Webアプリケーション</h1> 9 <form action="list-servlet" method="get"> 10 <input type="submit" value="Todo一覧を表示"> 11 </form> 12</body> 13</html>

console

1java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 2 at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1407) 3 at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1215) 4 at java.base/java.lang.Class.forName0(Native Method) 5 at java.base/java.lang.Class.forName(Class.java:375) 6 at model.DBConnection.getConnection(DBConnection.java:17) 7 at model.dao.TodoListDAO.getTodoList(TodoListDAO.java:24) 8 at servlet.ListServlet.doGet(ListServlet.java:44) 9 at javax.servlet.http.HttpServlet.service(HttpServlet.java:655) 10 at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) 11 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) 12 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) 13 at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 14 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) 15 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) 16 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) 17 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) 18 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) 19 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) 20 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) 21 at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687) 22 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) 23 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) 24 at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) 25 at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) 26 at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) 27 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732) 28 at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 29 at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) 30 at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) 31 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 32 at java.base/java.lang.Thread.run(Thread.java:833) 33

補足

MySQLとPostgreSQLではDBの設定時に記述することが違うのでしょうか。
パスワードは伏せさせていただいておりますが、本来はしっかり書いております。
また、jarファイルなどもビルドパスとして通しているのですが、そもそもMySQLと接続自体がうまく行っていない可能性もあるのでしょうか。
初めてのjavaでわからないことが多いため、ご回答いただければ幸いです。

追加にいる情報等あればおっしゃってください。

追記

jarファイルに関するビルドパスのスクリーンショットを貼らせていただきます。
イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiketa

2022/02/11 03:33

> コンソールに出力されたものを記述いたします。 肝心なこれが、見当たりませんが。
m.ts10806

2022/02/11 04:26

「list-servlet」というリクエストURIを受け取っている設定、Javaプログラムと それを受け取って処理してjspを呼び出しているJavaを提示してください。 あと、どこかでちゃんと例外を捕捉しているのでしょうか?throwsしかないですが。
tomomomo

2022/02/11 04:28

> 肝心なこれが、見当たりませんが。 申し訳ありません。追記いたしました。
tomomomo

2022/02/11 04:32

> jspを呼び出しているJavaを提示してください。 ListServlet.javaの情報を追加いたしました。 > どこかでちゃんと例外を捕捉しているのでしょうか?throwsしかないですが。 申し訳ありません。知識不足で理解できておりません。
m.ts10806

2022/02/11 04:33

>また、jarファイルなどもビルドパスとして通しているのですが、 画面キャプチャなどパス通していることがわかる情報を提示してください。
tomomomo

2022/02/11 04:46

ファイル構成、ビルドパスに関するスクリーンショットを追記しました。
m.ts10806

2022/02/11 04:53

>申し訳ありません。知識不足で理解できておりません。 「例外処理」「エラーハンドリング」と言って(たぶん調べたらもっときちんとした記事あるはず)、 いわゆるtry-catchなのですが、thorwsをメソッドに付けていると呼び出し元に返すので 呼び出し元でcatchするか、throwsする必要があります(IDEではエラー出て教えてくれるはず) ただ、これらは「想定例外」としてなるべくアプリケーション内で捕捉してエラーログ吐くなりエラー画面出すなりした方が望ましいと思います。 プロジェクトや好みによりますが、アプリケーション利用者への配慮をするのであれば、何も画面が表示されなくなったりフリーズするような事態になるのは防いだ方が良いということですね。throwsだけしてると基盤のほうで例外出力はされますが、アプリケーション側で捕捉されてないのでアプリケーションが強制終了されるような形となります。
tomomomo

2022/02/11 07:49

ご丁寧にありがとうございます。 エラーハンドリングを調べていましたが確かに事前に想定するエラーを出力できるようにしておくべきですね。 とても勉強になりました。 まだ経血自体はできていないので引き続き原因を突き止めたいと思います。 ありがとうございました。
tomomomo

2022/02/11 08:01

最後に質問よろしいでしょうか。 jarファイルをWEB-INF/lib内にfinderからそのままドラッグ&ドロップするとつながるようになりました。 通常はアプリケーションのディレクトリでビルドパスの構成を行うと思うのですが、どうしてファイルの置き場所でこのような違いが生まれたのでしょうか。
enii

2022/02/11 08:35

WEB-INF/lib は実行時にデフォルトで参照される場所だからです。 ビルドパスとは「コンパイル時の参照先」なので、あくまでも実行時の参照先の話です。
tomomomo

2022/02/12 04:33

なるほど、ありがとうございます。
guest

回答1

0

自己解決

jarファイルをWEB-INF/libに置くことで解決できました。

投稿2022/02/12 04:33

tomomomo

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問