Kotlin Ktor FreeMarker HelloWorld 実装 サンプル

今回は、KotlinのWebフレームワークKtorで、

HelloWorldの表示確認をするだけの簡単なメモです。

概ね以下の公式Getting startと同じ内容となります。

https://ktor.io/docs/intellij-idea.html

まずは、こちらを確認頂くことをお勧めします。

環境

  • macOS:Big Sur 11.5.2
  • IntelliJ(Ultimate Edition):2023.1

動作確認バージョン

  • Kotlin:1.9.0
  • Ktor:2.3.3
  • JDK:amazon-corretto-11
  • Logback:1.2.11
  • Gradle:7.5.1
  • FreeMaker:2.3.3

プロジェクト作成

こちらの手順は、有償版(Ultimate Edition)IntelliJを利用しての手順となります。

有償版(Ultimate Edition)IntelliJを利用されていない方は、

以下リンクのKtor Project Generatorを利用して下さい。

https://start.ktor.io/

IntelliJの新規プロジェクト作成にて、Ktorを指定してプロジェクト作成します。

プロジェクトの保存場所などを指定してNextボタンをクリックします。

Intellij Ktor Create Project

一旦、HelloWorldを表示させるだけのプロジェクトを作成しますので、

プラグインは特に追加せずに、Createボタンをクリックします。

Intellij Ktor Create Project

以下のような形でHelloWorldを表示するだけの少ない構成のプロジェクトが作成されます。

Intellij Ktor Create Project

・build.gradle.kts

プロジェクト生成時に、kotlin.gradleを指定していたため、

Kotlin Scriptの形式でgradle設定ファイルが作成されています。

他のJVM言語と同じ要領で、ライブラリを追加するときは、こちらにGradle設定を追加していきます。

val ktor_version: String by project
val kotlin_version: String by project
val logback_version: String by project

plugins {
   kotlin("jvm") version "1.9.0"
   id("io.ktor.plugin") version "2.3.3"
}

group = "com.example"
version = "0.0.1"

application {
   mainClass.set("com.example.ApplicationKt")
   val isDevelopment: Boolean = project.ext.has("development")
   applicationDefaultJvmArgs = listOf("-Dio.ktor.development=$isDevelopment")
}

repositories {
   mavenCentral()
}

dependencies {
   implementation("io.ktor:ktor-server-core-jvm")
   implementation("io.ktor:ktor-server-netty-jvm")
   implementation("ch.qos.logback:logback-classic:$logback_version")
   testImplementation("io.ktor:ktor-server-tests-jvm")
   testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version")
}

Ktor Kotlin.gradle.kts

・gradle.properties

gradleを利用しているプロジェクトお馴染みのgradle.propertiesです。

build.gradle.ktsで利用されているバージョン値などが定義されています。

 

・Applicaiton.kt

embeddedServer関数でNettyサーバーの設定を行えます。

自動生成されたコードでも既に、portやhostの指定が行われています。

その下のApplication.moduleで、Webアプリケーションの処理を定義します。

ただ、そのまま直に処理をコーディングしてしまうと、

処理が増えた際に管理が品雑になるため、自動生成されたコードでも、

plugins/Routing.ktに外出し実装されています。

package com.example

import com.example.plugins.*
import io.ktor.server.application.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*

fun main() {
    embeddedServer(Netty, port = 8080, host = "0.0.0.0", module = Application::module)
    .start(wait = true)
}

fun Application.module() {
    configureRouting()
}

Ktor plugins Application.kt

・Routing.kt

既にHelloWorldの文字列を返却する処理が自動生成されています。

routingブロックの中でpathを定義します。

GETメソッドでルーティングされていますが、POSTなども定義可能です。

package com.example.plugins

import io.ktor.server.application.*
import io.ktor.server.response.*
import io.ktor.server.routing.*

fun Application.configureRouting() {
    routing {
        get("/") {
            call.respondText("Hello World!")
        }
    }
}

Ktor Routing.kt

・logback.xml

ロガーはデフォルトだとlogbackが採用されています。

logback.xmlでログ設定を行います。今回はデフォルトのまま利用します。

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="trace">
        <appender-ref ref="STDOUT"/>
    </root>
    <logger name="org.eclipse.jetty" level="INFO"/>
    <logger name="io.netty" level="INFO"/>
</configuration>

Ktor logback.xml

HelloWorld 表示確認

そのまま自動生成されたプロジェクトでもHelloWorldを表示できるので、挙動確認を行います。

Application.ktのmain関数のところの緑色の実行ボタンなどから実行します。

Ktor Application.kt

Run 通常実行・ Debug デバッグ実行のどちらでも良いので実行します。

(デバッグ実行の場合、ブレークポイントが設置された場所で一時停止します)

Intellij Ktor Run Debug

起動すると実行ログが表示されます。

Intellij Ktor Run Debug

実行ログに表示されているURLか、

localhost:8080にブラウザ等でアクセスすると、HelloWorldが表示されます。

Intellij Ktor HelloWorld localhost

挙動確認できたら、サーバーを停止します。

Intellij Ktor stop


HelloWorld実装 テンプレートエンジン利用

文字列を返却するだけではなく、テンプレートエンジンを利用して、

簡単なWebページを表示させてみたいと思います。

SpringBootなどではよくThymeleafが利用されていると思います。

KtorでもThymeleafを利用できますが、今回は試しにFreeMarkerを使ってみます。

https://ktor.io/docs/templating.html

・gradle.properties 修正

既存の設定に加えて、FreeMarkderのバージョン指定を追加します。

free_marker_version=2.3.3 // 追加

gradle.properties Ktor build.gradle.kts

・build.gradle.kts 修正

build.gradle.ktsファイルのdependencies部分にテンプレートエンジンのライブラリ依存指定を追加します。

バージョンを指定する変数宣言と、FreeMarkerの依存関係追加を行います。

val free_marker_version: String by project // 追加
implementation("io.ktor:ktor-server-freemarker:$free_marker_version") // 追加

build.gradle.kts FreeMarkder implementation version

build.gradle.kts FreeMarkder implementation

追加したら、gradle依存関係の更新を行います。

以下のマークを押すと更新されます。

Intellij Ktor gradle update

・Application.kt 修正

Application.ktに、HTMLテンプレートを利用するための処理を追加します。

fun Application.module() {
    install(FreeMarker) {
        templateLoader = ClassTemplateLoader(this::class.java.classLoader, "templates")
    }
    configureRouting()
}

Ktor Application.kt

・ルーティング HelloWorld表示 実装

今回は、既存のconfigureRoutingに追加します。

GETメソッドで利用したいので、既存と同様にget(“ルーティングパス文字列”)の形で指定します。

また、後述で作成するHTMLテンプレートを利用したいので、call.respondに以下の形で実装します。

FreeMarkerContent("テンプレートファイル名", mapOf("テンプレート内変数名" to "値(今回は表示したい文字列)"))

package com.example.plugins

import io.ktor.server.application.*
import io.ktor.server.freemarker.*
import io.ktor.server.response.*
import io.ktor.server.routing.*

fun Application.configureRouting() {
    routing {
        get("/") {
            call.respondText("Hello World!")
        }
        get("/hello") {
            call.respond(FreeMarkerContent("HelloWorldPage.ftl", mapOf("h1_word" to "Ktor!")))
        }
    }
}

Ktor routing.kt

・HTMLテンプレート作成

続けて、HTMLテンプレートを作成します。

初めに、HTMLテンプレートを配置するディレクトリから作成します。

resources配下にtemplatesディレクトリを作成します。

resourcesを選択して、右クリックメニューなどで作成します。

IntelliJ Ktor create dir

その後、作成したtemplatesディレクトリに、HTMLテンプレートを作成します。

HelloWorldPage.ftlというファイルを作成してみます。IntelliJ Ktor create dir

IntelliJ Ktor create dir

作成されたファイルを以下の内容で保存します。

<html>
<head>
    <title>HelloWorldPage</title>
</head>
<body>
    <h1>Hello World. ${h1_word}</h1>
    <#list 1..4 as index>
    <div>繰り返し処理:${index}回</div>
    </#list>
</body>
</html>

https://freemarker.apache.org/docs/ref_directive_list.html

IntelliJ Ktor FreeMaker HelloWorld

HelloWorld 表示確認 (テンプレート利用)

先ほどと同じ要領で、Webサーバーを起動して挙動確認を行います。

通常実行 Runでもデバッグ実行でも良いので、実行を行います。

Intellij Ktor Run Debug

Intellij Ktor Debug log

実行ログが流れ正常に起動したら、以下のURLでブラウザ等にアクセスします。

http://localhost:8080/hello

Intellij Ktor HelloWorld

正常に表示されたら動作確認も終了です。


今回のメモは以上となります。

KtorはKotlinを開発しているJetBrains社が開発しているフレームワークです。

現状、あまり日本語の情報はありませんが、

軽量でありシンプルに構成できるので、マイクロサービスなどを構築する際に良い選択肢になると思います。

https://ktor.io/

都内でエンジニアをやっています。 2017年に脱サラ(法人設立)しました。 仕事で調べたことや、気になったことをメモしています。
投稿を作成しました 171

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連投稿

検索語を上に入力し、 Enter キーを押して検索します。キャンセルするには ESC を押してください。

トップに戻る