現在簡単なクイズ問題をJava、jsp、Ajaxを使用し作成していますが非同期通信が上手く行きません。JavaとAjaxで非同期通信を行うのは初めてなので困っています。以下ファイルです。
DBに保存されているクイズのカラムの値をフィールド値に入れ、インスタンスとして扱います。
Java
1package model; 2 3import java.io.Serializable; 4import java.util.List; 5 6import dao.JavaQuizDao; 7 8public class Quiz implements Serializable { 9 private int question_id; 10 private String question; 11 private String answer1; 12 private String answer2; 13 private String answer3; 14 private String answer4; 15 private String correct_answer; 16 17 public Quiz() { 18 } 19 20 public Quiz(int question_id, String question, String answer1, String answer2, String answer3, String answer4, 21 String correct_answer) { 22 this.question_id = question_id; 23 this.question = question; 24 this.answer1 = answer1; 25 this.answer2 = answer2; 26 this.answer3 = answer3; 27 this.answer4 = answer4; 28 this.correct_answer = correct_answer; 29 } 30 31 public int getQuestion_id() { 32 return question_id; 33 } 34 35 public String getQuestion() { 36 return question; 37 } 38 39 public String getAnswer1() { 40 return answer1; 41 } 42 43 public String getAnswer2() { 44 return answer2; 45 } 46 47 public String getAnswer3() { 48 return answer3; 49 } 50 51 public String getAnswer4() { 52 return answer4; 53 } 54 55 public String getCorrect_answer() { 56 return correct_answer; 57 } 58}
これはサンプルのJSPコードです。Ajaxを介してDBからデータを得ます。それがコンソールに表示されれば成功とします。
JSP
1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 4 5<!DOCTYPE html> 6<html lang="en" dir="ltr"> 7 8<head> 9 <meta charset="utf-8"> 10 <title>JavaのAjaxの練習です。</title> 11 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> 12</head> 13 14<body> 15 <h2>何も表示しません</h2> 16</body> 17 18<script> 19 $(function() { 20 21 function getQuizzes() { 22 return $.post('/Ajax', { 23 action: getQuizzes 24 }) 25 } 26 27 getQuizzes().done(function(result) { 28 }); 29 30 }); 31</script> 32</html>
Ajax.java
ここにPOSTから飛んできます。ReturnQuizzes.getQuizzes();はListに挿入したクイズインスタンスを返します。
package
1 2import java.io.IOException; 3 4import javax.servlet.ServletException; 5import javax.servlet.annotation.WebServlet; 6import javax.servlet.http.HttpServlet; 7import javax.servlet.http.HttpServletRequest; 8import javax.servlet.http.HttpServletResponse; 9 10import model.ReturnQuizzes; 11@WebServlet("/Ajax") 12public class Ajax extends HttpServlet { 13 private static final long serialVersionUID = 1L; 14 15 protected void doPost(HttpServletRequest request, 16 HttpServletResponse response) 17 throws ServletException, IOException { 18 19 request.setCharacterEncoding("utf-8"); 20 21 String action = request.getParameter("action"); 22 System.out.println(action); 23 24 if(action == "getQuizzes") { 25 ReturnQuizzes.getQuizzes(); 26 } 27 } 28 29}
DBに接続し値を取得するJavaQuizDaoクラスを使って値をリターンします。
Java
1package model; 2 3import java.util.List; 4 5import dao.JavaQuizDao; 6 7public class ReturnQuizzes { 8 9 public static List<Quiz> getQuizzes() { 10 JavaQuizDao jqDao = new JavaQuizDao(); 11 List<Quiz> quizzes = jqDao.getQuizzes(); 12 return quizzes; 13 } 14 15 public static void main(String[] args) { 16 //DBから値が取れているか確認 17 JavaQuizDao jqDao = new JavaQuizDao(); 18 System.out.println(ReturnQuizzes.getQuizzes()); 19 System.out.println(jqDao.getQuizzes()); 20 } 21} 22
一部抜粋ではありますが、DBに接続し値(クイズ)を取ってきます。(処理が成功することは確認済みです)
Java
1while (rs.next()) { 2 while (rs.next()) { 3 quizzes.add(new Quiz(rs.getInt("question_id"), rs.getString("question"), rs.getString("answer1"), 4 rs.getString("answer2"), rs.getString("answer3"), rs.getString("answer4"), 5 rs.getString("correct_answer"))); 6 } 7 } 8: 9: 10: 11 12return quizzes;//リターンする
問題★
これを実行(JSPをサーバーで実行)するとjQueryのエラーで、RangeError: Maximum call stack size exceeded.が表示されますがJavaのエラーは何も表示されません。どこが間違っているでしょうか。このAjaxへの通信もWEBサイト見ながら我流で組み合わせながら作ったので上手く行きません。
jspのdoneで値を受け取る時はServlet側で単にリターンするだけで良いのでしょうか。JSON型にしていないのが問題でしょうか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/13 11:49