前提・実現したいこと
プログラミング初心者です。
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
よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/25 14:56