« iBatisでINSERT,UPDATE,DELETE | メイン | iBatisでINSERT(自動採番値の利用) »

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 script
PUBLIC "-//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ファイルをどのように生成するのかの参考にしてください。
詳しい解説等は次回にしたいと思います。

トラックバック

このエントリーのトラックバックURL:
http://www.taosoftware.co.jp/mt/mt-tb.cgi/13

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)