Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在tapestry5中使用java套接字?_Java_Eclipse_Sockets_Service_Tapestry - Fatal编程技术网

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

如何在tapestry5中使用java套接字?,java,eclipse,sockets,service,tapestry,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.onrea

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

套接字的使用与您的webapp视图框架无关-无论视图是如何编码的,您都可以使用几乎相同的方法。唯一需要改变的是,一旦您实现了使用套接字的代码,它将如何被调用

我将tapestry与spring一起使用,因此将服务注入spring上下文是最自然的方法

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


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

XmlHttpRequest将只执行一个web服务器请求,无论您使用什么来运行Tapestry,都可以很好地处理该请求。不需要打开插座之类的东西

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


我发现了一个例子,所以您想从客户端代码向服务器发送一个AJAX请求,接收一个响应并以某种方式处理它?您不需要插座。相反,使用Tapestry的内置AJAX功能

如果您正在通过Javascript在页面中加载其他内容,那么很可能根本不需要编写任何代码。确保您已经阅读了,并且了解了分区是什么以及它是如何工作的

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

<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>
Tapestry将完成其他所有工作,比如在链接上注册适当的事件侦听器,并在适当的位置插入更新的内容。
if(this.request.isXHR())
确保您的页面在没有启用JavaScript的情况下为客户端打开

如果您想完全执行其他操作,比如返回JSON对象并使用自己的JavaScript代码处理它,那么您可以从事件处理程序返回任意一个JSON对象

此外,如果您想编写自己的客户端代码,请确保使用Tapestry附带的内置跨浏览器

根据评论进行编辑:

您将无法通过AJAX访问其他服务器(主机+端口),原因是。但是,您可以通过Tapestry应用程序代理调用。我修改了代码来说明这一点(假设在端口2112上侦听的是HTTP服务器,否则根据需要进行更改):


你能解释一下你想要实现的目标吗?我想做的是创建一个套接字,我可以通过一段javascript代码向它发送XmlHttpRequest。如下函数sendPost(url,postdata,callback){xmlHttp.open(“POST”,MYSOCKET,true);xmlHttp.send(postdata);}其中MYSOCKET是我创建的java套接字!任何帮助都会很好!是否要从用户的浏览器中打开套接字?你的问题不清楚。您可以实现自己的组件—您可以在该空间中渲染任何内容,包括javascript。有关如何创建输出javascript的tapestry组件的信息,请参阅。很抱歉,我可能没有正确表达我的问题。@Henning:再次感谢您的帮助。你帮我回答了前面的一个问题--我有一个javascript混合,当文本字段获得焦点时运行。javascript mixin应该向一个jar发送请求,该jar监听一个端口,该端口返回XHR响应,这些响应被解码并绘制到页面上的HTML画布元素上。需要大量的请求和响应!。我应该使用内置AJAX支持的tapestrys吗?@shane:那么你想从另一台服务器轮询数据并显示它?恐怕这行不通,您只能从相同的域和端口请求(请参阅)。如果必须访问第二台web服务器,则必须在服务器端执行,即让Tapestry应用程序发出请求并将其转发给客户端。@Henning:我有一个jar,当我运行它时,它会坐在端口2112上侦听重新访问。我想打开一个到那个jar的套接字连接,以发送XHR请求。然后jar用一个XHR响应进行响应,我的javascript将解码该响应并绘制到HTML画布元素上!。对不起,我可能没有很好地表达我的问题。希望这能让它更清楚一点@亨宁:端口2112上侦听的东西/jar是一个服务器套接字。这就是为什么我想创建一个clientSocket,它转发来自我的javascript片段的信息,这是我的应用程序工作所必需的。所以我不认为同源策略有问题。@Shane:Javascript中没有原始套接字,您必须在HTTP上工作。(您之前表示要使用XmlHttpRequests…?)。此外,localhost:2112与localhost:8080或应用服务器使用的任何应用程序都算作不同的源代码,因此恐怕存在相同的源代码问题。使用XHRs从客户端访问应用程序,并在那里执行套接字操作是您的最佳选择。
@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;
     }
}
@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");
         }
     }
}