トップ » 技術記事 » チャット作成で学ぶWebリモーティング(6) - Spring2の名前空間拡張機能を用いたDWRの設定

チャット作成で学ぶWebリモーティング(6) - Spring2の名前空間拡張機能を用いたDWRの設定

タグ: Ajax DWR Java javascript Spring

DWRの設定をコンテキスト設定ファイル内で行う

これまでの手順で、コンテキスト設定ファイル内でDWRの名前空間に含まれる要素を利用できるようになっています。では、具体的にどのような設定を行うのかを見ていきましょう。

対象となるプログラム自体は前回の物と同じです。つまり、以下のようなファイル (クラス) 構成になっているということです。

    remote/   … リモートAPIを格納するパッケージ
      ChatMessageDTO.java     リモートとのやり取りで利用されるデータ
      ChatServiceRemote.java  リモートからアクセスされるメソッドを持つクラス
    service/  … 業務ロジックAPIを格納するパッケージ
      ChatMessage.java        チャットメッセージのデータ
      ChatService.java        チャットのサービスインターフェース
      impl/   … 業務ロジックAPIの実装クラス
        ChatServiceImpl.java  サービスインターフェースの実装

DWRによる設定が必要なのは、以下の二つです。

  • ChatMessageDTOに、JSONとの変換を行うためのコンバータを指定する
  • ChatServiceRemoteをリモートからアクセス可能にする

こうした設定を全て`applicationContext.xml`内で行うわけです。

コンバータの指定

まずコンバータの指定は、ルート要素直下の<dwr:configuration>タグ内で行います。

<dwr:configuration>
  <!– Beanコンバータを指定 –>
  <dwr:convert type="bean" class="remote.ChatMessageDTO"/>
</dwr:configuration>

<dwr:configuration>以下には、dwr.xmlで指定可能なinit要素やcreate要素も指定できます (initについては、本連載では未説明)。

<dwr:convert>タグのtype属性に”bean”を指定することで、BeanConverterを用いてChatMessageDTOクラス⇔JSONデータの変換を行うよう指定しています。

リモートアクセス可能なクラスを指定

次に、Ajaxクライアントからリモートアクセスが可能なBeanの指定を行います。Bean定義を行っている<bean>タグの内側に、<dwr:remote>タグを指定するだけです。

<bean id="chatServiceRemote" class="remote.ChatServiceRemote">
  <property name="chatService" ref="chatService"/>
  <property name="chatTimestampFormat">
    <bean class="java.text.SimpleDateFormat">
      <constructor-arg value="MM/dd HH:mm:ss"/>
    </bean>
  </property>
  <!–
    このBeanのインスタンスに、リモートから
    ChatServiceという名称でアクセスできるようにする
  –>
  <dwr:remote javascript="ChatService">
    <!– DI用のsetterメソッドは除外 –>
    <dwr:exclude method="setChatService"/>
  </dwr:remote>
</bean>

とまあ、こんな感じです。dwr.xmlで設定を行っていた時には、SpringのBean IDをSpringCreatorのパラメータとして指定する必要がありました。

<create creator="spring" javascript="ChatService" scope="application">
  <!– Springで定義したBeanの名称 –>
  <param name="beanName" value="chatServiceRemote"/>
</create>

しかし、名前空間を使うと「このBeanをリモートアクセス可能にする」と言う指定をapplicationContext.xmlだけでスマートに記述できます。二種類の設定方法をよく見比べてみてください。

サーブレットの変更

最後に、SpringのコンテキストからDWRの設定を読み出すには、専用のサーブレットを使用する必要があります。前回まではorg.directwebremoting.servlet.DwrServletを使用していましたが、その代りにorg.directwebremoting.spring.DwrSpringServletを使うよう、web.xmlを変更します。

<servlet>
  <servlet-name>dwr-invoker</servlet-name>
  <display-name>DWR Servlet</display-name>
  <description>Direct Web Remoter Servlet</description>
  <servlet-class>
    <!– サーブレットのクラス名を変更 –>
    org.directwebremoting.spring.DwrSpringServlet
  </servlet-class>

動作確認とまとめ

以上の変更を行ったら、アプリケーションサーバに配置して、ブラウザからアクセスしてみてください。これまでと同様に動作すれば成功です。

今回修正したSpringのコンテキスト設定ファイル (applicationContext.xml) の全ソースコードは以下のようになりました。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                        http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-2.0.xsd">

  <dwr:configuration>
    <dwr:convert type="bean" class="remote.ChatMessageDTO">
      <dwr:include method="user,text,timestamp"/>
    </dwr:convert>
  </dwr:configuration>
  <bean id="chatServiceRemote" class="remote.ChatServiceRemote">
    <property name="chatService" ref="chatService"/>
    <property name="chatTimestampFormat">
      <bean class="java.text.SimpleDateFormat">
        <constructor-arg value="MM/dd HH:mm:ss"/>
      </bean>
    </property>
    <dwr:remote javascript="ChatService">
      <dwr:exclude method="setChatService"/>
    </dwr:remote>
  </bean>
  <bean id="chatService" class="service.impl.ChatServiceImpl">
  </bean>
</beans>

今回のソースコードはこちらからダウンロードしてください。

高度な話題 - 拡張名前空間を提供するためのルール

今回最後のトピックとして、Spring2が提供する名前空間拡張機能の基本的なルールを紹介しましょう。高度な話題なので、理解しておく必要はありませんが、知っておくと役に立つことがあるかもしれません。

今回の記事の最初に、「拡張された名前空間を使用するには『名前空間URI』と『XML SchemaファイルのURL』がわかればよい」と言うお話をしました。逆に言うと、これらがわからない限り拡張名前空間は利用できないわけです。

これらの情報は、Springフレームワークも必要とします。そして、あるきまったルールに従ってSpringフレームワークがクラスパス内から読み取るようになっています。なので、そのルールさえ押さえておけば、名前空間URIもXML SchemaのURLも判明させることができるわけです。

そのルールとは、以下の二つです。

  • クラスパス内の「META-INF/spring-handlers」ファイルに、「名前空間URI=処理するクラスの名称」と言う形式で記述されている
  • クラスパス内の「META-INF/spring-schemas」ファイルに、「XML SchemaのURL=代替となるファイルのクラスパス上でのパス」と言う形式で記述されている。これは、名前空間に含まれる要素のバリデーションを行うためのXML Schemaファイルを、Webにアクセスして取得するのを防ぐために用いられる

これらを踏まえて、dwr.jarを解凍した中身を調べてみた結果が以下の通りです。

META-INF/spring-handlers

http\://www.directwebremoting.org/schema/spring-dwr=org.directwebremoting.spring.DwrNamespaceHandler

META-INF/spring-schemas

http\://www.directwebremoting.org/schema/spring-dwr-2.0.xsd=org/directwebremoting/spring/spring-dwr-2.0.xsd

このように、名前空間の拡張に用いられる情報は簡単に入手可能なのがお分かりでしょう。こうした事柄を知っていると、拡張名前空間を自作するのもそれほど難しい話じゃなさそうだ、と思えますね。

まとめと次回予告

今回に至るまで、最初に作成したチャットアプリケーションを、以下のようにして変更してきましたね。
1. dwr.xmlを使用した通常通りの指定
2. Reverse Ajaxを使用したComet型アプリケーションへと変更
3. DWR2から利用可能になったアノテーションを用いた設定
4. SpringCreatorを用いたSpringとの連携
5. 名前空間拡張機能を使用したSpringとの連携

次回は、DWRとSpringの連携を行うトピックの最後です。Spring2の高度な機能である「スコープの自作」を用いて、これまで書いたソースコードに手を入れることなく、複数のチャットルームを扱えるようにします。

ご意見、ご感想お待ちしています。

Series Navigation«DWRとSpringの連携Spring2のカスタムスコープ»

1 2

執筆者紹介

shiraishi

shiraishi

最近書いてばっかりいます。 眠いとおんなじことばかり書きます。 そして、大概眠いです。

TrackBack URL :