[連載]
初めてのEnhydra
第3回 XMLCアプリケーションの基礎
2.XMLCとは何か
|
Enhydraのアプリケーションフレームワーク |
XMLCの説明に入る前に、まずはEnhydraのアプリケーションフレームワークと呼ばれる構造について説明しておきます。Enhydraはアプリケーションフレームワークと呼ばれる抽象的な多階層構造を採用することで、開発時の用途分離を実現します。この階層構造自体は特別独自のコンセプトを導入しているわけではありません。むしろアプリケーションサーバとしては一般的な構造になっているといえるでしょう。それぞれにはEnhydra特有の呼び方が付いています。各レイヤは「xxxオブジェクト」という形で呼ばれます。Enhydraのアプリケーションは以下のオブジェクトによって構成されます。
XMLCの説明に入る前に、まずはEnhydraのアプリケーションフレームワークと呼ばれる構造について説明しておきます。Enhydraはアプリケーションフレームワークと呼ばれる抽象的な多階層構造を採用することで、開発時の用途分離を実現します。この階層構造自体は特別独自のコンセプトを導入しているわけではありません。むしろアプリケーションサーバとしては一般的な構造になっているといえるでしょう。それぞれにはEnhydra特有の呼び方が付いています。各レイヤは「xxxオブジェクト」という形で呼ばれます。Enhydraのアプリケーションは以下のオブジェクトによって構成されます。
●PO - Presentation Object
POは、アプリケーションデータをブラウザにどのように表示するかを取り扱うオブジェクトです。単純な応答処理に関しては、このオブジェクトだけで実現することも可能です。
●BO - Business Object
BOは、プレゼンテーションとデータベースの間を取り持ち、複雑なビジネスロジックを実現するためのオブジェクトです。
●DO - Database Object
DOはその名のとおり、データベースアクセスを行うためのオブジェクトです。Enhydraのサーバ環境におけるアプリケーションと各オブジェクトの位置付けは、おおよそ下図のようになります。
Enhydraのアプリケーションでは、POは必須のオブジェクトになる |
Enhydraアプリケーションでは、PO(プレゼンテーションオブジェクト)は必須です。ビジネスオブジェクトとデータオブジェクトは必須ではなく、必要に応じて利用することができます。アプリケーションを3つのレイヤに分割することで、プレゼンテーション層とアプリケーションのデータを分離します。例えばページのレイアウトを変更した場合やデータベースの参照テーブルが変わった場合などでも該当部分のオブジェクトを修正するだけ済み、メンテナンスが容易になります。といっても、Enhydraが自動的にレイヤを分けてくれるわけではないので、アプリケーションを3つのレイヤに分ける設計が重要なポイントとなります。
POはブラウザに表示するコンテンツを動的に生成するためのオブジェクトです。Enhydraはブラウザから.poで終わるURLのリクエストを受けると、その要求を対応するプレゼンテーションオブジェクトに渡します。例えば、http://www.air-beat.com/Login.poが要求されたときに、呼び出されるプレゼンテーションオブジェクトは、Loginです。このようにPOはそのリクエストを受け取って処理を行い、動的に生成したコンテンツをブラウザに返します。逆に、POとは最低限この機能を満たしているオブジェクトだということができます。この「機能を満たしたオブジェクト」とは、実際には次のインターフェイスを実装したJavaオブジェクトのことを指します。
com.lutris.appserver.server.httpPresentation.HttpPresentation |
このインターフェイスには、run(HttpPresentationComms)というメソッドが定義されており、これに処理を記述することにより動的なコンテンツの生成を行います。
POの構造としては以上のとおりですが、実際にはまずもととなるコンテンツ(HTMLファイルなど)があり、その一部を動的に変更してその結果をブラウザに返す、といった処理形態になるのが普通です。その場合は、もととなるコンテンツとそれに対して変更を加えブラウザへ応答を返す処理を行うオブジェクトの2つの要素でPOが構成されることになります。その仕組みを実現するためにコンテンツも処理オブジェクトも実際にはJavaオブジェクトとして実装されることになります。そこで必要となるのが、Enhydraを特徴付けているXMLCなのです。
XMLCが行うこと |
XMLC(XML Compiler)は、XMLまたはHTMLで記述されたコンテンツからJavaのクラスを生成するためのツールです。生成されたクラスは元の文書構造を忠実に再現することができます。また生成されたクラスはW3Cで標準化されているDOMの定義に従ったインターフェイスを持っていて、アプリケーション実行時に動的にそのコンテンツを変更することができるようになっています。基本的にW3Cが提供するAPIの利用のみで、望みどおりにコンテンツを変更することができますが、XMLCはさらに属性の変更などに関する追加のAPIを用意していて、より生産性の高い環境を提供しています。
XMLCによって、出力するHTMLの構成を管理するクラスと、HTMLの中にに動的にコンテンツを埋め込んでいくための処理を行うクラスを分離して開発することが可能になります。これによって、プレゼンテーション層における分業、即ちデザインと処理の分離開発を進めることが可能となるのです。これはJSPなどと比較しても非常に大きな利点となっています。
もう少し詳細に説明しましょう。あるHTMLファイル(a.html)をXMLCに通してやると、その構造を出力するためのJavaソースコードが生成されます(a.java)。このJavaソースコードを普通にコンパイルしてやればJavaクラスの出来上がりなのですが、それだけではJSPと比較しても何ら新味はありません。実はXMLCはそのコンパイル時にちょっと気の利いたことをしてくれます。
XMLCは読み込んだHTML文書内に記述されているid属性を見つけると、そのid属性をJava側で操作するホットスポットであると見なして、そのホットスポットを外部クラスから操作するためのメソッドを用意してくれるのです。
例えば、次のようなHTMLがあったとします。
|
これをXMLCに通して作成されたJavaクラスは、
- getElementAisatsu()メソッドで値を取り出す(この場合だと最初に実行すると「こんにちは」を返す)
- setTextAisatsu()メソッドで引数に指定された値で、ターゲットid属性のタグのテキストを置き換える(setTextAisatsu("こんばんは") とすると、<H1>こんばんは</H1>に置き換えられる)
というような処理を行うためのメソッドが用意されるのです。これには特別なことはまったく不要です。単純にHTMLファイルやXMLファイルなどサポートされている形式を読み込ませればよいだけです。
さて、このメソッドを操作するにはどうしたらよいでしょうか。そのためにEnhydraはPOを2つのクラスに分離しています。1つはこの文書構造を出力するためのクラス。もう1つがrun()メソッドを実装するクラスです。先述したように、.poで終わるURLがリクエストされると、Enhydraはその名前に対応したJavaクラスのrun()メソッドを呼び出します。これは実際にはServletと同じ仕組みが使われます。このrun()メソッドの中で、XMLCによって生成された各種のメソッドを操作してやればよいのです。
参考までに、XMLCが生成するほかのメソッドもいくつか紹介しておきましょう。
- getElementXXX ( )
XXXで指定されたid属性値を持つ要素を得ます
- setAttribute( )、removeAttribute ( )
自要素に属性を設定、または削除します
- getParentNode ( )、getChildNode ( )
自要素のすぐ上、またはすぐ下の階層にある要素を得ます
- appendChild (Node)
自要素のすぐ下の階層に、Nodeで指定する要素を追加します
- cloneNode(boolean)
自要素の複製を生成します
では、あまり長々と説明していても余計に混乱すると思いますので、実際にコードを書いてみましょう。
2/5
|
3.実際にアプリケーションを作成してみる |
|
連載記事一覧 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|