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

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

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

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

それでは,作成したアプリケーションの中身を見ていきましょう。まず,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で作成したアプリケーションの基本的な動作の仕組みがわかったところで,次回はコントロール,そしてモデルをカスタマイズしてみましょう。

著者プロフィール

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

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

著書