2010-05-12 77 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!