Applicationの表示はどうなっている?
では、デフォルトで作成されたファイル類について、編集をしながら役割をチェックしていきましょう。デフォルトでは、ページの表示に関するものとして、以下のファイル類が用意されていました。
- Application.java:「controllers」内に作成されています。特定のアドレスにアクセスがあると、まず対応するコントローラーにあるメソッドが呼び出され、必要な処理がされます。
- main.html:これは、レイアウトのテンプレートとなるファイルです。Play!では、ページは土台となるテンプレート(これがmain.html)の中に、それぞれのページ(ここではindex.html)がはめ込まれ、レンダリングされた後、ブラウザへと送られます。
- index.html:デフォルトでアクセスされるページのテンプレートです。ここに書かれた内容が実際にページに表示されます。
この3つのファイルの仕組みをまずは理解する必要があります。では、まずページの土台となっているmain.htmlテンプレートを見てみましょう。これは次のように記述されています。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>#{get 'title' /}</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<link rel="stylesheet" type="text/css" media="screen"
href="@{'/public/stylesheets/main.css'}" />
<link rel="shortcut icon" type="image/png"
href="@{'/public/images/favicon.png'}" />
</head>
<body>
#{doLayout /}
</body>
</html>
ごくシンプルなXHTMLのページですが、肝心のコンテンツなどはありません。代わりに、いくつか特殊な記号が書かれていることに気が付くでしょう。タイトル部分の#{get 'title' /}、ボディ部分の#{doLayout /}です。これらは次のような働きをします。
#{get 'title' /}:これは'title'という変数の値を取得し表示します。#{doLayout /}:そのページのコンテンツをここにはめ込んで表示します。
これは、いわばページの土台であれ、これ自体が直接ロードされて表示されるわけではありません。実際に表示されているのは、index.htmlになります。こちらはこのようになっています。
#{extends 'main.html' /}
#{set title:'Home' /}
#{welcome /}
非常にシンプルです。これも少し説明が必要でしょう。これらはそれぞれ次のような働きをしています。
#{extends 'main.html' /}:main.htmlを継承しています。Javaの継承と同じように、これによりmain.htmlがまるごと取り込まれ、更に拡張されるのだと考えるとよいでしょう。#{set title:'Home' /}:これは'title'という変数に、'Home'という値を設定しています。先にmain.htmlで、#{get 'title' /}とあったのを思い出してください。ここでtitleの値を設定したことで、その値が#{get 'title' /}の部分に表示される、というわけです。#{welcome /}:これが、実際に表示される内容です。この#{welcome /}というのが、先ほどアクセスしたときに表示されたページの内容そのものなのです。この#{welcome /}は、ウェルカムページを示すもので、これを記述しておくことで、ウェルカムページの内容がまるごとここに出力されます。
Controllerクラスをチェックする
さて、残るはApplication.javaです。これは次のようなソースコードが記述されています。
package controllers;
import play.mvc.*;
public class Application extends Controller {
public static void index() {
render();
}
}
コントローラークラスは、play.mvc.Controllerクラスを継承して作成します。この中に、アクセスするページ名と同じ名前でメソッドを用意します。ここでは「index」にアクセスをしますので、indexメソッドを用意してあるわけです。
ここで行っているのはただ1つ「render」というメソッドの呼び出しです。これは、ページのテンプレートをロードしレンダリングするものです。このrenderにより、indexのテンプレート(index.html)がレンダリングされ出力されていた、というわけです。
この「index」を「アクション」と言います。デフォルトでは、ルート(http://localhost:9000/)にアクセスすると「index」というアクションが実行されるように設定されています。そしてこのアクションでは、renderにより、indexアクション用に用意されたindex.htmlというテンプレートがレンダリングされていた、ということになります。
説明を聞くまでもなく、アクションとテンプレートはファイル名によって自動的に必要なものが割り出され、利用されていることが分かるでしょう。これもRoRタイプのフレームワークの特徴です。それまでのフレームワークは、こうした情報をすべて設定ファイルに記述し、必要なファイルを呼び出していました。しかし、RoRタイプのフレームワークでは、「設定よりも規約」を重視します。あらかじめ決められていた規約に従ってファイル名やクラス名などを名づけることにより、設定ファイルなどを書かなくても自動的に必要なファイルが分かるのです。
