MAP | PageMixer ドキュメント > チュートリアル > PageMixer の利用 > 基本原理 | << | >> |
本節では、PageMixer の基本原理に関して説明します。
HTML ページは、以下のように、 多くのタグとテキストから構成されています。
: : <h2>Table of contents</h2> <table class="wide"> <tr><!-- ======================================== --> <th style="width: 25%;">title</th><th>content</th> </tr> <tr><!-- ======================================== --> <th><a href="./principle.ja.html">Basic principle</a></th> <td><p>basic principle of PageMixer</p></td> </tr> <tr><!-- ======================================== --> <th><a href="./nopfilter.ja.html">"NOP" filter</a></th> <td><p>parse and render HTML page in PageMixer framework</p></td> </tr> : :
PageMixer の基本原理は、 HTML ページを "Token" シーケンスとして扱うことです。
"Token" は、 プログラミング言語仕様におけるレキシカルアナライズでのそれがそうであるように、 "HTML ページの最小単位" を意味します。
備考: "Token" は "Symbol" や "Attribute" 群から構成されているため、 "Token" は実は "最小単位" ではありません。 しかし、 物理学の初歩では "原子" を "最小単位" とみなすように、 PageMixer では "Token" を "最小単位" とみなします。
PageMixer では、以下のものが Token に成り得ます。
そのため、 前述の HTML ページソースサンプルは、 以下のような Token シーケンスに変換されます (以下の例は変換結果の一部です)。
"Token" の概念は、Java クラスとして定義されているので、 "Token" およびそのバリエーションは Java のオブジェクとなります。 これは、 HTML ページを Java オブジェクトのシーケンスとして扱うことができる、 ということを意味します。.
上記のものに加えて、 PageMixer 3.0 からは、 以下のクラスも利用可能になっています。
CDATAToken
PIToken
ScriptToken
処理対称としての HTML ページは、 Token シーケンスとして表現されます。 では、処理主体は何処でしょう?
処理主体は、Token シーケンスを消費する "Consumer" として表現されます。 対象となる HTML ページを表現するシーケンス中の Token は、 1つづつ "Consumer" へと渡され、 "Consumer" がそれを消費します。
消費の結果は "Consumer" の実装に依存します。 例えば:
前述のように、 処理の主体は "Consumer" として表現されます。 しかし、巨大で、複雑で、多用途の "Consumer" は、 開発、テスト、訂正および理解が困難です。
処理を小さく、簡潔で、単機能なものに分割するために、 "Filter" という概念が導入されます。
"Filter" は、 接続された他の "Consumer" に Token シーケンスを供給する "Consumer" です。
与えられた Token シーケンスと同じものを提供するか否かは、 "Filter" の実装に依存します。 例えば、以下のような "Filter" 実装がありえます。
UNIX コマンドのパイプ("|")による組み合わせのように、 出来合いの "Filter" 群を組み合わせることで、 固有の処理を作り上げることも可能です。
Token シーケンスは "Consumer" あるいは "Filter" によって処理されます。 そして、それらに対して最初に Token シーケンスを供給するものは、 "Producer" と名づけられています。
"Producer" は自身に固有な Token シーケンスを、 指定された "Consumer"(あるいは "Consumer" としての "Filter")に対して、 供給する機能を持たなければなりませんが、 Token シーケンスの生成機構は "Producer" の実装に依存します。
動的に生成した Token シーケンス、 DBMS から取り出した Token シーケンス、 無限の長さを持った Token シーケンス(役に立つとは思えませんが)を生成する "Producer" を作ることも出来ます。
web ベースのシステムの場合、 HTML ページは動的な値を含みます。 それらの値は、 ユーザ入力やユーザ入力の処理結果であるため、 実行時に決定されます。
そのため、Consumer や Filter には、 それらユーザ入力やその結果を取得する手段が必要です。
同時に、Filter 間での相互通信のための手段も必要とします。
勿論、 Filter 同士が Token シーケンスを介して通信することも出来るでしょうが、 Token シーケンスは、FTP における DATA チャネルや HTTP ボディのようなものです。 DATA チャネルや HTTP ボディのような Token シーケンスではなく、 FTP における CONTROL チャネルや HTTP ヘッダのような, お互いの情報を交換する手段が必要です。
そこで、 "Consumer Context" という概念が導入されます。
Consumer および Filter は、 Token 処理の際に "Consumer Context" を渡され、 その "Consumer Context" は、 "java.util.Map" のような値の設定/取り消し/取得の機能を提供します。
Consumer と Filter は、 "Consumer Context" を介することで以下のようなことが出来ます。
値の格納場所やその識別方法は、
"Consumer Context" の実装に依存します。
例えば、Servlet 環境の場合、
"Consumer Context" は
HttpRequest
の attribute 格納空間や
HttpSession
の格納空間に値を格納するかもしれませんし、
それらの場所や HttpRequest
のパラメータから値を取得するかもしれません。
MAP | PageMixer ドキュメント > チュートリアル > PageMixer の利用 > 基本原理 | << | >> |