torutkのブログ

ソフトウェア・エンジニアのブログ

「Grailsをマスターする:GrailsサービスとGoogle Maps」を読みながら動かしてみる

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キー取得の際に入力します。

http://localhost:8080/trip-planner

Google Maps APIを使って地図を表示するページを作成

map.gspを作成します。セクションの、