2.0で大幅に拡張されたPlay Framework
本連載の第14回 、第15回 で「Play Framework 」( 以下、Play)というJavaアプリケーション開発フレームワークを紹介しました。Playは、Ruby on Railsのように簡単なコマンドだけでMVCスタイルのWebアプリケーションの雛形を構築し、開発をスタートさせることができるフレームワークです。
2012年3月13日、そのPlayの新バージョン「Play framework 2.0」( 以下、Play 2.0)がリリースされました。この新バージョンでは、核となるアーキテクチャに大幅な変更が加えられました。主なポイントとしては次のような項目が挙げられています。
JavaおよびScalaのネイティブサポート
強力なビルドシステムの構築
型安全性へのフォーカス
非同期プログラミングのより強力なサポート
データストアとモデルのよりシームレスな統合
特に大きく変わったのはScalaのサポートです。単に言語としてScalaのシンタックスをサポートしているだけではなく、ビルドシステムやテンプレートシステムといったフレームワークのコア部分にまでScalaが浸透しているのです。たとえば、Play 2.0のビルドシステムにはScalaベースのビルドツールであるSBT が統合されています。これによって、従来提供されていたPythonスクリプト群に比べてより柔軟で拡張性の高いビルドシステムが実現しているとのことです。
テンプレートエンジンも、従来のGroovyベースのものから、Scalaベースのものへと切り替えられました。したがって、テンプレートの記述方法もScala形式に変更されています。とはいえ、Groovyのときと同様に基本的な部分され覚えてしまえばScala自身を知らなくても十分に使うことができます。Scalaベースのテンプレートエンジンになったことによって、コンパイル時のコードチェックがより強固に行われるため、型安全性が大幅に高まっているとのことです。
Play 2.0のインストールとアプリケーションの作成
Play 2.0の基本的な導入方法は、従来のPlay 1.xのときと同様です。ただし、Play 2.0ではPlayコンソールと呼ばれるSBTベースのインタラクティブなコンソールによってアプリケーションのライフサイクルを管理できます。このPlayコンソールを使うために、環境変数PATHにPlay 2.0をインストールしたフォルダ(C:\work\play-2.0\など)を追加しておくと作業が楽になります。
また、Play本体とは別にJDK(JDK 6以降)も必要です。Playによるアプリケーションの実行にはJavacコマンドが使われるので、JDKのインストール先にあるbinフォルダを環境変数PATHに追加しておきましょう。このとき、「 C:\Program Files\Java\」のようなスペースを含むパスは、「 C:\Progr~1\Java\」のようにスペースを含まない形式で設定しておかないと、アプリケーションが正常に実行できない可能性があります。
アプリケーションの作成は、1.xのときと同様に「play new アプリケーション名」というコマンドで行います。ただし、2.0ではコマンドの実行中に「アプリケーション名(タイトルやメッセージとして表示されるもの) 」と「アプリケーションテンプレートの種類」次の2つの情報を入力する必要があります。アプリケーションテンプレートはJavaとScala、そしてどちらも使わない空のテンプレートの3つから選びます。本稿では、前回の記事で紹介した内容と比較したいので「Java」を選択しました。
図1 play newコマンドによるアプリケーションの作成例
Playコンソールによる実行
アプリケーションの実行や管理はPlayコンソールによって行います。まず、作成したアプリケーションのフォルダに移動して「play」コマンドでPlayコンソールを立ち上げます。
C:\work\play-2.0\myapp> play
[info] Loading project definition from C:\work\play-2.0\myapp\project
[info] Set current project to My First Application (in build file:/C:/work/play-2.0/myapp/)
........
[My First Application] $
このコンソールで「run」コマンドを実行するとアプリケーションが起動します。
[My First Application] $ run
デフォルトではlocalhostの9000番ポートで実行されるので、Webブラウザから「http://localhost:9000」にアクセスしてみましょう。図3.3のようにデフォルトのページが表示されるはずです。
図2 デフォルトのWelcomeページ
コンパイルは動的に行われるため、ソースコードに変更を加えてもアプリケーションを起動し直す必要はありません。Webページをリロードするだけで自動的に変更が反映されます。
Webサーバを起動せずにコンパイルだけを行いたい場合には、Playコンソールで「comple」コマンドを実行します
[My First Application] $ compile
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 ソースコードの修正は即座に反映される
このように、Play 2.0では核となるアーキテクチャに大幅な変更が加えられたので、Javaアプリケーションの場合であっても細部は大きく違っています。とはいえ、従来の使い勝手はできる限り残すように工夫されているので、慣れてしまえば違和感なく使うことができるでしょう。