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

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

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

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

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

4135閲覧

MySQLのセレクト文でデータを選択してブラウザに表示させたいです

chimo

総合スコア55

MySQL

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

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

2クリップ

投稿2020/03/23 05:11

編集2020/03/24 05:49

複数のクラスが複雑に絡んでいるのでやりたいことを順番立てて箇条書きにしたいと思います。複数のクラスにたくさんコードを書いたのですべてここに乗せると字数が足りなくなってしまいますので、【①】javaでHTMLを使ってブラウザに表示させるためのコードを書いたクラス全体と、【②】MySQLに送信するためのセレクト文、のみここに乗せたいと思います。ほかは追記で頂いた場合コードをコメント欄に載せようかと思いますので、コメントお願いします。

【要約】
(1)ブラウザにアンケート入力フォームを表示させる 

(2)入力フォームに入力したアンケートデータをMySQLに送信してテーブルを作成させる。このアンケート入力画面に「回答を送信する」というボタンを作り、それをクリックすると、送信が上手くいった場合「うまくデータを送信できました」という旨の画面に遷移させる。また、入力フォームの画面に「アンケート結果一覧へ」というリンクをつくる。

(3)そのリンクをおすと、送信されたデータをセレクトして、今まで回答されたアンケートの結果の一覧が表としてブラウザに表示される画面へ画面遷移させる。

このうち(1)と(2)はうまくいきましたが、(3)のうまくデータを抽出してきて、アンケート入力画面からアンケート結果一覧へ画面遷移させようとするとエラーがおきてしまいます。とにかく(3)の画面遷移をうまくいくようにしたいのです、が、何が問題でうまくいかないのかさっぱりわかりません!!アリゴリズムがまちがっているのかコーディングがまちがっているのか、もしコーディングが間違っていれば正しいコードを教えてください!

【各クラスで行っていること】
①InputSurveyクラス:ブラウザに表示させるためのHTML文書(アンケート入力画面)の出力と「アンケート提出ボタン」と「アンケート結果一覧へ」というリンクをコーディングしています。
②SaveSurveyクラス:リクエストパラメーターを取得し、アンケートデータを作成(DTOクラスをインスタンス化)し、BusinessLogicクラスをインスタンス化。また、データベース(アンケート)の送信が上手くいったかどうかに応じた画面を表示するようにコーディング。
③BusinessLogicクラス:DAOクラスをインスタンス化するだけ
④DAOクラス:JDBCドライバのロード、接続の確立、SQL文の確立、SQL文の送信と抽出結果の取得などを行いました。ここでのSQL文は、InputSurveyで使うインサート文やShowAllSurveyで使うセレクト文を作成し送信しました。
⑤DTOクラス:リクエストパラメーターを抽出したあとの変数の型を決めたり、それに対するgetter/setterを作ったりした。例えばアンケートの名前をnameで抽出したときnameをStringで定義し、getName, setNameを作った。

【①】javaでHTMLを使ってブラウザに表示させるためのコードを書いたクラス全体

java

1package work; 2 3import java.io.IOException; 4import java.io.PrintWriter; 5import java.util.List; 6 7import javax.servlet.ServletException; 8import javax.servlet.http.HttpServlet; 9import javax.servlet.http.HttpServletRequest; 10import javax.servlet.http.HttpServletResponse; 11 12public class ShowAllSurvey extends HttpServlet { 13 private static final long serialVersionUID = 1L; 14 15 public ShowAllSurvey() { 16 super(); 17 } 18 19 protected void doGet(HttpServletRequest request, HttpServletResponse response) 20 throws ServletException, IOException { 21 22 //レスポンスの文字コードを設定 23 response.setContentType("text/html;charset=UTF-8"); 24 //リクエスト(受信データ)の文字コードを設定 25 request.setCharacterEncoding("UTF-8"); 26 27 //ビジネスロジックを呼び出す 28 BusinessLogic logic_ex = new BusinessLogic(); 29 List<SurveyDto> resultDto = logic_ex.executeSelectSurvey(); 30 31 32 //DTO内のデータを取り出す 33 String name_ex = resultDto.getName(); 34 String age_ex = String.valueOf(resultDto.getAge()); 35 String sex_ex = String.valueOf(resultDto.getSex()); 36 String satisfactionLevel_ex = String.valueOf(resultDto.getSatisfactionLevel()); 37 String message_ex = resultDto.getMessage(); 38 39 //出力用のストリームの取得 40 PrintWriter out = response.getWriter(); 41 42 //HTML文書(HTMLテーブル作成Sample画面)の出力 43 out.println( "<html>" ) ; 44 out.println( "<head>" ) ; 45 out.println( "<title>アンケート回答一覧</title>" ) ; 46 out.println( "</head>" ) ; 47 out.println( "<body>" ) ; 48 out.println( "<h2>アンケート回答一覧</h2>" ) ; 49 50 out.println( "<table class=\"list\" border=1 id=\"TABLE\">" ) ; 51 out.println( " <tr bgcolor=\"#c0c0c0\"> "); // trタグ:1行分の情報を表す(1行目) 52 out.println( " <th>名前</th> "); // thタグ:見出しを表す(1列目) 53 out.println( " <th>年齢</th> "); // thタグ:見出しを表す(2列目) 54 out.println( " <th>性別</th> "); // thタグ:見出しを表す(3列目) 55 out.println( " <th>満足度</th> "); // thタグ:見出しを表す(4列目) 56 out.println( " <th>ご意見・ご感想</th> "); // thタグ:見出しを表す(5列目) 57 out.println( " </tr> "); // trタグ(閉じ) 58 59 out.println( "<tr> "); 60 out.println( " <td>" + name_ex + "</td> "); 61 out.println( " <td>" + age_ex + "</td> "); 62 out.println( " <td>" + sex_ex + "</td> "); 63 out.println( " <td>" + satisfactionLevel_ex + "</td> "); 64 out.println( " <td>" + message_ex + "</td> "); 65 out.println( "</tr> "); 66 67 out.println( "</table> "); 68 69 out.println(" <a href=\"InputSurvey\">アンケート画面へ戻る</a> "); //前の画面に戻るリンクの設定 70 71 out.println( "</body> "); 72 out.println( "</html> "); 73 74 } 75 76 protected void doPost(HttpServletRequest request, HttpServletResponse response) 77 throws ServletException, IOException { 78 doGet(request, response); 79 } 80 81} 82

【②】MySQLに送信するためのセレクト文

java

1public List<SurveyDto> doSelect() { 2 3 String driverName = "com.mysql.cj.jdbc.Driver"; 4 String jdbcUrl = "jdbc:mysql://localhost/test_db?characterEncoding=UTF-8&serverTimezone=JST&useSSL=false"; 5 String userId = "test_user"; 6 String userPass = "test_pass"; 7 8 try { 9 Class.forName(driverName); 10 } catch (ClassNotFoundException e) { 11 e.printStackTrace(); 12 } 13 14 Connection con = null ; 15 PreparedStatement ps = null ; 16 ResultSet rs = null ; 17 18 List<SurveyDto> dtoList = new ArrayList<SurveyDto>(); 19 20 try { 21 con = DriverManager.getConnection(jdbcUrl, userId, userPass); 22 //SQL文の生成(SELECT) 23 StringBuffer buf = new StringBuffer() ; 24 buf.append(" SELECT "); 25 buf.append(" NAME , "); 26 buf.append(" AGE , "); 27 buf.append(" SEX , "); 28 buf.append(" SATISFACTION_LEVEL , "); 29 buf.append(" MESSAGE "); 30 buf.append(" FROM "); 31 buf.append(" SURVEY "); 32 33 ps = con.prepareStatement(buf.toString()); 34 35 rs = ps.executeQuery(); 36 37 //ResultSetオブジェクトから1レコード分のデータをDTOに格納 38 while(rs.next()){ 39 SurveyDto dto_list = new SurveyDto(); 40 dto_list.setName( rs.getString( "NAME" ) ); 41 dto_list.setAge( rs.getInt( "AGE" ) ); 42 dto_list.setSex( rs.getInt( "SEX" ) ); 43 dto_list.setSatisfactionLevel( rs.getInt( "SATISFACTION_LEVEL" ) ); 44 dto_list.setMessage( rs.getString( "MESSAGE" ) ); 45 dtoList.add(dto_list) ; 46 } 47 48 } catch (SQLException e) { 49 e.printStackTrace(); 50 51 52 } finally { 53 //ResultSetオブジェクトの接続解除 54 if (rs != null) { 55 try { 56 rs.close(); 57 } catch (SQLException e) { 58 e.printStackTrace(); 59 } 60 } 61 //PreparedStatementオブジェクトの接続解除 62 if (ps != null) { 63 try { 64 ps.close(); 65 } catch (SQLException e) { 66 e.printStackTrace(); 67 } 68 } 69 //Connectionオブジェクトの接続解除 70 if (con != null) { 71 try { 72 con.close(); 73 } catch (SQLException e) { 74 e.printStackTrace(); 75 } 76 } 77 } 78     return dtoList; 79 } 80

【追記:BusinessLogicクラスのコード一部抜粋】

java

1public List<SurveyDto> executeSelectSurvey() { 2 SurveyDao dao_ex = new SurveyDao(); 3 List<SurveyDto> extractedDto = dao_ex.doSelect(); 4 return extractedDto ; 5 }

【追記:Savesurveyクラスのコード】

java

1public class SaveSurvey extends HttpServlet { 2 private static final long serialVersionUID = 1L; 3 4 public SaveSurvey() { 5 super(); 6 } 7 8 protected void doGet(HttpServletRequest request, HttpServletResponse response) 9 throws ServletException, IOException { 10 doPost(request, response); 11 } 12 13 protected void doPost(HttpServletRequest request, HttpServletResponse response) 14 throws ServletException, IOException { 15 16 response.setContentType("text/html;charset=UTF-8"); 17 request.setCharacterEncoding("UTF-8"); 18 19 //リクエストパラメータを取得 20 String name = request.getParameter("NAME"); 21 int age = Integer.parseInt(request.getParameter("AGE")); 22 int sex = Integer.parseInt(request.getParameter("SEX")) ; 23 int satisfactionLevel = Integer.parseInt(request.getParameter("SATISFACTION_LEVEL")) ; 24 String message = request.getParameter("MESSAGE"); 25 26 //アンケートデータ(SurveyDto型)の作成 27 SurveyDto dto = new SurveyDto(); 28 dto.setName( name ); 29 dto.setAge( age ); 30 dto.setSex( sex ); 31 dto.setSatisfactionLevel( satisfactionLevel ); 32 dto.setMessage( message ); 33 dto.setTime( new Timestamp(System.currentTimeMillis()) ); 34 //アンケートデータをDBに登録 35 BusinessLogic logic = new BusinessLogic(); 36 boolean succesInsert = logic.executeInsertSurvey(dto); 37 38 //DB操作の成功/失敗に応じて表示させる画面を振り分ける 39 if (succesInsert) { 40 response.sendRedirect("htmls/finish.html"); 41 } else { 42 response.sendRedirect("htmls/error.html"); 43 } 44 } 45} 46

【追記】修正依頼をうけてコードを修正しました!Listでdtoを返すようにコードを書き換えましたが、リストを格納しているdtoからどうやってデータを取得すればよいかわかりません。SowAllSurveyの以下の部分でエラーが出てしまいます。

java

1//DTO内のデータを取り出す 2 String name_ex = resultDto.getName(); 3 String age_ex = String.valueOf(resultDto.getAge()); 4 String sex_ex = String.valueOf(resultDto.getSex()); 5 String satisfactionLevel_ex = String.valueOf(resultDto.getSatisfactionLevel()); 6 String message_ex = resultDto.getMessage(); 7

【エラー内容】--------------------
例)メソッドgetName()は型List<SurveyDto>で未定義です。
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
SurveyDtoクラスでList<SurveyDto>で定義しろということでしょうか?でも自分なりに調べたところリストを作るときもdtoクラスはいじらなくてもよいとあったのですが…。

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

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

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

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

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

m.ts10806

2020/03/23 05:30

doSelect がどこから呼び出されてるのか提示されてないのでなんとも言えません。 「データベースのデータ」と言っても取得してきたらJava側ではあくまで配列なりモデルなりのオブジェクトなので、オブジェクトの取り扱いの問題では? いずれにしても、doSelectでデータ返してない、意図のよく分からないコードにはなってますけど。 作り直した方が早そうです。
chimo

2020/03/23 05:41

返信ありがとうございます。doSelectはDAOの中のメソッドで、DAOクラスはBusinessLogicクラスでインスタンス化されるので、doSelectはBusinessLogicクラスで以下のように呼び出されています。 【BusinessLogicクラスでdoSelectを呼び出している部分】 /**----------------------------------------------------------------------* *■executeSelectSurveyメソッド *概要 :対象のアンケートデータを選択してくる(SELECT) *引数 :対象のアンケートデータ(SurveyDto型) *戻り値:なし *----------------------------------------------------------------------**/ public void executeSelectSurvey() { SurveyDao dao_Ex = new SurveyDao(); dao_Ex.doSelect(); }
m.ts10806

2020/03/23 06:06

こちらに書かれても困ります。 質問本文に追記してください。 あと、文字数食うし読みづらくなるのでメソッド説明のコメント行は省いてもらって構いません。
rubytomato

2020/03/23 15:22

以下の仮定で確認させてください。 * ShowAllSurvey = データを表示するサーブレット * SaveSurvey = データを保存するサーブレット エラーメッセージを見ると、エラーが起きているのはSaveSurvey.javaのようです。 しかし、質問のタイトルを見ると一覧表示したい(けど出来ない)ということなので、SaveSurvey.javaは直接関係が無いようにも思います。 このようにエラーメッセージとやりたいこと(一覧表示したい)ことが関連しないように思いますので、いくつか確認させてください。 確認したい事項は下記の通りです。 1) 質問に記載のエラーが、何をしようとしたときに(入力フォームを表示しようとした、一覧表示をしようとした、データを登録しようとした 等)起きたのかを教えてください。 2) もしデータ登録のときに起きたのであれば、SaveSurvey.javaのソースコードとSaveSurvey.doPostを呼び出す側の処理のコード(htmlファイル?)を質問内容に追記ください。 3) 入力フォームのページのURLを教えてください。(例: localhost:8080/myapp/input ) 4) web.xmlの内容を教えてください。
javahack

2020/03/23 19:13

エラーを解決したいのであれば、rubytomatoさんが言われるようにエラーが発生しているコードを提示する必要があります。 が、そのエラーの原因については別の質問のコメント内で指摘済みです。 https://teratail.com/questions/248549#reply-359769 このエラー自体FAQ的なもので、ちょっと調べればいくらでも解決方法が出てきます。 失礼な言い方になりますが、chimoさんはJavaの基礎的な知識が十分でないと思われますので、もう一度基本に戻って学習し直した方が良いのではないでしょうか。
chimo

2020/03/24 01:38

>rubytomatoさん 返信ありがとうございます!コード中のコメント等削除したら字数的におさまったのでSavesurveyクラスのコードも追加いたしました。正直SavesurveyとInputsurveuはもともと講義で使われていたコードでそこに新たにわたしがかいたshowAllSurveyを加えてシステムを改造するというのが演習内容でありました。つまりSavesurveyとInputsurveyは先生が書いたもので講義中も普通に動いていたし、わたしがいじったのは自分で書いたShowAllsurveyとBusinessLogicとDAOの部分なのでまさかSavesurveyにエラーがあるとは予想外でした...。 >ShowAllSurvey=データを表示するサーブレット、Savesurvey=データを保存するサーブレット そうです!Showallsurveyは今まで入力された情報を、MySQLにアクセスしてSELECTしてきて、それをHTMLをつかってブラウザに表示するのが目的です。Savesurveyはその逆で、アンケートフォームに打ち込まれた情報をMySQLにアクセスしてINSERTするというのがこのクラスの仕事です。 1 ) エラーがおきるのはいつも「アンケート結果一覧へ」というリンクを押した後、つまりアンケート結果一覧が表示されるべきページでエラー画面になってしまいます。アンケートの入力も、送信もすべて成功しています。MySQLを見てみると、送信されたデータがきちんと更新されているので、Savesurveyもうまくいっているはずなのですが…。 3 ) 入力フォームのページurl : http://localhost:8090/Ex_5_04/InputSurvey 入力フォームのページが表示されているときのurlです 4 )字数の問題でweb.xmlの内容をここに書かせてもらいます。見にくくなって申し訳ないです…。 【web.xml】 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <servlet> <description></description> <display-name>InputSurvey</display-name> <servlet-name>InputSurvey</servlet-name> <servlet-class>work.InputSurvey</servlet-class> </servlet> <servlet-mapping> <servlet-name>InputSurvey</servlet-name> <url-pattern>/InputSurvey</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>SaveSurvey</display-name> <servlet-name>SaveSurvey</servlet-name> <servlet-class>work.SaveSurvey</servlet-class> </servlet> <servlet-mapping> <servlet-name>SaveSurvey</servlet-name> <url-pattern>/SaveSurvey</url-pattern> </servlet-mapping> <servlet> <description></description> <display-name>ShowAllSurvey</display-name> <servlet-name>ShowAllSurvey</servlet-name> <servlet-class>work.ShowAllSurvey</servlet-class> </servlet> <servlet-mapping> <servlet-name>ShowAllSurvey</servlet-name> <url-pattern>/ShowAllSurvey</url-pattern> </servlet-mapping> </web-app> ここにweb.xmlのせるためにもう一度見直してみるとweb.xmlに間違いがあることに気が付きました。 <servlet-class>work.ShowAllSurvey</servlet-class>を <servlet-class>work.SaveSurvey</servlet-class>にしておりました。そこをなおしてもう一度起動すると、エラーは出てこなくなったのですが、かわりに真っ白なページになってしまいました…。
rubytomato

2020/03/24 01:59

HTMLの出力に System.out.println( "<html>" ) ; のようにSystem.out.printを使用していますが、これだとブラウザに表示されないのではないでしょうか? 他のサーブレットがどのようにしているか見比べてみて下さい
chimo

2020/03/24 02:13

あっ!!そういえば前にその質問しました!いつもout.printlnでやるのにうまくいかなくて質問したらSystem.out.printlnにしろときたのでそうしたのですが、もう一度out.printlnでやってみます。 やってみたら半分うまくいきました!画面になにかしら表示されるようにはなりました、が、思っているのと違う装いで表示されました。こんな感じです↓ 【表示画面】 アンケート回答一覧 < table class="list" border=1 id="TABLE"> 名前年齢性別満足度 ご意見・ご感想 全然表になってないしデータも抽出されていない…。 一度ArrayListなしで泥臭くコード書いてみようかと思います...。 HTML文書かSQL文のどちらか、もしくは両方が間違っているのでしょうか?
m.ts10806

2020/03/24 02:19

サーバーサイドの処理をサーブレットで画面をjspで書くのが最も望ましい解決方法ですけど、あえてVIEWもJava側に書き続けてどんどんスパゲッティコード化していかれるのはどういう理由からでしょうか。 前の質問ではブラウザに出したいのかどうか不明だったからとりあえずの解決策を提示したけど、そもそもブラウザに出したいならサーブレット側に書くのはコード管理(役割)や生産性、メンテナンス性の観点から間違ってます。
rubytomato

2020/03/24 02:25

"< table class=\"list\" border=1 id=\"TABLE\"> " の部分ですが< と tableの間の余計なスペースを削除してみてください。 データが表示されないのはデータが登録されていないか、正しく検索できていないかのどちらかではないでしょうか?
chimo

2020/03/24 02:35

スペースけしたら表のタイトルだけは表示がうまくいきました!!すごいです!スペースには別に意味なんかないと思っていましたがこんなに影響力あったんですね…。ただ各カラムにデータが入った状態で表示されてはいないです…。イメージとしては ーーーーーーーーーーーーーーーーーーーーーーーー 名前  年齢  性別  満足度  ご意見ご感想 ーーーーーーーーーーーーーーーーーーーーーーーー だけの状態で、その下にデータはないです。でもMySQLを確認するとレコードが更新されていたので、データの登録はうまくいっているはずです。ArrayListの作り方がまずいかSELECT文が間違っているかですかね...。正しく検索できていない方の可能性でもうすこし考えてみます!
rubytomato

2020/03/24 02:49

動作確認はブラウザの表示結果だけでなくEclipseのコンソールに出力されるメッセージにも気を付けてください。何かエラーは出てないでしょうか? それと dto.setSatisfactionLevel( rs.getInt( "satisfactionLevel" ) ); のカラム名ですが正しいかご確認下さい。
chimo

2020/03/24 03:28

コンソールには真っ赤な文字列がびっしりあります!でもエラーではないような気がします...。いつもTomcatを起動するときにぶわーーっとでてくるやつと似ています。 カラム名訂正するとうまくいきました!テーブルはブラウザに表示されましたが、MySQLの一番上のデータ1レコード文しか抽出してきてくれません…。
m.ts10806

2020/03/24 03:32

コンソールある程度読めるようになるのも必須です。 既に指摘されてるように基礎部分が抜けすぎてることに起因します。 急がば回れ。初心者時期の「あともうちょっとでできそう」は実は半分も届いてないことが多いんですよ。 もっと簡単な単発コードからやったほうが早いですし、身に付きます。 質問サイトでペアプロ求めるのは無理な話です。
rubytomato

2020/03/24 03:52

一件しか表示しないのは一件しか取得していないからです。 > SurveyDto resultDto = logic_ex.executeSelectSurvey(); この処理は List<SurveyDto> resultDto = logic_ex.executeSelectSurvey(); のようにリストを返すように修正する必要があると思います。 https://itsakura.com/java-dto-dao こちらのページのDaoのサンプルが参考になると思います。
chimo

2020/03/24 05:51

やはりそうだったんですね、Daoサンプルのページありがとうございます!参考にしながらもう一度コードを書きなおしてみましたが、リストで帰ってきたデータをShowAllSurveyで取り出せません...。やり方もしらべてみましたが出てきませんでした...。
m.ts10806

2020/03/24 05:56

大事なことスルーされたのでもう一回書いておきますね。 *********** 質問サイトでペアプロ求めるのは無理な話です。 *********** 既に出ている回答、コメントのアドバイスで解決可能な内容なので、あとは自力でなんとかするしかないですよ。
chimo

2020/03/24 06:00

自分でもいろいろ調べてます。別に丸投げしているわけじゃないです。コード全部書いてくれって言ってるわけじゃないんです。回答を待っている間も試行錯誤しています。復習ももちろんしています、でも自分のレベルが足りていないのは重々承知しています。でもとりあえずこの質問だけは解決させてください。
rubytomato

2020/03/24 06:43

listからデータを取り出すにはfor文を使えばいいと思います。 参考にあげたページの 「利用するクラスのサンプル」にfor文の書き方が載っているのでみてください。もしくは"java list for"などで調べてみてください。 for文の書き方がわかったら後はそれをどこで使うかですが、htmlのテーブルでデータの数だけ繰り返し表示する必要があるのはtrタグだと思います。 そこをfor文を使って記述すればいいと思います。 なので、下記の変数に取り出している一連の処理は不要ということになります。 > //DTO内のデータを取り出す > String name_ex = resultDto.getName();
m.ts10806

2020/03/24 07:07

丸投げしてるという指摘ではなく、質問ではなくペアプロになってるという指摘をしています。 別に解決してほしくないと思ってるわけでもないです。解決してほしくないならわざわざ突っ込みません。 そもそもエラーメッセージも含めて解決のためのヒントです。 見た感じ「8割わからない」状態っぽいので、結局作ってもらってるような状態になってます。この状態が続けば続くほどはた目から見ると丸投げ作業依頼にしか見えなくなってくるんですよ。 他でも書いたかもしれないですが、自身が手に負えるくらいのレベルのコードに最初から書き直した方が結果的には早く終わり、自身の成長に繋がります。 ご一考ください。 どうしてもどうしてもと言うのでしたらMENTAのようなサービスを利用し、しっかりペアプロしてもらったほうが良いとも思います。 質問サイトで片付けられるほどの「問題」ではないと感じました。
chimo

2020/03/24 10:44

>rubytomatoさん 親身になって回答してくださってありがとうございました!!ついに完成させることができました!!DTO内のデータをfor文で取り出すことと、データをリストで返すことなど、たくさん勉強になりました!独学なのでとても助かりました。知識が未熟で迷惑かけてしまってすみませんでした。ベストアンサーにしたいのですが、回答なにかかいていただくか(もしくは参考になったページのurlはるか)していただけないでしょうか?
chimo

2020/03/24 10:47

>m.ts10806さん たくさんのご指摘ありがとうございました。とりあえず今回の質問は解決しましたが、今回で自分の力不足を理解しましたので、しばらくはプログラミングの勉強を先に進めるのは諦めて復習に徹そうかと思います。
guest

回答2

0

ベストアンサー

無事問題を解決できたようでよかったです。
すでにコメント欄でやり取りをさせて頂いたのですが、補足・指摘したい点もありましたので改めて回答させて頂きます。

ポイント1

コメント

ここにweb.xmlのせるためにもう一度見直してみるとweb.xmlに間違いがあることに気が付きました。
<servlet-class>work.ShowAllSurvey</servlet-class>
<servlet-class>work.SaveSurvey</servlet-class> にしておりました。
そこをなおしてもう一度起動すると、エラーは出てこなくなったのですが、かわりに真っ白なページになってしまいました…。

補足・指摘点

この点についてはご自身で気づかれたように、web.xmlの記述に問題があったためということですね。
データ表示を行うサーブレットShowAllSurveyを呼び出すところ、web.xmlの記述により想定外のSaveSurveyが呼び出されたためエラーが起きていたのが今回のご質問の根本の原因だったと思います。
この原因に早く気付くには、やはりエラーメッセージを注意深く読み、意味を読み取る技術が必要だと思いますが、いま直ぐには難しいと思いますので簡単なコツだけお伝えしたいと思います。

下記のエラーメッセージの中から自身が作成したクラスがないか探します。この例でいえば★を付けた2行が該当します。

java.lang.NumberFormatException: null java.lang.Integer.parseInt(Integer.java:542) java.lang.Integer.parseInt(Integer.java:615) work.SaveSurvey.doPost(SaveSurvey.java:40) ★ work.SaveSurvey.doGet(SaveSurvey.java:26) ★ javax.servlet.http.HttpServlet.service(HttpServlet.java:634) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

さらに2行ある内の上の行に注目します。この行が意味するのは以下の通りです。ソースファイル名と行番号が指す箇所でエラー(例外=NumberFormatException)が起きていることを意味していますが、
今回の事象でいえば、そこはあまり意味がなく上述したとおり、本来ShowAllSurveyが実行されるべきところ、SaveSurvey.doPostが実行されているということに注目する必要があります。

work.SaveSurvey.doPost(SaveSurvey.java:40) ^^^^^^^^^^^^^^^ ^^^^^^ ^^^^^^^^^^^^^^^ ^^ | | | | | | | +--- 行番号 | | | | | +------------------- ソースファイル名 | | | +-------------------------- メソッド名 | +------------------------------------------ パッケージ.クラス名

もう1つのコツとしては、開発中であればいろいろなところでデバッグログを出力するのも効果があると思います。
Javaには標準のログAPIがあるのでそれを利用すればいいと思いますが、もっと簡単に済ますのであればSystem.out.println(" なんらかのメッセージ ");を書くという方法もあります。
メッセージを出力するようにしておけば動作確認時に、メッセージがコンソールに出力されてプログラムが実際どのように動いているか追跡しやすくなります。

今回の例でいえばメソッドの先頭に以下のように記述しておけば、どのメソッドを処理が通ったか追いやすくなります。必要があればメソッドの引数の値もメッセージに加えるのも良いとおもいます。

java

1public class ShowAllSurvey extends HttpServlet { 2 3 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 4 System.out.println("ShowAllSurvey.doGet"); 5 6 // 省略 7 } 8 9 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 10 System.out.println("ShowAllSurvey.doPost"); 11 12 // 省略 13 } 14 15}

java

1public class SaveSurvey extends HttpServlet { 2 3 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 4 System.out.println("SaveSurvey.doGet"); 5 6 // 省略 7 } 8 9 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 10 System.out.println("SaveSurvey.doPost"); 11 12 // 省略 13 } 14 15}

ポイント2

コメント

やってみたら半分うまくいきました!画面になにかしら表示されるようにはなりました、が、思っているのと違う装いで表示されました。こんな感じです↓
【表示画面】
アンケート回答一覧
< table class="list" border=1 id="TABLE"> 名前年齢性別満足度 ご意見・ご感想

全然表になってないしデータも抽出されていない…。
一度ArrayListなしで泥臭くコード書いてみようかと思います...。
HTML文書かSQL文のどちらか、もしくは両方が間違っているのでしょうか?

補足・指摘点

この問題については、ご自身でコメントされているとおり『HTMLの書き方』か『SQLの書き方(データ抽出の仕方)』か、もしくは『データが登録されていない』かが原因として考えられそうです。
どこに原因があるのかは地道に調べていくしかありません。

  • データが登録されていないか → SQLクライアントで直接データが存在するか調べることで確認できます。
  • SQLの書き方の問題か → データ取得直後にそのデータをログに出力することで確認できます。
  • HTMLの書き方の問題か → これは特定するのが難しいですがHTMLタグの出力部分に注意するしかありません。またブラウザでHTMLソースを確認するというのも有りだと思います。

SQLの書き方に問題ないかを確認するには、例えばデータを取得するメソッド内にログを出力するようにします。

java

1//SQL文の生成(SELECT) 2StringBuffer buf = new StringBuffer() ; 3buf.append(" SELECT "); 4buf.append(" NAME , "); 5buf.append(" AGE , "); 6buf.append(" SEX , "); 7buf.append(" SATISFACTION_LEVEL , "); 8buf.append(" MESSAGE "); 9buf.append(" FROM "); 10buf.append(" SURVEY "); 11 12System.out.println("SQL:" + buf.toString()); //★組み立てたSQLを出力する 13 14ps = con.prepareStatement(buf.toString());

また、取得したデータを詰めたリストに、本当にデータが詰まっているか確認することも有効です。

java

1System.out.println(dtoList); //★リストのデータを出力する、ただしデータ件数が多いとその分出力量が多くなるので注意 2 3return dtoList;

ただし、このコードで意味がある情報(人間が読める文字列)が出力されるようにするにはSurveyDtoクラスのtoStringメソッドをオーバーライドしておく必要があります。
toStringメソッドのオーバーライドはEclipseの機能を使うと簡単です。
SurveyDtoクラスを開き、Shift + Alt + S キーを押し、メニューからGenerete toString()...を選択(もしくはメニューバー → Source → Generate toString()...)します。
フィールド名を選択(この場合は全部)してGenereteボタンをクリックすると、toStringメソッドのコードが自動的に生成されます。

java

1@Override 2public String toString() { 3 return "SurveyDto [name=" + name + ", age=" + age + ", sex=" + sex + ", satisfactionLevel=" + satisfactionLevel 4 + ", message=" + message + "]"; 5}

ポイント3

コメント

< table class="list" border=1 id="TABLE"> 名前年齢性別満足度 ご意見・ご感想

スペースけしたら表のタイトルだけは表示がうまくいきました!!すごいです!スペースには別に意味なんかないと思っていましたがこんなに影響力あったんですね…。

補足・指摘点

ページが中途半端に表示されるというこの問題は余計な半角スペースがあった為ということでしたが、下記の考え方は危ういと思います。

スペースには別に意味なんかないと思っていましたが

プログラミングではたった1文字の打ち間違いがバグになりえます。コンパイルエラーになればまだいい方ですが、コンパイルが通って一見普通に動作しているように見える場合もありますので
よくよく注意してコーディングしてみてください。
この部分はツール(Eclipse)の機能を借りるとだいぶ楽になるので、時間があったらツールの使い方も調べておくといいと思います。

ポイント4

コメント

ただ各カラムにデータが入った状態で表示されてはいないです…。イメージとしては
ーーーーーーーーーーーーーーーーーーーーーーーー
名前  年齢  性別  満足度  ご意見ご感想
ーーーーーーーーーーーーーーーーーーーーーーーー
だけの状態で、その下にデータはないです。でもMySQLを確認するとレコードが更新されていたので、データの登録はうまくいっているはずです。

補足・指摘点

この問題はResultSetからデータを取得する際にカラム名の記述を間違えていたことにあったのですが、

java

1dto.setSatisfactionLevel( rs.getInt( "satisfactionLevel" ) ); //誤 2 3dto.setSatisfactionLevel( rs.getInt( "SATISFACTION_LEVEL" ) ); //正

1つ指摘できる点として、この問題により実行時に例外が発生していたはずなのにブラウザにはページが表示されているという点です。
ソースコードでは例外処理を下記のように書いているのでスタックトレースを出力していると思いますが、最初のころは動作しているように見えてしまうので問題に気づきにくいと思います。

java

1} catch (SQLException e) { 2 e.printStackTrace(); 3 4 // 省略

コンソールに出力されているメッセージを注意深く見るという習慣を付ける必要がありますが、今回の例でいえば下記のようにRuntimeExceptionをスローするようにして処理を中断させた方がよかったかもしれません。こうすればブラウザ上での動作確認でも問題が起きていることがすぐにわかります。

java

1} catch (SQLException e) { 2 throw new RuntimeException("この場所で問題が起きたことを識別できるエラーメッセージを書く", e); 3 4 // 省略 5

ポイント5

コメント

リストで帰ってきたデータをShowAllSurveyで取り出せません...。やり方もしらべてみましたが出てきませんでした...。

補足・指摘点

これはWebアプリケーションというよりはJavaの基本の部分になるので、これも地道に勉強と経験を積み重ねるしかないと思います。
ネット上で情報を調べるという手もありますが、最初はやはり書籍の方がいいと個人的に思いますので入門向けの書籍を買ってみることをお勧めします。

また、他人の書いたコードを読むというのも経験になりますので、簡単なfor文の例を記載しておきます。
下記のExerciseクラスで実行する3つの繰り返し処理は同じ結果を出力します。どの方法を取るかは状況によりますが、とりあえず1)か2)の書き方を知っていると良いと思います。

また、このようなJavaのコードを試せる動作確認用のクラスを作って実際に動かしてみるというのも効果があると思います。

java

1import java.util.ArrayList; 2import java.util.List; 3 4public class Exercise { 5 6 public static void main(String[] args) { 7 // テストデータの準備 8 List<SurveyDto> list = new ArrayList<>(); 9 list.add(new SurveyDto("Aaa", 1, 1, 1, "aaa")); 10 list.add(new SurveyDto("Bbb", 2, 2, 2, "bbb")); 11 list.add(new SurveyDto("Ccc", 3, 3, 3, "ccc")); 12 13 String messageFormat = "Name:[%s] Age:[%d] Sex:[%d] satisfactionLevel:[%d] Message:[%s]"; 14 15 // 例1) for文 16 for (int i=0; i<list.size(); i++) { 17 SurveyDto dto = list.get(i); 18 String src = String.format(messageFormat, 19 dto.getName(), 20 dto.getAge(), 21 dto.getSex(), 22 dto.getSatisfactionLevel(), 23 dto.getMessage()); 24 System.out.println(src); 25 } 26 27 // 例2) 拡張for文 28 for (SurveyDto dto : list) { 29 String src = String.format(messageFormat, 30 dto.getName(), 31 dto.getAge(), 32 dto.getSex(), 33 dto.getSatisfactionLevel(), 34 dto.getMessage()); 35 System.out.println(src); 36 } 37 38 // 例3) forEach文 39 list.forEach(dto -> { 40 String src = String.format(messageFormat, 41 dto.getName(), 42 dto.getAge(), 43 dto.getSex(), 44 dto.getSatisfactionLevel(), 45 dto.getMessage()); 46 System.out.println(src); 47 }); 48 } 49 50}

投稿2020/03/25 11:00

rubytomato

総合スコア1752

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

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

chimo

2020/03/26 08:26

なるほど…。お忙しい中、お金を払っているというわけでもないのにこんなに丁寧に説明してくださり、本当にありがとうございました!!まだまだ未熟な私にとってすごく勉強になりました!!javaの基本に戻りソースコードを書くことからまた復習し、基礎をかためてから今度はデバックの工夫やコンソールの確認などもできるようになった状態でシステム作りにチャレンジしてみたいと思います!!本当に丁寧な解説ありがとうございました!親身になって回答してくださり、諦めそうになっていたところ心が救われました。
guest

0

executeSelectSurvey内でArrayList作ってそこに取得結果詰めてそのArrayList返却してそのまま利用するのが早いです。
今の作りだと単に入力送信した値が一行出てるだけです。

が、
今のエラーをどうにかするよりもっと簡単なコードで作り直した方が着実に進むと思います。
「ここまで出来たからもう少しでできるはず」にこだわっては底無し沼にハマるだけです。大抵は根本的な理解やロジックの過ちに気づけません。

まずはロジッククラスとかモデルとか一切なくしてサーブレットで直に全件データとってくるところから。

そしてブレイクポインと貼ってデバッグ実行して
各場所でデータがどうなってるか確認すること。
プログラミングをしていく上でデバッグは必須です。

投稿2020/03/23 06:34

編集2020/03/24 10:52
m.ts10806

総合スコア80765

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

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

chimo

2020/03/23 08:30

回答ありがとうございます。おっしゃるとおりなのですが、妥協できない理由があります。どうしてもこの形式でしないとだめなので、もう一度一からアルゴリズムやシステムを考え直してみます。
m.ts10806

2020/03/23 13:05

妥協しろとは言っていません。 ベタで作れないのにモデルだコントローラだサービスだというのは無理があるという話をしています。 いきなり構造や階層を考えると大抵破たんします。階段は1段ずつ上がっていくものですよ。
chimo

2020/03/23 13:31

そうですね…。次の講義でこれを使用するのでそれまでに仕上げないといけなくて、焦っていました。一応頭冷やしてコードもう一度考え直して編集したのですが、やっぱり改善できてないんでしょうか…。もしお時間あれば確認お願いしたいです…。
m.ts10806

2020/03/23 13:38

>次の講義でこれを使用するのでそれまでに仕上げないといけなくて、焦っていました なるほど。残酷かもしれませんが他人は関係ない事情ですね。 課題感が出ると回答者は避けます。ご注意を。 (課題丸投げになってしまうと非推奨ですしね。無責任な赤の他人ではなく先生・講師に聞いてという話になってきます) >やっぱり改善できてないんでしょうか… 動かしたら分かるのではないでしょうか。 手元に環境があるのは質問者さんだけです。 コードレビューを請け負う場所ではないですよ。 ブレイクポインと貼ってデバッグ実行して 各場所でデータがどうなってるか確認することですね。
m.ts10806

2020/03/23 21:21

低評価理由をコメント願います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問