コントローラーの作成
では、実際にMVCによる開発を行ってみましょう。といっても、最初からMVCのすべてを使う必要はありません。まず必要となるのは「コントローラー」と「ビュー」です。コントローラーは、すべての制御を担当しますので、何よりもまず最初に用意する必要があります。また「ビュー」は、画面に何かを表示するなら必ず用意しなければいけません。「モデル」は、データベースを利用する必要がなければ、特に用意する必要はありませんから、しばらく忘れておきましょう。
では、コントローラーを作成します。これは、手作業でファイルを作成してもよいのですが、Grailsにはファイルの生成機能が用意されているので、これを使って作ることにしましょう。コマンドプロンプトで、作成するアプリケーションのディレクトリ(ここでは、C:\Users\ユーザー名\grails_apps\gapp)に移動し、次のように実行をします。
grails create-controller helo
これは、「helo」という名前のコントローラーを作成するものです。コントローラーの作成は、「grails create-controller 名前」というように実行をします。コマンドを実行したら、「grails-app」フォルダ内にある「controllers」フォルダを開いてみてください。ここに「HeloController.groovy」というファイルが作成されているのが分かります。これを開いてみると、次のように書かれています。
class HeloController { def index = { } }
HeloControllerというクラスの中に、indexというものが作成されていますね。これは、デフォルトでアクセスされる「アクション」です。アクションは、コントローラークラスの中のプロパティにクロージャを設定する形で用意されます。
設定より規約を!
Grailsは「設定よりも規約」を重視したつくりになっています。例えば、多くのJavaのフレームワークでは、あるURLにアクセスしたときあるプログラムが実行されるようにするためには、その内容を設定ファイルに記述する、といったやり方をとったりします。が、Grailsでは、この種の設定ファイルはありません(設定ファイルそのものはありますが、設定ファイルで実行する処理とアクセスするURLを関連付けるようなことはしません)。Grailsでは、Webアプリケーションのアクセスは次のような形で指定されます。
http://サーバー/アプリケーションのディレクトリ/コントローラー/アクション
「アクション」というのは、コントローラーの中に用意するさまざまな処理です。Grailsでは、1つのコントローラーの中にさまざまなアクションを用意しておくことができます。そのアクションを指定することで、必要な処理をコントローラーから呼び出し実行できるようになっています。
例えば、ここではlocalhostに「gapp」というアプリケーションを作成していますから、このアプリケーションのアクセス先は、http://localhost:8080/gapp/となっていました。そこに「HeloController」というコントローラークラスを作成し、その中にindexというアクションがあったとき、
http://localhost:8080/gapp/helo/index
このようにWebブラウザからアクセスすると、このHeloController内のindexが呼び出され実行されるのです。整理すると、ある名前でコントローラーを作成すると、自動的に次のようなものの名前が決定されるようになっています。
- コントローラーファイ ル名: 名前Controller.groovy
- コントローラークラス名: 名前Controller
- アクセスURL: http :……Webアプリケーション……/helo/
このようにGrailsでは、すべてが「名前」で管理されています。この命名ルールに従ってプログラムを作成していけば、Grailsのほうでそれを認識し、自動的に使えるようになるのです。設定ファイルにコントローラーを記述して登録して……などという必要はまったくありません。
ビューを作成する
コントローラーはこれでできました。……え? まだindexアクションには何も書いてない、って? 今はそれでいいんです。コントローラーは何らかの処理が必要になったときにそこに記述すればよいのであって、何も処理することがなければ空のクロージャのままでかまいません(ただし、クロージャそのものを削除してはいけません! 削除すると、そのアクションは「ない」ことになってしまいます。何も行わなくとも、クロージャだけは用意しなければいけません)。
では、HeloControllerに用意したindexアクションのためのビューを作成しましょう。grails-appの中の「views」というフォルダを開きます。この中に、「helo」というフォルダが作成されているはずです。先ほど、コマンドプロンプトからコントローラーを作成しましたね? あのとき、heloに対応するビューの配置場所としてこの「helo」フォルダが自動的に生成されていたのです。
Grailsでは、ビューはコントローラー単位でフォルダにまとめられます。ここでは「helo」という名前のコントローラーを作成しましたから、ビューも「helo」というフォルダの中に作成するわけです。
では、このフォルダの中に「index.gsp」というテキストファイルを作成してください。そして、次のようにソースコードを記述しましょう。
<!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"> <head> <title>Grails Helo</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style type="text/css"> h1 {background:#AAAAFF; font-size: 12pt; padding: 3px;} h2{font-size: 12pt; font-weight: bold;} p{color:#000066; font-size:10pt;} </style> </head> <body> <h1>Grails Helo</h1> <h2>This is Index Action Page.</h2> <p>これは、Grailsのサンプルです。</p> </body> </html>
見れば分かるように、ここではキャラクタセットをUTF-8にしています。Grailsでは、基本的にファイルはすべてUTF-8(BOMなし)で作成するようにしてください。記述したら、コマンドプロンプトから「grails run-app」を実行し、http://localhost:8080/gapp/helo/indexにアクセスをしてみましょう。作成したビューがWebブラウザに表示されます。
一見したところ、ただのHTMLのように見えますね。実はこれは……ただのHTMLです。Grailsには、ビューを構築するための仕組みもちゃんと用意されているのですが、まずはただのHTMLのページを用意して「コントローラーのアクションに対応するビューが表示される」という仕組みを理解しておいて欲しかったのです。
ビューは、このようにコントローラー名のフォルダ内に「アクション.gsp」という名前でファイルを作成します。指定のアクションが呼び出されると、コントローラーのアクションプロパティに設定されたクロージャを実行後に、それに対応するビューが読み込まれレンダリングされクライアントに返されます。ここでも、「設定より規約!」は生きています。指定した名前でファイルを用意さえしていれば、自動的にそのアクションに対応するビューが読み込まれるのです。
GSPとは?
ここで使われている「gsp」という拡張子は、「Groovy Server Pages」と呼ばれるものです。これは、JSPのGroovy版のようなものと考えるとよいでしょう。基本的にはHTMLのソースコード内に、独自の記述を埋め込んでページを作成していきます。
Grailsには、独自に定義されたカスタムタグが用意されており、これを利用してさまざまな出力をすることができます。また、変数などをそのままページ内に埋め込んで表示させたり、Groovyの処理を記述し、その場で実行させることもできます。まさに、Javaのソースコードを埋め込むJSPのGroovy版なのです。
先のサンプルでは、HTMLのタグだけしか使っていませんでしたが、もう少しGSPらしい機能を追加してみましょう。まずは、コントローラーから変数を用意し、それをGSPに受け渡して表示させてみましょう。まずは、コントローラーのクラスを修正します。
class HeloController { def index = { ['msg':"こんにちは! これはコントローラーで用意したテキストです。"] } }
見れば分かるように、indexアクション内で、連想配列を1つ作成しています。コントローラーからビューへと値を受け渡すために必要な処理は、ただこれだけです。このように連想配列をアクションメソッド内に用意すると、その中に用意されている値が、キー名の変数としてビューに用意されます。例えば、ここでは'msg'という名前のキーに値が用意されていますが、ビューではこの値がmsgという名前の変数として渡されるようになるのです。
では、ビュー側の修正をしましょう。index.gspのボディ部分を次のように変更してみてください。(ヘッダー他は変わりないので省略します)
<body> <h1>Grails Helo</h1> <h2>This is Index Action Page.</h2> <p>${msg}</p> </body>
ここでは、<p>
タグ内に${msg}というものが書かれています。GSPでは、このように${}の{}内に変数やメソッド、フィールドなどを記述しておくことで、そこに値を出力させることができます。