您好,我尝试在 Jetty 上运行一个 java 服务器,它应该响应 ajax 调用。不幸的是,当我用 ajax 调用它时,响应似乎是空的。当我调用 http://localhost:8081/?id=something我得到了答案。
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>
我实际上不知道我在这里做错了什么。也许有人有好主意。
问候克里斯
最佳答案
您可能正在从磁盘读取 HTML 文件,即使用“file:///”URL。 Web 浏览器只允许 XmlHttpRequests 到页面来自的主机,这就是您的请求不起作用的原因。
我学习了嵌入式 Jetty 教程并修改了您的代码:
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>
这些是我对您的代码所做的更改:
- 我删除了不必要的东西(可能来自你的实验 ☺)
- 我向 Jetty 服务器添加了一个
ResourceHandler
,当 URL 上没有给出路径时,它会传送index.html
文件 - 我更改了 Javascript 部分中的请求 URL,以便请求转到
Answer
处理程序 - 我在
callback
函数中取消引用消息处理,因此会显示应答消息的内容(由于硬编码的 GET-URL 参数,总是fd
)
将 index.html 放入您的基本工作目录并再次运行 Answer 类——当您将浏览器指向 http://localhost:8081/ 时事情应该按照您的意愿进行。首先 Jetty 将 index.html 传递给浏览器,然后浏览器发出 XHR GET 请求并在成功时将“hannak”替换为“fd”。
喂!
关于java - Jetty servlet 对 Ajax 的响应总是空的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2817470/