0

如何在 Tapestry5 中实现 Java 套接字?我想要做的是创建一个套接字,我可以通过一段 javascript 代码发送一个 XmlHttpRequest。

function sendPost(url, postdata, callback) {

 xmlHttp=GetXmlHttpObject()

 if (xmlHttp==null) {
  alert ("Browser does not support HTTP Request")
  return
 } 

 xmlHttp.onreadystatechange=callback
 xmlHttp.open("POST",url,true)
 xmlHttp.send(postdata);

}

URL 是我刚刚创建的套接字。

4

3 回答 3

1

因此,您想从客户端代码向服务器发出 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");
         }
     }
}
于 2010-05-28T07:14:55.377 回答
0

XmlHttpRequest 只会执行一个 Web 服务器请求,无论您使用什么来运行 Tapestry 都可以很好地处理该请求。无需打开套接字和其他东西。

只需在您的 wep 应用程序中定义一个路由以接受 XmlHttpRequest 并让处理程序、servlet、控制器……收集必要的数据,将其转换为 xml 并将其发送到 Javascript 组件。

我在这里找到了一个例子

于 2010-05-27T23:46:23.967 回答
0

Sockets 的使用独立于你的 webapp 视图框架——不管视图是如何编码的,你都会以几乎相同的方式来做。唯一改变的是,一旦你实现了使用套接字的代码,它是如何被调用的。

我在 spring 中使用了 Tapestry,因此将服务注入到 spring 上下文中是最自然的方法。

Tapestry 中的services子包主要用于创建插入 Tapestry 的实现,例如编码器、属性管道和绑定工厂。因此,您是否使用它取决于您要达到的目标。

例如,如果您正在创建一个从套接字读取并呈现读取的数据的组件,那么您可以在components子包中将其创建为常规组件。

于 2010-05-27T23:14:57.043 回答