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
ブラウザから、