jooby(Kotlin)で Rocker(テンプレートエンジン)を使えるようにする方法

jooby(Kotlin)で Rocker(テンプレートエンジン)を使えるようにする方法 技術ネタ

ググっても、Kotlin + jooby で Rcoker(テンプレートエンジン) を使えるようにするための方法が書かれた日本語サイトが見つからなかったので、簡単にまとめました。



前提

本説明は、以下の環境で行っております。

  • https://github.com/jooby-project/kotlin-gradle-starter が動作するようになっていること。
    ※kotlin-gradle-starter については、ググると出てきますので、そちらを参考に動作するように設定してください。
  • java : 1.8.0_201
  • Gradle : 5.1.1
  • Kotlin : 1.3.11

修正方法

以下の通り修正していきます。

build.gradleの修正

Rcoker plugin を使えるようにするために build.gradle ファイルを修正します。
具体的には、repositories の上に plugins と、apply plugin の一番下に追加します。

plugins {
    id "nu.studer.rocker" version "0.4"
}

repositories {
    mavenLocal()
    jcenter()
    mavenCentral()
}

apply plugin: "io.spring.dependency-management"
apply plugin: "com.google.osdetector"
apply plugin: "java"
apply plugin: "kotlin"
apply plugin: "application"
apply plugin: "jooby"
apply plugin: "org.junit.platform.gradle.plugin"
apply plugin: "nu.studer.rocker"

次に、Rocker の設定を build.gradle ファイルの一番最後に追加します。
追加する内容は以下の通りです。

sourceSets.main.java {
    srcDirs += "src/rocker"
}

rocker {
    main {
        templateDir = file('src/rocker')
        outputDir = file('src/generated/rocker')
        optimize = true
    }
}
ディレクトリ名は、好きな場所に適宜変更してください。

Rocker表示用のコントローラとテンプレート追加

Rcoker を使ったページを表示するためのコントローラとテンプレートを追加します。

コントローラ

まずは、コントローラを追加します。
kotlin-gradle-starter/src/main/kotlin/starter/kotlin/test1 ディレクトを作成し、そこに Test1Controller.kt を作成します。
Test1Controller.kt の内容は以下の通りです。

package starter.kotlin.test1

import com.fizzed.rocker.Rocker
import org.jooby.mvc.GET
import org.jooby.mvc.Path

@Path("/test1")
class Test1Controller {

    @GET
    @Path("/hoge")
    fun hoge() : String {
        return Rocker.template("views/test1/hoge.rocker.html")
                .bind("title", "タイトル")
                .bind("h1", "ほげ")
                .render().toString()
    }
}

テンプレート

次にテンプレート(view)を2つ追加します。

本説明では、レイアウトとコンテンツに分けたやり方としています。
レイアウトテンプレートとして、kotlin-gradle-starter\src\rocker\views\common ディレクトリを作成し、そこに layout.rocker.html を作成します。
layout.rocker.html の内容は以下の通りです。

@args (String title, RockerBody content)
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>@title</title>
</head>
<body>
@content
</body>
</html>

次に、コンテンツのテンプレートとして、kotlin-gradle-starter\src\rocker\views\test1 ディレクトリを作成し、そこに hoge.rocker.html を作成します。
hoge.rocker.html の内容は以下の通りです。

@args (String title, String h1)
@views.common.layout.template(title) -> {
<h1>@h1</h1>
}

追加したコントローラ呼び出しのためのroute定義

最後に、上で定義したコントローラが有効になるように、 App.kt に追加します。
具体的には、以下のように 5行目にimport、15行目にuseを記述します。

package starter.kotlin

import org.jooby.Jooby.*
import org.jooby.Kooby
import starter.kotlin.test1.Test1Controller

/**
 * Gradle Kotlin stater project.
 */
class App : Kooby({
    get {
        val name = param("name").value("Kotlin")
        "Hello $name!"
    }
    use(Test1Controller::class)
})

/**
 * Run application:
 */
fun main(args: Array) {
    run(::App, args)
}

動作確認

以上の修正が完了したら、joobyRun を実行する。
以下のURLにアクセスし「ほげ」と表示されたら Rockerが正しく実行されています。
http://localhost:8080/test1/hoge/

最後に

最初にも書いた通り、ググっても、Kotlin + jooby で Rocker template engine を動作させるための方法が書かれた日本語サイトが見つけられず、結構苦労しました。
同じように悩んでいる方が居たら参考にしてください。