#ajax
#ajax
Вопрос:
Я впервые пробую AJAX для своего школьного проекта. У меня проблема с получением ответа от сервера (ответ ‘status’ 0). Я просматривал похожие проблемы в предложенном списке и уже пробовал, но проблема все еще сохраняется. Надеюсь, кто-нибудь может указать, что я делаю не так с моим AJAX-кодом.
Вот мой код jsp:
<%@ page import="java.io.IOException"%>
<%@ page import="java.sql.SQLException"%>
<%@ page import="java.sql.Connection"%>
<%@ page import="java.sql.ResultSet"%>
<%@ page import="java.sql.Statement"%>
<%@ page import="com.p6qgen.*"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Generate Question</title>
<link rel="stylesheet" type="text/css" href="style.css" />
<script type="text/javascript" src="js/jquery-1.6.2.js"></script>
</head>
<body>
<script language="javascript" type="text/javascript">
<!--
// Checking whether the browser support AJAX or not
function ajaxFunction() {
var ajaxReq; // The variable to hold XMLHttpRequest object
//alert("ajaxFunction()");
try {
// Chrome, Firefox, Opera, Safari
ajaxReq = new XMLHttpRequest();
} catch (e){
// Internet Explorer Browsers
try{
ajaxReq = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try{
ajaxReq = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e){
// Something went wrong
alert("Your browser does not support AJAX!");
return false;
}
}
}
//alert("Ajax object created...");
/*
* Start of server response handling
*/
ajaxReq.onreadystatechange = parseXml;
// Parsing the xml document
function parseXml() {
if(ajaxReq.readyState == 4){
alert("in parseXml");
if(ajaxReq.status == 200) {
alert("Status OK!");
var numQs = ajaxReq.responseXML.getElementsByTagName("numqs")[0];
alert(numQs);
for(var i=0; i<numQs; i ) {
num = i 1;
var question = ajaxReq.responseXML.getElementsByTagName("question")[i];
setQuestion(num, question.childNodes[0].nodeValue);
}
} else if(ajaxReq.status == 404) {
alert("Page Not Found");
} else {
alert("Error: " ajaxReq.status)
}
}
/* Just for debugging
else {
switch(ajaxReq.readyState) {
case 0: alert("Not Initialize"); break;
case 1: alert("Connection Establish"); break;
case 2: alert("Request received"); break;
case 3: alert("Answer in Progress"); break;
}
} */
}
/*function setQuestion(num, question) {
var qsTag = document.getElementById("question");
var qBody = "<font size="4"> Question " num;
qBody = "<p>" question "</p></font>";
// if the messageBody element has been created simple replace it otherwise
// append the new element
if (qsTag.childNodes[0]) {
qsTag.replaceChild(qBody, qsTag.childNodes[0]);
} else {
qsTag.appendChild(qBody);
}
}*/
/*
* End of server response handling
*/
// Extract selected values from dropdown lists and store in corresponding var
alert("going to show...");
var numT01 = document.getElementById('numT01').value;
var numT02 = document.getElementById('numT02').value;
var numT03 = document.getElementById('numT03').value;
var numT04 = document.getElementById('numT04').value;
var numT05 = document.getElementById('numT05').value;
var numT06 = document.getElementById('numT06').value;
var numT07 = document.getElementById('numT07').value;
var numT08 = document.getElementById('numT08').value;
// Prepare query string
var queryStr = "?num1=" numT01 "amp;num2=" numT02 "amp;num3=" numT03
"amp;num4=" numT04 "amp;num5=" numT05 "amp;num6=" numT06
"amp;num7=" numT07 "amp;num8=" numT08;
alert("dbg#" numT01);
// Send request to server (server-side 'QGenerator')
ajaxReq.open("GET", "QGenerator" queryStr, true);
//ajaxReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
//ajaxReq.setRequestHeader("Content-length", queryStr.length);
//ajaxReq.setRequestHeader("Connection", "close");
ajaxReq.send(null);
}
//-->
</script>
<h1 align="center">Percentage Question</h1>
<br>
<form name="qtype">
<table width="800" cellspacing="5" align="center">
<tr>
<td width="200" align="right" valign="middle">
<input type="image" src="Pix/qt1.jpg" width="96" height="30" name="typ1">
</td >
<td align="center" valign="middle">
<font size="4">
No of Questions to generate:amp;nbsp;amp;nbsp;
<select id="numT01">
<option value="0" selected="selected">0</option>
<option value="5">5</option>
<option value="10">10</option>
<option value="20">20</option>
<option value="50">50</option>
</select>
</font>
</td>
</tr>
<tr><td></td></tr>
<tr>
<td width="200" align="right" valign="middle">
<input type="image" src="Pix/qt2.jpg" width="96" height="30" name="typ2">
</td >
<td align="center" valign="middle">
<font size="4">
No of Questions to generate:amp;nbsp;amp;nbsp;
<select id="numT02">
<option value="0" selected="selected">0</option>
<option value="5">5</option>
<option value="10">10</option>
<option value="20">20</option>
<option value="50">50</option>
</select>
</font>
</td>
</tr>
<tr><td></td></tr>
<tr>
<td width="200" align="right" valign="middle">
<input type="image" src="Pix/qt3.jpg" width="96" height="30" name="typ3">
</td >
<td align="center" valign="middle">
<font size="4">
No of Questions to generate:amp;nbsp;amp;nbsp;
<select id="numT03">
<option value="0" selected="selected">0</option>
<option value="5">5</option>
<option value="10">10</option>
<option value="20">20</option>
<option value="50">50</option>
</select>
</font>
</td>
</tr>
<tr><td></td></tr>
<tr>
<td width="200" align="right" valign="middle">
<input type="image" src="Pix/qt4.jpg" width="96" height="30" name="typ4">
</td >
<td align="center" valign="middle">
<font size="4">
No of Questions to generate:amp;nbsp;amp;nbsp;
<select id="numT04">
<option value="0" selected="selected">0</option>
<option value="5">5</option>
<option value="10">10</option>
<option value="20">20</option>
<option value="50">50</option>
</select>
</font>
</td>
</tr>
<tr><td></td></tr>
<tr>
<td width="200" align="right" valign="middle">
<input type="image" src="Pix/qt5.jpg" width="96" height="30" name="typ5">
</td >
<td align="center" valign="middle">
<font size="4">
No of Questions to generate:amp;nbsp;amp;nbsp;
<select id="numT05">
<option value="0" selected="selected">0</option>
<option value="5">5</option>
<option value="10">10</option>
<option value="20">20</option>
<option value="50">50</option>
</select>
</font>
</td>
</tr>
<tr><td></td></tr>
<tr>
<td width="200" align="right" valign="middle">
<input type="image" src="Pix/qt6.jpg" width="96" height="30" name="typ6">
</td >
<td align="center" valign="middle">
<font size="4">
No of Questions to generate:amp;nbsp;amp;nbsp;
<select id="numT06">
<option value="0" selected="selected">0</option>
<option value="5">5</option>
<option value="10">10</option>
<option value="20">20</option>
<option value="50">50</option>
</select>
</font>
</td>
</tr>
<tr><td></td></tr>
<tr>
<td width="200" align="right" valign="middle">
<input type="image" src="Pix/qt7.jpg" width="96" height="30" name="typ7">
</td >
<td align="center" valign="middle">
<font size="4">
No of Questions to generate:amp;nbsp;amp;nbsp;
<select id="numT07">
<option value="0" selected="selected">0</option>
<option value="5">5</option>
<option value="10">10</option>
<option value="20">20</option>
<option value="50">50</option>
</select>
</font>
</td>
</tr>
<tr><td></td></tr>
<tr>
<td width="200" align="right" valign="middle">
<input type="image" src="Pix/qt8.jpg" width="96" height="30" name="typ8">
</td >
<td align="center" valign="middle">
<font size="4">
No of Questions to generate:amp;nbsp;amp;nbsp;
<select id="numT08">
<option value="0" selected="selected">0</option>
<option value="5">5</option>
<option value="10">10</option>
<option value="20">20</option>
<option value="50">50</option>
</select>
</font>
</td>
</tr>
</table>
<br><br>
<table align="center">
<tr>
<td align="center" valign="middle">
<font size="4">
No of Questions to generate per page:amp;nbsp;amp;nbsp;
<select id="numQs_page">
<option value="5">5</option>
<option value="10">10</option>
<option value="20">20</option>
</select>
</font>
</td>
</tr>
<tr><td></td></tr>
<tr><td></td></tr>
<tr>
<td align="center" valign="middle">
<button onclick="ajaxFunction()">
<img src="Pix/genQs.jpg" width= "252" height="50" />
</button>
</td>
</tr>
</table>
</form>
<div id="question"></div>
</body>
И вот мой код сервлета:
package com.p6qgen;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//import org.apache.velocity.runtime.log.Log;
/**
* Servlet implementation class QGenerator
*/
@WebServlet("/QGenerator")
public class QGenerator extends HttpServlet {
private static final long serialVersionUID = 1L;
DBAccess dbAccess;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//int num1, num2, num3, num4, num5, num6, num7, num8, total_qs;
/**
* @see HttpServlet#HttpServlet()
*/
public QGenerator() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/xml");
response.setHeader("Access-Control-Allow-Origin", "*");
try {
dbAccess = new DBAccess();
conn = dbAccess.getConnection();
stmt = conn.createStatement();
dbAccess.clearTable(conn, "T_Temp");
dbAccess.clearTable(conn, "T_Question");
//int num1 = 5;
int num1 = Integer.parseInt(request.getParameter("num1"));
int num2 = Integer.parseInt(request.getParameter("num2"));
int num3 = Integer.parseInt(request.getParameter("num3"));
int num4 = Integer.parseInt(request.getParameter("num4"));
int num5 = Integer.parseInt(request.getParameter("num5"));
int num6 = Integer.parseInt(request.getParameter("num6"));
int num7 = Integer.parseInt(request.getParameter("num7"));
int num8 = Integer.parseInt(request.getParameter("num8"));
int total_qs = num1 num2 num3 num4 num5 num6 num7 num8;
System.out.println(total_qs);
System.out.println("num1: " num1);
int tbl_cnt = 0; // to count the solution tables created
// Generating the question
do {
if(num1!=0) {
T_Q01 q01 = new T_Q01();
q01.generateQuestion();
tbl_cnt ;
String tbl_name = "T_S" tbl_cnt;
dbAccess.dropTable(conn, tbl_name); // delete table if existed
dbAccess.createTable(conn, tbl_name); // created a new table
q01.generateSol();
num1--;
total_qs--;
}
if(num2!=0) {
T_Q02 q02 = new T_Q02();
q02.generateQuestion();
tbl_cnt ;
String tbl_name = "T_S" tbl_cnt;
dbAccess.dropTable(conn, tbl_name); // delete table if existed
dbAccess.createTable(conn, tbl_name); // created a new table
q02.generateSol();
num2--;
total_qs--;
}
if(num3!=0) {
T_Q03 q03 = new T_Q03();
q03.generateQuestion();
tbl_cnt ;
String tbl_name = "T_S" tbl_cnt;
dbAccess.dropTable(conn, tbl_name); // delete table if existed
dbAccess.createTable(conn, tbl_name); // created a new table
q03.generateSol();
num3--;
total_qs--;
}
if(num4!=0) {
T_Q04 q04 = new T_Q04();
q04.generateQuestion();
tbl_cnt ;
String tbl_name = "T_S" tbl_cnt;
dbAccess.dropTable(conn, tbl_name); // delete table if existed
dbAccess.createTable(conn, tbl_name); // created a new table
q04.generateSol();
num4--;
total_qs--;
}
if(num5!=0) {
T_Q05 q05 = new T_Q05();
q05.generateQuestion();
tbl_cnt ;
String tbl_name = "T_S" tbl_cnt;
dbAccess.dropTable(conn, tbl_name); // delete table if existed
dbAccess.createTable(conn, tbl_name); // created a new table
q05.generateSol();
num5--;
total_qs--;
}
if(num6!=0) {
T_Q06 q06 = new T_Q06();
q06.generateQuestion();
tbl_cnt ;
String tbl_name = "T_S" tbl_cnt;
dbAccess.dropTable(conn, tbl_name); // delete table if existed
dbAccess.createTable(conn, tbl_name); // created a new table
q06.generateSol();
num6--;
total_qs--;
}
if(num7!=0) {
T_Q07 q07 = new T_Q07();
q07.generateQuestion();
tbl_cnt ;
String tbl_name = "T_S" tbl_cnt;
dbAccess.dropTable(conn, tbl_name); // delete table if existed
dbAccess.createTable(conn, tbl_name); // created a new table
q07.generateSol();
num7--;
total_qs--;
}
if(num8!=0) {
T_Q08 q08 = new T_Q08();
q08.generateQuestion();
tbl_cnt ;
String tbl_name = "T_S" tbl_cnt;
dbAccess.dropTable(conn, tbl_name); // delete table if existed
dbAccess.createTable(conn, tbl_name); // created a new table
q08.generateSol();
num8--;
total_qs--;
}
} while (total_qs > 0);
// Counting total number of questions in T_Question table
int row = dbAccess.countRow(conn, "Q_ID", "T_Question");
response.getOutputStream().println("<?xml version="1.0"?>");
response.getOutputStream().println("<qpage>");
response.getOutputStream().println("<numqs>");
response.getOutputStream().println(row);
response.getOutputStream().println("</numqs>");
for(int i=0; i<row; i ) {
int q_id = i 1;
response.getOutputStream().println("<number>");
response.getOutputStream().println(q_id ".");
response.getOutputStream().println("</number>");
response.getOutputStream().println("<question>");
String q_val = dbAccess.selectValue(conn, "Q_Val", "T_Question", "Q_ID", q_id);
response.getOutputStream().println(q_val);
response.getOutputStream().println("</question>");
}
response.getOutputStream().println("</qpage>");
response.getOutputStream().flush();
response.getOutputStream().close();
stmt.close();
conn.close();
} catch(SQLException e) {
System.err.println("-----SQLException-----");
System.err.println("doGet Error: " e.getSQLState());
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
Извините за публикацию очень длинного кода, но я думаю, что это может дать хорошую информацию для анализа моей проблемы.
Как указано в сообщении «Ответ сервлета на запрос AJAX пуст», я уже пытался включить:
response.setHeader("Access-Control-Allow-Origin", "*");
Но это все равно не решает проблему.
Пожалуйста, пожалуйста, совет.
Ответ №1:
Похоже, эта статья подходит для вашей проблемы. Вам придется отменить поведение вашей кнопки «отправить» по умолчанию. У тега button есть атрибут type
, который будет «submit», если он не определен. Итак, у вас есть два варианта:
- Измените вашу кнопку на
<button type="button" onclick="...">...</button>
- Добавьте
return false;
послеajaxReq.send(null);
Также есть ошибка в вашей parseXml
-функции. getElementsByTagName(...)
возвращает список узлов, включающий все узлы. numqs
Поэтому значением numQs
будет узел xml, поэтому условие вашего for-цикла завершится с ошибкой. Вам нужно будет проанализировать nodeValue
NUMQS, прежде чем использовать его в цикле for.
var numQs = parseInt(ajaxReq.responseXML.getElementsByTagName("numqs")[0].nodeValue, 10);
for (var i = 0; i < numQs; i ) {
...
}
Комментарии:
1. спасибо, чувак! Это решило проблему, теперь я могу получить ответ о статусе «200». К сожалению, я не могу проголосовать, поскольку у меня нет 15 репутации. Кстати, зачем мне нужно добавлять ‘return false’?
2.
return false;
не позволит браузеру отправлять форму, которая была бы поведением кнопки отправки по умолчанию.3. Спасибо, john_doe, за объяснение.
4. Еще раз спасибо, что указали на ошибку в функции ‘parseXML’. Я исправлю это. Как новичок в веб-разработке, я всегда совершаю такого рода ошибки :).