1概要

このチュートリアルでは、http://www.grails.org[Grails]を使って簡単なWebアプリケーションを作成する方法を学びます。

Grails(より正確には最新のメジャーバージョン)はSpring Bootプロジェクトの上に構築されたフレームワークであり、Webアプリケーションを開発するためにApache Groovy言語を使います。

これは、Ruby用のRailsフレームワークに触発されたもので、** 定型コードを減らすことを可能にするコンベンションオーバーコンフィギュレーションの考え方に基づいています。


2セットアップ

まず、公式ページに進んで環境を整えましょう。このチュートリアルの時点での最新バージョンは3.3.3です。

簡単に言うと、Grailsをインストールするには2つの方法があります。SDKMANを使用する方法とディストリビューションをダウンロードする方法、そしてPATH環境変数にバイナリを追加する方法です。

セットアップ手順については、http://docs.grails.org/latest/guide/single.html#downloadingAndInstalling[Grails Docs]に詳しく記載されているため、ステップバイステップでは説明しません。


3 Grailsアプリの解剖学

このセクションでは、Grailsアプリケーション構造の理解を深めるでしょう。前述したように、Grailsは設定よりも規約を優先しているため、ファイルの場所によって目的が決まります。

grails-app

ディレクトリにあるものを見てみましょう。


  • assets

    – スタイルのような静的なアセットファイルを保存する場所

JavaScriptファイルまたは画像


conf ** – プロジェクト設定ファイルを含みます。

  • **

    application.yml

    にはデータなどの標準的なWebアプリ設定が含まれています

ソース、MIMEタイプ、その他のGrailsまたはSpring関連の設定



resources.groovy

にはSpring Beanの定義が含まれています

  • **

    logback.groovy

    にはロギング設定が含まれています


  • コントローラ

    – リクエストの処理と生成を担当します

応答またはそれらをビューに委任します。慣例により、ファイルが
名前が


Controller


で終わる場合、フレームワークはデフォルトのURLを作成します。
コントローラクラスで定義されている各アクションのマッピング

domain

– Grailsアプリケーションのビジネスモデルが含まれています。各

ここに住んでいるクラスはGORMによってデータベーステーブルにマッピングされます。


国際化** – 国際化対応のために使われる


  • init

    – アプリケーションの入り口


  • services

    – アプリケーションのビジネスロジックはここにあります。によって

規約では、GrailsはサービスごとにSpringシングルトンBeanを作成します


taglib ** – カスタムタグライブラリの場所


  • views

    – ビューとテンプレートが含まれています


4簡単なWebアプリケーション

この章では、生徒を管理するための簡単なWebアプリを作成します。

まず、アプリケーションスケルトンを作成するためのCLIコマンドを呼び出します。

grails create-app

プロジェクトの基本構造が生成されたら、実際のWebアプリケーションコンポーネントの実装に移りましょう。


4.1. ドメイン層

生徒を処理するためのWebアプリケーションを実装しているので、

Student

というドメインクラスの生成から始めましょう。

grails create-domain-class com.baeldung.grails.Student

最後に、

firstName

プロパティと

lastName

プロパティを追加しましょう。

class Student {
    String firstName
    String lastName
}

Grailsはその規約を適用し、

grails-app/domain

ディレクトリにあるすべてのクラスに対してオブジェクトリレーショナルマッピングを設定します。

さらに、http://gorm.grails.org/6.0.x/hibernate/api/org/grails/datastore/gorm/GormEntity.html[GormEntity]トレイトのおかげで、

すべてのドメインクラスはすべてのCRUD操作にアクセスできるようになります。

、これは次のセクションでサービスを実装するために使用します。


4.2. サービス層

私たちのアプリケーションは以下のユースケースを扱います。

  • 学生のリストを見る

  • 新入生を作る

  • 既存の生徒を削除する

これらのユースケースを実装しましょう。まずサービスクラスを生成します。

grails create-service com.baeldung.grails.Student


grails-app/services

ディレクトリに進んで、適切なパッケージで新しく作成されたサービスを見つけ、必要なすべてのメソッドを追加しましょう。

@Transactional
class StudentService {

    def get(id){
        Student.get(id)
    }

    def list() {
        Student.list()
    }

    def save(student){
        student.save()
    }

    def delete(id){
        Student.get(id).delete()
    }
}

  • サービスはデフォルトでトランザクションをサポートしていないことに注意してください。この機能を有効にするには、クラスに

    @ Transactional

    アノテーションを追加します。


4.3. コントローラレイヤ

ビジネスロジックをUIで利用できるようにするには、次のコマンドを呼び出して

StudentController

を作成しましょう。

grails create-controller com.baeldung.grails.Student

デフォルトでは、

GrailsはBeanを名前で注入します

。つまり、

studentsService

というインスタンス変数を宣言することで、

StudentService

シングルトンインスタンスをコントローラに簡単に挿入できます。

生徒の閲覧、作成、削除のためのアクションを定義できるようになりました。

class StudentController {

    def studentService

    def index() {
        respond studentService.list()
    }

    def show(Long id) {
        respond studentService.get(id)
    }

    def create() {
        respond new Student(params)
    }

    def save(Student student) {
        studentService.save(student)
        redirect action:"index", method:"GET"
    }

    def delete(Long id) {
        studentService.delete(id)
        redirect action:"index", method:"GET"
    }
}

慣例により、

このコントローラからの

index()

アクションはURI



/student/index




show()



/student/show__などにマッピングされます。


4.4. レイヤーを表示

コントローラアクションを設定したので、次にUIビューの作成に進むことができます。生徒の一覧表示、作成、削除のために3つのGroovy Server Pagesを作成します。

慣例により、Grailsはコントローラ名とアクションに基づいてビューをレンダリングします。たとえば、




StudentController

のindex()


アクションは

/grails-app/views/student/index.gsp


に解決されます。

生徒のリストを表示するビュー

/grails-app/views/student/index.gsp

の実装から始めましょう。コントローラの

index()アクションから返されたすべての生徒を表示するHTMLテーブルを作成するには、タグ<<f:table/>

を使用します。

慣例により、オブジェクトのリストで応答するとき、

Grailsはモデル名

に “List”サフィックスを追加します。その結果、変数

studentList

を使用して生徒オブジェクトのリストにアクセスできます。

<!DOCTYPE html>
<html>
    <head>
        <meta name="layout" content="main"/>
    </head>
    <body>
        <div class="nav" role="navigation">
            <ul>
                <li><g:link class="create" action="create">Create</g:link></li>
            </ul>
        </div>
        <div id="list-student" class="content scaffold-list" role="main">
            <f:table collection="${studentList}"
                properties="['firstName', 'lastName']"/>
        </div>
    </body>
</html>

これで、

/grails-app/views/student/create.gsp、

ビューに進みます。これにより、ユーザーは新しい生徒を作成できます。組み込みの

<f:all/>

タグを使用します。これは、指定されたBeanのすべてのプロパティのフォームを表示します。

<!DOCTYPE html>
<html>
    <head>
        <meta name="layout" content="main"/>
    </head>
    <body>
        <div id="create-student" class="content scaffold-create" role="main">
            <g:form resource="${this.student}" method="POST">
                <fieldset class="form">
                    <f:all bean="student"/>
                </fieldset>
                <fieldset class="buttons">
                    <g:submitButton name="create" class="save" value="Create"/>
                </fieldset>
            </g:form>
        </div>
    </body>
</html>

最後に、表示して最終的に生徒を削除するためのビュー

/grails-app/views/student/show.gsp

を作成しましょう。

他のタグの中でも、引数としてBeanを取り、そのすべてのフィールドを表示する

<f:display/>

を利用します。

<!DOCTYPE html>
<html>
    <head>
        <meta name="layout" content="main"/>
    </head>
    <body>
        <div class="nav" role="navigation">
            <ul>
                <li><g:link class="list" action="index">Students list</g:link></li>
            </ul>
        </div>
        <div id="show-student" class="content scaffold-show" role="main">
            <f:display bean="student"/>
            <g:form resource="${this.student}" method="DELETE">
                <fieldset class="buttons">
                    <input class="delete" type="submit" value="delete"/>
                </fieldset>
            </g:form>
        </div>
    </body>
</html>


4.5. 単体テスト

Grailsは主にテスト目的でhttp://spockframework.org/[Spock]を利用します。あなたがSpockに慣れていないのなら、まず

このチュートリアル

を読むことを強くお勧めします。


StudentControllerの

index()アクションを単体テストすることから始めましょう。


StudentService



list()

メソッドをモックし、

index()

が期待されるモデルを返すかどうかをテストします。

void "Test the index action returns the correct model"() {
    given:
    controller.studentService = Mock(StudentService) {
        list() >>[new Student(firstName: 'John',lastName: 'Doe')]    }

    when:"The index action is executed"
    controller.index()

    then:"The model is correct"
    model.studentList.size() == 1
    model.studentList[0].firstName == 'John'
    model.studentList[0].lastName == 'Doe'
}

それでは、

delete()

アクションをテストしましょう。

StlentService

から

delete()

が呼び出されたかどうかを確認し、インデックスページへのリダイレクトを確認します。

void "Test the delete action with an instance"() {
    given:
    controller.studentService = Mock(StudentService) {
      1 **  delete(2)
    }

    when:"The domain instance is passed to the delete action"
    request.contentType = FORM__CONTENT__TYPE
    request.method = 'DELETE'
    controller.delete(2)

    then:"The user is redirected to index"
    response.redirectedUrl == '/student/index'
}


4.6. 統合テスト

次に、サービス層の統合テストを作成する方法を見てみましょう。主に

grails-app/conf/application.yml.

に設定されたデータベースとの統合をテストします。

  • デフォルトでは、Grailsはこの目的のためにインメモリH2データベースを使用します。

まず、データベースにデータを追加するためのデータを作成するためのヘルパーメソッドを定義することから始めましょう。

private Long setupData() {
    new Student(firstName: 'John',lastName: 'Doe')
      .save(flush: true, failOnError: true)
    new Student(firstName: 'Max',lastName: 'Foo')
      .save(flush: true, failOnError: true)
    Student student = new Student(firstName: 'Alex',lastName: 'Bar')
      .save(flush: true, failOnError: true)
    student.id
}

私たちの統合テストクラスの

@ Rollback

アノテーションのおかげで、

各メソッドは別々のトランザクションで実行され、それはテストの終わりにロールバックされます

__list()メソッドの統合テストをどのように実装したかを見てください。

void "test list"() {
    setupData()

    when:
    List<Student> studentList = studentService.list()

    then:
    studentList.size() == 3
    studentList[0].lastName == 'Doe'
    studentList[1].lastName == 'Foo'
    studentList[2].lastName == 'Bar'
}

また、

delete()

メソッドをテストして、生徒の総数が1減るかどうかを検証しましょう。

void "test delete"() {
    Long id = setupData()

    expect:
    studentService.list().size() == 3

    when:
    studentService.delete(id)
    sessionFactory.currentSession.flush()

    then:
    studentService.list().size() == 2
}


5実行とデプロイ

アプリケーションの実行とデプロイは、Grails CLIを介して単一のコマンドを呼び出すことによって実行できます。

アプリを実行するための使用:

grails run-app

デフォルトでは、GrailsはTomcatをポート8080に設定します。

画像:/uploads/list-300×111.jpg%20300w[画像]

アプリケーションをサーブレットコンテナにデプロイする場合は、次のようにします。

grails war

すぐに展開できる戦争成果物を作成する。


6. 結論

この記事では、設定を上書きするという考え方を使ってGrails Webアプリケーションを作成する方法に焦点を当てました。また、Spockフレームワークを使用して単体テストおよび統合テストを実行する方法も見ました。

いつものように、ここで使われているすべてのコードはhttps://github.com/eugenp/tutorials/tree/master/grails[GitHubに載って]を見つけることができます。