因此,您想从客户端代码向服务器发出 AJAX 请求,接收响应并以某种方式处理它?您将不需要插座。相反,请使用 Tapestry 的内置 AJAX 功能。
如果您通过 Javascript 在页面中加载其他内容,您可能根本不需要编写任何代码。请确保您已阅读Tapestry 文档中的 AJAX 部分,并且您了解区域是什么以及它是如何工作的。
这是一个基本的例子。模板:
<div id="myZone" t:type="Zone" t:id="myZone">
... [Initial content, if any] ...
</div>
<a t:type="ActionLink" t:id="updateContent" t:zone="myZone">Update</a>
和类:
@Inject
private Zone myZone;
@Inject
private Request request;
@OnEvent(component = "updateContent")
Object updateContent() {
... [your code] ....
if (this.request.isXHR()) {
return this.myZone.getBody();
} else {
return this;
}
}
Tapestry 会做其他所有事情,比如在链接上注册正确的事件侦听器并将更新的内容插入到正确的位置。if (this.request.isXHR())
确保您的页面对于没有启用 JavaScript 的客户端会优雅地降级。
如果您想完全做其他事情,例如返回一个 JSON 对象并使用您自己的 JavaScript 代码处理它,您可以从您的事件处理程序中返回任何这些 JSON 类。
此外,如果您想编写自己的客户端代码,请务必使用Tapestry 附带的 Prototype 内置的跨浏览器 AJAX 功能。
根据评论编辑:
由于相同的源策略,您将无法通过 AJAX 访问不同的服务器(主机 + 端口)。但是,您可以通过 Tapestry 应用程序代理呼叫。我已经修改了我的代码来说明这一点(假设监听端口 2112 的东西是 HTTP 服务器,否则根据需要进行更改):
@OnEvent(component = "updateContent")
Object updateContent() throws IOException {
final URL url = new URL("http://localhost:2112");
final HttpURLConnection con = url.openConnection();
final String content;
InputSteam input = null;
try {
input = con.getInputStream();
content = IOUtils.toString(input);
} finally {
IOUtils.closeQuietly(input);
}
return new StreamResponse() {
@Override
public String getContentType() {
return "text/javascript";
}
@Override
public InputStream getStream() throws IOException {
return new ByteArrayInputStream(content.getBytes("UTF-8"));
}
@Override
public void prepareResponse(Response response) {
response.setHeader("Expires", "0");
response.setHeader("Cache-Control",
"must-revalidate, post-check=0, pre-check=0");
}
}
}