現状と問題
現在、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でわからないことが多いため、ご回答いただければ幸いです。
追加にいる情報等あればおっしゃってください。
追記

回答1件
あなたの回答
tips
プレビュー