Как использовать сокет Java в tapestry5? - PullRequest
0 голосов
/ 28 мая 2010

Как реализовать сокет Java в tapestry5? Я хочу создать сокет, через который я могу отправить XmlHttpRequest с помощью фрагмента кода JavaScript.

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 ]

1 голос
/ 28 мая 2010

То есть вы хотите сделать AJAX-запрос с вашего клиентского кода на сервер, получить ответ и каким-то образом его обработать? Вам не понадобятся розетки. Вместо этого используйте встроенную функциональность AJAX в Tapestry.

Если вы загружаете дополнительный контент внутри своей страницы с помощью Javascript, скорее всего, вам вообще не потребуется писать какой-либо код. Обязательно прочитайте раздел 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 из обработчика событий.

Также, если вы хотите написать свой собственный код на стороне клиента, обязательно используйте встроенную кросс-браузерную AJAX-функциональность Prototype , которая поставляется с Tapestry.

Редактировать на основании комментария:

Вы не сможете получить доступ к другому серверу (хост + порт) через 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");
         }
     }
}
0 голосов
/ 28 мая 2010

XmlHttpRequest просто выполнит запрос веб-сервера, который может быть отлично обработан всем, что вы используете для запуска Tapestry. Нет необходимости открывать сокеты и прочее.

Просто определите маршрут в вашем приложении wep, чтобы принять XmlHttpRequest и иметь обработчик, сервлет, контроллер, ... собрать необходимые данные, преобразовать их в xml и отправить в компонент Javascript.

Я нашел пример здесь

0 голосов
/ 28 мая 2010

Использование Sockets не зависит от вашей среды представления веб-приложения - вы бы сделали это почти одинаково, независимо от того, как закодировано представление. Единственное, что изменится, это то, как вы реализовали свой код, который использует сокеты, это то, как он вызывается.

Я использовал гобелен с пружиной, поэтому внедрение служб в контекст весны - самый естественный подход.

Подпакет services в гобелене в основном предназначен для создания реализаций, включающих в себя гобелен, таких как кодировщики, каналы свойств и фабрики связывания. Так что, используете ли вы это или нет, зависит от того, чего вы пытаетесь достичь.

Например, если вы создаете компонент, который читает из сокета и отображает прочитанные данные, вы можете создать его как обычный компонент в подпакете components.

...