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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

Q&A

2回答

4191閲覧

受け取ったデータが何故かjstlでキャストされず文字列になってしまう

m.aqua

総合スコア6

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

0グッド

0クリップ

投稿2019/07/25 11:28

編集2019/07/25 14:44

前提・実現したいこと

プログラミング初心者です。
Javaで試験申し込み用のアプリケーションを制作しているのですが、申込者一覧を取得時にエラーが出ました。
希望していた結果を表示する方法は一応あり、jstlを使用しない事で望んでいた通りの表示をすることが可能でした。
が、なぜこのようなエラーが起きたのかの根本的な原因の特定が出来ず、このまま放置していては学んでいる意味が無いと思うのでどなたか詳しい方にアドバイスをいただきたいです。

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

原因
javax.el.PropertyNotFoundException: Property [code] not found on type [java.lang.String]
javax.el.BeanELResolver$BeanProperties.get(BeanELResolver.java:260)
javax.el.BeanELResolver$BeanProperties.access$300(BeanELResolver.java:212)
javax.el.BeanELResolver.property(BeanELResolver.java:347)
javax.el.BeanELResolver.getValue(BeanELResolver.java:92)
org.apache.jasper.el.JasperELResolver.getValue(JasperELResolver.java:110)
org.apache.el.parser.AstValue.getValue(AstValue.java:169)
org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:190)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(PageContextImpl.java:944)
org.apache.jsp.WEB_002dINF.jsp.subscribeList_jsp._jspx_meth_c_005fout_005f0(subscribeList_jsp.java:226)
org.apache.jsp.WEB_002dINF.jsp.subscribeList_jsp._jspx_meth_c_005fforEach_005f0(subscribeList_jsp.java:188)
org.apache.jsp.WEB_002dINF.jsp.subscribeList_jsp._jspService(subscribeList_jsp.java:139)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
servlet.SubscribeList.doGet(SubscribeList.java:56)
javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
filter.EncodingFilter.doFilter(EncodingFilter.java:40)

該当のソースコード

java

1package model; 2 3import java.io.Serializable; 4 5public class Subscribe implements Serializable { 6 /* 申込者データ*/ 7 private String id; 8 private int code; 9 private String number; 10 private String name; 11 private String address; 12 private String birth; 13 private String gender; 14 private String kana; 15 private int year; 16 private int count; 17 private String testClass; 18 private String testName; 19 20 public Subscribe() {} 21 22 /* テーブル結合用 */ 23 public Subscribe(String id, int code) { 24 this.id = id; 25 this.code = code; 26 } 27 28 public Subscribe(int count, int year) { 29 super(); 30 this.year = year; 31 this.count = count; 32 } 33 34 /* 申し込み申請時に使用 idは申込者が誰かの判定に必要な為追加 */ 35 public Subscribe(String id, int code, String number) { 36 this.id = id; 37 this.code = code; 38 this.number = number; 39 } 40 41 /* 申請者一覧取得時に使用 genderは念の為にString型へ変更 */ 42 public Subscribe(String id, int code, String number, String name, String address, String birth, String gender, 43 String kana, int year, int count, String testClass, String testName) { 44 this.id = id; 45 this.code = code; 46 this.number = number; 47 this.name = name; 48 this.address = address; 49 this.birth = birth; 50 this.gender = gender; 51 this.kana = kana; 52 this.year = year; 53 this.count = count; 54 this.testClass = testClass; 55 this.testName = testName; 56 } 57 58 public String getId() { 59 return id; 60 } 61 62 public void setId(String id) { 63 this.id = id; 64 } 65 66 public int getCode() { 67 return code; 68 } 69 70 public void setCode(int code) { 71 this.code = code; 72 } 73 74 public String getNumber() { 75 return number; 76 } 77 78 public void setNumber(String number) { 79 this.number = number; 80 } 81 82 public String getName() { 83 return name; 84 } 85 86 public void setName(String name) { 87 this.name = name; 88 } 89 90 public String getAddress() { 91 return address; 92 } 93 94 public void setAddress(String address) { 95 this.address = address; 96 } 97 98 public String getBirth() { 99 return birth; 100 } 101 102 public void setBirth(String birth) { 103 this.birth = birth; 104 } 105 106 public String getGender() { 107 return gender; 108 } 109 110 public void setGender(String gender) { 111 this.gender = gender; 112 } 113 114 public String getKana() { 115 return kana; 116 } 117 118 public void setKana(String kana) { 119 this.kana = kana; 120 } 121 122 public int getYear() { 123 return year; 124 } 125 126 public void setYear(int year) { 127 this.year = year; 128 } 129 130 public int getCount() { 131 return count; 132 } 133 134 public void setCount(int count) { 135 this.count = count; 136 } 137 138 public String getTestClass() { 139 return testClass; 140 } 141 142 public void setTestClass(String testClass) { 143 this.testClass = testClass; 144 } 145 146 public String getTestName() { 147 return testName; 148 } 149 150 public void setTestName(String testName) { 151 this.testName = testName; 152 } 153 154 155 156} 157

jsp

1 2<%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4<%@ page import="model.*,java.util.*"%> 5<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 6 7<!DOCTYPE html> 8<html> 9<head> 10<meta charset="UTF-8"> 11<title>応募者一覧</title> 12</head> 13<body> 14<h1>応募者一覧</h1> 15<table> 16<c:forEach var="subscribe" items=" ${subscribeList }" > 17 <tr><td> 18 <c:out value="${subscribe.code }"/> 19 </td></tr> 20</c:forEach> 21</table> 22<p><a href="/SubscribeCertify/Manage">管理者トップへ</a></p> 23<p><a href="/SubscribeCertify/Logout">ログアウト</a><p> 24</body> 25</html> 26

DAO

1package dao; 2 3import java.sql.PreparedStatement; 4import java.sql.ResultSet; 5import java.sql.SQLException; 6import java.util.ArrayList; 7import java.util.List; 8 9import model.Subscribe; 10 11public class SubscribeListDAO extends SubscribeCertifyDAO{ 12 13 public List<Subscribe> findAll(){ 14 List<Subscribe> subscribeList = new ArrayList<>(); 15 16 try { 17 getConnection(); 18 19 String sql = "SELECT subscribe.id, subscribe.code, subscribe.number, user.name, user.address, user.birth, user.gender, user.kana, " 20 + "testData.year, testData.count, testData.testClass, testData.testName " 21 + "FROM user INNER JOIN subscribe USING(id) " 22 + "INNER JOIN testData USING(code) " 23 + "ORDER BY number DESC"; 24 25 PreparedStatement pstmt = conn.prepareStatement(sql); 26 27 ResultSet rs = pstmt.executeQuery(); 28 29 while(rs.next()) { 30 String id = rs.getString("subscribe.id"); 31 int code = rs.getInt("subscribe.code"); 32 String number = rs.getString("subscribe.number"); 33 String name = rs.getString("user.name"); 34 String address = rs.getString("user.address"); 35 String birth = rs.getString("user.birth"); 36 String kana = rs.getString("user.kana"); 37 String gender = rs.getString("user.gender"); 38 int year = rs.getInt("testData.year"); 39 int count = rs.getInt("testData.count"); 40 String testClass = rs.getString("testData.testClass"); 41 String testName = rs.getString("testData.testName"); 42 Subscribe subscribes = new Subscribe(id, code, number, name, address, birth, kana, gender, year, count, testClass, testName); 43 44 subscribeList.add(subscribes); 45 } 46 }catch(SQLException e){ 47 e.printStackTrace(); 48 return null; 49 }catch(ClassNotFoundException e) { 50 e.printStackTrace(); 51 return null; 52 }finally { 53 closeConnection(); 54 } 55 return subscribeList; 56 } 57} 58

model

1package model; 2 3import java.util.List; 4 5import dao.SubscribeListDAO; 6 7 8public class GetSubscribeListLogic { 9 public List<Subscribe> execute(){ 10 SubscribeListDAO dao = new SubscribeListDAO(); 11 List<Subscribe> subscribeList = dao.findAll(); 12 return subscribeList; 13 } 14 15 16}

servlet

1package servlet; 2 3import java.io.IOException; 4import java.util.List; 5 6import javax.servlet.RequestDispatcher; 7import javax.servlet.ServletException; 8import javax.servlet.annotation.WebServlet; 9import javax.servlet.http.HttpServlet; 10import javax.servlet.http.HttpServletRequest; 11import javax.servlet.http.HttpServletResponse; 12import javax.servlet.http.HttpSession; 13 14import model.GetSubscribeListLogic; 15import model.Subscribe; 16import model.User; 17/** 18 * Servlet implementation class SubscribeList 19 */ 20@WebServlet("/SubscribeList") 21public class SubscribeList extends HttpServlet { 22 private static final long serialVersionUID = 1L; 23 24 /** 25 * @see HttpServlet#HttpServlet() 26 */ 27 28 /** 29 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 30 */ 31 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 32 33 GetSubscribeListLogic getSubscribeList = new GetSubscribeListLogic(); 34 List<Subscribe> subscribeList = getSubscribeList.execute(); 35 request.setAttribute("subscribeList", subscribeList); 36 37 38 request.setCharacterEncoding("UTF-8"); 39 HttpSession session = request.getSession(); 40 User loginUser = (User) session.getAttribute("loginUser"); 41 42 if(loginUser == null) { 43 response.sendRedirect("/SubscribeCertify/"); 44 }else { 45 String pageStr = request.getParameter("page"); 46 Integer page; 47 if(pageStr == null || pageStr.equals("")) { 48 page = 1; 49 }else { 50 page = Integer.parseInt(pageStr); 51 } 52// session.setAttribute("subscribeList", subscribeList); 53 request.setAttribute("page", page); 54 RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/jsp/subscribeList.jsp"); 55// request.getRequestDispatcher("/WEB-INF/jsp/subscribeList.jsp"); 56 rd.forward(request, response); 57 } 58 } 59 60} 61

試したこと

デバッグモードやjsp側で呼び出したsubsclibeListの中身を確認してみた所、jspに渡るまではしっかりと中身が入っていたのですが
いざjsp側で表示をすると、なぜかキャストされずに全て文字列として表示されてしまっていました。

試しに、jstlを使わず<%%>等の手間がかかる方で表示をしてみると今度はちゃんとsubsclibeListの中身が表示され、望んだ形での表示が可能になりました。

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

eclipse Version: 2019-03 (4.11.0)
MySQL 8.0.16
Java11 

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

EL式で使われている変数(${subscribeList })はpageContextオブジェクトなので、
jspでスクリプトレット(<%%>)の変数をpageContextオブジェクトに登録する必要があります。

jsp

1<c:set var="hoge " value="<%= subscribeList %>" /> 2<c:forEach var="subscribe" items=" ${hoge}" > 3・・・

もしくは下記でも可能なはずです。

jsp

1<% pageContext.setAttribute("fuga",subscribeList); %> 2<c:forEach var="subscribe" items=" ${fuga }" > 3・・・

EL式についての詳しい解説はこちらを参照してください。
http://pgbox.grush.jp/ref/java/jee/jsp/el.html

投稿2019/07/25 11:43

編集2019/07/25 11:49
BluOxy

総合スコア2663

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

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

m.aqua

2019/07/25 14:56

回答ありがとうございます。 EL式や暗黙オブジェクトについて、うろ覚えな部分が多いので改めてしっかり読ませていただいています。 回答いただいた通りに編集し、実行してみましたがエラーの内容に変化はありませんでした。 下記に変更したjspを記載させていただきます。 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="model.*,java.util.*"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% List<Subscribe> subscribeList = (List<Subscribe>)request.getAttribute("subscribeList"); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>応募者一覧</title> </head> <body> <h1>応募者一覧</h1> <table> <% pageContext.setAttribute("subscribeList",subscribeList); %> <c:forEach var="subscribe" items=" ${subscribeList }" > <tr><td> <c:out value="${subscribe.code }"/> </td></tr> </c:forEach> </table> <p><a href="/SubscribeCertify/Manage">管理者トップへ</a></p> <p><a href="/SubscribeCertify/Logout">ログアウト</a><p> </body> </html> 変更の仕方はこの形であっているかと思うのですが、どこか抜けや間違いなどありますでしょうか?
guest

0

Subscribeクラスのコードがないので予想ですが、Subscribeのフィールドに対して、アクセサメソッド(いわゆるgetメソッド)がないため、JSTLからフィールドを出力できません。例えば、Subscribeのcodeに対して、

java

1public int getCode() { 2 return code; 3}

が必要です。

余談ですが、JSTLやEL式では、サーブレットスコープを省略するとJSPのpageContext→リクエスト属性→セッション属性→アプリケーション属性(サーブレットコンテキスト属性)と順番に自動検索します。
例えばJSPの<c:set>で一時的に変数へ格納したオブジェクトに対して別のタグで扱う場合でも、特にスコープは指定する必要ありません。

投稿2019/07/25 12:50

A-pZ

総合スコア12011

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

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

m.aqua

2019/07/25 14:42

回答有り難うございます。 Subscribeサーブレットについてですが、編集して追加させていただきました。 また、いわゆるgetメソッドについては一応記述の方はしてありました。 自動検索の流れ等、まだ知らない事でしたので勉強になります、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問