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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

2316閲覧

サーブレットでJSONの値を返せない

Chandler_Bing

総合スコア673

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2019/03/22 14:02

編集2019/03/30 03:21

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();の部分のはずなのですが、何がおかしいのでしょうか。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/03/22 14:39

また同じ質問を3つも量産してからに
A-pZ

2019/03/22 15:34

エラーが e.printStackTrace() で出力されているので、そのエラー内容が出ているはずですよ。
Chandler_Bing

2019/03/22 15:35

ありがとうございます。 はい。エラーが乗っています。 with root cause という名がありますが、よく分かりません。
A-pZ

2019/03/22 15:40

いいえ、それは違う内容です。一度デバッグモードで起動して、一体どこでエラーになったのかをステップ実行などで試されると良いでしょう。
Chandler_Bing

2019/03/22 15:42

了解いたしました。また追加します。
m.ts10806

2019/03/22 22:35 編集

基本的なデバッグをすすめられてそれで解決に向かえるのに自己解決する気はないんですか。 毎回脳髄反射で質問たてる前にデバッグして自己解決してね、ってお願いをされてるってそろそろ気づこう。
m.ts10806

2019/03/24 11:04

Googleでの検索の仕方から教えてって依頼ですね、これは。
退会済みユーザー

退会済みユーザー

2019/03/24 11:53

@mts10806 Tomcat の標準のエラーページの見方が日本語じゃないからわかりませんって終わってるレベルの質問だけどね(エラーページの設定をしてない場合、画面側にトレースがでる)
Chandler_Bing

2019/03/24 11:56

ありがとうござます。英語に関しては当方英検1級保持者ですので、問題ありません。 どうやって現在のエラーを特定すれば良いのでしょうか。
m.ts10806

2019/03/24 12:01

英検1級 プログラミングにほぼ活かせてないので宝の持ち腐れですね。まだGoogle翻訳のほうがプログラミング向けの訳を返してくれますね。
m.ts10806

2019/03/24 12:06

それに翻訳しろって言ってません。検索して考えろって言ってます。 「どこが間違ってますか?」って質問してる限り、デバッグやエラーの調べ方から検索しないといけない状態からは抜けられませんよ。 ちょこちょこ質問編集されてますが、最初からやってから、やりつくしてから質問してください。 しないなら「自己解決するまでの備忘録がわりです」とか一言入れといてください。誰も邪魔しなくなるので。
BluOxy

2019/03/29 22:00

マルチポストは非推奨です。https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14205620064 連投していることを指摘され、「気を付ける」と言いながら改善が見られないのはいかがでしょうか。 考えてみてください。 1週間も問題解決ができていないのでしたら、mts10806さんの仰る通りデバッグやエラーの調べ方を調べるのが一番早いです。 また、 >一度デバッグモードで起動して、一体どこでエラーになったのかをステップ実行などで試されると良いでしょう。 とA-pZさんからアドバイスを頂いていますが、ステップ実行は試してみましたか? 上記指摘について試したようなレスポンスがないので、何もアクションをされていないように見えます。 その結果を報告するところから始めないといけないと先に進まないと思いますが、いかがでしょう。
Chandler_Bing

2019/03/31 10:19

デバックもしましたし、エラー個所の特定もしましたので、教えていただけませんか。
m.ts10806

2019/03/31 10:26

?? 特定できたら直すだけでは?? 単なる作業依頼です。質問じゃないので答えませんよ誰も。教えたところで理解しませんよね? お金払ってやってもらったらいいです。
BluOxy

2019/03/31 11:05

JavaQuizDAO jqd = new JavaQuizDAO();でエラーが出るって、「コンストラクタが定義されていないのにそんな訳ないでしょ」という気はしますが・・・。
em334

2019/03/31 13:36

BluOxy さん 知恵袋から流れてきました。 推察するに、ここでエラーが出るのは、ClassLoaderがJavaQuizDaoをロードするときにAssertionErrorを吐き出している可能性があり…(この辺詳しくないので断言はできないのですが…) と考えると、StackTraceが出てこないのも納得ができます。 自分なら起動コマンドイジってassertionが出ているか見るのですが、それはそれで… この推察が正しければ、おそらく、外部jarの置き場がWEB-INFでないとか、外部プロジェクトを参照していて、tomcat homeから見れないような参照の仕方をしているとか…そんな感じかなと思いましたが、 まぁ、この調子だと自己解決はほど遠いかと…
em334

2019/03/31 14:01

考えられるclassをClass.forNameで呼び出してClassNotFoundExceptionが出てくれれば、推察が確定に変わるんですが…それをやってくれないんですよね。 プロジェクトの構成やら全てを確認することもできないですし…
Chandler_Bing

2019/03/31 14:08

分かりました。やってみます。 ありがとうござます。
退会済みユーザー

退会済みユーザー

2019/03/31 15:28

@em334 ちなみに OMの場所とか一週間前に本人がきづいてるはずなのにいまだに解決してないからね。(直接JSONをかくと成功するとかいってる)
guest

回答1

0

自己解決

em334のおかげで解決しました。ありがとうございます。外部jarファイルをWEB-INFのlibに入れると上手く行きました。本当にありがとうございました。

投稿2019/04/01 12:31

Chandler_Bing

総合スコア673

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問