如何在tapestry5中使用java套接字?

时间:2010-05-27 23:09:34

标签: java eclipse sockets service tapestry

如何在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是我刚刚创建的套接字。

3 个答案:

答案 0 :(得分:1)

所以你想从你的客户端代码到服务器做一个AJAX请求,接收响应并以某种方式处理它?你不需要套接字。相反,使用Tapestry的内置AJAX功能。

如果您通过Javascript在页面中加载其他内容,则可能根本不需要编写任何代码。请务必阅读AJAX section from the Tapestry docs,了解区域是什么以及它是如何工作的。

这是一个基本的例子。模板:

<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将完成其他所有工作,例如在链接上注册正确的事件侦听器并在适当的位置插入更新的内容。对于未启用JavaScript的客户,if (this.request.isXHR())会确保您的网页为degrade gracefully

如果您想完全执行其他操作,例如返回JSON对象并使用您自己的JavaScript代码处理它,则可以从事件处理程序返回任何these JSON classes

此外,如果您想编写自己的客户端代码,请务必使用Tapestry附带的内置跨浏览器AJAX functionality of Prototype

根据评论进行修改:

由于same origin policy,您将无法通过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");
         }
     }
}

答案 1 :(得分:0)

套接字的使用独立于您的webapp视图框架 - 无论视图的编码方式如何,您都可以采用相同的方式。唯一改变的是,一旦你实现了使用套接字的代码,就会调用它。

我使用带有弹簧的挂毯,因此在弹簧环境中注入服务是最自然的方法。

tapestry中的services子包主要用于创建插入tapestry的实现,如编码器,属性管道和绑定工厂。所以你是否使用这个取决于你想要实现的目标。

例如,如果要创建从套接字读取的组件,并将数据读入,则可以在components子包中将其创建为常规组件。

答案 2 :(得分:0)

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

只需在wep应用程序中定义一个接受XmlHttpRequest的路由,并拥有一个处理程序,servlet,controller,...收集必要的数据,将其转换为xml并将其发送到Javascript组件。

我找到了一个例子here