ここに質問の内容を詳しく書いてください。
初心者です。
Todoリストの一覧をDBから取得して画面に出力するという事を行っています。
home.html画面は表示でき、Todo一覧表示ボタンを押し画面遷移の際にエラーになってしまいます。
DBでselect文できちんとデータが登録されているのは確認済みです。
どのようにすればこのエラーを解決できるのでしょうか?
よろしくお願いいたします。
実現したいこと
Todoリストの一覧をDBから取得して画面に出力する
発生している問題・エラーメッセージ
エラーメッセージ
Cannot invoke "java.sql.Connection.prepareStatement(String)" because "connection" is null
サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。
例外
java.lang.NullPointerException: Cannot invoke "java.sql.Connection.prepareStatement(String)" because "connection" is null
model.dao.TodoListDAO.getTodoList(TodoListDAO.java:36)
servlet.ListServlet.doGet(ListServlet.java:44)
javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
該当のソースコード
java,html,jsp
1ソースコード 2package model; 3 4import java.sql.Connection; 5import java.sql.DriverManager; 6import java.sql.SQLException; 7 8public class DBConnection { 9 10 public static Connection getConnection() throws SQLException, ClassNotFoundException { 11 // データベースのURL 12 final String URL = "jdbc:postgresql://localhost:5432/Tododb"; 13 // データベースにアクセスするユーザー 14 final String USER = "postgres"; 15 // パスワード 16 final String PASSWORD = "postgres"; 17 Class.forName("org.postgresql.Driver"); 18 // データベースへ接続する 19 Connection connection = DriverManager.getConnection(URL, USER, PASSWORD); 20 21 return connection; 22 } 23} 24 25package model.dao.dto; 26 27import java.sql.Date; 28 29public class TodoDTO { 30 /** 31 * TodoのIdを保持する 32 */ 33 private int id; 34 35 /** 36 * Todoの内容を保持する 37 */ 38 private String todo; 39 40 /** 41 * Todoの期限を保持する 42 */ 43 private Date timeLimit; 44 45 /** 46 * 引数なしコンストラクタ 47 * 初期化を行う 48 */ 49 public TodoDTO () { 50 id = 0; 51 todo = ""; 52 timeLimit = new Date(System.currentTimeMillis()); 53 } 54 55 /** 56 * 受け取った引数によって初期化を行う 57 * @param id 58 * @param todo 59 * @param timeLimit 60 */ 61 public TodoDTO(int id, String todo, Date timeLimit) { 62 this.id = id; 63 this.todo = todo; 64 this.timeLimit = timeLimit; 65 } 66 67 /** 68 * idを取得する 69 * @return id 70 */ 71 public int getId() { 72 return id; 73 } 74 75 /** 76 * idを設定する 77 * @param id 78 */ 79 public void setId(int id) { 80 this.id = id; 81 } 82 83 /** 84 * Todoの内容を取得する 85 * @return Todoの内容 86 */ 87 public String getTodo() { 88 return todo; 89 } 90 91 /** 92 * Todoの内容を設定する 93 * @param todo 94 */ 95 public void setTodo(String todo) { 96 this.todo = todo; 97 } 98 99 /** 100 * Todoの期限を取得する 101 * @return 102 */ 103 public Date getTimeLimit() { 104 return timeLimit; 105 } 106 107 /** 108 * Todoの期限を設定する 109 * @param timeLimit 110 */ 111 public void setTimeLimit(Date timeLimit) { 112 this.timeLimit = timeLimit; 113 } 114 115} 116 117package model.dao; 118 119import java.sql.Connection; 120import java.sql.Date; 121import java.sql.PreparedStatement; 122import java.sql.ResultSet; 123import java.sql.SQLException; 124import java.util.ArrayList; 125import java.util.List; 126 127import model.DBConnection; 128import model.dao.dto.TodoDTO; 129 130public class TodoListDAO { 131 132 /** 133 * Todoの一覧を取得する 134 * @return todoの一覧 135 * @throws ClassNotFoundException 136 * @throws SQLException 137 */ 138 public List<TodoDTO> getTodoList() throws ClassNotFoundException, SQLException { 139 // 返却用Listの初期化 140 List<TodoDTO> todoList = new ArrayList<>(); 141 142 // 実行するSQL 143 String sql = "SELECT id, todo, timeLimit from todo"; 144 145 // DBに接続し、Todo一覧を取得する 146 try (Connection connection = DBConnection.getConnection(); 147 PreparedStatement pstmt = connection.prepareStatement(sql)) { 148 149 // SQLを実行しResultSetの変数に結果を格納する 150 ResultSet res = pstmt.executeQuery(); 151 // 実行結果を順番に取り出す 152 while (res.next()) { 153 // それぞれid, todo, timeLimitを取得する 154 int id = res.getInt("id"); 155 String todo = res.getString("todo"); 156 Date timeLimit = res.getDate("timeLimit"); 157 158 // 取得したid, todo, timeLimitでTodoDTOを初期化してListに追加 159 todoList.add(new TodoDTO(id, todo, timeLimit)); 160 } 161 } 162 163 return todoList; 164 } 165} 166 167package servlet; 168 169import java.io.IOException; 170import java.sql.SQLException; 171import java.util.ArrayList; 172import java.util.List; 173 174import javax.servlet.RequestDispatcher; 175import javax.servlet.ServletException; 176import javax.servlet.annotation.WebServlet; 177import javax.servlet.http.HttpServlet; 178import javax.servlet.http.HttpServletRequest; 179import javax.servlet.http.HttpServletResponse; 180 181import model.dao.TodoListDAO; 182import model.dao.dto.TodoDTO; 183 184/** 185 * Servlet implementation class ListServlet 186 */ 187@WebServlet("/list-servlet") 188public class ListServlet extends HttpServlet { 189 private static final long serialVersionUID = 1L; 190 191 /** 192 * @see HttpServlet#HttpServlet() 193 */ 194 public ListServlet() { 195 super(); 196 // TODO Auto-generated constructor stub 197 } 198 199 /** 200 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 201 */ 202 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 203 // todoの一覧を保持する変数を宣言 204 List<TodoDTO> todoList = new ArrayList<>(); 205 206 // DAOを生成し、Todo一覧を取得する 207 TodoListDAO dao = new TodoListDAO(); 208 try { 209 // todo一覧を取得する 210 todoList = dao.getTodoList(); 211 System.out.println(todoList); 212 }catch(SQLException | ClassNotFoundException e) { 213 e.printStackTrace(); 214 } 215 216 // todo一覧をリクエストスコープに設定する 217 request.setAttribute("todoList", todoList); 218 // todo一覧画面に遷移する 219 RequestDispatcher rd = request.getRequestDispatcher("list.jsp"); 220 rd.forward(request, response); 221 } 222 223 /** 224 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 225 */ 226 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 227 // TODO Auto-generated method stub 228 doGet(request, response); 229 } 230 231} 232 233<!DOCTYPE html> 234<html> 235<head> 236<meta charset="UTF-8"> 237<title>Home</title> 238</head> 239<body> 240 <h1>Todo 管理Webアプリケーション</h1> 241 <form action="list-servlet" method="get"> 242 <input type="submit" value="Todo一覧を表示"> 243 </form> 244 245</body> 246</html> 247 248<%@ page language="java" contentType="text/html; charset=UTF-8" 249 pageEncoding="UTF-8" import="java.util.List, java.util.ArrayList, model.dao.dto.TodoDTO"%> 250<!DOCTYPE html> 251<html> 252<head> 253<meta charset="UTF-8"> 254<title>Todo List</title> 255</head> 256<body> 257 <% 258 List<TodoDTO> todoList = (List) request.getAttribute("todoList"); 259 %> 260 261 <% for(TodoDTO todo: todoList){ %> 262 <%=todo.getTodo() %> 期限:<%=todo.getTimeLimit() %><br> 263 <% } %> 264 265 266</body> 267</html> 268 269### 試したこと 270インターネットで調べる 271\pleiades\workspace\Todo\src\main\webapp\WEB-INF\libフォルダにjdbcドライバを格納 272ここに問題に対して試したことを記載してください。 273 274### 補足情報(FW/ツールのバージョンなど) 275 276ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2022/09/11 05:21
2022/09/11 05:57