はじめに
前回は、関数型Webアプリケーションフレームワークというコンセプトで構築された、ScalaのWebアプリケーションフレームワーク「Lift」の概要を紹介しました。
第2回となる本稿では、LiftにおけるView層であるテンプレート、Snippetについてサンプルを用いて解説したいと思います。
対象読者
- Javaは知っているが、Scalaも学んでみたいと思っている方
- ScalaでのWebアプリケーション開発に興味がある方
必要な環境
最低動作環境
- J2SE 5.0 JDK
推奨環境
- J2SE 6.0 JDK
- Apache Maven 2.10
- Scala 2.7.5
LiftのViewはSnippet+Template
LiftのView層は、基本的にテンプレートとSnippetによって構成されています。開発者は、HTMLページのテンプレートを用意し、動的な出力を行う部分をSnippetとして切り出すことで、処理とレイアウトを分離できます。
図1は、テンプレートとSnippetの関係を表したものです。
テンプレートとSnippetはXMLタグで結びつき、Snippetはテンプレートの内容を動的な出力で置き換えます。ただ、これだけではJSPのカスタムタグと同じではないかと、思われる方もいらっしゃるかもしれません。LiftのテンプレートとSnippetは、Scalaの言語仕様を生かして、JSPカスタムタグよりはるかに柔軟で簡単に記述することができます。また、本稿の後半で説明する、Function Mapping(動的なイベント処理)という機能を利用して、ブラウザ上で発生したイベントをダイレクトにScalaで記述された関数で処理されることができます。
以下、テンプレートとSnippetについて解説します。
テンプレート(XHTML)
ブラウザへの出力を生成するための、XHTML形式のテンプレートファイルです。従来のMVC型のWebアプリケーションフレームワークと異なり、Liftではテンプレートをレンダリングする過程で、テンプレート内に記述されたSnippetを呼び出すことで動的な出力を生成します。
テンプレートファイルの拡張子は「.html」で、プロジェクトディレクトリの「src/main/webApp」以下に配置します。
テンプレート内では、Snippetによって動的な出力を生成したい箇所をXMLタグで指定します。Snippetには、Liftに標準で組み込まれているビルトインSnippetと、開発者が作成するSnippetの2種類があります。ビルトインSnippetは、レイアウトの指定、メニューの自動生成やエラーメッセージの表示、CSSの読み込みなどよく利用する処理があらかじめ用意されています。
リスト1は、Formを生成するテンプレートの例です。例では、ビルトインSnippetである<lift:surround>
タグでレイアウトを指定し、<lift:SampleSnipet.hello>
タグで独自に用意したSnippetを呼び出しています。
<!-- lift:surroundタグはレイアウトを指定する --> <lift:surround with="default" at="content"> *4 <h2>Sampleのフォーム</h2> <!-- Snippetの指定 lift:"Snippetクラス名"."Snippetの関数名" --> <lift:SampleSnipet.hello form="POST"> *1 <greeting:name/> *2 <br/> <greeting:submit/> *3 </lift:SampleSnipet.hello> </lift:surround>
Snippetの指定方法
リスト1中の*1の部分が、Snippetを指定するタグです。Snippetを指定するタグは、以下の3つの指定方法があります。
(1)<lift:snippet type="Snippetクラス名:Snippetの関数名">
<lift:snippet>
タグの属性「type
」に、「Snippetクラス名:Snippetの関数名」を指定します。
<lift:snippet type="SampleSnipet:hello"/>
(2)<lift:"Snippetクラス名"."Snippetの関数名"/>
名前空間をliftにして、「Snippetクラス名」.「Snippetの関数名」を指定します。リスト2のような書式になります。*1の例ですと、SampleSnippet
クラスのhello
関数が呼び出されます。
<lift:"Snippetクラス名"."Snippetの関数名"> ... </lift:"Snippetクラス名"."Snippetの関数名">
(3)<lift:"Snippetクラス名" />
名前空間をliftにして、「Snippetクラス名」を指定すると、指定したSnippetクラスのrender関数が呼び出されます。
<lift:SampleSnipet />