Cocoon2によるHTMLベースのWebサイトの構築

 今度は少し基本に立ち返って、 Webサーバに普通のApacheを使ったサイトのように、 HTML文書と画像・音声などの固定コンテンツだけを配信する Webサイトを構築してみます。 「あー?それなら、Cocoon使う必要はないだろ?」 というところですが、実際問題、ある程度以上の規模があるWebサイトを最初から全て XML文書で配信する、というのは無理があります。 例えば使いやすいHTMLエディタはたくさんあるのに、 XMLエディタはまだまだ発展途上、などのオ・ト・ナの事情があるので (黙れ)。 そこで、最初はHTMLベースのサイトとして出発するか、 一定期間はHTMLとXMLが混在するサイトとして構成することになるでしょう。 ここでは、そのような環境を想定しています。


HTML文書を配信する方法

 この方法には大きく2種類があります。

  1. HTML Generator + HTML Serializer
  2. File Generator + HTML Serializer
 1番目で使うHTML Generatorというのは若干マイナーなgeneratorですが、 一般のHTML文書をXHTML文書(XMLとしても解釈できる整形式のHTML) に変換して読み取るgeneratorです。 が、現状では日本語の文字の変換がうまくいかないので、 日本語圏では使えません。 HTML→XHTMLの変換には、Cocoonが内部的に HTML Tidy というライブラリを持っていて、これを使うのですが、 その際のエンコーディング設定がうまくできないようです。
 そこで2番目の方法ですが、 こちらはXML文書を読むときと同じ、デフォルトのFile Generator でHTML文書を読み、HTML Serializerでそのまま出力します。 但しこちらには条件があって、 HTML文書がXHTMLでなければいけません。 つまり、文書の冒頭には <?xml version="1.0" encoding="Shift_JIS" ?> のような擬似命令の行が必要で、 HTMLタグの開く閉じるも厳密に行われるように自分で書かなくてはいけません。


HTML Serializerのエンコーディング設定

 まず、$COCOON_HOME/sitemap.xmap を編集して、 HTML Serializerが出力する文書のエンコーディングを、 HTML文書がそれによって書かれているところのエンコーディングに合わせます。

  <map:serializer logger="sitemap.serializer.html"
   mime-type="text/html" name="html" pool-grow="4" pool-max="32"
   pool-min="4" src="org.apache.cocoon.serialization.HTMLSerializer">
    <buffer-size>1024</buffer-size>
    <encoding>EUC_JP</encoding>
  </map:serializer>


$DOC_HOME/sitemap.xmap の編集

 次に、HTML文書を置いたディレクトリ、 $DOC_HOME のsitmap.xmapの編集です。

 <map:match pattern="**.html">
   <map:generate type="file" src="{1}.html"/>
   <map:serialize type="html"/>
 </map:match>

このよーに、このディレクトリ以下にある全てのHTML文書は、 このルールによって出力されます。
 なお、$DOC_HOME のサブディレクトリ、サブディレクトリのサブディレクトリ、 サブディレクトリのサブディレクトリのサ(以降略) に置いたHTML文書にも、上記の設定は適用されます(*ではなく**を使っているため)。 Cocoonコンポーネントなどの設定が$DOC_HOMEと全く同じ場合には、 それら各サブディレクトリにはsitemap.xmapファイルを置く必要はありません。 特定のパス以下の設定を変えたい場合には、 その設定だけを上書きする形でsitemap.xmapを置けば、 そのディレクトリから下に対しては上書きされた内容が有効になります。

 いちおう、$DOC_HOME/index.html です。別に変なところはないですね。 (変なところだらけじゃねーかというような矯激なツッコミは、認めません!)

<?xml version="1.0" encoding="EUC-JP"?>
<html>
<head>
<title>うらのホームページ</title>
<meta http-equiv="Content-type" content="text/html;charset=euc-jp"></meta>
</head>
<body>

<h1><font color="#700040">うらのホームページ</font></h1>

<p>
<a href="hobby/index.html">趣味のページ</a><br/>
<a href="haiku/index.html">俳句のページ</a><br/>
<a href="diary.html">日記</a><br/>
<a href="link.html">リンク</a><br/>
</p>

<p align="right">
<a href="mailto:uranom@nsnhnkmmkk.co.jp">メールはこちらへ</a>
</p>
</body>
</html>

 サイト構成は、次のようになっています。
C:/usr/javadeploy/cocoon/sitemap.xmap
                     |
                     +--- (Cocoon2のディレクトリ)
C:/usr/javadeloy/common/xml/sitemap.xmap
                         +- index.html
                         +- diary.html
                         +- link.html
                         |
                         +- hobby ----- index.html ほか
                         |
                         +- haiku ----- index.html ほか
この、hobby/index.htmlやhaiku/index.htmlは、親ディレクトリのsitemap.xmap に従って配信されます。 これは、どんな俳句を読んだとしても同様であります。 (聞いてない聞いてない)


画像ファイルの表示

 CocoonをただのWebサーバと思ってはなりませんぞ! なんと、GIF形式やJPEG形式の画像ファイルを表示するのにも設定が必要なのです。 って、Apacheよりも面倒やんけ! というところですが、物は考えよう。確かに、 HTMLのIMG SRC=タグで指定した通りのURLにある画像ファイルを表示するには、 sitemap.xmapに次のように書く必要があります:

<map:match pattern="**.gif">
  <map:read src="{0}" mime-type="image/gif"/>
</map:match>

が、任意のディレクトリに置いた画像ファイルを、 Cocoon得意の仮想的なURLで参照させることもでき、 これを工夫すればアイコンなどの画像ファイルの集中管理が可能になります。 samplesディレクトリのsitemap.xmapの例を載せてみます。

<map:match pattern="*/images/*.gif">
  <map:read src="common/resources/images/{2}.gif" mime-type="image/gif"/>
</map:match>

Baykit and Cocoon Top

(first uploaded 2003/01/25 last updated 2003/03/13, URANO398)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル