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

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

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

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

Eclipse

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

servlet

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

Q&A

解決済

1回答

765閲覧

Servetエラー DBの取得結果が画面に表示されない

退会済みユーザー

退会済みユーザー

総合スコア0

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

Eclipse

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

servlet

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

0グッド

1クリップ

投稿2022/09/10 13:15

編集2022/09/11 05:07

ここに質問の内容を詳しく書いてください。

初心者です。
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ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

getConnection()内でcloseしてしまってますから、接続成功した場合、finallyで必ずcloseされます。
closeはその接続を使い終わってからです。

投稿2022/09/10 20:05

m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2022/09/11 05:21

ご指摘ありがとうございます。 connectionにnullが渡されてしまっているのかと考えて、 一旦DBConnectionクラスの例外処理を消しました。(参考サイトがこの形式だったので) 結果、エラーはなくなったのですが、画面遷移時に何も表示されない空白になってしまいます。 http://localhost:8080/Todo/list-servlet?というURLになります。 上記の全てのソースコードは参考サイトを模写しています。 何か原因は分かりますでしょうか? また、closeが使い終わってからならばListServletクラスにfinallyをつけるということでしょうか? よろしくお願いいたします。
m.ts10806

2022/09/11 05:57

参考サイトの提示を。 あと先に指摘すればよかったですが、コードブロック(マークダウンのcode)はファイル毎にしてください。 かなり見づらいのと、閉める場所が悪いのか、以降のコードと関係ない項目まで含まれています。 >また、closeが使い終わってからならばListServletクラスにfinallyをつけるということでしょうか? connection を取得しているtry-catchのfinallyでconnection.close()を実行すれば良いと思います。 今のコードからすると、TodoListDAO.getTodoList()内ですね。 >画面遷移時に何も表示されない空白 これはリクエストの結果何も出力してないか、 続行不可能なエラーが起きてそこで処理が終了しているかのどちらかだと思います。 エラー出てませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問