Grails Quick Start(4)

つづきです。

Create the View

Viewは言わずもがな、画面のコンポーネントですな。
Viewは、、ここではコマンドで生成とかではなく、手書きするようですね。
grailsコマンドのヘルプには、”generate-views”というのがあるようですが、ドメインクラスのCRUD用のUIを自動で作ってくれるのかしら?
よくわからないので、手書きするとします。
ちなみに、grailsを引数なしで実行するとコマンドラインヘルプが表示されます。

>grails
help:
  [echo] Usage: grails [target]
  [echo]
  [echo] Targets:
  [echo] "create-app" - Create a new grails app
  [echo] "create-controller" - Create a new controller
  [echo] "create-service" - Create a new service
  [echo] "create-domain-class" - Create a new domain class
  [echo] "create-test-suite" - Create a new test suite
  [echo] "generate-controller" - Generates a controller from a domain class
  [echo] "generate-views" - Generates the views from a domain class
  [echo] "generate-all" - Generates the all artifacts from a domain class
  [echo] "test-app" - Run current app's unit tests
  [echo] "run-app" - Run the application locally and wait
  [echo] "create-webtest" - Create the functional test layout
  [echo] "run-webtest" - Run the functional tests for a running app

さて、横道にそれました。Viewでした。


”firstapp\grails-app\views”の下に、”book”というディレクトリを作ってその下に、gsp(Groovy Server Pages)ファイルを作るようです。
ディレクトリ”book”は、前に作った Controller の bookと関連するということなのでしょうね。
さらに、gspファイルは、Controllerで定義したクロージャ属性と名前で関連つけられるようです。
listというクロージャを定義してあったので、list.gspを作成します。


こんな感じ。
firstapp\grails-app\views\book\list.gsp:

<html>
<head>
    <title>Book list</title>
</head>
<body>
<h1>Book list</h1>
<table>
    <tr>
        <th>Title</th>
         <th>Author</th>
    </tr>

    <% books.each { %> 
        <tr>
             <td>${it.title}</td>
             <td>${it.author}</td>
        </tr>
    <% } %>
</table>
</body>
</html>

booksというのは、Controllerのロジックで作成されたMapの要素ですね。
ラベルでそのまま参照できるのですね。便利ですね。
booksの中身を表に出力している部分ですが、JSPとGroovyの記法を知っているとわかるのですが。。JSPはともかくGroovyは。。。


HTMLタグとJSPコードを除いて考えます。

    books.each {
      it.title
      it.author
    }

{ }で囲まれたコードはクロージャです。処理ブロックです。
上記のように、コレクションの each メソッドにクロージャを渡すと、イテレートしながら、クロージャを実行してくれます。it というのは、要素への参照ですね。
Java的に書くと、

    for(Iterator iter = books.iterator(); iter.hasNext(); ) {
      Book it = (Book)iter.next();
      it.getTitle();
      it.getAuthor();
    }

こんな感じ?


さてさて、画面出るかなー。
アプリを動かして確認してみましょう。

> cd firstapp
> grails run-app

ブラウザから、

http://localhost:8080/firstapp/book/list

どうだ。出た!
。。。地味だねー。でも出た。パチパチ。