2.0からScalaに対応したWebアプリ開発の人気軽量フレームワーク「Play」について解説し、Webアプリの作り方を紹介する入門連載。今回は、Play 2.xでビューを表現するための機能「Scala Templates」と、フォームを用いてデータをやりとりする方法を解説します。
前回の記事「Play 2.1にアップグレードしてコントローラを使いこなす」では、コントローラのいろいろな使い方、さらにセッションやフラッシュスコープの使用方法を紹介しました。
今回はPlay 2.xでビューを表現するための機能「Scala Templates」と、フォームを用いてデータをやりとりする方法を紹介します。
Java EEのアプリケーションサーバでJSPが使えるように、Play 2.xでは、「Scala Templates」というテンプレートエンジンをバンドルしています。これはASP.NETの「Razor」というビュー・エンジンに影響を受けて作成されたとのことです。
JSPはHTMLとJavaのコードを組み合わせて記述をしますが、Scala Templatesの場合はHTMLとScalaのコードを組み合わせて記述し、「scala.html」という拡張子を持ちます。このファイルはコンパイルされ、エラーはコンパイル時に確認できます。
では、Scala Templatesの特徴について解説していきましょう。
Scalaが持つ機能とライブラリを使えば、HTMLを生成可能ですが、現実的ではありません(JavaサーブレットでHTML生成をするための処理を記述することを想像してみてください)。
デザイナがScalaファイルを修正することも難しいでしょう。それに引き換え、Scala Templatesは、HTMLをベースにしてScalaのコードを組み合わせているので、シンプルに記述できますし、いくつかのルールを覚えればデザイナが修正するのも容易です。
Scala Templatesでは、HTMLの断片を定義して任意の個所で再利用できます。よく使用するテンプレートをあらかじめ定義しておき、複数のページでそのテンプレートを使い回すことが可能です。
このテンプレート機能を使えば、プレゼンテーションロジックとビジネスロジックを分離できます。
こうすることで、メンテナンスおよびリファクタリングが容易になります。テンプレート機能については、この後の章でサンプルプログラムを作成するので、そこで確認してみてください。
Scala Templatesには、もう1つ「Type Safe(型安全)」という特徴があります。先ほどもいったように、scala.htmlファイルは、コンパイル時にScalaのコードとしてコンパイルされます。
これは、いままでのフレームワークでは、あまりなかったことです。例えばPlay 1.xの場合、ビューを表現するためにGroovyを用いたテンプレートエンジンを使用していました。このテンプレートエンジンでは、ビューがレンダリングされるタイミング、すなわち実行時に評価されていたため、エラーを早期に発見できませんでした。
しかし、Scala Templatesであれば、コンパイル時にエラーを発見できるので、プログラムはより堅牢となります。そして、リファクタリングも容易に行えます。
ここで、Scala Templatesがどのようなサイクルで動作するのか、図に従って確認してみましょう。
まず、通常通りroutes定義に従って、マッピングされたActionが実行されます。ここでは、とあるアクションクラスのlistメソッドが実行されています。
テンプレートに対して、引数を渡します。サンプルのテンプレートでは、引数としてSeqコレクションを受け取り、<ul>/<li>タグでリスト表示します。
渡された引数に応じて、テンプレートオブジェクトが作成されます。この時点でresult変数の中身は、表示されるHTMLとなっています。
テンプレートオブジェクトを、ステータスコード200でクライアントに返します。プレゼンテーションロジックとビジネスロジックがしっかり分割されていますね。
以上が、リクエストからレスポンスまでのサイクルです。
ここからは、Scala Templatesの具体的な記述方法について解説します。
Scala Templatesでは、HTMLとScalaのコードを組み合わせて記述できる以外、特殊な記法は1つを除いてありません。その唯一の記法が、Scalaコードの開始を示す「@」です。この「@」がScala Templatesの中で登場すると、Scalaコードの開始として解釈されます。
なお、Scalaコードの終わりについては推論されるので、明示的に記述する必要はありません。
それでは試してみましょう。まずは、conf/routesファイルに新たなルーティング情報を記述します。
GET /show controllers.TemplateController.show()
次に、app/controllersに、TemplateController.scalaを作成しましょう。このコントローラのshowメソッドで、List[String]型のデータを作成し、Scala Templatesに渡します。
package controllers import play.api._ import play.api.mvc._ object TemplateController extends Controller { def show = Action { val list = List[String]("lemon","mikan","nanao") Ok(views.html.show("Hello Scala Templates!",list)) } }
app/viewsにlist.scala.htmlファイルを作成しましょう。上記コントローラでは2つのパラメータを渡しており、show.scala.htmlではそのパラメータを受け取るように定義されています。
@(message:String,userList:List[String]) @main("show scala templates") { <h1>@message</h1> <ul> @for(user <- userList) { <li><p>@user</p></li> } </ul> }
Scala Templatesは関数なので、通常の関数と同じように使えます。また、関数の引数はファイルの先頭で宣言する必要があります。引数はデフォルト値を設定することもできますし、暗黙のパラメータを取ることもできます。
show.scala.htmlでは、HTMLとScalaのコードを組み合わせて記述しているのが分かりますね。Scalaの持つ機能を使用すれば、複雑なHTMLもシンプルな記述で構築できます。
Copyright © ITmedia, Inc. All Rights Reserved.