То есть вы хотите сделать 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");
}
}
}