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

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

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

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

servlet

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

Q&A

3回答

4109閲覧

サーブレットからJSPへのデータの受け渡しをしたい

Yushishi

総合スコア20

Java

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

servlet

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

0グッド

0クリップ

投稿2019/09/20 05:33

編集2019/10/27 13:52

前提・実現したいこと

①のBlogservlet.javaから、④MySQL(testDB2)のデータを呼び出して、②のDTO.javaに格納。
⇒Blogservletから、③のNewFile.jspへDTOのデータをforwardして、NewFile側で表示したいのですが、うまくいきません。
初心者で見当外れなことをしていたら申し訳ないのですが、どなたか解決策をご教示頂けますと幸いです。
どうか宜しくお願い致します。

発生している問題・エラーメッセージ

value = null

①Blogservlet.java

java

1package blogservlet; 2 3import java.io.IOException; 4import java.sql.Connection; 5import java.sql.Driver; 6import java.sql.DriverManager; 7import java.sql.ResultSet; 8import java.sql.Statement; 9import java.util.ArrayList; 10import java.util.List; 11import java.util.Properties; 12 13import javax.servlet.RequestDispatcher; 14import javax.servlet.ServletContext; 15import javax.servlet.ServletException; 16import javax.servlet.annotation.WebServlet; 17import javax.servlet.http.HttpServlet; 18import javax.servlet.http.HttpServletRequest; 19import javax.servlet.http.HttpServletResponse; 20import javax.servlet.http.HttpSession; 21 22import jp.dendai.blogDTO; 23 24/** 25 * Servlet implementation class Blogservlet 26 */ 27@WebServlet("/Blogservlet") 28public class Blogservlet extends HttpServlet { 29 private static final long serialVersionUID = 1L; 30 /** 31 * @Resource(name = "jdbc/") 32 * @see HttpServlet#HttpServlet() 33 */ 34 35 /** 36 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 37 */ 38 39 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 40 //DBからデータ取得 41 getDB(request); 42 43 response.setCharacterEncoding("UTF-8"); 44 45 ServletContext context = this.getServletContext(); 46 RequestDispatcher dispatcher = context.getRequestDispatcher("/WEB-INF/NewFile.jsp"); 47 dispatcher.forward(request, response); 48 } 49 50 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 51 // TODO Auto-generated method stub 52 doGet(request, response); 53 } 54 55 private void getDB(HttpServletRequest req) { 56 try { 57 Connection con = null; 58 con = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb2?serverTimezone=JST","bloguest", "blog"); 59 System.out.println("MySQLに接続できました。"); 60 Statement stm = con.createStatement(); 61 String sql = "select * from prefectures"; 62 ResultSet rs = stm.executeQuery(sql); 63 List<blogDTO> blog_list = new ArrayList<blogDTO>(); 64 65 while(rs.next()){ 66 int id = rs.getInt("id"); 67 String name = rs.getString("name"); 68 String population = rs.getString("population"); 69 blogDTO blogDTO = new blogDTO(id, name, population); 70 blog_list.add(blogDTO); 71 72 73 //この時点では、データの取得ができている。 74 System.out.println(id); 75 req.setAttribute("blog_list",blog_list); 76 } 77 rs.close(); 78 stm.close(); 79 con.close(); 80 } 81 catch (Exception e) { 82 e.printStackTrace(); 83 } finally { 84 } 85 } 86}

②blogDTO.java

java

1package jp.dendai; 2 3import java.io.Serializable; 4 5public class blogDTO { 6 private int id; 7 private String name; 8 private String population; 9 10 public blogDTO() { 11 12 } 13 14 public blogDTO(int id,String name,String population) { 15 this.id = id; 16 this.name = name; 17 this.population = population; 18 } 19 20 public int getId() { 21 return this.id; 22 } 23 24 public void setId(int id) { 25 this.id = id; 26 } 27 28 public String getName() { 29 return this.name; 30 } 31 32 public void setName(String name) { 33 this.name = name; 34 } 35 36 public String getPopulation() { 37 return this.population; 38 } 39 40 public void setPopulation(String population) { 41 this.population = population; 42 } 43 44}

③NewFile.jsp

jsp

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 4<%@ page import="jp.dendai.blogDTO"%> 5<%@ page import="java.util.List"%> 6<% 7 //ここでリクエストスコープを受け取る 8 //getAttributeメソッド 9 //→追加した属性を取り出す 10###修正箇所### 11 List<blogDTO> blog_list = (List<blogDTO>) request.getAttribute("blog_list"); 12%> 13 14 15<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 16<html> 17<head> 18<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 19<title>Sample01</title> 20</head> 21<body> 22###修正箇所### 23value = <%= request.getAttribute("blog_list") %> 24 25 26</body> 27</html>

④MySQLからとってきているデータ

id name  population 5 宮城県 961768

補足情報(FW/ツールのバージョンなど)

<実行環境>
Widows 10 Home
Eclipse_2019-06 (4.12.0)
MySQL 8.0.17
apache-tomcat-8.5.45

ナビゲーター情報↓
イメージ説明
new file実行結果↓
イメージ説明
blogservlet実行結果
イメージ説明

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

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

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

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

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

tetutetu

2019/09/20 06:20

拡張子が全て.jspになってます。 紛らわしいので一応修正した方が良いかと。
Yushishi

2019/09/20 09:41

ご指摘頂き、ありがとうございます。修正しました。
guest

回答3

0

blogDTOの get/setメソッド名が、JSPのEL式から参照できない名前になっているためです。Javaでは大文字小文字を判別します。

java

1private int id; 2private String name; 3private String population;

に対して、値をJSPで出力する場合は、

java

1public int getId() { 2 return id; 3} 4 5public String getName() { 6 return name; 7} 8 9public String getPopulation() { 10 return population; 11}

このように、キャメルケールの記載が必要です。

投稿2019/10/20 04:15

A-pZ

総合スコア12011

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

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

Yushishi

2019/10/22 01:03

ご指摘頂き、有難うございます。メソッド名の小文字を大文字に変更し、上記のコードに反映させましたが、こちらの修正内容で間違いございませんでしょうか。 結果はやはりvalue = nullと表示されてしまいます。
A-pZ

2019/10/23 08:05

こちらに記述されているサーブレットとJSPの内容であれば、###修正箇所### value = [model.BlogDTO@6fe83c6a] のように表示されます。サーバにデプロイしているコードが反映されていることを確認していただき、反映後にサーバを再起動などしても同じでしょうか
Yushishi

2019/10/27 12:42

はい。やはり、同様の結果になってしまいます。結果画面を質問内容に画像で追加しました。 コードに誤りがない場合、私の操作の方に問題があるのかなとも考えているのですが、その様な可能性はあるのでしょうか。
A-pZ

2019/10/27 13:11

出ているスタックトレースとJSPの内容が違うようなので判断付きかねるところもあるのですが(少なくとも今書かれているJSPでは当該のNullPointerExceptionはスローされません)、getDBメソッドにて何らかの例外が出力されていることはないでしょうか。一度デバッグモードで起動しなおし、ブレークポイントをつけて動作確認をするべきでしょう。データの取得部分に問題がないのであれば、サーブレット→JSPへ渡すときのリクエスト属性に格納する方法に誤りはありません。
Yushishi

2019/10/27 14:16

エラーの情報だけ古いままでした、すみませんただいま訂正しました。今はvalue = nullと出力されてしまうのが、問題です。 デバックを行ってもBlogservlet.javaは添付画像のようにデータベース内のデータの値が表示される為、バグは出てきていないです。。。
guest

0

getAttribute()は指定したキーの情報を返すものですが、返された情報を変数で受けとる必要がありますし、受けとる情報の型により適切にキャストする必要があります。

現在のコードでは受け取ってませんしキャストもされていません。

投稿2019/09/20 06:01

編集2019/09/20 06:02
m.ts10806

総合スコア80850

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

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

Yushishi

2019/09/20 07:09

ざっくりと以下の対応を取れば直るということかと理解しましたが、合ってますでしょうか。 (例)は正しくないと思うのですが、私がイメージしていることをお伝えする為に書いています。 可能であれば、もう少しだけヒントを頂きたく、宜しくお願い致します。 1.現在のコードでは①getAttribute()が受け取るblogDTOの情報(id,name,population)が変数になっていないので、それを(例:(型)変数=id;)といった形で定義した後で、JSPにフォワードする。 2.フォワードした際に定義した型で(例:blogDTO id = (blogDTO) request.getAttribute("id"))のような形で適切にキャストしてから、getAttribute()で情報を取得する。
guest

0

m.ts10806様の回答を拝見した上で。
一応

//ここでリクエストスコープを受け取る //getAttributeメソッド //→追加した属性を取り出す blogDTO blogDTO = (blogDTO) request.getAttribute("blogDTO");

の部分で受け取る記述自体はされているように思われます。
List<blogDTO>をセットしているのにblogDTOを受け取ろうとしていることが問題なのではないかなと。

List<blogDTO> blogDTO = (List<blogDTO>) request.getAttribute("blogDTO"); ~略~ <%=blogDTO.get(0).getName()%>

でも表示できませんか?


蛇足ですが

rs.close(); stm.close(); con.close();

を記述する位置がおかしいです。
finally内に記述すべきものになります。
finally内に何も記述しないのであれば(現在のコード)、finally自体が必要ありません。
もしくはtry-with-resources文というものがありますので、今回の問題がひと段落したら調べてみてください。

投稿2019/09/20 06:19

編集2019/09/20 06:26
tetutetu

総合スコア419

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

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

Yushishi

2019/09/20 09:44

投稿に追記しましたが、矢張り同様のところでNullPointerExceptionが出てしまいます。。 m.ts10806さんにご回答した様に変数定義とキャストを行う必要があるということでしょうか。
Yushishi

2019/09/20 09:55

rs.close(); stm.close(); con.close();の部分もこの一件が解決したら、調べてみようと思います。
tetutetu

2019/09/24 00:34

修正するのは表示するための部分 (<%=blogDTO.get(0).getName()%>)だけではなく、blogDTOを定義する部分もです。 変数名はあくまで名前でしかないので、blog_listに変えてもリスト型にはなりません。 一度、回答に張ったもの(定義部分、表示のための部分)を「そのまま」コピペして結果を確認してください。
tetutetu

2019/09/24 00:39

>変数定義とキャストを行う必要があるということでしょうか。 変数定義とキャスト自体は「行っています」 ただし、変数定義、およびキャストする際のデータの型が間違っているのでエラーを吐いている状態です。 ・質問者様の考えの通り、サーブレットからjspに値を渡せていないのか ・jsp側で値を受け取る、表示する処理に問題があるだけなのか の判断を行いたいので、まずはjsp側を修正しましょう。
Yushishi

2019/10/19 04:05

すみません、こちらのサイトを確認しておらず、返信が大変遅くなってしまいました。ココナラでも依頼をしてみて、多少いじってもらったのですが、未だ解決できていない状況です。 エラーは出なくなったのですが、データが表示されず、nullになってしまいます。 現在のコードを更新しましたので、ご確認頂けますでしょうか。
Yushishi

2019/10/19 04:11

value = nullという表示になってしまいます。
dodox86

2019/10/19 04:46

Blogservlet.java で > blogDTO blogDTO = new blogDTO(id, name, population); > blog_list.add(blogDTO); > //この時点では、データの取得ができている。 > System.out.println(id); > req.setAttribute("blog_list",blogDTO); とありますが、req.setAttributeしているのがblog_listオブジェクトではなく、blogDTOオブジェクトのままだからではないでしょうか?
Yushishi

2019/10/22 00:37

ご指摘頂き、有難うございます。 blogDTO blogDTO = new blogDTO(id, name, population); > blog_list.add(blogDTO); > //この時点では、データの取得ができている。 > System.out.println(id); > req.setAttribute("blog_list",blogDTO); ⇒> req.setAttribute("blog_list",blog_list);に変更しましたが、 結果は同様でした。。 他の方法も考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問