はじめに
インターネットとその相棒のWebブラウザが世の中に与えた影響の大きさは、誰もが認めるところです。もし、読者の皆さんが私と同類ならば、Webブラウザを通じてニュースやスポーツの速報をチェックしたり、NASDAQの株価が下落した翌日に自分のポートフォリオの値をチェックしたりしていることでしょう。しかし、WebアプリケーションはHTTPに依存しているため、さまざまな制限があります。ご存知のように、Webアプリケーションの世界ではHTTP Webクライアントの弱点が広く認識されており、この弱点を補うために、"Web 2.0"アプリケーション、リッチインターネットアプリケーション(RIA)、AJAX、Lazlo、Flexなどの技術が考案されています。
これらの技術はすべて、Webブラウザというシンクライアント(thin-client)をシッククライアント(thick-client)に見せようとするものです。しかし、私の考えでは、フォルクスワーゲンの色や形状を変えてポルシェのような外観にしても、実際にポルシェのように走ることは決してできません。私は、Webクライアントとデスクトップアプリケーションの戦いを始めるつもりは毛頭ありません。それぞれに目的があると考えています。しかし、Dojo、script.aculo.us、AJAX、Prototypeなどを使った開発作業に多くの時間を費やした結果、Web 2.0の機能の多くは、HTTPの制限的な要求/応答パラダイムを回避して、最終的には、本来の意図を超えた処理をHTTPに実行させようとする試みにすぎないと感じています。
いつの日か、機能豊富なWeb 2.0アプリケーションのダウンロードサイズが、Java Web Startを通じて配備される充実したデスクトップアプリケーションのダウンロードサイズに迫るような状況になったとしても、私はまったく驚きません。そのことを念頭に置いた上で、今回は、従来のJ2EE/Webアプリケーションサーバーアーキテクチャを利用して、エンドユーザーのためのシッククライアントを作成することを提案します。このチュートリアルでは、シッククライアントの株式取引アプリケーションを作成および配備しながら、概要を説明していきます。
必要な環境
- Eclipse 3.1.2
- J2EE準拠のWebサーバー(Tomcat、Resin、Jettyなど)
- MyEclipse 4.1.1
- Java 5(およびその実用的な知識)
- サーブレットコンテナまたはJ2EEサーバー(このチュートリアルではTomcat 5.5+を使用)
- Spring 1.2+(およびその実用的な知識)
インストール
実際の開発作業に入る前に、次の手順を実行して、JREではなくJDKを使用していることを確認します。
- [Window]-[Preferences]をクリックし、[Java]ノードを展開して、[Installed JRE]をクリックします。
- [Add]をクリックし、[Browse]をクリックして[JRE Home Directory]を参照します。JAVA_HOMEディレクトリに移動し、[OK]をクリックします。
- [JRE Name]に「JDK」と入力し、[OK]をクリックします。[JDK]の横にチェックマークがあることを確認し、[OK]をクリックして(図1を参照)、[Windows]-[Preferences]を終了します。
Tomcatのインストール
このチュートリアルでは、本稿執筆時点での最新リリースであるTomcat 5.5.17を使用します。Tomcat内でRMIも使用するため、Tomcatのインストール先は、空白を含まないパスにする必要があります。つまり、「C:\Program Files\Apache Software Foundation」などは不適切です。空白を含まないディレクトリにTomcatをインストールしない限り、Tomcat上でRMI Serverを動かすことはできません(実際のASF Bugzillaバグについては、こちらを参照してください。Apacheは受付を締め切っており、修正の予定はありません)。今回の例では、「C:\devtools\java\apache-tomcat-5.5.17」にTomcatをインストールしました。
このチュートリアルのいずれかの部分を実行して、次のような例外が発生する場合は、RMI部分を削除する(または起動しない)か、Tomcatのインストール先を、空白を含まないディレクトリに変更します。
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.net.MalformedURLException: no protocol: Files/Apache ... ... ... Caused by: java.net.MalformedURLException: no protocol: Files/Apache at java.net.URL.(URL.java:567) ... ... ...
Springの取得
Spring Frameworkをまだインストールしていない場合は、これをダウンロードします。今回は、執筆時点の最新の安定版リリースである1.2.8を選択しました。ダウンロードする場合は、必要となるいくつかのサードパーティライブラリが含まれている「Spring Framework with dependencies」のダウンロードをお勧めします。また、リソースとして、ソースとjavadocもダウンロードしてください。ダウンローが終了したら、ダウンロードファイルを解凍します。
準備がすべて完了しました。いよいよこれからが本番です。
Webアプリケーション/サーバーサイドプロジェクトの作成
まず、EclipseでJavaプロジェクトを作成します。
- [File]-[New]-[Project]をクリックします。Javaプロジェクトを選択し、[Next]をクリックします。
- New Projectウィザードが表示されます。[MyEclipse]-[J2EE Projects]の[Web Project]をクリックし(図2を参照)、[Next]をクリックします。
- プロジェクト名として「stocktraderserver」と入力します(図3を参照)。今回は、場所として、「C:\dev\Devx\EclipseRcpSpringRemoting\StockTraderServer」を選択しました。[Finish]をクリックします。
サードパーティライブラリの追加
サードパーティライブラリをいくつか追加します。
- 解凍されたspring-framework-1.2.8ディストリビューションには、次のjarが含まれています。
- Table 1 …… クラスパスに追加するサードパーティの外部jar
- spring.jar …… 「dist」フォルダにあるjar
- commons-logging.jar …… 「lib\jakarta-commons」フォルダにあるjar
- log4j-1.2.13.jar …… 「lib\log4j」フォルダにあるjar
- Eclipseのパッケージエクスプローラで、[StockTradeServer]プロジェクトを右クリックします。
- プロパティを選択し、[Java Build Path]をクリックします。
- [Libraries]タブをクリックします。
- [Add JARs...]をクリックし、コピーしたjarを追加します。また、[Add External JARS...]をクリックし、spring dependencies 1.2.8を解凍してできたフォルダを参照して、「lib/junit」ディレクトリにある「junit.jar」を追加します(図4を参照)。
StockTraderServerへのSpringの追加
Spring Frameworkをプロジェクトに組み込みます。そのためには、MyEclipseプラグインを使用するのが最も簡単です。
- Eclipseメニューの[MyEclipse]-[Add Spring Capabilities...]をクリックします。
- ウィザードが表示されたら、[MyEclipse Libraries]チェックボックスと[Spring core]チェックボックスを両方ともオフにして、[Next]をクリックします(図5を参照)。
- 新しいSpring Bean設定ファイルを作成し、[Browse]ボタンを使用して、WEB-INFディレクトリに「applicationContext.xml」を作成します。終了したら、[Finish]をクリックします。
- パッケージエクスプローラに「S」の記号が表示され、Springが追加されたことが示されます(図6を参照)。
- 残念ながら、SpringのDispatcherServletはWebプロジェクトに追加されていません。そこで、次の操作を実行します。
- 次に、SpringのWebApplicationContextを作成します。Springでは、そのためのルールが明確に定義されており、WEB-INFディレクトリに新しいxmlファイルを作成する必要があります。この新しいファイルの名前は、「web.xml」内の
<servlet-name>
タグで囲まれたテキストに「servlet.xml」を付加したものにしなければなりません。 - 「springDispatcher-servlet.xml」をMyEclipseプラグインに追加します。パッケージエクスプローラで、[stocktradeserver]プロジェクトノードを右クリックします。左側で、[MyEclipse-Spring]を選択します。[Add...]をクリックし、「springDispatcher-servlet.xml」にナビゲートして選択し、[OK]をクリックします。再び[OK]をクリックして[Properties]ウィンドウを閉じます(図8を参照)。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <servlet> <servlet-name>springDispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>springDispatcher</servlet-name> <url-pattern>/service/*</url-pattern> </servlet-mapping> </web-app>
<servlet-name>
タグで囲まれたサーブレット名/テキストは「springDispatcher」であるため、WEB-INFディレクトリの下に「springDispatcher-servlet.xml」という名前の新しいファイルを追加することになります(図7を参照)。<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> </beans>