Grails をマスターする: Grails サービスと Google Mapsの記事に沿ってGrailsの習得を進めます。
id:torutk:20090722の続きです。
サービスのクラス生成
Grailsは、MVC(Model/View/Controller)に相当する、ドメイン、ビュー、コントローラの3つに分割するアーキテクチャを採っていますが、ここに追加してサービスが登場します。記事では
そこでGrailsが提供するのは単一のドメイン・クラスの枠を超えて一般に使用されるメソッドを保存する場所、すなわちサービスです。
と説明されています。少しJava EEのアーキテクチャに近づいた感があります。
grails create-service
$ grails create-service Geocoder :
とすると、grails-app/services/GeocodService.groovyが生成されます。ここにロジックを記述します。
class GeocoderService { boolean transactional = false def geocodeAirport(String iata) { : } }
AirportControllerにサービス・クラス呼び出しを追加
記事では、AirportController.groovyに、geocodeメソッドを追加し、scaffoldにより生成されるビュー経由で呼び出しを行って動作確認をしています。
- AirportController.groovyへの追加
def geocoderService def geocode = { def result = geocoderService.geocodeAirport(params.iata) render result as JSON }
ブラウザでアクセスすると、JSONデータはファイルに保存するか外部アプリケーションで開くかを選択するダイアログが表示されてしまいます。ファイルに保存して閲覧するのは手間です。
grails shellによる直接呼出しで動作確認
記事にはありませんが、grails shellによるコマンド環境でサービス・クラスのメソッドを直接実行することもできます。
$ grails shell : groovy:000> new GeocoderService().geocodeAirport("nrt") ===> {name=New Tokyo Inter-National Airport, lat=35.764722, lng=140.386389, state=04, country=JP} groovy:000>
こうすると、簡単な確認はできるようになります。
ビューのカスタマイズ(新規作成)
IATAコードを入れれば空港の情報が外部より取得できるので、Airportを新規作成するときのビューをIATAとCityだけ入力するよう修正し、IATAから検索した結果で埋めるようにします。
ビューをカスタマイズするので、grails generate-views Airportを実行し
ます。
生成された、grails-app/views/airport/create.gspを編集します。
記事との違いは、変数名がairportではなくairportInstanceになっている点です。
コントローラの修正(新規作成)
Airportの作成では、IATAとCityだけ入力するようにしたので、AirportControllerで、作成時に呼び出されるsaveメソッドに、GeocoderServiceから情報を取得する処理を追加します。
ビューのカスタマイズ(編集)
既存のデータを編集するときも、同じくIATAとCityだけ変更可能にします。grails-app/views/airport/edit.gspを編集します。
create.gspと同様、変数名がairportではなくairportInstanceになっている点に注意します。
コントローラの修正(編集)
編集時は、updateメソッドが呼ばれるので、updateメソッドに、GeocoderServiceから情報を取得する処理を追加します。
Google Mapsの利用
Google Maps APIキーの取得
まず、Google Maps APIを利用するためのキーを取得します(現時点で無料)。Grailsを試す際は、localhostで試しているので、以下のURLをGoogle Maps APIキー取得の際に入力します。
Google Maps APIを使って地図を表示するページを作成
map.gspを作成します。
セクションの、