Tapestry JavaScript(1)

あまり情報として出てきませんが、TapestryではJavaScriptも簡単に扱えます。
HTMLテンプレートにJavaScriptを書くこともできますし(Tapestry3ではできませんでした)、特定のコンポーネントを使用するときに自動的にJavaScriptを生成して出力したり、動的に出力内容を変更したりといったことも可能です。
簡単なJavaScriptであれば、HTMLテンプレートに、<script language=”JavaScript” type=”text/javascript” src=”general.js” ></script>等記述し読み込ませる。もしくは、そのままJavaScriptを記述することもできますが、状態により出力するJavaScriptを変更したいときに、コンポーネントとセットにしたJavaScriptテンプレートを使用します。
Tapestry3とTapestry4ではJavaファイルの書き方が異なりますが、それ以外のファイルは共通です。
Tapestry4でのJavaScriptテンプレートの扱い方について説明したいと思います。
以下に記述するのは、TagListコンポーネント内でJavaScriptを生成し、TagListコンポーネントが使用されているページが表示した時に、ダイアログを表示するサンプルです。ダイアログに表示する文字列は、TagListコンポーネント内で決定しています。

サンプルコード

-WEB-INF/jwc/TagList.script

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE scriptPUBLIC "-//Apache Software Foundation//Tapestry Script Specification 3.0//EN""http://jakarta.apache.org/tapestry/dtd/Script_3_0.dtd"><script><body>var ${varName} = "${varValue}";    alert(${varName});</body></script>

JavaScriptファイルを用意します。スクリプト名は、Tapestryの標準のコンポーネントの命名規則に従い、コンポーネント名+ .script名としましたが、特にスクリプト名に制限はありません。
DOCTYPEは、Tapestry3, Tapestry4 両方共、Script_3_0.dtdを指定します。
-WEB-INF/jwc/TagList.jwc

<component-specification class="jp.co.taosoftware.tagraw.tape.jwcs.TagList" allow-body="no" allow-informal-parameters="no"><inject property="script" type="script" object="TagList.script"/></component-specification>

-TagList.java

/*** Inject* @return*/public abstract IScript getScript();protected void renderComponent(IMarkupWriter aWriter, IRequestCycle aCycle) {if(aCycle.isRewinding())return;PageRenderSupport pageRenderSupport = TapestryUtils.getPageRenderSupport(aCycle, this);Map symbols = new HashMap();symbols.put("varName","name");symbols.put("varValue","12345");getScript().execute(aCycle,pageRenderSupport,symbols);.....}

出力結果(HTML)

<html><body><script type="text/javascript"><!--var name = "12345";alert(name);// --></script>....</body></html>

出力結果(画面表示)
javascript1.png
2006/3/07加筆

上記の例では、Scriptテンプレートファイルの指定は、pageファイルで、<inject property=”script” type=”script” object=”TagList.script”/>のように、行いましたが、アノテーションを使用してjavaファイル内での使用も以下のように記述することで可能です。

@InjectScript("TagList.script")public abstract IScript getScript();

TagList.scriptの場所は、pageファイルでの指定では、pageファイルからの相対になりますが、上記の場合、Javaファイルからの相対となりますので、Javaファイルと同じディレクトリに配置する必要があります。
簡単なサンプルですが、何ができるのか?JavaScriptファイルをどのように生成するのかの参考にしてください。
詳しい解説等は次回にしたいと思います。


コメント

このブログの人気の投稿

島へ移住の話【炊飯】

ドローンプログラミング体験教室を伊豆大島の小学校でしてきました

情報処理安全確保支援士登録証のカード型が届きました。