Cocoon2 チュートリアル (前編)
概要
Cocoon2はXMLをpublishするためのフレームワークです。Cocoon2を用いることでXMLベースの アプリケーションの開発を行うことができます。このサイトはForrestで構築されていますが、 Forrestの裏ではCocoon2が働いています。ここではCocoon2の紹介および チュートリアルを行います。
Cocoon2とは
Cocoon1はXML(およびXSP)とXSLTを用いて動的に新しいXMLを生成するサーブレットを提供しました。 この技術をWebアプリに適用した場合、XMLはコンテンツ、XSLTはプレゼンテーションロジックとなります。 Cocoon1はこのようにしてコンテンツとプレゼンテーションロジックの分離という 問題に対する一つの解を与えました。つまりCocoon1はビューの部分の技術に焦点を当てていたわけです。
ところが最近のようにWebアプリケーションが大規模化してくると、分離したことによって、かえって ページ遷移の把握が困難になってきました。
そこでCocoon2で新たにsitemapという機能が追加されました。sitemapではリクエストに応じて どのようにコンポーネントを呼ぶかを記述します。Cocoon2ではsitemapという技術 によって、コントローラの部分が強化されました。
以降、特に注意しない限り Cocoon2 を単に Cocoon と書きます。
何ができるのか?
Cocoonで何ができるのか、それはCocoonを利用しているプロジェクトを見ることで理解できます。
一番身近な例はこの文書自体です。ForrestはXMLからHTMLおよびPDFの変換にCocoon2を 利用しています。
このHTMLとPDFは一つのXMLから生成されています。 http://.../xxx.htmlのときはhtml生成用のxslt、http://.../xxx.pdfのときは pdf生成用のxsltを同一XMLに適用するというように、リクエストに応じた、単一コンテンツからの動的な 生成を可能としています。
pipeline
pipelineはCocoonの中心となる概念です。Cocoonはリクエストを受けると、 リクエストに応じた pipeline を選択し, pipelineの中でSAXイベントを生成して流し、レスポンスとしてシリアライズして返します。
Cocoonではpipeline中にコンポーネントを配置していくことによって開発を進めていきます。 主要なコンポーネントとして
- Generator
- Transformer
- Serializer
があります。それぞれ以下の仕事を行います。
| コンポーネント名 | 仕事 |
|---|---|
| Generator | SAXイベントを生成する。生成のタネとしてはXMLやXSP,HTMLをはじめ画像ファイルやHTTP Requestなどもとることができる。 |
| Transformer | Generatorで生成されたSAXイベントを変換する。変換規則としては主にXSLを用いる。 |
| Serializer | SAXイベントをシリアライズする。XML、XHTML、PDFのような文書や、 JPEGやPNGなどの画像ファイルにシリアライズする。 |

その他のコンポーネントとしては以下のものがあります。
| コンポーネント名 | 仕事 |
|---|---|
| Reader | 画像ファイルやJSPなどをそのまま読み出す。 |
| Selector | SAXイベントを分岐させる。 |
| Matcher | マッチしたパイプラインを開始する。 |
| Action | 開発者が作成したアクションを呼び出す。 |
Sitemap
コンポーネントやpipelineなどCocoonを構成する要素の定義を行います。 これらの定義はsitemap.xmapというファイルに記述します。 Strutsにおけるstruts-config.xmlに相当します。
SitemapはMVCモデルでいうところのコントローラのための情報を持ちます。 pipelineにはどのコンポーネントを使うか、リクエストに対してどのpipelineを使うか などの情報を記述します。
詳しい説明は省きますが、使用するAction(StrutsのActionと同様なJavaクラス)の 定義も行います。
Cocoonの周辺技術
XSLT
XSLT(eXtensible Stylesheet Language Transformations)は、 XMLを他の形式に変換するための言語です。代表的な用途としては、 XML→XHTMLのようなスタイルシート、XML→XMLのようなデータの加工があ げられます。Cocoonでは用意したXMLをどのように加工し、publishす るためにどのように整形するか、ということを定義するためにXSLTを用い ます。XSLTの記述はCocoonを用いた開発において大部分を占めます。
XSP
XSP(eXtensible Server Pages)はXMLに対するJSP(Java Server Pages)と考えると分かりやすいかもしれません。しかし、JSPとは利用方 法に大きな違いがあります。JSPはJSPスクリプトレットにデータが埋めこまれた 時点でページとなります。一方XSPはデータが埋めこまれた時点ではまだ XMLです。つまりページではなくデータです。データの埋めこまれたXML にさらにXSLTをかけることによってようやくページとなります。

XSL-FO
FO(Formatting Objects)はXMLで文書のスタイルを記述するための仕様です。 Apache FOPはFOからPDF文書を作成するJavaライブラリです。XMLに対してXSLT を適用してFOを作成し、FOPにかけることでPDFにすることができます。XSL-FOを 利用することにより、XMLデータをPDF形式に加工するという選択肢が生まれます。 これはForrestでも採用されている方法でCocoon2を用いる場合の利点となってい ます。一つのXMLからHTMLとPDFにできるため、計算機での閲覧にはHTML、 印刷するためにはPDFといった利用形態が可能となりました。 (つまりこのチュートリアル資料の形態です)

Cocoon のインストール
ここではCocoonのインストール方法を説明します。本資料執筆時の最新版である Cocoon-2.1.9 を使います。
ダウンロード
最新版はここで配布されています。
環境に合ったものをダウンロードしましょう
ビルド
ダウンロードしたファイルを展開して現れるディレクトリの直下のbuild.shを実行します。(Windowsならbuild.bat)
配備・起動
build/ 以下に webapp/ が現れるので、これを Tomcat に配備すれば完了です。
また、Cocoon は、自前でサーバを持っており、cocoon.sh を実行することによっても起動することができます。
build/webapp/ の Web アプリケーションは Cocoon の Example Web アプリケーションで、Cocoon の豊富な 機能をそれぞれ使用しながら紹介しているので、これを見ていくだけでも、Cocoon についてかなりの勉強になります。
Cocoon で Hello World
まず、練習として定番の Hello World をやってみましょう。
表示するだけではつまらないのでリクエストパラメータで表示する色を与えることができるようにします。
作成するCocoonアプリのイメージは以下の通りです。

まず、以下のような XML を用意します.
<?xml version="1.0" encoding="UTF-8" ?> <message> Hello, world! </message>
次に XSLT ファイルを用意します。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html"
encoding="UTF-8"
doctype-public="-//W3C//DTD XHTML 1.0 Strict //EN"
doctype-system="DTD/xhtml1-strict.dtd" />
<xsl:param name="color"/>
<xsl:template match="/">
<html>
<head>
<title>Hello World!</title>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8" />
</head>
<body>
<xsl:element name="font">
<xsl:attribute name="color">
<xsl:value-of select="$color"/>
</xsl:attribute>
<xsl:value-of select="/message" />
</xsl:element>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
注目すべき点は<xsl:param>要素でcolorをパラメータとして宣言していることです。 こうすることによって外部から値を与えてやることができるようになります。そして、font要素の生成時に属性として そのパラメータを与えるようにしています。
最後に sitemap.xmap に pipeline を定義します。
<map:match pattern="helloworld/*.html">
<map:generate src="helloworld/{1}.xml"/>
<map:transform src="helloworld/{1}.xsl">
<map:parameter name="use-request-parameters" value="true"/>
</map:transform>
<map:serialize type="xhtml"/>
</map:match>
要素の簡単な説明を加えます。
| 要素、属性 | 説明 |
|---|---|
| <map:match pattern="helloworld/*.html"> | リクエストに対するマッチング。"*"はワイルドカードで子要素では{1}のように"*"の現れる位置を 表わす数字で参照することができる.たとえば"*/*.jsp"に対して"pages/aaa.jsp"では {1}はpages {2}はaaaとなる。 |
| <map:parameter name="use-request-parameters" value="true"/> | XSLTでリクエストパラメータを使用する |
以上で準備は完了です.http://ホスト名/helloworld/hello.html にアクセスし、パラメータcolorの値を 変えてみましょう。
by Ryo SUETSUGU


