本格派エンジニアの工具箱

第30回 Scalaをネイティブサポートした「Play Framework 2.0」

この記事を読むのに必要な時間:およそ 3 分

Play 2.0のテンプレート

Play 2.0ではテンプレートエンジンがScalaベースのものに変更されているため,テンプレートの文法や使い方が大きく違っています。まず,controllers/Application.javaを見てみましょう。Applicationクラスがindex()メソッドを持っており,これがindex.htmlのレンダリングに相当することは1.xと同様ですが,戻り値がvoidではなくResultインスタンスとなっている点に注意が必要です。ここではindex.render()メソッドでWebページのレンダリングを行っています。

package controllers;

import play.*;
import play.mvc.*;
import views.html.*;

public class Application extends Controller {
  public static Result index() {
    return ok(index.render("Your new application is ready."));
  }  
}

続いてviewフォルダに収められたテンプレートですが,デフォルトではmain.scala.htmlとindex.scala.htmlの2つのファイルが用意されています。main.scala.htmlの方は従来のmain.htmlにあたる汎用的なテンプレートファイルで,中身は次ののようになっています。

@(title: String)(content: Html)

<!DOCTYPE html>

<html>
    <head>
        <title>@title</title>
        <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
        <link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")">
        <script src="@routes.Assets.at("javascripts/jquery-1.7.1.min.js")" type="text/javascript"></script>
    </head>
    <body>
        @content
    </body>
</html>

1.xのときはテンプレート内で使用する変数やパラメータを「#{.... /}」というタグで表現していましたが,2.0では「@」を使った特殊な記法を使用します。テンプレートはパラメータを使用して呼び出します。main.scala.htmlの場合は,最初の「@(title:String)(content: Html)」がパラメータで,@titleに文字列値が,@contentのHTML形式の値が渡されることになります。

次にindex.scala.htmlの方を見てみましょう。こちらは次のような内容になっています。

@(message: String)

@main("Welcome to Play 2.0") {    
    @play20.welcome(message, style = "Java")
}

最初の「@(message: String)」がパラメータで,先ほどのindex.render()メソッドによって渡された文字列が入ります。@main(...)の部分は一見するとメソッド呼び出しのように見えますが,この記述でmain.scala.htmlのテンプレートが読み込まれます。@play20.welcome(...)というのはデフォルトのWelcomeページのテンプレートです。

ためしに,Application.javaとindex.scala.htmlをそれぞれ次のように書き換えてみましょう。

package controllers;

import play.*;
import play.mvc.*;
import views.html.*;

public class Application extends Controller {
  public static Result index() {
    return ok(index.render("Play 2.0で作成したアプリケーションです。"));
  }
}
@(message: String)

@main("Play 2.0の使用例") {
    <h1>@message</h1>
}

http://localhost:9000をリロードすると,図3のように表示が変わり,変更が反映されることが確認できるはずです。

図3 ソースコードの修正は即座に反映される

図3 ソースコードの修正は即座に反映される

このように,Play 2.0では核となるアーキテクチャに大幅な変更が加えられたので,Javaアプリケーションの場合であっても細部は大きく違っています。とはいえ,従来の使い勝手はできる限り残すように工夫されているので,慣れてしまえば違和感なく使うことができるでしょう。

著者プロフィール

杉山貴章(すぎやまたかあき)

ONGS Inc.所属のプログラマ兼テクニカルライター。雑誌,書籍,Webメディアで多数の著作をもつ。

著書