Grails Quick Start(3)
さてさて、亀のようにすすんでますが、続きです。
Create the Controller
次は、Controllerというやつですね。
クライアントから受け取ったリクエストを適当に捌いてビジネスロジックを起動するコンポーネントです。詳しい説明はここ。
ドメインモデル同様、grailsコマンドで雛形を生成できるようです。
> cd firstapp
> grails create-controller
名前を聞いてくるので、チュートリアルにしたがって”book”とします。
init-props:
[groovy] statements executed successfullycreate-controller:
[input] Enter controller name:
book
[groovy] statements executed successfully
[copy] Copying 1 file to ...
[echo] Created controller: grails-app/controllers/BookController.groovyinternal-create-test-suite:
[groovy] statements executed successfully
[echo] Created test suite: grails-tests/BookTests.groovy
以下のようなファイルが作られました。
firstapp\grails-app\controllers\BookController.groovy:
class BookController { @Property index = { } }
これって、URLにマップされるのかしら?
サーバーを動かして...
> cd firstapp
> grails run-app
ブラウザからアクセス → http://localhost:8080/firstapp/book
エラーだ。↓
HTTP ERROR: 404
/WEB-INF/grails-app/views//book/index.jsp
RequestURI=/firstapp/book
Powered by Jetty://
Viewが必要なのかな。そうかそうか、フライングか。
というわけで、チュートリアルに奴隷のように従い、以下のように実装を加えておきます。
class BookController { @Property index = { redirect(action:list) } @Property list = { [ books : Book.list() ] } }
ここによると、Controllerに属性としてクロージャを持つと、URLとそのクロージャが関連つけられるのだそうです。なるほどー。
どういうことかと言うと、たとえば、上のBookControllerの、
@Property list = { [ books : Book.list() ] }
という属性は、名前が”list”なので、http://localhost:8080/firstapp/book/list というURLと関連つけられて、URLにリクエストがあると { } の中のロジックが実行されるのですね。
属性名をindexとすると、index.htmlみたいにデフォルトとして扱われるそうです。ふーん。
ちなみにクロージャというのは、処理のひとかたまり(ブロックとかいうといいのだろうか?)がオブジェクトとして扱える、、みたいなイメージ?正しい定義はご勘弁を。
詳細はこちら。
上の例をJava的に書くと、
interface Function { abstract Object exec(); } .... public Function list = new Function(){ Object exec() { Map m = new HashMap(); List books = Book.list(); m.put("books", books); return m; }; };
こんな感じ?
Groovyでは、コレクションの宣言が簡略化されていて、
list = [] で、 List list = new ArrayList();
list = [1,2,3] のように初期化できる模様。
map = [:] で、 Map map = new HashMap();
map = [label1:"value1", label2:"value2"] なんて書ける。
これはすごく便利!
詳細は例によってこちら。
The Back Room/Editors
- アーティスト: Editors
- 出版社/メーカー: Fader Label
- 発売日: 2006/03/21
- メディア: CD
- 購入: 1人 クリック: 10回
- この商品を含むブログ (22件) を見る
名前も見た目も地味だし、ニューウェーブリバイバル系のUKバンドということで、いまいち興味がなかったのですが、ちょっと視聴してJoy Divisionっぽかったので買ってみたんですが、このバンドいいですねー。
何がよいって、やはりJoy Divisionを彷彿させるからなんですが。
なかなかいなかったんですよ。そういうバンドが。Joy Divisionはもう存在しませんし、再結成してもIan Curtisはいないわけですから、音源に限りがあるわけです。
そんな中、こういう音が聞けてとてもうれしいんです。IsolationとかDead SoulsとかLove will tear us appartとかAtomosphereとか。。声質も似てるし。くぅー。
Rockin' Onのレビューにもありましたが、曲自体すごく良いです。
中には、WARとかの頃のU2っぽいナンバーもあるんですよ。
あー、U2もニューウェーブだったんだっけ、と。
BONOがLove will tear us appartを歌ったらかなりはまるかも、なんて思ったりして。
そんな発見もあったうれしい1枚でした。以上。
Grails Quick Start(2)
気を取り直して、つづきです。
Configure a Data Source
アプリケーションが使うデータベース接続先の定義は、以下のようにクラスとして定義するようですね。
デフォルトでは、HSQLDBを使う設定になっています。
”アプリケーションフォルダ/grails-app/conf”にある、ApplicationDataSource.groovyを開くと、
class ApplicationDataSource { @Property String url = "jdbc:hsqldb:mem:testDB" @Property String driverClassName = "org.hsqldb.jdbcDriver" @Property String username = "sa" @Property String password = "" }
@Property というのは、Groovyの記法で、クラスの属性とその属性用のsetter/getterメソッドが定義されるようです。一瞬、Java5のアノテーションかと思いましたが、JDK1.4でも動作するみたいです。
今のところは、このままにして進めるとしましょう。
Create a Domain Class
Domain Classというのは、アプリケーションの領域に存在するビジネスオブジェクト、、みたいな感じ?
以下のように、コマンドで雛形が作成されるようだけど、デフォルトではDomain Classのフィールドはデータベースにマップされるそうです。
作ってみましょう。
アプリケーションフォルダに移動してコマンドを実行ぉー。
> cd firstapp
> grails create-domain-class
例によって、Domain Classの名前を聞いてくるので、チュートリアルにあるとおり、”Book”とします。
> create-domain-class:
[input] Enter domain class name:
Book
[groovy] statements executed successfully
[copy] Copying 1 file to ...
[echo] Domain class created: grails-app/domain/Book.groovyinternal-create-test-suite:
[groovy] statements executed successfully
[copy] Copying 1 file to ...
[echo] Created test suite: grails-tests/BookTests.groovy
モデルのソースらしきファイルと、そのテストモジュールらしいのができているようです。
できたgroovyファイルは、こんな風になっています。
firstapp\grails-app\domain\Book.groovy
class Book { @Property Long id @Property Long version String toString() { "${this.class.name} : $id" } }
id と version というのがデフォルトで出来るようですね。
id はBookエンティティのユニークIDなのかな?
versionは分からん。。serialVer ではないですよね。。おいおい調べるとしましょう。
例に従って、Bookの属性を追加しておきましょう。
class Book { @Property Long id @Property Long version @Property String title @Property String author String toString() { "${this.class.name} : $id" } }
ね、眠い。。今日はここまで。
痛い。。
今朝、目が覚めたら身体のあちこちが痛くて容易に起き上がれませんでした。
特に、左ひざと肩がひどく、足踏ん張れないし、真面目に肩があがらなかった。
四十肩、五十肩とはこのことか!
明日が剣道の試合なので、このところめずらしく練習に励んでいたので、筋肉痛がまとめて押し寄せてきたのかもしれない。
まじで動かないので、ストレッチをしてやったら、そこそこほぐれて日常生活はこなせるようになりました。
夜、1時間ほど稽古に出てきましたが、どうも、打つときに身体が曲がっているらしくよく注意されます。
素振りで随分矯正してみてはいるんだけど、相手ありの試合稽古になると、どうしても元に戻っていがちです。わかっちゃいるけどうまくいかない。難しいもんですね。
基本が身体に染み付いているような人たちは、やっぱり強いなぁと思います。
下手に応用に走ってはいかんのだなぁ、とつくづく思います。
日ごろ、ソフトウェアの開発なんかを生業にしてますが、同じことが言えますねー。基礎がしっかりしてる人はバランス良く仕事しますものね。
まぁまぁ身体も動くようになってきたけど、試合に勝てるレベルには到底達していません。まぁ、オリンピック精神で臨むこととします。
Grails Quick Start
さて、インストールしてみたGrailsですが、QUICK STARTというチュートリアルがあるようです。
まずは、ざっと概要をつかむために、やってみましょう。
Create a Grails project
前の投稿を参照。
アプリケーション開発の土台を生成しました。
確か、RubyのRailsだと、この時点でもサーバーを起動すれば張りぼてアプリが動いたはず。
どれどれ、ページの下のほうに、Start Grailsというのがあるね。
> grails run-app
とやるらしい。やってみよう。。。おー、Antなのか。。コンパイルとか始まったよ。。
すごく重そう。いつもそうなのか???
コンソールが落ち着いたらCtrl+Cで止めてもう一回やってみる。。あー、すっと動いた。最初だけなのか。。
ブラウザでアクセスしてみよう。。
おー、動いてますね。張りぼてだけど。
コマンド一発でWebアプリが動くって気持ちよいですよ。
Grailsインストール
http://grails.codehaus.org/Installation
今回は、CVSからソースをダウンロードしてビルドしてみた。
CVSROOTは、
:pserver:anonymous@cvs.grails.codehaus.org:/home/projects/grails/scm
※パスワードは空でした
Eclipseを使うとそのままプロジェクトになるので便利です。
ビルドは簡単。
ダウンロードしたモジュールのTOPに移動して、antを実行するだけ。たとえば、
> cd c:\grails
> ant
grails create-app
というコマンドでアプリケーション(の土台)を作ってくれるようですね。
Railsのrailsコマンドに相当するものですね。
railsでは、引数にアプリケーション名を渡すんだと思いましたが、"grails create-app"を実行すると、インタラクティブに名前を聞いてくるらしいです。
さて、binにパスを通して早速実行!
> cd c:\work
> grails create-app
。。。う、パスがないとか何とか言われちゃった。。なぜだ。。
ようわからんので、binの下のgrails.batをエディタで開いて、@echo offをREMる。
もう一回!
う、GRAILS_HOMEを設定してないじゃない。。ちゃんと読まないとね。
では、再度実行!
おおー!動いた!
名前は、、、"firstapp"とかにしておこう。。ベタだけど。
こんな感じで、フォルダ、ファイルが自動生成されました↓
> ls
firstapp
> cd firstapp
grails-app grails-tests hibernate lib spring src web-app
とりあえず、はじめの一歩はここまでー。