2014-09-28 4 views
0

저는 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> 
     &nbsp;&nbsp; 
     <input type="radio" name="size" 
       value="medium">Medium</input> 
     &nbsp;&nbsp; 
     <input type="radio" name="size" 
       value="large">Large</input> 
     </p> 
     <h3>Beverage</h3> 
     <p> 
     <input type="radio" name="beverage" 
       value="mocha" checked>Mocha</input> 
     &nbsp;&nbsp; 
     <input type="radio" name="beverage" 
       value="latte">Latte</input> 
     &nbsp;&nbsp; 
     <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 
    } 

} 

답변

0

아마도이 때문에 서버입니다 모든 도착한 요청에 대해 단 하나의 스레드 만 사용합니다.

+0

요청이 서블릿으로 전송 될 때마다 새 스레드가 해당 요청에 대해 생성 될 것이라는 가정하에있었습니다. 또는 새로운 스레드를 생성하는 다른 클라이언트의 요청 일뿐입니다? – mitchj

+0

응용 프로그램 또는 웹 서버에서 관리합니다. 각 요청을 처리 할 수있는 스레드 풀을 포함하며 다시 사용할 수 있습니다. 1의 풀이 가능하지만 매우 가능성이 낮고 매우 나쁜 결정 일 수 있습니다. 풀 크기를 조정하려면 공급 업체 특정 문서를 살펴야하지만 기본 설정에는 일반적으로 1을 초과하므로 사용자의 문서가 1로 설정되어 있는지 의심 스럽습니다. –

0

각 HTTP 요청에 자체 요청 개체가 필요하다는 것을 알았습니다. 필요한 변경을 한 후 각 요청이 실제로 자체 요청 객체를 갖도록 예상 된대로 작동했습니다.

관련 문제