【Java】結合条件のsqlの値をjspに表示したいです。NullPointerExceptionエラーが修正できません。
解決したいこと
Javaでいいね機能は作ったので、お気に入り機能を作っています。
結合条件のsql文で選択した値をjspに表示させたいのですが、
データは間違いなくあるのに、エラーが出てしまいます。
解決方法を教えて下さい。
発生している問題・エラー
org.apache.jasper.JasperException: [/account/user.jsp] の処理中に行番号 [35] で例外が発生しました。
32: <th>タイトル</th>
33: <th>詳細</th>
34: </tr>
35: <% for (FavoriteInfo f : favoriteList) { %>
36: <tr>
37: <td><%= f.getId() %></td>
38: <td><%= f.getFavoriteBook() %></td>
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:599)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:488)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:380)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:328)
jakarta.servlet.http.HttpServlet.service(HttpServlet.java:814)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
根本原因
java.lang.NullPointerException: Cannot invoke "java.util.List.iterator()" because "favoriteList" is null
org.apache.jsp.account.user_jsp._jspService(user_jsp.java:171)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
jakarta.servlet.http.HttpServlet.service(HttpServlet.java:814)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:456)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:380)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:328)
jakarta.servlet.http.HttpServlet.service(HttpServlet.java:814)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
注意 原因のすべてのスタックトレースは、サーバのログに記録されています。
該当するソースコード
【user.jsp】
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.List"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="pack.FavoriteInfo"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ユーザー情報</title>
</head>
<table>
<tr>
<th>投稿ID</th>
<th>タイトル</th>
<th>詳細</th>
</tr>
<% for (FavoriteInfo f : favoriteList) { %>
<tr>
<td><%=f.getId()%></td>
<td><%=f.getFavoriteBook() %></td>
<td><%=f.getDetail() %></td>
</tr>
<% } %>
</table>
</body>
</html>
【index.jsp】↓がuser_idのパラメータ部分です。
<% Integer userId = (Integer) request.getSession().getAttribute("id"); %>
<header>
<a href="/test/account/user.jsp?user_id=<%= userId %>"><button type="button" >マイページへ</button></a>
</header>
【Favorite.java】
package pack;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Favorite
*/
@WebServlet("/Favorite")
public class Favorite extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Favorite() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// 受け取る文字設定
request.setCharacterEncoding("utf-8");
// 送る文字設定(html文字;文字コード)
response.setContentType("text/html;charset=utf-8");
try {
Integer userId = Integer.parseInt(request.getParameter("user_id"));
FavoriteDAO fDAO = new FavoriteDAO();
fDAO.connect();
List<FavoriteInfo> favoriteList = fDAO.favorite(userId);
request.setAttribute("favoriteList", favoriteList);
RequestDispatcher rd = request.getRequestDispatcher("/account/user.jsp");
rd.forward(request, response);
} catch (SQLException e) {
e.printStackTrace();
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
【FavoriteDAO.java】
package pack;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class FavoriteDAO {
private String URL = "jdbc:mysql://localhost:xxxxxx";
private String USER = "xxxxxxx";
private String PASS = "xxxxxxx";
PreparedStatement pstmt = null;
ResultSet rs = null;
Connection con = null;
public void connect() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
con = DriverManager.getConnection(URL, USER, PASS);
} catch (Exception e) {
e.printStackTrace();
}
}
public List<FavoriteInfo> favorite(int userId) throws SQLException {
List<FavoriteInfo> favoriteList = new ArrayList<>();
String sql = "select books.id, books.favorite_book, books.detail from books inner join likes on books.id = likes.books_id where likes.user_id = ?";
try {
connect();
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, userId);
rs = pstmt.executeQuery();
while (rs.next()) {
FavoriteInfo fi = new FavoriteInfo();
fi.setId(rs.getInt("id"));
fi.setFavoriteBook(rs.getString("favorite_book"));
fi.setDetail(rs.getString("detail"));
favoriteList.add(fi);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (pstmt != null)
pstmt.close();
if (rs != null)
rs.close();
if (con != null)
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return favoriteList;
}
}
※"select books.id, books.favorite_book, books.detail from books inner join likes on books.id = likes.books_id where likes.user_id = ?" で値が取得できるのは、コマンドプロンプトで?に値を入れて確認済みです。
ackage pack;
import java.io.Serializable;
public class FavoriteInfo implements Serializable {
private int id;
private int user_id;
private String favorite_book;
private String detail;
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public int getUserId() {
return this.user_id;
}
public void setUserId(int user_id) {
this.user_id = user_id;
}
public String getFavoriteBook() {
return this.favorite_book;
}
public void setFavoriteBook(String favorite_book) {
this.favorite_book = favorite_book;
}
public String getDetail() {
return this.detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
}
自分で試したこと
原因はfavoriteListに値が入っていないことだと分かるのですが、
何故値が入らないのか分かりません。
自分なりには何度も確認をしたのですが修正できませんでした。
どなたか助けてください。。。