저는 Ajax, javascript 및 html을 배우고 있으며 "get"요청 후에 또 다른 "get"요청이 발생하는 응용 프로그램을 가지고 있습니다. 이러한 요청은 사용자가 버튼을 누를 때 발생하는 결과입니다. 내 서블릿에서 나는 TimeUnit.SECONDS.sleep (10)을 사용하여 양조되는 커피 주문을 시뮬레이션한다.Http Get 요청은 이전 Get 요청을 중단합니다.
두 번째 "요청"요청이 전송되면 (10 초가 경과하기 전에) 첫 번째 요청이 중단됩니다 (Firefox와 Chrome에서 모두). 나는 연구를 해왔지만 왜 그 이유에 대해 충분한 대답을 찾지 못했습니다.
누구든지이 문제에 대해 알려주시겠습니까? 미리 감사드립니다. 여기
내 HTML은
...<html>
<head>
<title>Ajax-powered Coffee Maker</title>
<link rel="stylesheet" type="text/css" href="coffee.css" />
<script type="text/javascript" src="ajax.js"> </script>
<script type="text/javascript" src="coffee.js"> </script>
<script type="text/javascript" src="text-utils.js"> </script>
</head>
<body>
<div id="header">
<h1>Ajax-powered Coffee Maker</h1>
</div>
<div id="wrapper">
<div id="coffeemaker1">
<h2>Coffee Maker #1</h2>
<p><img src="images/CoffeeMaker1.gif" alt="Coffee Maker #1" /></p>
<div id="coffeemaker1-status">Idle</div>
</div>
<div id="coffeeorder">
<p><img src="images/coffeeMugWithBeans.jpg" alt="Coffee Pot 1" /></p>
<h2>Place your coffee order here:</h2>
<div id="controls1">
<form>
<p>Name: <input type="text" name="name" id="name" /></p>
<h3>Size</h3>
<p>
<input type="radio" name="size"
value="small" checked>Small</input>
<input type="radio" name="size"
value="medium">Medium</input>
<input type="radio" name="size"
value="large">Large</input>
</p>
<h3>Beverage</h3>
<p>
<input type="radio" name="beverage"
value="mocha" checked>Mocha</input>
<input type="radio" name="beverage"
value="latte">Latte</input>
<input type="radio" name="beverage"
value="cappucino">Cappucino</input>
</p>
<p>
<input type="button"
onClick="orderCoffee();"
value="Order Coffee" />
</p>
</form>
</div>
</div>
<div id="coffeemaker2">
<h2>Coffee Maker #2</h2>
<p><img src="images/CoffeeMaker2.gif" alt="Coffee Maker #2" /></p>
<div id="coffeemaker2-status">Idle</div>
</div>
<p id="clear"></p>
</div>
</body>
</html>
내 자바 스크립트 ...
var request;
try {
request = new XMLHttpRequest(); // Most browsers will do this
} catch (trymicrosoft) {
try {
request = new ActiveXObject("Msxm12.XMLHTTP"); // Internet Explorer
// does this
} catch (othermicrosoft) {
try {
request = new ActiveXObject("Microsoft.XMLHTTP"); // And this
// sometimes
} catch (failed) {
request = null;
}
}
}
if (request == null) {
alert("Error Creating Request Object!");
} else {
alert("Request Object created!");
}
function getBeverage() {
var beverageGroup = document.forms[0].beverage;
for (var i = 0; i < beverageGroup.length; i++) {
if (beverageGroup[i].checked == true) {
return beverageGroup[i].value;
}
}
}
function getSize() {
var sizeGroup = document.forms[0].size;
for (var i = 0; i < sizeGroup.length; i++) {
if (sizeGroup[i].checked == true) {
return sizeGroup[i].value;
}
}
}
function serveDrink() {
var reply = request.responseText;
console.log("reply: " + reply);
}
function orderCoffee() {
console.log("ordering coffee");
var name = document.getElementById("name").value;
var size = getSize();
var beverage = getBeverage();
var coffeemakerStatusDiv1 = document.getElementById("coffeemaker1-status");
var status = getText(coffeemakerStatusDiv1);
console.log("status1: " + status);
if (status == "Idle") {
replaceText(coffeemakerStatusDiv1, "Brewing " + name + "'s " + size + " " + beverage);
document.forms[0].reset();
var url = "coffee.do?name=" + escape(name) + "&size=" + escape(size)
+ "&beverage=" + escape(beverage) + "&coffeemaker=1";
sendRequest(url);
} else {
var coffeemakerStatusDiv2 = document.getElementById("coffeemaker2-status");
var status = getText(coffeemakerStatusDiv2);
console.log("status2: " + status);
if (status == "Idle") {
replaceText(coffeemakerStatusDiv2, "Brewing " + name + "'s " + size + " " + beverage);
document.forms[0].reset();
var url = "coffee.do?name=" + escape(name) + "&size=" + escape(size)
+ "&beverage=" + escape(beverage) + "&coffeemaker=2";
sendRequest(url);
} else {
console.log("y am i here?");
}
}
}
function sendRequest(url) {
request.onreadystatechange = serveDrink;
request.open("get", url, true);
request.send();
}
내 서블릿
...package com.asponte.controller;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
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 com.ibm.websphere.logging.WsLevel;
/**
* Servlet implementation class CoffeeController
*/
@WebServlet("/CoffeeController")
public class CoffeeController extends HttpServlet {
private static final long serialVersionUID = 1L;
private Logger s_log = Logger.getLogger("com.asponte.controller");
/**
* @see HttpServlet#HttpServlet()
*/
public CoffeeController() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
boolean isDebug = false;
if (s_log.isLoggable(WsLevel.ALL)) {
isDebug = true;
}
if (isDebug) {
s_log.entering("Coffee Servlet doGet()", "entering");
}
String name = request.getParameter("name");
String size = request.getParameter("size");
String beverage = request.getParameter("beverage");
String maker = request.getParameter("coffeemaker");
System.out.println("name: " + name);
System.out.println("size: " + size);
System.out.println("beverage: " + beverage);
System.out.println("maker: " + maker);
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String toReturn;
if (maker.equals("1")) {
toReturn = "1";
} else if (maker.equals("2")){
toReturn = "2";
} else {
toReturn = "doggit";
}
response.getWriter().write(toReturn);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
요청이 서블릿으로 전송 될 때마다 새 스레드가 해당 요청에 대해 생성 될 것이라는 가정하에있었습니다. 또는 새로운 스레드를 생성하는 다른 클라이언트의 요청 일뿐입니다? – mitchj
응용 프로그램 또는 웹 서버에서 관리합니다. 각 요청을 처리 할 수있는 스레드 풀을 포함하며 다시 사용할 수 있습니다. 1의 풀이 가능하지만 매우 가능성이 낮고 매우 나쁜 결정 일 수 있습니다. 풀 크기를 조정하려면 공급 업체 특정 문서를 살펴야하지만 기본 설정에는 일반적으로 1을 초과하므로 사용자의 문서가 1로 설정되어 있는지 의심 스럽습니다. –