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

标签 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 是我刚刚创建的套接字。

最佳答案

所以您想从客户端代码向服务器发出 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>

和类(class):

@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()) 确保您的页面将degrade gracefully适用于未启用 JavaScript 的客户端。

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

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

根据评论进行编辑:

由于 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");
         }
     }
}

关于java - 如何在tapestry5中使用java套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2925657/

相关文章:

java - 如何在 Android 上解锁 InputStream.read()?

java - 为哈希选择合适的表大小

java - 将 HashSet<T> 中的所有项添加到 Map<String,T>

java - 使用 Jackson 将 GeoJSON 映射到 Java

java - 如何在我自己的插件中访问常规 Eclipse 首选项

node.js - 网络服务器如何处理同一端口上的多个连接

java - 我不确定如何修复此代码。第一部分是一个循环(需要是第一部分),我不知道如何关闭它

java - Eclipse 不一致 : Resource leak: '<unassigned Closeable value>' is never closed

java - 参数 [frmStartupGame] 的修饰符非法;只允许最终的

java 如何指定程序应连接的正确IP地址