チャット作成で学ぶWebリモーティング(2) - DWRの基本
どうも皆さん、こんにちは。白石です。
今回はWebリモーティングに関する連載の第二回目です。この記事では、DWRを使用して作られたチャットアプリケーションを題材に、DWRというライブラリの基本的なトピックについてお話したいと思います。
DWRとは
DWR (Direct Web Remoting) は、AJAXという概念が登場してから比較的早い時期に登場した、Webリモーティングライブラリです。有名なプロダクトなので、すでにご存じの方も多いことでしょう。
DWRを使用すると、簡単なセットアップのみで、JavaのメソッドをJavaScriptから呼び出すことができるようになります。
ただ、単に「呼び出す」と言っても、やはりJava同士でメソッド呼び出しを行う場合では考える必要のない、さまざまな事柄を考慮する必要があります。たとえば以下のようなものです。
1. AJAXは基本的に非同期リクエストだけど、どうやってメソッドの戻り値を受け取るの?
DWRでは、メソッドを非同期で呼び出し、戻り値をコールバック関数の引数として受け取ります。
例えば、以下のようなJavaクラスがあったとします。
class Hello { String hello() { return "Hello, world"; } }
このクラスのメソッドhello()を呼び出すための、AJAXクライアント側のコードは以下のようになります。
// メソッドの引数に、コールバック関数のオブジェクトを渡す。 // その関数の引数として、メソッドの戻り値が渡される。 Hello.hello(function(result) { alert(result); });
Javaのコードではhello()は引数をとりませんが、JavaScriptから呼び出すときには関数オブジェクトを渡しています。このように、メソッド実行の結果を受け取るためにコールバック関数のオブジェクト/ポインタを渡すという手法は、非同期処理を扱うプログラミングではよく使われる手法です。
2. Javaオブジェクトは、JavaScript上ではどのようなオブジェクトとして扱われるの?
JavaとJavaScriptという異なる言語間でデータの受け渡しをするわけですから、これも重要なトピックです。DWRでは、Java⇔JavaScript間でオブジェクトの変換を行うためのモジュールを「コンバータ」と呼んでいます。
DWR組み込みの「コンバータ」も多くあり、例えば以下のようなものが挙げられます。
StringConverter - Javaの文字列⇔JavaScriptの文字列の間の変換
DateConverter - java.util.Date⇔JavaScriptのDate型の間の変換
BeanConverter - JavaBeansをJavaScriptオブジェクトに変換
ここに挙げたのはほんの一例です。
最後に挙げたBeanConverterは非常によく使います。このコンバータは、JavaBeanのプロパティ (getter/setter) から取得した値を格納した、JavaScriptオブジェクトを生成します。
例えば、getName()/setName()やgetAge()/setAge()と言ったプロパティを持つJavaBeanを、BeanConverterによって変換すると以下のようなJavaScriptオブジェクトになります。
{
"name":"白石",
"age":29
}
コンバータは自作することもできますが、それは少し高度な話題なので、この連載では触れません。
例えば僕は以前非常に通信回数の多いAJAXアプリを作成したときに、データ量を1バイトでも削減するためコンバータを自作しました。
3. Javaオブジェクトはどうやって生成され、どのスコープにおかれるの?
DWRで管理されるJavaオブジェクトがどう生成されるかは、他のフレームワークとの連携にも絡んだ重要な問題です。一番単純なのは、DWRにnewさせることですが、たとえばSpring Frameworkと連携させる場合は、Springが生成し管理するオブジェクトを対象にすることもできます。
また、オブジェクトがどのスコープにおかれるかは、Servletプログラミングにおいて常に気にかける必要のある事柄です。これについては、request、session、applicationと言った一般的なスコープを利用できると理解しておいてください。
他にもセキュリティや通信に使用するコンポーネント (XMLHttpRequestかIFrameか)など、Webリモーティングにおいて考慮しなければならないことは数多くあります。DWRは意外と歴史の長いライブラリなので、そうした問題に対するソリューションは万全です。
DWRとほかのフレームワークを組み合わせる
DWRは、Webリモーティングの機能のみを提供するライブラリです。本格的なJavaEEアプリケーションを作成するには、他のフレームワークと組み合わせる必要があります。
DWRはその点についても熱心に取り組まれており、さまざまなフレームワークに対するアダプタがあらかじめ提供されています。例えば以下のようなフレームワークと連携できます。
- Spring
- Guice
- Hibernate
- Struts
- WebWork
- JSF
この連載では、Spring Frameworkとの連携について紹介します。
バージョン2から加わった機能
DWR 1.xでは、JavaScriptからJavaのメソッドを呼び出すというコンセプトを中心に、必要最小限の機能が提供されていました。バージョン2では、AJAXアプリ開発をさらに強力にサポートするための、高度な機能がいくつも追加されました。
- scriptスコープ - これは、DWRが独自に定義したオブジェクトのスコープです。ブラウザのページと同じ生存期間を持つスコープだと理解しておいてください。
- Reverse Ajax - これは、DWR2で導入された非常に重要な機能で、なんとサーバサイドのJavaからJavaScriptのコードを操作すると言うものです。こんな事が実現できるのは、DWR2がComet (サーバからクライアントへのデータプッシュ) をサポートしているからです。
- Java5 Annotationのサポート - Java5から追加された、Metadata Annotationを用いてリモートメソッドやコンバータの設定を行うことができます。
DWR2で追加された機能はこれだけに留まりませんが、代表的なものは上のようなものです。これらについては本連載でも取り上げていきます。
ではずいぶん前置きが長くなりましたが、以降は実際にDWR2を用いてチャットアプリケーションを実装するまでの流れを紹介したいと思います。
1 2
TrackBack URL :
