My favorites | Sign in
t-2
Project Home Downloads Wiki Issues Source
READ-ONLY: This project has been archived. For more information see this post.
Search
for
ZPT_Integration  

ja , en
Updated Jul 31, 2009 by shinpei.ohtani@gmail.com

TODO : translate.

T2でZPTを使う

T2Framework(以下T2)はビューテンプレートエンジンと独立しているため、ビューテンプレートとしてJSP以外のものも利用可能です。ここではT2のビューテンプレートとしてZPT(Zope Page Template)を使うための方法を説明します。

ZPTエンジン

ZPTはZope Page Templateの略で、もともとはPythonで書かれたWebアプリケーションサーバ「ZOPE」のために考案されたビューテンプレート言語です。今では様々な言語用のエンジンが開発されています。

ここではThe Skirnir Projectで開発されているタグベーステンプレートエンジン構築フレームワーク「Freyja(ふれいや)」にサンプル実装として含まれているZPTエンジンを利用します。以下FreyjaのZPTエンジンのことを単に「Freyja」と表記します。

FreyjaはZPT仕様をベースとした実装ですが、若干の拡張や変更が加えられています。FreyjaのZPTテンプレートの書き方については、以下のドキュメントが参考になるでしょう。

  • Zope Page Templateリファレンス - オリジナルのZPTのリファレンスの日本語訳です。
  • YmirでのZPTテンプレート - YmirでのZPTの記述方法についてのドキュメントです。FreyjaにおけるオリジナルのZPTとの相違点がまとめられています。(ドキュメント中「Ymir拡張」となっているものは利用不可です。)

ZPTの基本

ZPTではタグに独自の属性を付与することで出力内容の制御を行ないます。

ZPTが提供する独自属性は以下の8つです。

  • tal:define
  • tal:condition
  • tal:repeat
  • tal:content
  • tal:replace
  • tal:attributes
  • tal:omit-tag
  • tal:on-error

まずは値を出力してみましょう。以下のコードが処理されてからZPTエンジンに処理が委譲されたとします。

アクションメソッド:

Navigation index(HttpServletRequest request) {
    request.setAttribute("message", "Hello, ZPT!");
    return PassThrough.pass();
}

ZPTテンプレート:

<p tal:content="message">ここにメッセージが入ります</p>

tal:contentは式の評価結果でタグのボディを置き換えます。従って、最終的なHTMLは

<p>Hello, ZPT!</p>

になります。

tal:contentの代わりにtal:replaceを使うと、タグごと置き換えることができます。

ZPTテンプレート:

<p tal:replace="message">ここにメッセージが入ります</p>

出力:

Hello, ZPT!

タグのボディだけを残してタグだけ削除したい場合はtal:omit-tagを使います。

アクションメソッド:

Navigation index(HttpServletRequest request) {
    request.setAttribute("weak", Boolean.TRUE);
    return PassThrough.pass();
}

ZPTテンプレート:

<strong tal:omit-tag="weak">注意して下さい。</strong>

出力:

注意して下さい。

tal:omit-tagは、式の値が真である場合にボディを残してタグを除去します。偽の場合は何もしません。なお「tal:omit-tag=""」と書くと式の値は真とみなされタグが除去されます。

タグ全体の表示非表示を制御するにはtal:conditionを使います。

アクションメソッド:

Navigation index(HttpServletRequest request) {
    request.setAttribute("displayMessage1", Boolean.TRUE);
    request.setAttribute("displayMessage2", Boolean.FALSE);
    return PassThrough.pass();
}

ZPTテンプレート:

<p tal:condition="displayMessage1">メッセージ1</p>
<p tal:condition="displayMessage2">メッセージ2</p>

出力:

<p>メッセージ1</p>

tal:conditionは、式の値が偽である場合にタグ全体を除去します。真の場合は何もしません。なお「tal:condition=""」と書くと式の値は偽とみなされタグ全体が除去されます([Freyja拡張])。

タグの属性を動的に変更したい場合はtal:attributesを使います。

アクションメソッド:

Navigation index(HttpServletRequest request) {
    request.setAttribute("url", "http://replaced.url");
    return PassThrough.pass();
}

ZPTテンプレート:

<a tal:attributes="href url" href="http://original.url">リンク</a>

出力:

<a href="http://replaced.url">リンク</a>

式は「属性名 属性の値を表すTAL式」(TAL式については後述)というように、空白で属性名とTAL式を区切って指定します。複数の属性を置き換える場合は「;」で区切って下さい。

TAL式の評価結果がnullの場合はhref属性が削除されます。評価結果がdefault(net.skirnir.freyja.zpt.Default.instanceオブジェクト)である場合は元々のhref属性が残されます。

コレクションの中身を繰り返し出力するにはtal:repeatを使います。

アクションメソッド:

Navigation index(HttpServletRequest request) {
    request.setAttribute("messages", new String[]{ "メッセージ1", "メッセージ2" });
    return PassThrough.pass();
}

ZPTテンプレート:

<p tal:repeat="message messages" tal:content="message">ここにメッセージが入ります</p>

出力:

<p>メッセージ1</p><p>メッセージ2</p>

式は「一時変数名 コレクションを表すTAL式」というように、空白で一時変数名とTAL式を区切って指定します。

TAL式の評価結果に一時的な名前をつけるにはtal:defineを使います。

アクションメソッド:

Navigation index(HttpServletRequest request) {
    Map<String, String> map = new HashMap<String, String>();
    map.put("key", "value");
    request.setAttribute("map", map);
    return PassThrough.pass();
}

ZPTテンプレート:

<div tal:define="value map/key">
  <p tal:content="value">ここに値が入ります</p>
</div>

出力:

<div>
  <p>value</p>
</div>

式は「変数名 TAL式」というように、空白で変数名とTAL式を区切って指定します。定義した変数はtal:defineが書かれているタグとその内側でのみ有効です。

より詳しい使い方については、Zope Page Templateリファレンスなどを参照して下さい。

TAL式

TAL式はTemplate Attribute Language Expressionのことで、ZPTの属性の中に記述することのできる評価式のことです。TAL式を記述するための構文をTALES(Template Attribute Language Expression Syntax)と言います。

TALESの詳細はTALES Specification 1.3を見ていただくとして、ここではTAL式の基本についてのみ説明します。

TAL式は通常次のように記述します。

aaa/bbb

これは、現在のスコープに登録されている「aaa」という名前を持つオブジェクトの、「bbb」というプロパティを表します。スコープとはオブジェクトが保存されている入れ物のようなものです。TAL式の中では「/」を使ってプロパティへの参照を表します。「aaa/bbb」という式は、Javaで言うところの「aaa.getBbb()」と同じです。

プロパティ参照は入れ子で行なうこともできます。

aaa/bbb/ccc

これはJavaで言うところの「aaa.getBbb().getCcc()」と同じです。

先頭に「タイプ名:」をつけると式のタイプを指定することができます。実は、上で説明した「/」区切りの式は「path」というタイプを持つ式で「path式」と呼ばれるものです。タイプ名を省略するとpath式とみなされます。

主な式のタイプには以下のものがあります。

  • path
  • exists
  • not
  • string

exists式は「exists:TAL式」の形を取り、TAL式の評価結果がnullでない場合にBoolean.TRUEとなります。nullの場合はBoolean.FALSEとなります。

not式は「not:TAL式」の形を取り、TAL式の評価結果の真偽値を反転します。TAL式の評価結果が真であればBoolean.FALSEとなり、偽であればBoolean.TRUEとなります。

string式は「string:文字列」の形を取り、単に文字列を値として返します。ただし文字列中に「${TAL式}」という記述が含まれている場合はその部分をTAL式の評価結果で置き換えます。例えばmessageの値が"ZPT"の時、「string:Hello, ${message}!」の評価結果は「Hello, ZPT!」となります。

式は「|」で連結することができます。「|」で連結された式は左から評価され、真である最初の値が最終的な評価結果となります。偽であった場合は次の部分式が評価され、最後まで偽であった場合は最後の部分式の値が評価結果となります。例えば「1 | true | false」の評価結果は「1」、「 0 | false | true」の評価結果は「true」となります。

真偽値ではなく、値がnullでない最初のものを返したい場合は「|」の代わりに「||」を使って下さい([Freyja拡張])。例えば「0 || false || true」の評価結果は「0」となります。

真偽値

TAL式では次のものが偽とみなされます。それ以外は真とみなされます。

  • null
  • Boolean.FALSE
  • Numberインタフェースの実装クラスで値が「0」のもの
  • 配列クラスで長さが0のもの
  • Collectionインタフェースの実装クラスで空のもの
  • Enumerationインタフェースの実装クラスでhasMoreElements()がfalseであるもの
  • Iteratorインタフェースの実装クラスでhasNext()がfalseであるもの
  • toString()した結果の長さが0であるもの

T2でZPTエンジンを使う

T2でZPTエンジンを使うには、web.xmlに以下のエントリを追加して下さい。

  <servlet>
    <servlet-name>zpt</servlet-name>
    <servlet-class>
      net.skirnir.freyja.webapp.FreyjaServlet
    </servlet-class>
    <init-param>
      <param-name>tagEvaluator</param-name>
      <param-value>
        net.skirnir.freyja.zpt.MetalTagEvaluator
      </param-value>
    </init-param>
    <init-param>
      <param-name>expressionEvaluator</param-name>
      <param-value>
        net.skirnir.freyja.zpt.webapp.ServletTalesExpressionEvaluator
      </param-value>
    </init-param>
    <init-param>
      <param-name>templateRoot</param-name>
      <param-value></param-value>
    </init-param>
    <init-param>
      <param-name>pageEncoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>requestEncoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>responseEncoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>contentType</param-name>
      <param-value>text/html;charset=UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>useShiftJISInsteadOfWindows31J</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>
        tagEvaluator.render.overwrite-content-type-meta-tag
      </param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>transcriptVariablesToRequest</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>variableResolverFactory</param-name>
      <param-value></param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>zpt</servlet-name>
    <url-pattern>*.zpt</url-pattern>
  </servlet-mapping>

この例では「.zpt」というパスにZPTエンジンを結び付けていますが、必要に応じて変更しても構いません。Transitive Path Strategyを採用する場合は「.html」というパスにZPTエンジンを結びつけると良いかもしれません。

次に、アプリケーションのクラスパスにFreyjaのライブラリを追加します。Maven2をお使いの場合は、以下の記述をpom.xmlに追加して下さい。

  <repositories>
    <repository>
      <id>maven.seasar.org</id>
      <name>The Seasar Foundation Maven2 Repository</name>
      <url>http://maven.seasar.org/maven2</url>
    </repository>
    <repository>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
      <id>snapshot.maven.seasar.org</id>
      <name>The Seasar Foundation Maven2 Snapshot Repository</name>
      <url>http://maven.seasar.org/maven2-snapshot</url>
    </repository>
  </repositories>
<dependency>
  <groupId>net.skirnir.freyja</groupId>
  <artifactId>freyja</artifactId>
  <version>1.0.9</version>
</dependency>

上記の設定だけでも問題なくZPTを利用できますが、zpt-toolというモジュールを使用すると便利です。zpt-toolではT2とZPTを組み合わせる際に便利になるような様々な道具を提供する予定です。

zpt-toolを利用する場合は以下の記述をアプリケーションプロジェクトのpom.xmlに追加して下さい([2008-09-04] zpt-toolは現状ではまだMaven2リポジトリにdeployされていません)。

<dependency>
  <groupId>org.t2framework.plugins</groupId>
  <artifactId>zpt-tool_0.3</artifactId>
  <version>0.1</version>
</dependency>

また、DIコンテナのエントリにZptPluginのエントリを追加して下さい。Seasar2.3をお使いの場合は以下のようになります。

<component class="org.t2framework.plugins.zpt.ZptPlugin" />

現状のzpt-toolの機能は以下のとおりです。

  • ZPT中のTAL式に「self」と書くことでPageオブジェクトを参照することができます。

Powered by Google Project Hosting