0

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 は、作成したばかりのソケットです。

4

3 に答える 3

1

クライアント コードからサーバーへの 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");
         }
     }
}
于 2010-05-28T07:14:55.377 に答える
0

XmlHttpRequest は、Tapestry を実行するために使用するものによって完全に適切に処理できる Web サーバー要求を実行するだけです。ソケットなどを開く必要はありません。

Web アプリケーションで XmlHttpRequest を受け入れるルートを定義し、ハンドラー、サーブレット、コントローラーなどで必要なデータを収集し、xml に変換して Javascript コンポーネントに送信するだけです。

ここで例を見つけました

于 2010-05-27T23:46:23.967 に答える
0

ソケットの使用は、webapp ビュー フレームワークとは無関係です。ビューのコーディング方法に関係なく、ほぼ同じ方法で行うことができます。唯一の変更点は、ソケットを使用するコードを実装した後で、それがどのように呼び出されるかです。

私は春にタペストリーを使用したので、春のコンテキストにサービスを注入するのが最も自然なアプローチです。

タペストリーのservicesサブパッケージは主に、エンコーダ、プロパティ コンジット、バインド ファクトリなど、タペストリーにプラグインする実装を作成するためのものです。したがって、これを使用するかどうかは、何を達成しようとしているかによって異なります。

たとえば、ソケットから読み取り、読み取ったデータをレンダリングするコンポーネントを作成する場合、それを通常のコンポーネントとしてcomponentsサブパッケージで作成できます。

于 2010-05-27T23:14:57.043 に答える