<?xml version="1.0" encoding="Shift_JIS" ?>

<document>

 <properties>
  <title>The Velocity JSP Tag Library</title>
  <author email="geirm@apache.org">Geir Magnusson Jr.</author>
  <translator>熊坂祐二</translator>
  <translator>高橋達男</translator>
  <original>veltag</original>
 </properties>

<body>

<section name="Contents">

<ol>
<li>
<a href="#So You Have To Use JSP...">JSPを使わなくてはならないなら・・・</a>
<ul>
  <li>
    <a href="#What Are The Advantages">利点は何?</a>
  </li>
</ul>
</li>

<li>
 <a href="#Using The Velocity Taglib">Velocity タグライブラリを使う</a>
 <ul>
  <li>
    <a href="#Automatic Scope Access">自動スコープアクセス</a>
  </li>
  <li>
    <a href="#Strict Scope Access">厳密スコープアクセス</a>
  </li>
</ul>
</li>

<li>
<a href="#Building The Velocity Taglib">Velocity タグライブラリのビルド</a>
<ul>
  <li>
    <a href="#JJAR build">JJARを使ったビルド</a>
  </li>
  <li>
    <a href="#nonJJAR build">JJARを使わない昔ながらのビルド</a>
  </li>
</ul>
</li>

<li>
<a href="#Configuration">設定</a>
</li>
</ol>

</section>

<section name="So You Have To Use JSP..." alias="JSPを使わなくてはならないなら・・・">

<p>
時には、選択できないこともあります。技術の決定は、
とても多くの要因に基づいて行われ、その要因は、ネットワークにもとづく外部的なもの
(「彼らが<b>使っている</b>から・・・」)から
過去の資産への配慮 (「彼らが<b>使った</b>から・・・」)まで様々です。
</p>

<p>
JSP を使用せざるを得ない人のために、シンプルな制御指示子や Java
オブジェクトモデルとの強力な結びつきといった Velocity の利点を生かせる
JSP タグライブラリを提供しています。
JSP で Velocity を使うのはこんなに簡単です。
</p>

<source><![CDATA[
<%@ taglib uri="/WEB-INF/veltag.tld" prefix="vel" %>

<html>
<head>
  <title> Velocity! </title>
</head>

<jsp:useBean id="mybean"  class="GeirBean" />

<body>
    <vel:velocity strictaccess="true">

         #set($mybean = $scopetool.getPageScope("mybean"))

         #if(true)
            this is true!
         #end

         <br>

         $mybean.string

         <br>

        #foreach($item in $mybean.array) 
            $item <br>
        #end

    </vel:velocity>
</body>
</html>
]]></source>

<p>
すごく簡単でしょ?
</p>

<a name="What Are The Advantages"><strong>利点は何?</strong></a>

<p>
この話題にとりくむ際に最初に聞かれる質問は、「「純粋な」Velocity と比べて、
どんな利点があるのか？」といったものです。
一般に、Velocity のみのシステムから、JSP ページに Velocity を埋め込んだ
JSP システムに移行しなければならない理由はほとんどありません。
もしそうしたいと思うのなら、その唯一の理由は、
既存の JSP タグライブラリを使いたいのにソースコードがないからか、
ソースはあるがタグライブラリのコア機能のクラスに手を入れたくないからでしょう。
そうでないなら、こうしたコアのクラスをコンテキストに入れて、
Velocity テンプレート内で直接アクセスすれば済むからです。
</p>

<p>
したがって、このアプローチが役に立つのは、JSP が中心的な環境で、
既存のアプリケーションが JSP で書かれていて、機能を追加・変更したい場合です。
Velocity は以下のような機能を提供します。
</p>

<ul>
<li> 
タグライブラリのシェルを作成しなくても、Java オブジェクトに簡単にアクセスできます。
public インタフェースに public メソッドがあれば、それをスコープにそのまま入れて、
直接アクセスできます（あるいは、自分のクラスのインスタンスを生成するツールも使えます)。
</li>
<li> 
複雑な Java オブジェクトに簡単にアクセスできます。
JSP では $foo.bar( $thing ).getIterator().hasNext() といった、
任意の呼び出し連鎖には簡単にアクセスできません。
</li>
<li>
好みの問題ですが、Velocity の制御指示子 (#if()、#else()、#elseif()、#foreach()) を、
同じ機能のタグライブラリよりも好む人もいます。古代ローマの諺にあるように、
「<i>人の好みについては議論すべきではありません
(De gustibus non est disputandum)</i>」。
</li>
<li> 
複雑な Java オブジェクトから JSP への橋渡しが簡単です -- たとえば、
実行時にオブジェクトを動的に選択/作成して JSP
の他の部分でアクセスできるようにスコープにつっこみたい場合は、こんな風にできます。
     <pre>
         &lt;vel:velocity strictaccess="true"&gt;
             #set($reqbean = $scopetool.getRequestScope("beaninrequest"))
             #set($newthing = $reqbean.getThing().makeBlue("azure"))
             $request.getSession().setAttribute("bluething", $newthing)
         &lt;/vel:velocity&gt;
     </pre>
まあこんな感じです :)
</li>
<li>
何がなくとも、Velocimacro があります。
</li>

</ul>

</section>

<section name="Using The Velocity Taglib" alias="Velocity タグライブラリを使う">

<p>
Velocity と JSP をまとめる際の最大の問題は、
スコープとBeanアクセスに関する「インピーダンスマッチング」です。
JSP での基本的なデータ格納メカニズムである「スコープ」は、ベースにある Servlet API
から派生した考え方で、データオブジェクトが、
ページ／リクエスト／セッション／アプリケーション内で保存・取得されます。
Velocity は「コンテキスト」と呼ばれる非階層的な仕組みでデータを管理しており、
テンプレートでアクセス可能なデータの管理は、コントローラである
Servlet など、ビュー以外のコードが行うことを前提としています。
</p>

<p>
したがって、Velocity タグライブラリを使って JSP 内で簡単にデータアクセスするために、
2種類の方法が提供されています。自動アクセスと厳密アクセスという2種類の方法で、
2通りの異なるやり方でのデータの管理やアクセスが可能となっています。
併用も可能です。

</p>

<a name="Automatic Scope Access"><strong>自動スコープアクセス</strong></a>

<p>
1つ目のやり方である、自動アクセスの方が便利です。
(VTL「リファレンス」を通して) オブジェクトが参照される場合、
同じ ID のオブジェクトを見つけるためにスコープが検索されます。
スコープは以下の順序で検索されます
</p>

<ol>
<li> ページスコープ </li>
<li> リクエストスコープ </li>
<li> セッションスコープ </li>
<li> アプリケーションスコープ </li>
</ol>

<p> 
自動スコープアクセスは、デフォルトで使えます。
自動スコープアクセスを使うには、名前で Bean にアクセスするだけです。
例えば、
</p>

<source><![CDATA[
<!-- ページスコープに Bean を設定 -->
<jsp:useBean id="mybean"  class="GeirBean" />

 <vel:velocity>

    <!-- IDでアクセスするだけで、コンテキストは -->
    <!-- 自動的にオブジェクトを見つけてくれます -->

    #foreach($item in $mybean.array) 
       $item <br>
    #end

</vel:velocity>
]]></source>

<p>
自動スコープアクセスの方が簡単ですが、既存のアプリケーションと統合するためには、
もう一つのアクセスモードである厳密スコープアクセスを使うか、
あるいは両者を組み合わせて使う必要があるかもしれません。
</p>

<a name="Strict Scope Access"><strong>厳密スコープアクセス</strong></a>
  <p>
自動スコープアクセスの代替手段（または追加手段）が、<i>厳密スコープアクセス</i>と呼ばれているものです。
厳密スコープアクセスとはどういうことかというと、Velocity
コンテキストがスコープを検索してくれない 
-- テンプレートで使用するために用意されている ScopeTool を使って、
直接オブジェクトを取り出さなければならない -- ということです。
これは通常の JSP により近いモデルで、
デザイナはオブジェクトがどのスコープに保存されているかを把握しなければなりません。
  </p>

   <p>
例えば、以下の JSP のコードでは、ScopeTool
を使ってリクエストスコープ内のオブジェクトにアクセスし、
オブジェクトを Velocity コンテキストに追加する方法を示しています。
<code>&lt;vel:velocity strictaccess="true"&gt;</code> タグで、
<code>strictaccess</code> プロパティが true に設定されているのに注目してください。
こうすれば Veltag タグライブラリが自動スコープ検索を行わないようになります。
注意：<code>strictaccess</code> をオフのままにしておき (または false に設定し)、
その上でどこからのオブジェクトかを気にしないですむように ScopeTool を使うことで、
2つのモードの混在も可能です。
  </p>

<source><![CDATA[
<jsp:useBean id="beaninrequest" class="GeirBean" scope="request" />

<vel:velocity strictaccess="true">

         #set($reqbean = $scopetool.getRequestScope("beaninrequest"))

         $reqbean.string

         <br>

        #foreach($item in $reqbean.array) 
            $item <br>
        #end

</vel:velocity>
]]></source>

<p>
こちらも、かなり簡単です。
</p>

</section>

<section name="Building The Velocity Taglib" alias="Velocity タグライブラリのビルド">

<p>
Velocity ラグライブラリを使う場合、メインの Velocity の
JAR ファイルにはまだ含まれていないので、ビルドする必要があります。
Jakarta での伝統に従い、ビルドを非常に簡単にしました。
このプロジェクトのコードは、配布の contrib セクションの
<code>/contrib/temporary/veltag</code> の下
[<a href="http://cvs.apache.org/viewcvs/jakarta-velocity/contrib/temporary/veltag/">
http://cvs.apache.org/viewcvs/jakarta-velocity/contrib/temporary/veltag/</a>]
に置いてあります。一時的なディレクトリの下にあるのは、このパッケージは
<a href="http://jakarta.apache.org/taglibs/">Jakarta Taglibs</a>
プロジェクトに受け入れられることを希望しているからです。
</p>

<a name="JJAR build"><strong>JJARを使う簡単な方法</strong></a>

<p>
Veltag タグライブラリは、新しい<b>実験的な</b> Jar ファイル管理ツールである
<em>JJAR</em> (Jakarta Jar Archive &amp; Repository)
を使ってビルドできます。このツールは、タグライブラリを簡単にビルドできるように、
依存するライブラリを見つけて取り出してくれます。
</p>

<p>
 <i>
注意：JJAR は現在開発中です -- JJAR ベースのビルドが動作するように、
あらゆる努力をしていますが、動作しない可能性もあります。
その場合には、後で示す<a href="#nonJJAR build">一般的な方法</a>で行ってください。
</i>
</p>

<p>
JJAR でビルドする手順は以下の通りです。
</p>

<ol>
<li> 
  すぐれたビルドツールである、<a href="http://ant.apache.org/">Ant</a>
  がインストールされていなければなりません。
</li>
<li>
  CVS または夜間スナップショットから Velocity 配布を取得します。
</li>
<li>
  Velocity 配布の <code>/contrib/temporary/veltag</code> ディレクトリへ移動します。
</li>
<li>
  以下のようにタイプします。
    <pre>
      $ ant getjars
    </pre>
  こうすれば、JJAR を取得し、そのJJAR を使って、
  本日の Veltag の依存ライブラリを取得できます。
</li>
<li>
  以下のようにタイプします。
     <pre>
      $ant jar
     </pre>
  これで、veltag-XX.jar（XX = 現在のバージョン）がビルドされます。
</li>
</ol>

<p>
以上です。かなり簡単です。
</p>

<a name="nonJJAR build"><strong>JJARが不安な人のための方法</strong></a>

<p>
JJAR ベースでのビルドがうまくいかなかった場合や、
JAR ファイルを探して回るのが好きな人は、
以下の手順で Veltag をビルドして下さい。
</p>

<p>
ビルドで必要な手順は以下の通りです。
</p>

<ul>
<li> 
  すぐれたビルドツールである、<a href="http://ant.apache.org/">Ant</a>
  がインストールされていなければなりません。
</li>
<li>
Servlet API の JAR ファイルが必要です。Servlet 2.2 API は<a
href="http://jakarta.apache.org/builds/jakarta-tomcat/release/v3.3.1a/bin/">ここ</a> 
から、Servlet 2.3 APIは<a
href="http://cvs.apache.org/builds/jakarta-servletapi-4/nightly/">ここ</a>
からも取得できます。
注意: JSPユーザであれば、使用しているサーブレットエンジンに含まれています。
[訳注：例えば Tomcat 4であれば、$CATALINA_HOME/common/lib/servlet.jar がそれです。]
</li>
<li> 
velocity.jar。これはもちろん、
  <a href="http://jakarta.apache.org/velocity/">ここ</a>で見つけることができます。
</li>
<li> 
ビルドスクリプトは、Servlet と Velocity の JAR ファイルを
<code>/contrib/temporary/veltag/lib/</code>
ディレクトリで見つけることを想定しています。
これらのファイルが他の場所にあっても、ビルドスクリプトの修正は簡単です。
<code>/contrib/temporary/veltag/build.xml</code> ファイルにある
「servlet.home」と「velocity.home」を探して[指定を変更して]ください。
</li>
<li>
ここまでがすべて完了したら、
Velocity 配布の <code>/contrib/temporary/veltag</code> に移動して
「ant」とタイプします。JAR ファイルがビルドされます。
</li>
</ul>
</section>

<section name="Configuration" alias="設定">

<p>
このタグライブラリを使うのは非常に簡単です。以下の説明は、
<a href="http://jakarta.apache.org/tomcat/">Tomcat</a> のような
JSP をサポートする Servlet コンテナをセットアップしており、
簡単な JSP ページを書いて表示させられるだけの知識があることを
前提としています。また、すべてのディレクトリ参照は、Velocity 配布ではなく、
veltag プロジェクトのルートの相対パスです。
</p>

<p>
Velocity Taglib をテストするには
</p>

<blockquote>
   veltag-XX.jar を Web アプリケーションの
   <code>WEB-INF/lib</code>ディレクトリにコピーしてください。
   (XXは、現在のバージョン番号です)
</blockquote>
<blockquote>
   タグライブラリ記述子のサンプルである<code>/examples/veltag.tld</code> を
   あなたのWebアプリケーションの WEB-INF にコピーしてください。
</blockquote>
<blockquote>
   最後に、以下の内容を web.xml ファイル内の &lt;webapp&gt;
   セクションに追加してください。
   <pre>
     &lt;taglib&gt;
       &lt;taglib-uri&gt;http://jakarta.apache.org/taglibs/veltag-1.0&lt;/taglib-uri&gt;
       &lt;taglib-location&gt;/WEB-INF/veltag.tld&lt;/taglib-location&gt;
     &lt;/taglib&gt;
   </pre>
</blockquote>

<p>
JSP サンプルを使いたいので場合は、上記に加えて、
<code>examples/SimpleBean.java</code> をコンパイルし、
生成される <code>SimpleBean.class</code> を Web アプリケーションの
<code>WEB-INF/classes</code> ディレクトリ内に置く必要があります。
</p>

<p>
その上で、<code>examples/</code> にある JSP のサンプルを試してください。
この JSP を Web アプリケーションのルートにコピーし、ブラウザで見ます。
楽しんでみてください。
</p>

<p>
コメントや質問、修正や貢献については、
直接 <a href="mailto:geirm@apache.org?SUBJECT=Veltag">Geir Magnusson Jr.</a>
または Velocity ユーザ メーリングリストにしてください。
Velocity メーリングリストに参加するには、
<a href="http://jakarta.apache.org/site/mail.html">このページ</a>
を読み、ページの指示に最後まで従ってください。
</p>

<p>
注意: このコードは、公式の Velocity 配布の一部ではありません。
[訳注：つまり、通常ダウンロードする .zip ファイルや .tar.gz
ファイルには含まれていません。上にも書いたとおり、コードは<a
href="http://cvs.apache.org/viewcvs/jakarta-velocity/contrib/temporary/veltag/">http://cvs.apache.org/viewcvs/jakarta-velocity/contrib/temporary/veltag/</a>
にあります。]
</p>

</section>

</body>
</document>

