複数のクラスが複雑に絡んでいるのでやりたいことを順番立てて箇条書きにしたいと思います。複数のクラスにたくさんコードを書いたのですべてここに乗せると字数が足りなくなってしまいますので、【①】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クラスはいじらなくてもよいとあったのですが…。
回答2件
あなたの回答
tips
プレビュー