Ajax とは、HTML内から動的にサーバ側にアクセスする機能です。
Reverse Ajax はその逆で、サーバ側からHTMLにアクセスする機能のことです。
HTTPでそんな事が可能なのかと疑問に思う方もいると思いますが
実際これが可能なのです。
詳しい実装方法などは他の記事に任せるとして、ここではその使い方について説明します。
ただし一つ覚えておいてほしいことは、この機能はWebリソース(具体的に言えばHTTP Session)を
著しく消費する可能性があるということです。
その為、一度に多くの人がアクセスするようなページで使うことはオススメできません。
DWRは2.0からReverse Ajaxに対応しました。
使い方は非常に簡単です。
まず、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>
Reverse Ajaxを使うページ(HTML)で以下の宣言(JavaScript)をする必要があります。
dwr.engine.setActiveReverseAjax(true);
当然、このページではDWRの共通JavaScriptである
<script src="dwr/engine.js"></script> <script src="dwr/util.js"></script>
を記述しておく必要があります。
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を楽しんで下さい。