コントローラとビュー

続いて、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
   }
}