Grails最初の一歩
データベース自動生成&ScaffoldによるCRUD機能動的生成
まず、Grailsのもっとも得意なパターンである、データベース自動生成とScaffoldを使ったCRUD機能動的生成によるWebアプリケーション作成を行います。
Grailsでは、ドメインクラスをGroovyで定義することにより、データベースの自動生成とデータベースとのデータ読み書き処理を自動生成します。また、Scaffoldにより、データベースに対するCRUD機能を動的生成します。
最初の一歩としてアプリケーションlostfleetを作成します。
アプリケーション"lostfleet"
アプリケーション"lostfleet"は、とあるSF作品に登場する宇宙艦船と艦長の情報を管理するものとして作成します。艦船名、艦船種類、艦長のデータから構成します。
最初の枠組みを作成する
アプリケーションを作成する作業用ディレクトリを作成します。
~$ mkdir mygrails
~$ cd mygrails
mygrails$
作業用ディレクトリの下にカレントディレクトリを移動した後、最初の一歩として作成するアプリケーションの枠組みを、grailsコマンドのサブコマンドcreate-appを実行して作成します。
mygrails$ grails create-app lostfleet
Welcome to Grails 1.2.0 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /opt/grails/grails
Base Directory: /home/torutk/mygrails
Resolving dependencies...
Dependencies resolved in 1240ms.
Running script /opt/grails/grails/scripts/CreateApp_.groovy
Environment set to development
:(中略)
Executing tomcat-1.2.0 plugin post-install script ...
Plugin tomcat-1.2.0 installed
Plug-in provides the following new scripts:
------------------------------------------
grails tomcat
Found events script in plugin tomcat
Created Grails Application at /home/torutk/mygrails/lostfleet
mygrails$
生成されるディレクトリ(最上位)の中身は以下です。
mygrails$ ls lostfleet
application.properties
grails-app lib scripts src target test web-app
mygrails$
アプリケーションの内容はまだ作成していませんが、ここでアプリケーションを実行します†1。
mygrails$ cd lostfleet
lostfleet$ grails -Dserver.port=8087 run-app
Welcome to Grails 1.2.0 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /opt/grails/grails
Base Directory: /home/torutk/mygrails/lostfleet
Resolving dependencies...
Dependencies resolved in 1428ms.
Running script /opt/grails/grails/scripts/RunApp.groovy
Environment set to development
Running Grails application..
Server running. Browse to http://localhost:8087/lostfleet
最後の行にある、Server running. が出れば正常に起動しています。WebブラウザからこのURLにアクセスします。

Grailsのデフォルト画面が表示されます。右側「Available Controllers:」の下が空白ですが、Grailsではアプリケーションを作成するとき、ここに作成したコントローラ名が列挙されるようになります。
Grailsアプリケーションの基本構造
Grailsで動くアプリケーションの基本構造は、ドメインクラス、コントローラクラス、ビューの3つから構成されます。また、共通ロジックを記述するサービスクラスもあります。
構成要素 |
記述方法 |
備考 |
ドメインクラス |
Groovyのクラス |
データベースの定義 |
コントローラクラス |
Groovyのクラス |
Webアプリケーションの制御を記述する |
ビュー |
GSP |
画面を定義する |
サービスクラス |
Groovyのクラス |
共通のロジック等を定義する |
Scaffold機能
Scaffoldと呼ばれる、データベースのCRUD機能を動的生成するGrailsのフレームワークを利用すると、アプリケーションとして最低限プログラミングするのは、アプリケーションで使用するデータを定義するドメインクラスと、Scaffoldの使用を宣言するコントローラクラスの2つとなります。
ドメインクラスの作成
アプリケーションのドメイン情報として、艦船(Ship)、艦種(ShipSpec)、艦長(Captain)の3つのクラスを作成します。パッケージ名は省略することも可能ですが、原則アプリケーションにちなんでパッケージ名を付けます。ここではパッケージ名fleetを使用します。
まず、Shipクラスをドメインクラスとして作成します。ドメインクラスを作成するときは、grailsコマンドのサブコマンドcreate-domain-classを実行します。
lostfleet$ grails create-domain-class fleet.Ship
Welcome to Grails 1.2.0 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /opt/grails/grails
Base Directory: /home/torutk/mygrails/lostfleet
Resolving dependencies...
Dependencies resolved in 1369ms.
Running script /opt/grails/grails/scripts/CreateDomainClass.groovy
Environment set to development
[mkdir] Created dir: /home/torutk/mygrails/lostfleet/grails-app/domain/fleet
Created DomainClass for Ship
[mkdir] Created dir: /home/torutk/mygrails/lostfleet/test/unit/fleet
Created Tests for Ship
lostfleet$
自動生成された、grails-app/domain/fleet/Ship.groovyは以下です。
package fleet
class Ship {
static constraints = {
}
}
このドメインクラスに、プロパティとして、艦名(name)、艦種(spec)、艦長(captain)を追記します。
package fleet
class Ship {
static constraints = {
}
String name
ShipSpec spec
Captain captain
}
同様に、艦種(ShipSpec)、艦長(Captain)のドメインクラスを作成します。
lostfleet$ grails create-domain-class fleet.ShipSpec
: (省略)
lostfleet$ grails create-domain-class fleet.Captain
: (省略)
lostfleet$
ドメインクラス艦種
package fleet
class ShipSpec {
static constraints = {
}
String name
}
ドメインクラス艦長
package fleet
class Captain {
static constraints = {
}
String name
}
コントローラクラスの作成
ドメインクラスそれぞれと対になるコントローラクラスを作成します。grailsコマンドのサブコマンドcreate-controllerにドメインクラス名を指定して実行します。
ドメインクラス艦船のコントローラクラス"ShipController"
lostfleet$ grails create-controller fleet.Ship
Welcome to Grails 1.2.0 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /opt/grails/grails
Base Directory: /home/torutk/mygrails/lostfleet
Resolving dependencies...
Dependencies resolved in 1468ms.
Running script /opt/grails/grails/scripts/CreateController.groovy
Environment set to development
[mkdir] Created dir: /home/torutk/mygrails/lostfleet/grails-app/controllers/fleet
Created Controller for Ship
[mkdir] Created dir: /home/torutk/mygrails/lostfleet/grails-app/views/ship
Created Tests for Ship
lostfleet$
自動生成された、grails-app/controllers/fleet/ShipController.groovyは以下です。
package fleet
class ShipController {
def index = { }
}
ScaffoldによるCRUD機能動的生成を行うよう書き換えます†2。
package fleet
class ShipController {
def scaffold = true
}
ドメインクラス艦種および艦長のコントローラクラスを同様に作成します。
lostfleet$ grails create-controller fleet.ShipSpec
: (省略)
lostfleet$ grails create-controller fleet.Captain
: (省略)
lostfleet$
同様にScaffold宣言に書き換えます。
艦種コントローラクラス
package fleet
class ShipSpecController {
def scaffold = true
}
艦長コントローラクラス
package fleet
class CaptainController {
def scaffold = true
}
実行
ここで、再度 grailsを実行します。なお、実行中のgrailsを止めるには、実行したコンソールからCtrl+Cを入力すれば、シャットダウン処理が走ります。

Available Controllers: の下に、作成したコントローラクラスが3つ列挙されています。
ここで、fleet.ShipSpecControllerをクリックすると、ShipSpecの一覧画面に飛びます。

まだ、何も作成していないのでリストは空欄です。そこで、「New ShipSpec」をクリックして新しいShipSpecデータの作成を行います。

Name欄に入力し、Createをクリックすると、ShipSpecのデータが1件作成できます。

ShipSpec Listをクリックして、再びShipSpecの一覧画面を表示させると、作成したShipSpecのデータが1件表示されます。

同じように、Homeに戻って、ここで、fleet.CaptainControllerをクリックすると、Captainの一覧画面に飛びます。New
Captainをたどって、Captain作成画面で1件のデータを作成します。

これで、Shipデータを作成するために必要なShipSpecとCaptainが1件ずつ作成できたので、いよいよShipデータを作成します。Homeに戻って、今度は、fleet.ShipControllerをクリックします。まだデータは空なので、見出し行にプロパティ名が並んだ表示となっています†4。

ここで、NewShipをクリックします。

ドメインクラスShipは、プロパティにShipSpec、Captainを持ちますが、新規作成画面では、この値はドロップダウンリストで選択する形式になっており、現在作成されているShipSpecおよびCaptainのデータが候補としてドロップダウンリストに登場します。しかし、このドロップダウンリストの表示はデフォルトではクラス名とIDとなっています†3。最初の一歩としてはここはそのまま艦船名を入力してShipデータを1件作成します。

Ship Listをクリックすると、Shipデータの一覧に1件データが追加されているのが分かります。

注記に記載した日本語化、他のドメインクラスをプロパティとしたときの自然な名前による表示等の設定をしたときのShip一覧の画面は以下となります。
 |