-ナナシナー(3)-HTMLテンプレートのJSPタグライブラリ化

HTMLテンプレートのJSPタグライブラリ化の考えがまとまりました。これはHTMLテンプレートの中にJSPタグを用いるこれまでの検討ではなく、HTMLテンプレートをそのまま他のHTMLテンプレート中で用いる部品とするための仕様です。WEBページのヘッダやフッタを共通的に定義したり、複数HTML要素を複合してひとつのコンポーネントとすることができるなどの利益があります。include命令と似てますが、アイディアの出所はもちろんTapestryのJWCフレームワークです。ナナシナーではこのTapestry JWCのアイディアを既存のJSPタグライブラリのフレームワーク上で実装しますので、ナナシナーに限らず、普通のJSPページの上でも利用できるようにします。というか、このテンプレートのコンポーネント化技術を作ります。HTMLページを動的に生成するのはひとつ大きなテンプレートコンポーネントが白紙HTMLに貼られているかのような考え方とするのです。プリプロセッサのマジックIDに、$contents$と$body$を定義します。

コンポーネントのテンプレート

<html>
  <head>
    <meta name="parameter" contents="greeting=java.lang.String"/>
  </head>
  <body>
    <span tagid="$contents$">
      <span tagid="header">デザイン確認のためのあいさつ</span>
      <span tagid="$body$">デザイン確認時用のダミー本文</span>
      <hr>
      <b>(c)copyrights #{parameter.year} HelloWorld,Inc. all rights reserved.</b>
    </span>
  </body>
</html>

こういったテンプレートを作っておきます。今回から、さすがに敬愛していてもJavaWebComponentというTapestryの提唱する固有名を用いた属性名を援用するのは気が引けるので、「tagid」としました。JWCではなく、JSP Tagだからです。
これをコンポーネントとするために、設定XMLは以下のように書いてください。

コンポーネントの設定XML

<page>
  <export name="border" url="http://www.foo.co.jp/taglib"/>
  <parameter name="name" type="java.lang.String"/>
  <parameter name="year" type="int"/>
  <taglib prefix="c" url="http://java.sun.com/jstl/core">
  <component name="header" type="c:out">
    <binding name="header" value="#{parameter.name}さん#{parameter.greeting}"
  </component>
</page>

exportおよびparameterをHTMLにインプリシットする際には、やはりmetaタグを用います。設定XMLにもかけるし、テンプレートにも書けます。例ではgreetingパラメータだけテンプレートに書いてます(おそらくこういう風にテンプレートとXMLと両方にまたがって書かないでしょうね。あくまで例です)。XMLDTD的な問題やマジックネームはこの後によく考えるとして、使うほうは以下の感じ。

アプリケーションのテンプレート

<html>
  <head>
    <meta name="taglib" contents="my=http://www.foo.co.jp/taglib"/>
  </head>
  <body>
    <span tagid="my:border" name="#{user.name}" greedint="こんにちは" year="2004">
      へべれけさん飲みすぎですよ
    </span>
      <br>
      本文をここにかきます。
      <br>
    </span>
  </body>
</html>

プレビューすると以下のとおりです。

アプリケーションのテンプレートプレビュー

へべれけさん飲みすぎですよ

本文をここにかきます。

しかしナナシナーServletがHTTPリクエストにレスポンスすると

アプリケーションの表示イメージ

まさたかさんこんにちは

本文をここにかきます。

――――――――――――――――――――――――――――
(c)copyrights 2004 HelloWorld,Inc. all rights reserved.

ところで舌の根も乾かないうちに仕様を変えますが、ボディ部分など、どこでも式言語を使えるようにしたいと思います。例では、#{year}がそれです。わざわざこれだけのためにspanを書くのがめんどくさいから。もちろん、テンプレートを直接ブラウザで見てデザインを確認する時に見えちゃいますが、それはいいでしょう。嫌ならタグで囲うと。
さらに、コンポーネントを直接WEBコンテナ上に配置して表示させると、$contents$と&body&を有効にしないでうごかします。パラメータは、リクエストパラメータでぶち込むことにします(http://localhost:8080/nanashi/border.html?name=はらへり&greeting=テストご苦労様です&year=1234)。すると、以下のように見えます。

コンポーネントデバッグ動作させたとき

はらへりさんテストご苦労様です
楽しくなってきたでしょ?
――――――――――――――――――――――――――――
(c)copyrights 1234 HelloWorld,Inc. all rights reserved.

コンポーネントはAntタスクもしくはEclipseのExportで標準的なJSPタグライブラリにします。その際は$contents$と&body&を有効にしたソースコードジェネレーションを行って、TLDも生成します。できたコンポーネントは普通のJSPに貼っても使えます。これは、どうしてもナナシナーを使うことが許されない、舶来原理主義な上司にJSPを書かされているときの救いの手になるといいなと思って考えた機能です。がんばってナナシナータグライブラリのランタイムJarとテンプレートHTMLのコンパイル結果が入ったJarは目立たない名前でWEB-INF\libにこっそりひそませてください。優しく易しく。