アセットは動的に生成されるHTMLに関連してクライアントWebブラウザへダウンロードされる各種ファイルです。
ほとんどの場合、アセットは画像とスタイルシート、JavaScriptライブラリです。
通常のアセットは、(いつもの通りに作成されたWebアプリケーションWARファイル内の)Webアプリケーションコンテキストフォルダに格納されます。
Tapestryでは、Javaクラスファイルとともに クラスパス上 に格納してあるファイルもWebブラウザから見えるようにすることができます。
あなたのコードからは、Assetインターフェースのインスタンスとしてアセットを扱います。
コンポーネントはインジェクションによってアセットのことを知ります。 Injectアノテーションはリードオンリープロパティとしてコンポーネントにアセットをインジェクトします。 リソースへのパスはPathアノテーションを用いて指定します。
@Inject @Path("context:images/tapestry_banner.gif") private Asset banner;
アセットを置くことができるいくつかの 領域 があります。それらの領域はInjectアノテーションの値のプリフィックスで識別します。
プリフィックスが省略された場合、"classpath:" 領域内でのそのJavaクラスファイル自身からの相対パスとして解釈されます。 これはコンポーネントライブラリを作成するときによく使用されます。 コンポーネントライブラリではコンポーネントが使用するアセットをコンポーネント自身と共にJARファイルにパッケージします。
Tapestryの他の部分と違い、大文字小文字の違いは重要です。これは、TapestryがServlet APIやJavaランタイムに依存してファイルアクセスを行うためです。 これらのAPIはTapestryと異なり、大文字小文字を区別します。(Windowsのような)いくつかの オペレーティングシステム では大文字小文字を区別しないことに注意してください。 このようなオペレーティングシステムではエラーを隠してしまい、(Linuxのような大文字小文字を区別するオペレーティングシステムに)配備してからエラーが表面化するかもしれません。
(プリフィックスを省略した場合、)相対パスを使うことができます:
@Inject @Path("../edit.png") private Asset icon;
プリフィックスを省略しなければならないため、これが役に立つのはコンポーネントを再利用するためにライブラリにパッケージする場合だけです。
アノテーションの値の中の シンボル は展開されます。 そのため、シンボルを定義しパスの一部として参照することができます。例えば、"skin.root" という名前のシンボルを "context:/skins/basic" としてcontributeし、アセットを参照することができます:
@Inject @Path("${skin.root}/style.css") private Asset style;
skin.root シンボルをオーバーライドすると、そのシンボルの参照全てに作用します。
アセットはローカライズされます; Tapestryは、リクエストのロケールに対して適切なバリエーションのアセットファイルを探します。 前の例では、ドイツ語ユーザーには edit_de.png という名前のファイルが表示されるでしょう(もしそのファイルが存在すれば)。
例えばファイルシステムとデータベースのどちらにも格納しておくことができるアセットといった独自のアセット領域を作りたい場合、 新しい AssetFactory を定義しAssetSourceサービスにcontributeします。
通常、プライベートアセット(クラスパス上のアセット)は /assets/foo/bar/Baz.css のような形になります。 Baz.css は foo.bar Javaパッケージ内にあるファイルです。パッケージ名がパスに変換され、/assets/ 仮想フォルダの下に置かれます。
このパスを短くすることができます。ClasspathAssetAliasManagerのマップコンフィギュレーションに、論理フォルダ名をキーにし完全なクラスパスを値とした設定をします。 例えば、Tapestry自身が次の設定を行っています:
public static void contributeClasspathAssetAliasManager( MappedConfiguration<String, String> configuration) { configuration.add("tapestry", "org/apache/tapestry"); }
この設定によって、/org/apache/tapestry5/Foo.gif という(クラスパス内の)ファイルに対して /assets/tapestry5/Foo.gif というURLが生成されます。
重複したマッピングを行わないように気をつけてください。重複したマッピングは予期しない結果を引き起こします。