Grails

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内, 検索
Grails
最新版 1.3.5(2010年10月4日(15か月前) (2010-10-04
対応OS 各種
プラットフォーム クロスプラットフォームJVM
種別 Webアプリケーションフレームワーク
ライセンス Apache License 2.0
公式サイト http://grails.org
テンプレートを表示

Grailsグレイルズ)は、Groovyというプログラミング言語を使ったオープンソースWebアプリケーションフレームワーク。Groovyは Java 上で動作する。「設定より規約 (convention over configuration)」というパラダイムにより高い生産性を実現し、スタンドアロンの開発環境を提供しつつ、開発者からはその設定の詳細を隠蔽している。

かつては "Groovy on Rails" と名乗っていたが、Ruby on Rails の David Heinemeier Hansson の要求で現在の名称になった[1]。開発は2005年7月に開始され、2006年3月29日に 0.1 をリリース、2008年2月18日に 1.0 をリリースした。

目次

[編集] 概要

Grails は以下のような目標を掲げて開発されてきた。

  • Javaプラットフォームの高生産性のWebフレームワークとする。
  • HibernateSpring Framework といった既に広く使われているJavaテクノロジーを単純で一貫したインタフェースで再利用する。
  • 一貫性があり習得が容易なフレームワークとする。
  • フレームワークを構成する各部分についてユーザーに分かりやすい文書を提供する。
  • 複雑で一貫性のない分野でユーザーが期待するものを提供する。
    • 強力で一貫した永続性フレームワーク
    • GSP (Groovy Server Pages) を使った強力で使いやすいビューテンプレート
    • Webページコンポーネントを簡単に作成できるダイナミックタグライブラリ
    • 容易に拡張/カスタマイズ可能なAjaxサポート
  • フレームワークの威力を示すためのサンプルアプリケーションを提供する。
  • Webサーバや自動リソース再ロード機能など、完全な開発環境を提供する。

Grails は習得しやすく、アプリケーション開発と拡張が容易となるよう設計された。一貫性と強力な機能との正しいバランスを保つことを心がけている。

[編集] 高い生産性

Grails は従来のJavaによるWeb開発フレームワークに比べて生産性を高めるため、以下の3つの特徴を備えている。

  • XMLコンフィギュレーション不要
  • 即座に使える開発環境
  • Mixin経由の機能

[編集] XMLコンフィギュレーション不要

JavaによるWebアプリケーション作成では、開発開始時点や途中で環境やフレームワークの構成設定が必要である。そのコンフィギュレーションは XML ファイルとして切り出して設定しやすくし、構成設定をアプリケーションのコードに埋め込まないようにすることが多い。

XML によるコンフィギュレーションはアプリケーション間の一貫性を高めるということで当初は歓迎された。しかし最近では、有効性は認めるものの、実際にXMLファイルの設定を修正するのは面倒だという人が多くなっている。アプリケーションが成長するにつれて、開発者はフレームワークのコンフィギュレーションを理解し、維持することに時間を費やすことになり、生産性を低下させる要因になっている。アプリケーションに機能を追加したり修正したりする度にXMLコンフィギュレーションも修正していると、アプリケーションの改良が遅くなり、生産性が低下する。

Grails では、XMLコンフィギュレーションファイルの修正を不要にした。その代わり、フレームワークが規約を使ってアプリケーションのコードを調べる。例えば、名前の最後が Controller となっているクラス(例えば BookController)は、MVCのコントローラと見なされる。

[編集] 即座に使える開発環境

従来のJavaによるWebツールキットでは、開発環境の整備は開発者が行わなければいけなかった。Grails は完全な開発環境を備えており、Webサーバなども含んでいて、即座に使用することができる。全ての必要なライブラリはディストリビューションに含まれており、JavaのWeb環境も自動的に用意する。

[編集] Mixin 経由の機能

Grails はいくつかのクラス上で Mixin 経由の動的メソッドを用意している。Grails では Mixin はメソッドである。Mixin はクラスに動的に追加される機能であり、あたかもその機能がプログラム上でコンパイルされたかのように利用できる。

この動的メソッドは、クラスを拡張したりインタフェースを実装したりすることなく、操作を実行できるようにする。Grails では、クラスの種類に基づいて動的メソッドを提供する。例えば、ドメインクラスはセーブ/削除/検索などの永続性操作を自動化するメソッドを持っている。

[編集] Web フレームワーク

Grails は、MVCパラダイムにしたがって設計されている。

[編集] コントローラ

Grails はWebページの振る舞いを実装するのにコントローラを使う。以下のコードはコントローラの例である。

 class BookController {
    def list = {
       [ books: Book.findAll() ]
    }
 }

上のコントローラには list アクションがあり、データベース内の全ての本を含むモデルを返す。このコントローラを生成するには、以下のように grails コマンドを使う。

grails create-controller

このコマンドはコントローラ名を聞いてくるので、それを入力するとプロジェクトの grails-app/controller ディレクトリにクラスが作成される。コントローラクラスは作成するだけで Grails に認識される。list アクションは開発モードでは http://localhost:8080/book/list にマッピングされる。

[編集] ビュー

Grails は JSP と GSP をサポートしている。以下のコード例は GSP で書かれたビューであり、上記のコントローラが用意したモデル内の本のリストを表示する。

<html>
  <head>
    <title>Our books</title>
  </head>
  <body>
    <ul>
      <g:each in="${books}">
        <li>${it.title} (${it.author.name})</li>
      </g:each>
    </ul>
  </body>
</html>

このビューはGrailsプロジェクトの grails-app/views/book/list.gsp としてセーブする。この位置にセーブすることで BookControllerlist アクションにマッピングされる。また、この位置に置くだけで Grails がこれをビューとして認識する。

[編集] Ajax サポート

Grails は、OpenRico、Prototype、Yahoo! UI library[2]といった Ajax ライブラリをサポートしている。AjaxコードとHTMLを生成する既存のタグライブラリを利用できる。また、自前のタグライブラリを生成するのも容易である。

[編集] ダイナミックタグライブラリ

Grails は各種タグライブラリを提供するが、同時に自前のタグライブラリを簡単に作成できる。

 def formatDate = { attrs ->
    out << new java.text.SimpleDateFormat(attrs.format).format(attrs.date)
 }

この formatDate タグライブラリは java.util.Date オブジェクトを String にフォーマットする。このタグライブラリは grails-app/taglib/ApplicationTagLib.groovy ファイルに追加するか、ファイル名の末尾を TagLib.groovy として grails-app/taglib ディレクトリに置く。

以下は、GSP で formatDate タグライブラリを使ったコード断片である。

<g:formatDate format="yyyyMMdd" date="${myDate}"/>

ダイナミックタグライブラリを GSP で使う場合、インポートタグを使う必要がない。ダイナミックタグライブラリはJSPファイルでも使えるが、GSPよりも若干作業が多い[3]

[編集] 永続性

[編集] モデル

Grailsにおけるドメインモデルは、GORM (Grails Object Relational Mapping) を使ってデータベースに格納される。ドメインクラスは、grails コマンドを以下のように使って作成し、grails-app/domain ディレクトリに置く。

grails create-domain-class

すると、ドメインクラス名を聞かれるので入力すると、適当なファイルが作成される。以下に Book クラスのコードを示す。

 class Book {
    String title
    Person author
 }

このクラスを作成するだけで、Grails によって永続的に管理される。Grails 0.3 以降では GORM が強化されており、ドメインクラスに属性IDとバージョンがない場合、それらを付加する。

[編集] メソッド

GORMで管理されるドメインクラスには、クラスおよびオブジェクト上で永続性操作を行う動的メソッドと静的メソッドがある[4]

[編集] 動的インスタンスメソッド

save() メソッドはオブジェクトをデータベースにセーブする。

 def book = new Book(title:"The Da Vinci Code", author:Author.findByName("Dan Brown"))
 book.save()

delete() メソッドはオブジェクトをデータベースから削除する。

 def book = Book.findByTitle("The Da Vinci Code")
 book.delete()

refresh() メソッドはオブジェクトの状態をデータベースに基づいて更新する。

 def book = Book.findByTitle("The Da Vinci Code")
 book.refresh()

ident() メソッドはデータベースからそのオブジェクトに割り当てられたIDを取り出す。

 def book = Book.findByTitle("The Da Vinci Code")
 def id = book.ident()

[編集] 動的静的(クラス)メソッド

count() メソッドは、指定されたクラスについて、データベース上のレコード数を返す。

 def bookCount = Book.count()

exists() メソッドは、指定されたIDのオブジェクトがデータベース上に存在するかどうかをブーリアンで返す。

 def bookExists = Book.exists(1)

find() メソッドは、指定されたオブジェクトクエリ文でデータベースから見つかった最初のオブジェクトを返す。

 def book = Book.find("from Book b where b.title = ?", [ 'The Da Vinci Code' ])

この場合のクエリ構文は Hibernate HQL である。

findAll() メソッドは、データベースに存在する全オブジェクトを返す。

 def books = Book.findAll()

findAll() メソッドは、クエリ文を指定し、それにマッチした全オブジェクトのリストを返す。

 def books = Book.findAll("from Book")

findBy*() メソッドは、指定したパターンにマッチした最初のオブジェクトを返す。

 def book = Book.findByTitle("The Da Vinci Code")

または:

 def book = Book.findByTitleLike("%Da Vinci%")

findAllBy*() メソッドは、指定したパターンにマッチした全オブジェクトのリストを返す。

 def books = Book.findAllByTitleLike("The%")

findWhere*() メソッドは、一連のパラメータにマッチした最初のオブジェクトを返す。

 def book = Book.findWhere(title:"The Da Vinci Code")

[編集] Scaffolding

Grails は、CRUD (Create, Read, Update, Delete) 操作サポートのための scaffolding をサポートしている。scaffolding コントローラを以下のように作成することで、任意のドメインクラスを scaffold することができる。

 class BookController {
    scaffold = true
 }

こうすることで、CRUD 操作を http://localhost:8080/book 上でできるようになる。現在のGrailsは関連の scaffolding は提供していない。

[編集] 古いデータベースモデル

GORMの永続性機構は Hibernate を使って実装されている。そのため、古いデータベースであっても標準の Hibernate mapping ファイルを使ってGORMクラスにマッピングできる。

[編集] Javaプラットフォームとの連携

Grails はJavaプラットフォーム上に構築されているため、Javaライブラリ、フレームワーク、既存コードベースとの連携が容易である。特に Hibernate ORMフレームワークとはクラスの透過的連携を実現している。したがって、Hibernate を使った既存アプリケーションを再コンパイルや再設定することなく、上述の動的永続性メソッドを使ってGrailsを使うことができる[5]

その結果、Hibernate にマッピングされたJavaクラスのために scaffolding を設定できる。また、Grails Webフレームワークの機能は全て、これらのクラスとそれを使うアプリケーションに使用可能である。

[編集] 脚注

[編集] 関連項目

[編集] 外部リンク

個人用ツール
名前空間
変種
操作
案内
ヘルプ
ツールボックス
他の言語