Java
1package model; 2 3import java.io.IOException; 4 5import com.fasterxml.jackson.databind.ObjectMapper; 6import com.fasterxml.jackson.databind.SerializationFeature; 7 8import dao.JavaQuizDAO; 9 10public class Quiz { 11 private int question_id; 12 private String question; 13 private String answer1; 14 private String answer2; 15 private String answer3; 16 private String answer4; 17 private String correct_answer; 18 19 public Quiz(int question_id, String question, String answer1, String answer2, String answer3, String answer4, 20 String correct_answer) { 21 this.question_id = question_id; 22 this.question = question; 23 this.answer1 = answer1; 24 this.answer2 = answer2; 25 this.answer3 = answer3; 26 this.answer4 = answer4; 27 this.correct_answer = correct_answer; 28 } 29 30 public int getQuestion_id() { 31 return question_id; 32 } 33 34 public String getQuestion() { 35 return question; 36 } 37 38 public String getAnswer1() { 39 return answer1; 40 } 41 42 public String getAnswer2() { 43 return answer2; 44 } 45 46 public String getAnswer3() { 47 return answer3; 48 } 49 50 public String getAnswer4() { 51 return answer4; 52 } 53 54 public String getCorrect_answer() { 55 return correct_answer; 56 } 57 58 public static void main(String[] args) { 59 60 JavaQuizDAO jqd = new JavaQuizDAO(); 61 ObjectMapper mapper = new ObjectMapper(); 62 mapper.enable(SerializationFeature.INDENT_OUTPUT); 63 64 try { 65 String script = mapper.writeValueAsString(jqd.getgetQuizzes()); 66 System.out.println(script); 67 } catch (IOException e) { 68 e.printStackTrace(); 69 } 70 } 71 72}
これはDBに入っているクイズ(ID,質問,答え,正答)をインスタンスとして捉えたクラスです。jqd.getgetQuizzes()はDBにあるクイズを4つ取得し、それを全てインスタンスにしそれをListに全てaddし、そのリストを返します。
このmainの表示結果は以下の様になります。きちんとJSONで表示されます。
JSON
1[ { 2 "question_id" : 2, 3 "question" : "This is the book I wrote ___ my sister used to have.", 4 "answer1" : "that", 5 "answer2" : "who", 6 "answer3" : "whom", 7 "answer4" : "in which", 8 "correct_answer" : "that" 9}, { 10 "question_id" : 3, 11 "question" : "I'd ___ honored if you named me as the best man", 12 "answer1" : "rather", 13 "answer2" : "be", 14 "answer3" : "woud", 15 "answer4" : "been", 16 "correct_answer" : "be" 17}, { 18 "question_id" : 4, 19 "question" : "She is so much more ___ than me.", 20 "answer1" : "funnier", 21 "answer2" : "cooler", 22 "answer3" : "fun", 23 "answer4" : "good", 24 "correct_answer" : "fun" 25}, { 26 "question_id" : 1, 27 "question" : "I've ____ studying English for 7 years.", 28 "answer1" : "have", 29 "answer2" : "had", 30 "answer3" : "been", 31 "answer4" : "done", 32 "correct_answer" : "been" 33} ]
これを以下のJSからサーブレットにアクセスし、受け取りたいです。
JS
1$(function() { 2 3 function getQuizzes() { 4 return $.post('AjaxController', { 5 action: 'getQuizzes' 6 }) 7 } 8 9 getQuizzes().done(function(quizzes) { 10 console.log(quizzes); 11 }); 12});
これがサーブレットです。
Java
1protected void doPost(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 4 response.setContentType("application/json; charset=UTF-8"); 5 PrintWriter out = response.getWriter(); 6 ObjectMapper mapper = new ObjectMapper(); 7 JavaQuizDAO jqd = new JavaQuizDAO(); 8 mapper.enable(SerializationFeature.INDENT_OUTPUT); 9 String action = request.getParameter("action"); 10 11 if (action.equals("getQuizzes")) { 12 13 try { 14 String script = mapper.writeValueAsString(jqd.getgetQuizzes()); 15 out.print(script); 16 } catch (IOException e) { 17 e.printStackTrace(); 18 } 19 20 } 21 }
これを実行すると以下のエラーが出ますがどうすればいいかわかりません。解決策をお願いします。
重大: Servlet.service() for servlet [servlet.AjaxController] in context with path [/JavaQuiz] threw exception [サーブレットの実行により例外を投げました] with root cause [金 3 22 22:58:43 JST 2019]
【追記】
今まで、ブレークポイントを置いても止まりませんでしたが、適当に弄っているとブレークポイントでと止まる様になりました。
以下が変更後のサーブレットです
Java
1package servlet; 2 3import java.io.IOException; 4import java.io.PrintWriter; 5 6import javax.servlet.ServletException; 7import javax.servlet.annotation.WebServlet; 8import javax.servlet.http.HttpServlet; 9import javax.servlet.http.HttpServletRequest; 10import javax.servlet.http.HttpServletResponse; 11 12import com.fasterxml.jackson.databind.ObjectMapper; 13 14import dao.JavaQuizDAO; 15 16/** 17 * Servlet implementation class AjaxController 18 */ 19@WebServlet("/AjaxController") 20public class AjaxController extends HttpServlet { 21 22 private static final long serialVersionUID = 1L; 23 24 protected void doPost(HttpServletRequest request, HttpServletResponse response) 25 throws ServletException, IOException { 26 try { 27 response.setContentType("application/json; charset=UTF-8"); 28 29 PrintWriter out = response.getWriter(); 30 JavaQuizDAO jqd = new JavaQuizDAO(); 31 32 ObjectMapper mapper = new ObjectMapper(); 33 out.println(mapper.writeValueAsString(jqd.getQuizzesJson())); 34 35 } catch (Exception e) { 36 e.printStackTrace(); 37 } 38 39 } 40 41}
1行づつブレークポイントを設定すると、JavaQuizDAO jqd = new JavaQuizDAO();のところで上記に書いたエラーがでます。e.printStackTrace();には何も表示されません。
これがインスタンス化しているクラスJavaQuizDAOクラスです
Java
1package dao; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.ResultSet; 7import java.sql.SQLException; 8import java.util.ArrayList; 9import java.util.List; 10 11import com.fasterxml.jackson.core.JsonProcessingException; 12import com.fasterxml.jackson.databind.ObjectMapper; 13import com.fasterxml.jackson.databind.SerializationFeature; 14 15import model.Quiz; 16 17public class JavaQuizDAO { 18 19 public List<Quiz> getgetQuizzes() { 20 Connection conn = null; 21 List<Quiz> quizzes = new ArrayList<>(); 22 23 try { 24 // JDBCドライバを読み込む 25 Class.forName("com.mysql.cj.jdbc.Driver"); 26 // データベースに接続 27 conn = DriverManager.getConnection("jdbc:mysql://localhost:8889/JavaQuiz", "tennisuser", "password"); 28 29 // SELECT文を準備 30 String sql = "SELECT * FROM quizzes ORDER BY RAND() LIMIT 4"; 31 PreparedStatement pStmt = conn.prepareStatement(sql); 32 33 // SELECTを実行し、結果表を取得 34 ResultSet rs = pStmt.executeQuery(); 35 36 while (rs.next()) { 37 int question_id = rs.getInt("question_id"); 38 String question = rs.getString("question"); 39 String answer1 = rs.getString("answer1"); 40 String answer2 = rs.getString("answer2"); 41 String answer3 = rs.getString("answer3"); 42 String answer4 = rs.getString("answer4"); 43 String correct_answer = rs.getString("correct_answer"); 44 Quiz quiz = new Quiz(question_id, question, answer1, answer2, answer3, answer4, correct_answer); 45 quizzes.add(quiz); 46 } 47 48 } catch (SQLException e) { 49 e.printStackTrace(); 50 quizzes.clear(); 51 return quizzes; 52 } catch (ClassNotFoundException e) { 53 e.printStackTrace(); 54 quizzes.clear(); 55 return quizzes; 56 } finally { 57 // データベースを切断 58 if (conn != null) { 59 try { 60 conn.close(); 61 } catch (SQLException e) { 62 e.printStackTrace(); 63 quizzes.clear(); 64 return quizzes; 65 } 66 } 67 } 68 return quizzes; 69 } 70 71 public String getQuizzesJson() { 72 String script = null; 73 ObjectMapper mapper = new ObjectMapper(); 74 mapper.enable(SerializationFeature.INDENT_OUTPUT); 75 try { 76 script = mapper.writeValueAsString(getgetQuizzes()); 77 } catch (JsonProcessingException e) { 78 e.printStackTrace(); 79 } 80 81 return script; 82 } 83}
ちなみに何も弄っていませんが現在このクラスのメソッドをmainで実行すると以下の形式(上記に書いたJSONとは少し違う形)でJSONが表示されます。
JSON
1"[ {\n \"question_id\" : 4,\n \"question\" : \"She is so much more ___ than me.\",\n \"answer1\" : \"funnier\",\n \"answer2\" : \"cooler\",\n \"answer3\" : \"fun\",\n \"answer4\" : \"good\",\n \"correct_answer\" : \"fun\"\n}, {\n \"question_id\" : 6,\n \"question\" : \"I don't want you to feel ___ to come with me.\",\n \"answer1\" : \"forced\",\n \"answer2\" : \"be \",\n \"answer3\" : \"be sad\",\n \"answer4\" : \"been forced\",\n \"correct_answer\" : \"forced\"\n}, {\n \"question_id\" : 3,\n \"question\" : \"I'd ___ honored if you named me as the best man\",\n \"answer1\" : \"rather\",\n \"answer2\" : \"be\",\n \"answer3\" : \"woud\",\n \"answer4\" : \"been\",\n \"correct_answer\" : \"be\"\n}, {\n \"question_id\" : 5,\n \"question\" : \"Don't be ___ in the classroom.\",\n \"answer1\" : \"running\",\n \"answer2\" : \"play game\",\n \"answer3\" : \"happier\",\n \"answer4\" : \"can\",\n \"correct_answer\" : \"running\"\n} ]"
これをそのままコピーしてサーブレットでStringに入れ他のクラスなどを生成しなければ動きます。ですので問題はやはりJavaQuizDAO jqd = new JavaQuizDAO();の部分のはずなのですが、何がおかしいのでしょうか。
回答1件
あなたの回答
tips
プレビュー