minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

Reverse Ajaxとは

Ajax とは、HTML内から動的にサーバ側にアクセスする機能です。

Reverse Ajax はその逆で、サーバ側からHTMLにアクセスする機能のことです。
HTTPでそんな事が可能なのかと疑問に思う方もいると思いますが
実際これが可能なのです。
詳しい実装方法などは他の記事に任せるとして、ここではその使い方について説明します。

ただし一つ覚えておいてほしいことは、この機能はWebリソース(具体的に言えばHTTP Session)を
著しく消費する可能性があるということです。
その為、一度に多くの人がアクセスするようなページで使うことはオススメできません。

DWRからReverse Ajaxを使う

DWRは2.0からReverse Ajaxに対応しました。
使い方は非常に簡単です。

web.xml

まず、web.xml に以下の記述を追加します。

<servlet>
  <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
  ...
  <init-param>
    <param-name>activeReverseAjaxEnabled</param-name>
    <param-value>true</param-value>
  </init-param>
</servlet>

HTML側の準備

Reverse Ajaxを使うページ(HTML)で以下の宣言(JavaScript)をする必要があります。

dwr.engine.setActiveReverseAjax(true);

当然、このページではDWRの共通JavaScriptである

<script src="dwr/engine.js"></script>
<script src="dwr/util.js"></script>

を記述しておく必要があります。

DWRの動作について

DWRの使い方 で説明したDWRの仕組みについてもう一度おさらいをしていみましょう。

HTML側でDWRの呼び出しが発生すると、サーバ側に処理が移ります。
サーバ処理の間、HTML側は待たされることはありません(非同期)。
サーバの処理が終わると、HTML側で定義したコールバック関数が呼ばれます。

ここでわかると思うのですが、Reverse Ajaxを使っていなくても
実はここで「サーバ→HTML」という通信が行われているのです。
そうでないと、HTML側では「いつサーバ側の処理が終わったのか」を認識できません。

Reverse Ajaxを使うと、サーバ側処理の途中でも随時HTML側に情報を送信できます。
これにより、例えばプログレスバーのような機能が実装できます。

サーバ側

さて、ではいよいよサーバ側でHTMLに情報を送信してみましょう。

WebContext wctx = WebContextFactory.get();
String currentPage = wctx.getCurrentPage();
Collection<? extends ScriptSession> sessions = wctx.getScriptSessionsByPage(currentPage);

正直意味はまだ僕もよくわかっていないのですが、以上の記述で
「現在処理しているHTMLセッションの一覧」を取得することができます。
あとはこれらのセッションに対してメッセージを送信します。

ScriptBuffer script = new ScriptBuffer("alert('Reverse Ajax!!');");
for (ScriptSession session : sessions) {
   session.addScript(script);
}

これで、HTML側には "Reverse Ajax!!" というダイアログが表示されるはずです。
今回はalertを使いましたが、ここにはもちろん任意のJavaScript文を記述できるので
あとは思いのままにReverse Ajaxを楽しんで下さい。