コントローラとビュー
続いて、create-controllerコマンドを実行してコントローラのコードを生成する。この際、grails-app/viewディレクトリ以下にコントローラと同じ名称のビュー用のディレクトリも生成される。
コントローラ生成コマンド
% grails create-controller com.example.Book (パッケージ名から生成したいコントローラ名称を指定)
コントローラをコマンドで生成すると、BookController.groovyファイルができる。少しわかりにくいがコントローラを生成するときに指定する名称は、サフィックスになる Controllerを付けなくてよい。
BookController.groovy
class BookController {
//シンプルにテキストを返す
def index = {
render(text:"Hello")
}
//ビューを指定
def foo = {
//ここに処理を書く
render view:"example",models:[name:'tyama']
}
}
動的スカッフォルド
コントローラにscaffoldプロパティを記述する事によって、シンプルなCRUDアプリケーションを動的に動かす事ができる、動的スカッフォルド機能がある。サンプルコードのように単純にscaffoldプロパティにtrueを指定するか、CRUDアプリケーションを生成したい対象のドメインクラス名を指定するだけだ。
BookController.groovy
class BookController {
def scaffold = true //あるいは、対象のドメインクラス名
}
静的スカッフォルド
動的スカッフォルドで動作するCRUDアプリケーションのソースコードを書き出して使用する事も可能だ。
% grails generate-all com.example.Book (コードを生成したいコントローラ名称を指定)
コマンドを実行すると、BookController.groovyファイルとそれぞれ必要なビューのgspファイルが生成される。
スカッフォルドを活用した開発の流れ
GrailsでWeb開発をする際に、いちばんスタートしやすい流れが、スカッフォルドをベースにした開発になる。まず始めにドメインクラスを作り、動的スカッフォルドでデータを登録する等、確認調整を行いながら開発を進める。そして、ドメインクラスの設計がまとまった時点で、静的スカッフォルドでソースコードを書き出す。書き出されたソースコードをもとにして、さらに調整を行っていく。もちろん、簡単なマスタ扱いの内容等、単純なCRUDアプリケーションで問題無い内容は、そのまま動的スカッフォルドにしておいてもよい。
GSP - Groovy Server Pages
JSPと同じようなビューのコーディングの仕組みをGroovyで実装したGSP(Groovy Server Pages)を使用してビューの実装をおこなう。以下のサンプルコードのようにHTMLの中にGrailsタグライブラリを記述したり、変数はエクスプレッションが使用できる。
GSPサンプルコード example.gsp
<html>
<head>
<title>タイトル</title>
<meta name="layout" content="main" />
</head>
<body>
<div id="page">
<h1>Hello</h1>
<ol>
<g:each var="item" in="${list}">
<li>${item.name} - ${item.message}</li>
</g:each>
</ol>
<g:link controller="book" action="list">リストへ</g:link>
</div>
</body>
</html>
シンプルなタグライブラリ
Grailsのタグライブラリは簡単に作成できて、JSPでのタグライブラリで必要となる、tldファイルやweb.xmlの記述も不要だ。必要であれば、いつでもコマンドで追加できる。簡単に作成できるだけでなく、コントローラ内部でも呼び出して使用できる。 % grails create-tag-lib com.example.MyUtil (パッケージ名から生成したい名称を指定)
MyUtilTagLibサンプルコード MyUtilTagLib.groovy
class MyUtilTagLib {
static namespace = "myutil" //タグのネームスペース
static returnObjectForTags = ['content'] // 返値をオブジェクトで返す場合の指定。
// <myutil:hello name="tyama"/> タグ。
// outに返す
def hello = {attrs, body ->
out<<"Hello, ${attrs.name}"
}
//オブジェクトを返す。コントローラで myutil.content として呼び出す。
def content = {attrs, body ->
CmsContent.findByCode(attrs.code)?.content
}
}