クライアント コードからサーバーへの AJAX 要求を実行し、応答を受信して何らかの方法で処理したいですか? ソケットは必要ありません。代わりに、Tapestry に組み込まれている AJAX 機能を使用してください。
JavaScript を使用してページ内に追加のコンテンツをロードする場合、コードをまったく記述する必要がない可能性があります。Tapestry docs の 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 は、適切なイベント リスナーをリンクに登録し、更新されたコンテンツを適切な場所に挿入するなど、他のすべてを行います。これにより、 JavaScript が有効になっていないクライアントに対してif (this.request.isXHR())
、ページが正常に機能しなくなります。
JSON オブジェクトを返し、それを独自の JavaScript コードで処理するなど、まったく別のことをしたい場合は、イベント ハンドラーからこれらの JSON クラスのいずれかを返すことができます。
また、独自のクライアント側コードを作成する場合は、Tapestry に同梱されているPrototypeの組み込みのクロスブラウザー AJAX 機能を必ず使用してください。
コメントに基づいて編集:
同じ起点ポリシーのため、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");
}
}
}