chikuwacyan
@chikuwacyan

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

java サーブレット JSP

解決したいこと

サーブレットからJSPにリストを渡して表示させたい

JavaのWebアプリケーションで、サーブレットからJSPにリストを渡そうとしています。しかし、JSPでリストを取得しようとすると、nullが返ってきてしまいます。サーブレットとJSPのコードは以下の通りです。

ListServlet.java
import java.io.IOException;
import java.util.ArrayList;

import bean.HumanBean;
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; 

@WebServlet("/ListServlet")
public class ListServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		UserDao dao = new UserDao();
		ArrayList<HumanBean> list = dao.getList();
		
		 //デバッグログ
        if (list != null) {
            System.out.println("List size in Servlet: " + list.size());
        } else {
            System.out.println("List is null in Servlet.");
        }
		
		request.setAttribute("list", dao.getList());
		
		 // デバッグログ:リストが設定されたか確認
        if (request.getAttribute("list") != null) {
            System.out.println("List attribute is set in Servlet.");
        } else {
            System.out.println("List attribute is null in Servlet.");
        }
		
		
		RequestDispatcher rd = request.getRequestDispatcher("/jsp/list.jsp");
		rd.forward(request, response);
	}
}

list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page import="bean.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>リスト表示</title>
</head>
<body>
    <%
        ArrayList<HumanBean> list = (ArrayList<HumanBean>) request.getAttribute("list");
        
        // デバッグログ
        if (list != null) {
            System.out.println("List size in JSP: " + list.size());
        } else {
            System.out.println("List is null in JSP.");
        }
    %>
    
    <table align="center" border="1">
        <tr>
            <th>ID</th><th>NAME</th><th>AGE</th>
        </tr>
        
        <%
            if (list != null && !list.isEmpty()) {
                for (int i = 0; i < list.size(); i++) {
                    HumanBean bean = list.get(i); 
        %>
        <tr>
            <td><%= bean.getId() %></td>
            <td><%= bean.getName() %></td>
            <td><%= bean.getAge() %></td>
        </tr>
        <%
                }
            } else {
                out.println("<tr><td colspan='3'>リストがnullです</td></tr>");
            }
        %>  
    </table>
</body>
</html>
UserDao.java(一部記載)
	ArrayList<HumanBean> list = new ArrayList<>();
	String sql ="SELECT id,name,age FROM id_tbl ORDER BY id";
	connect();
	try {
		PreparedStatement ps = getConnection().prepareStatement(sql);
		ResultSet rs = ps.executeQuery();
        while (rs.next()) {	
    		// Beanの生成
    		HumanBean bean = new HumanBean();
    		// 生成したBeanのフィールドにidをセット
    		bean.setId(rs.getString("id")); 
    		// 生成したBeanのフィールドにnameをセット
    		bean.setName(rs.getString("name")); 
    		// 生成したBeanのフィールドにageをセット
    		bean.setAge(rs.getInt("age")); 
    		// ArrayListにBeanを格納する
    	    list.add(bean);
        }	
	} catch(SQLException e) {
		e.printStackTrace();
	}   finally {
		disconnect(); // DB切断
	}
   return list; //完成したリストを返す	
  }

例)

```ruby
def greet
  puts Hello World
end

自分で試したこと

UserDao.javaでアプリケーションで実行をするとリストが表示されます。
ListServlet.javaで実行してもリストが表示され、コンソール上にも

List size in Servlet: 10
List attribute is set in Servlet.
List size in JSP: 10

と表示されます。
list.jspで実行すると、nullになり、コンソール上も

List is null in JSP.

と表示されるので、受け渡しの際に問題があるのかとは思います。
打ち間違え、カラム名などが間違ってないかの確認や、コピーして貼り付けてますが、nullのままです。
サーバを停止して、再開したりしてますが、変わらないです。
jspへのパスの誤りもないです。
エラーログの表示なども特にいです。
他の原因となるところはありますか?
検索や訂正をしたのですが、一向に解決しません。

0

5Answer

順番の問題です。以下のように、まずRequestDispatcherを作成して、次setAttributeして、最後formwardすれば大丈夫です。

RequestDispatcher rd = request.getRequestDispatcher("/jsp/list.jsp");
request.setAttribute("list", dao.getList());
rd.forward(request, response);
0Like

申し訳ございません。前回答は思い込みがありました。以下のソースでテストして、前後と関係なく送信できると分けりました。開発途中でおっしゃる現象は確かに発生しました。プロジェクトを再コンパイルしたり、クリーンしたりで直しました。多分そちらも同じ原因でしょう。
index.jsp

<html>
<body>
	<form action="ServletA" method="POST">
		<input name="text1">
		<input type="submit" value="submit">
	</form>
</body>
</html>

ServletA.java

package testWeb;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name="ServletA",loadOnStartup=1,urlPatterns={"/ServletA"})
public class ServletA extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
		String text1=request.getParameter("text1");
		request.setAttribute("param1", text1);
		ArrayList ary=new ArrayList();
		ary.add("[");
		ary.add(text1);
		ary.add("]");
		request.setAttribute("array1",ary );
		RequestDispatcher rd =request.getRequestDispatcher("test.jsp");
		rd.forward(request, response);
	}

}

}

test.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
String param1=(String)request.getAttribute("param1");
java.util.ArrayList ary=(java.util.ArrayList)request.getAttribute("array1");
int size=ary.size();
%>
param1=<%=param1 %><br>
size=<%=size %>

結果です。
image.png

0Like

@changkejun
ご回答ありがとうございます。
リフレッシュやアプリの再起動、サーバの再起動など何回も繰り返しているのですが、変わらずnullのなんです。

0Like

Comments

  1. プロジェクトの再コンパイルは忘れないでくださいね。

何をしたらどうなったのかを正確に記載してください。
うまく行ったときのURLとうまく行かなかったときのURLがありません。

恐らく転送(forward)すべきjspのURLを直にブラウザから指定したのではないですか?
記載がない部分から推測しろという質問をしている時点で、そもそもご自分が何をしているのかすら分かっていないように見えます。
分からないのに先に進んだりせず、体系的に学習を進めながら、分からないところだけを聞いて下さい。

0Like

Your answer might help someone💌