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

第14回Ruby on RailsライクなJavaフレームワーク「Play Framework」

Play Frameworkとは

Play Framework⁠日本語サイトはこちらは、Rub on RailsライクなJavaアプリケーション開発フレームワークです。簡単なコマンドの実行でアプリケーションの雛形を構築し、手軽に開発をスタートさせることができます。構築されるアプリケーションの雛形はモデル、ビュー、コントロールの3つのパーツから構成され、データベースシステムとJavaの永続化機能によるモデル、テンプレートエンジンを利用したビュー、Javaプログラムで記述するコントロールをシームレスに連携させたアプリケーション開発を行うことが可能です。

Play Frameworkの大きな特徴のひとつは、JavaコードやHTMLファイル、テンプレートファイルなどを修正しても、コンパイルやサーバへのデプロイ、サーバの再起動などを一切することなく、ブラウザでWebサイトをリロードするだけで修正内容が反映されるという点です。コードの修正から結果の確認までを連続したサイクルで行う、スムーズな開発を実現することが可能です。開発環境としては、シンプルなテキストエディタでの作業から、高機能な統合開発環境の利用まで、好みの環境を選択することができます。特に統合開発環境ではEclipseとNetBeans、そしてとIntelliJ IDEAとの統合がサポートされており、それぞれの環境で必要な設定ファイルは自動で生成することが可能です。

その他、Play Frameworkの主な特徴としては次のような項目が挙げられています。

  • Groovyベースのテンプレートシステムを採用
  • HibernateやOpenID、MemcachedなどといったWebアプリケーション技術との統合をサポート
  • ソースコードの該当行を含む詳細なエラー表示
  • ノンブロッキングIOモデルに基づく非同期通信をサポート
  • スケールしやすいステートレスモデルの採用

本稿では、Play Frameworkの基本的な使い方を解説します。

プロジェクトの作成と実行

Play Frameworkはこのページよりダウンロードすることができます。本稿執筆時点での最新版はバージョン1.2.2です。ダウンロードしたファイル(play-1.2.2.zip)を、任意のフォルダに解凍してください。このとき、⁠C:\Program Files」のような空白を含むフォルダ以下に配置することは推奨されません。本稿では「C:\work\play」フォルダに配置したものとして解説を進めます。

Play Frameworkはコマンドプロンプトで使うことができるフレームワークです。C:\work\playフォルダにある「play.bat」⁠Windowsの場合。Pythonスクリプト環境では「play⁠⁠)が実行用のスクリプトファイルになっています。まずはプロジェクトを作りましょう。今回は「myapp」というプロジェクトを作ります。コマンドプロンプトを立ち上げてC:\work\playに移動し、以下のコマンドを実行してください。

> play new myapp

続いてアプリケーション名を聞かれるので、ここでは「My First Application」と入力します。

図1 playコマンドによるプロジェクトの作成
図1 playコマンドによるプロジェクトの作成

プロジェクトの作成に成功すると、C:\work\play\myappフォルダが作られ、そこにアプリケーションの雛形が構築されます。myappフォルダ以下には、次のようなフォルダが作成されています。

  • app - アプリケーションの本体が格納されているフォルダ
  • conf - 設定ファイルが格納されているフォルダ
  • lib - ライブラリ格納用のフォルダ
  • public - HTMLファイルやJavaScriptファイル、スタイルシートや画像などの静的コンテンツを格納するフォルダ
  • test - テスト用のファイルが格納されるフォルダ
  • tmp - 一時ファイル作成用のフォルダ

このうち、アプリケーション開発の中心となるのはappフォルダです。appフォルダには「controllers⁠⁠、⁠models⁠⁠、⁠views」という3つのフォルダがあり、それぞれコントロール、モデル、ビューに関連するプログラムやファイルが格納されています。

新しくプロジェクト作成した場合、その時点でアプリケーションは一応動作する形の雛形になっています。アプリケーションの実行は次のコマンドで行います。

> play run myapp

起動に成功すると、Webブラウザからアクセスできるようになります。デフォルトでは9000番ポートで動作するので、⁠http://localhost:9000/」にアクセスすると、図2のように表示されます。これはデフォルトで用意されたWelcomeページです。

図2 プロジェクト作成直後のデフォルトページ
図2 プロジェクト作成直後のデフォルトページ

アプリケーションの動作の仕組み

それでは、作成したアプリケーションの中身を見ていきましょう。まず、controllersフォルダにはApplication.javaという、コントローラを実装したファイルが1つだけ用意されています。コードは次のようになっています。

package controllers;

import play.*;
import play.mvc.*;
import java.util.*;
import models.*;

public class Application extends Controller {
    public static void index() {
        render();
    }
}

Play Frameworkのコントローラはplay.mvc.Controllerクラスを継承して作成します。Webページへのアクセスがあった場合に呼び出されるのは、コントローラクラスの各メソッドです。どのURLへのアクセスに対してどのメソッドが呼び出されるのかは、confフォルダにある「routes」ファイルへの設定内容によって決まります。デフォルトではroutesの中身は次のようになっています。

# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~

# Home page
GET    /                    Application.index

# Ignore favicon requests
GET     /favicon.ico            404

# Map static resources from the /app/public folder to the /public path
GET   /public/                           staticDir:public

# Catch all
*     /{controller}/{action}    {controller}.{action}

この設定のうち、次の行に注目してください。

# Home page
GET    /                    Application.index

これは、⁠アプリケーションのコンテキストルート(⁠⁠/⁠⁠)に対するGETリクエストは、Applicationクラスのindex()メソッドで処理する」という意味の設定内容になります。つまり先ほどのApplication.javaにあったindex()メソッドのことです。index()はpublicな静的メソッドである点に注目してください。Contorollerクラスはインスタンス化されないため、リクエストによって呼び出されるメソッドはすべてpublic staticでなければいけません。

index()メソッドではrender()というメソッドの呼び出しだけが行われるようになっています。render()メソッドはControllerクラスに用意されたもので、Play Frameworkのテンプレートエンジンを利用してWebページのレンダリングを行います。テンプレートはviewsフォルダに用意します。どのテンプレートを使用するか指定しないでrender()を呼び出した場合、デフォルトのテンプレートとしてクラス名のフォルダにある「メソッド名.html」というファイルが使用されることになります。この例の場合は「Application」フォルダにある「index.html」です。

それでは、ビューを定義するviewsフォルダの中を見てみましょう。まず「main.html」というファイルがあります。これはデフォルトで用意された汎用的なテンプレートファイルです。コードは次のようになっています。

<!DOCTYPE html>

<html>
  <head>
    <title>#{get 'title' /}</title>
    <meta charset="${_response_encoding}">
    <link rel="stylesheet" media="screen" href="@{'/public/stylesheets/main.css'}">
    #{get 'moreStyles' /}
    <link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}">
    <script src="@{'/public/javascripts/jquery-1.5.2.min.js'}" 
        type="text/javascript" charset="${_response_encoding}"></script>
    #{get 'moreScripts' /}
  </head>

  <body>
    #{doLayout /}
  </body>
</html>

一見すると普通のHTMLファイルですが、一部で「#{.... /}」という特殊な記述が含まれています。これがPlay Frameworkのテンプレートエンジンで利用されるタグの記法です。例えば「#{get 'title' /}」の部分には、titleプロパティに設定された文字列が挿入されます。ページの本文を構成するのは「#{doLayout /}」の部分です。

続いて、Applicationフォルダにあるindex.htmlを見てみましょう。前述の通り、これが「htttp://localhost:9000/」へのアクセスに対して表示されるページになります。このファイルの中は次のようになっています。

#{extends 'main.html' /}
#{set title:'Home' /}

#{welcome /}

まず最初の「#{extends 'main.html' /}」で、先ほどのmain.htmlを継承しています。すなわち、このテンプレートはmain.htmlの内容を引き継いでいるということです。⁠#{set title:'Home' /}」はtitleプロパティの値を「Home」に設定する記述です。最後の「#{welcome /}」は、図2で見たWelcomeページを表示するタグです。

ためしに、index.htmlの記述を次のように変更してみましょう。

#{extends 'main.html' /}
#{set title:'Play Frameworkの使用例' /}

<h2>Playで作成したアプリケーションです</h2>

ファイルを保存して「htttp://localhost:9000/」のページをリロードすると、表示は図3.7のように変わります。titleプロパティにセットする値と、body部分の表示内容を変更したからです。

図3 index.htmlを変更した結果
図3 プindex.htmlを変更した結果

Play Frameworkで作成したアプリケーションの基本的な動作の仕組みがわかったところで、次回はコントロール、そしてモデルをカスタマイズしてみましょう。

おすすめ記事

記事・ニュース一覧