2010-05-12 74 views
1

嗨我嘗試在Jetty上運行一個應該響應ajax調用的java服務器。不幸的是,當我用ajax調用它時,響應似乎是空的。當我打電話給http://localhost:8081/?id=something時,我得到一個答案。Jetty Servlet對Ajax的響應總是爲空

Java服務器:

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 2010-05-12 09:33:46

+0

什麼是'服務器'? – Bozho 2010-05-12 09:34:11

+0

我使用螢火蟲,在那裏我看到答案是空的。獲取響應的編號爲200,因爲我這樣設置,至少螢火蟲能夠識別。在Javascript中,我仍然有req.status = 0 服務器是org.eclipse.jetty.server ......這裏是進口: import javax.servlet.http.HttpServletRequest; import 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 2010-05-12 10:07:40

回答

4

你可能會從磁盤讀取HTML文件,即用「文件:///」 URL。 Web瀏覽器只允許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> 

這些都是我的變化到您的代碼:

  • 我刪除不必要的東西(可能是從你的實驗☺)
  • 我添加了一個ResourceHandler到送出時未指定路徑的URL
  • 我在JavaScript中更改請求URL中index.html文件Jetty服務器部分因此請求轉到Answer處理
  • 我未引述消息中的callback功能處理,所以得到顯示的應答消息的內容(總fd由於硬編碼GET-URL參數)

index.html放在您的基本工作目錄中,然後再次運行Answer類 - 當您將瀏覽器指向http://localhost:8081/時,應該按照您的要求工作。 First Jetty將index.html提供給瀏覽器,然後瀏覽器發出XHR GET請求,並在成功用「fd」替換「hannak」。

HTH!