連載
» 2013年05月21日 18時00分 UPDATE

Scala+Play 2.0でWebアプリ開発入門(6):Play 2.xのScala Templatesでビュー&フォーム操作 (1/3)

2.0からScalaに対応したWebアプリ開発の人気軽量フレームワーク「Play」について解説し、Webアプリの作り方を紹介する入門連載。今回は、Play 2.xでビューを表現するための機能「Scala Templates」と、フォームを用いてデータをやりとりする方法を解説します。

[中村修太,クラスメソッド]

 前回の記事「Play 2.1にアップグレードしてコントローラを使いこなす」では、コントローラのいろいろな使い方、さらにセッションやフラッシュスコープの使用方法を紹介しました。

 今回はPlay 2.xでビューを表現するための機能「Scala Templates」と、フォームを用いてデータをやりとりする方法を紹介します。

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 Templatesの3つの特徴

【1】簡潔でデザイナとの作業も可能

 Scalaが持つ機能とライブラリを使えば、HTMLを生成可能ですが、現実的ではありません(JavaサーブレットでHTML生成をするための処理を記述することを想像してみてください)。

 デザイナがScalaファイルを修正することも難しいでしょう。それに引き換え、Scala Templatesは、HTMLをベースにしてScalaのコードを組み合わせているので、シンプルに記述できますし、いくつかのルールを覚えればデザイナが修正するのも容易です。

【2】部品の再利用

 Scala Templatesでは、HTMLの断片を定義して任意の個所で再利用できます。よく使用するテンプレートをあらかじめ定義しておき、複数のページでそのテンプレートを使い回すことが可能です。

 このテンプレート機能を使えば、プレゼンテーションロジックとビジネスロジックを分離できます。

 こうすることで、メンテナンスおよびリファクタリングが容易になります。テンプレート機能については、この後の章でサンプルプログラムを作成するので、そこで確認してみてください。

【3】Type SafeなTemplateエンジン

 Scala Templatesには、もう1つ「Type Safe(型安全)」という特徴があります。先ほどもいったように、scala.htmlファイルは、コンパイル時にScalaのコードとしてコンパイルされます。

 これは、いままでのフレームワークでは、あまりなかったことです。例えばPlay 1.xの場合、ビューを表現するためにGroovyを用いたテンプレートエンジンを使用していました。このテンプレートエンジンでは、ビューがレンダリングされるタイミング、すなわち実行時に評価されていたため、エラーを早期に発見できませんでした。

 しかし、Scala Templatesであれば、コンパイル時にエラーを発見できるので、プログラムはより堅牢となります。そして、リファクタリングも容易に行えます。

Scala Templatesの動作の仕組み

 ここで、Scala Templatesがどのようなサイクルで動作するのか、図に従って確認してみましょう。

scalaplay06_1.jpg Scala Templatesのサイクル

【1】Actionの実行

 まず、通常通りroutes定義に従って、マッピングされたActionが実行されます。ここでは、とあるアクションクラスのlistメソッドが実行されています。

【2】データをテンプレートへ渡す

 テンプレートに対して、引数を渡します。サンプルのテンプレートでは、引数としてSeqコレクションを受け取り、<ul>/<li>タグでリスト表示します。

【3】テンプレートオブジェクトが作成される

 渡された引数に応じて、テンプレートオブジェクトが作成されます。この時点でresult変数の中身は、表示されるHTMLとなっています。

【4】HTMLがクライアントに返される

 テンプレートオブジェクトを、ステータスコード200でクライアントに返します。プレゼンテーションロジックとビジネスロジックがしっかり分割されていますね。

 以上が、リクエストからレスポンスまでのサイクルです。

Scala Templatesの具体的な記述方法

 ここからは、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もシンプルな記述で構築できます。

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。