2010-05-12 3 views
1

안녕하세요 저는 아약스 호출에 응답해야하는 Jetty에서 Java 서버를 실행하려고합니다. 불행히도 응답은 아약스로 호출 할 때 비어있는 것 같습니다. 내가 http://localhost:8081/?id=something라고 전화하면 나는 대답을 얻는다.Ajax에 대한 제티 서블릿 응답은 항상 비어 있습니다.

자바 서버 :

public class Answer extends AbstractHandler 
{ 
    public void handle(String target, 
         Request baseRequest, 
         HttpServletRequest request, 
         HttpServletResponse response) 
     throws IOException, ServletException 
    { 
     String id = request.getParameter("id"); 
     response.setContentType("text/xml"); 
     response.setHeader("Cache-Control", "no-cache"); 

     response.setContentLength(19+id.length()); 
     response.setStatus(HttpServletResponse.SC_OK); 
     response.getWriter().write("<message>"+id+"</message>"); 
     //response.setContentType("text/html;charset=utf-8"); 

     response.flushBuffer(); 
     baseRequest.setHandled(true); 
    } 

    public static void main(String[] args) throws Exception 
    { 
     Server server = new Server(8081); 
     server.setHandler(new Answer()); 

     server.start(); 
     server.join(); 
    } 
} 

JS 및 HTML :

<html> 
<head> 
<script> 
var req; 

function validate() { 
    var idField = document.getElementById("userid"); 
    var url = "validate?id=" + encodeURIComponent(idField.value); 
    if (typeof XMLHttpRequest != "undefined") { 
     req = new XMLHttpRequest(); 
    } else if (window.ActiveXObject) { 
     req = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    req.open("GET", "http://localhost:8081?id=fd", true); 
    req.onreadystatechange = callback; 
    req.send(null); 
} 


function callback() { 
    if (req.readyState == 4) { 
     if (req.status == 200) { 
      var message = req.responseXML.getElementsByTagName("message")[0]; 
      document.getElementById("userid").innerHTML = "message.childNodes[0].nodeValue"; 
     } 
    } 
} 

</script> 
</head> 
<body onload="validate('foobar')"> 
<div id="userid">hannak</div> 
</body> 
</html> 

실제로 해요 내가 잘못 여기서 뭘하는지 모르겠어요. 아마 누군가는 좋은 생각을 가지고있을 것입니다.

인사 크리스

+0

FireBug (Firefox Addon)를 사용하여 서버에서 Ajax 요청과 응답을 디버깅 할 수 있습니다. – ZeissS

+0

'서버'란 무엇입니까? – Bozho

+0

나는 방화 광을 사용하며, 그 대답은 비어 있음을 알았다. Get 응답은 숫자 200을 가지고 있는데, 적어도 그것을 설정했기 때문에, 적어도 방화범이 그것을 인식합니다. 자바 스크립트에서 나는 여전히 req.status = 0을 가지고 있습니다. 서버는 org.eclipse.jetty.server입니다. 다음은 가져 오기입니다 : import javax.servlet.http.HttpServletRequest; 가져 오기 javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import java.io.IOException; import org.eclipse.jetty.server.섬기는 사람; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.handler.AbstractHandler; – chris

답변

4

당신은 아마로 즉 디스크에서 HTML 파일을 읽고 "파일 : ///"URL. 웹 브라우저는 페이지가있는 호스트에서만 XmlHttpRequests를 허용하므로 요청이 작동하지 않습니다.

내가 포함 된 부두 자습서를 가져다 코드 수정 :

Answer.java :

package test; 

import java.io.IOException; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.eclipse.jetty.server.Handler; 
import org.eclipse.jetty.server.Request; 
import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.server.handler.AbstractHandler; 
import org.eclipse.jetty.server.handler.HandlerList; 
import org.eclipse.jetty.server.handler.ResourceHandler; 

public class Answer extends AbstractHandler { 
    public void handle(String target, Request baseRequest, HttpServletRequest request, 
     HttpServletResponse response) throws IOException, ServletException { 
    String id = request.getParameter("id"); 
    response.setContentType("text/xml"); 
    response.setHeader("Cache-Control", "no-cache"); 
    response.setContentLength(19 + id.length()); 
    response.setStatus(HttpServletResponse.SC_OK); 
    response.getWriter().write("<message>" + id + "</message>"); 
    response.flushBuffer(); 
    baseRequest.setHandled(true); 
    } 

    public static void main(String[] args) throws Exception { 
    Server server = new Server(8081); 

    ResourceHandler resource_handler = new ResourceHandler(); 
    resource_handler.setDirectoriesListed(true); 
    resource_handler.setWelcomeFiles(new String[] { "index.html" }); 
    resource_handler.setResourceBase("."); 

    HandlerList handlers = new HandlerList(); 
    handlers.setHandlers(new Handler[] { resource_handler, new Answer() }); 

    server.setHandler(handlers); 
    server.start(); 
    server.join(); 
    } 
} 

그리고 index.html을을 :

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"/> 
    <title>AJAX Test</title> 
    <script type="text/javascript"> 
     var req; 

     function validate() { 
     if (typeof XMLHttpRequest != "undefined") { 
      req = new XMLHttpRequest(); 
     } else if (window.ActiveXObject) { 
      req = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     req.open("GET", "http://localhost:8081/SomeResourceThatDoesntExistSoOurTestHandlerGetsCalled?id=fd", true); 
     req.onreadystatechange = callback; 
     req.send(null); 
     } 

     function callback() { 
     if (req.readyState == 4 && req.status == 200) { 
      var message = req.responseXML.getElementsByTagName("message")[0]; 
      document.getElementById("userid").innerHTML = message.childNodes[0].nodeValue; 
     } 
     } 
    </script> 
    </head> 
    <body onload="validate()"> 
    <div id="userid">hannak</div> 
    </body> 
</html> 

이 내 변경 사항은 코드 :

  • 나는
  • 내가 경로가 내가 자바 스크립트에서 요청 URL을 변경
  • 의 URL에 주어지지하는 index.html 파일을 제공하는 부두 서버에 ResourceHandler 추가 (아마도 ☺ 실험에서) 불필요한 물건을 제거 일부 요청은 Answer 핸들러 (때문에 하드 GET-URL-매개 변수에 항상 fd을)를 callback 함수에서 메시지 처리를 유엔 인용, 그래서 응답 메시지의 내용이 표시 얻을 I
로 이동 있도록

기본 작업 디렉토리에 index.html을 입력하고 Answer 클래스를 다시 실행하십시오. 브라우저를 http://localhost:8081/으로 지정하면 원하는대로 작동합니다. First Jetty는 index.html을 브라우저에 전달하고 브라우저는 XHR GET 요청을하고 성공하면 "hannak"을 "fd"로 바꿉니다.

HTH!