Thymeleaf
필수 의존성: io.ktor:ktor-server-thymeleaf
코드 예제: thymeleaf
Ktor에서는 Thymeleaf 플러그인을 설치하여 애플리케이션의 뷰(view)로 Thymeleaf 템플릿을 사용할 수 있습니다.
의존성 추가하기
Thymeleaf을 사용하려면 빌드 스크립트에 ktor-server-thymeleaf 아티팩트를 포함해야 합니다:
Thymeleaf 설치하기
애플리케이션에 Thymeleaf 플러그인을 설치하려면, 지정된
install 함수에 전달하세요. 아래 코드 스니펫은 Thymeleaf을 설치하는 방법을 보여줍니다... - ...
embeddedServer함수 호출 내부에서. - ...
Application클래스의 확장 함수로 명시적으로 정의된module내부에서.
Thymeleaf 설정하기
템플릿 로딩 설정하기
install 블록 내부에서 ClassLoaderTemplateResolver를 설정할 수 있습니다. 예를 들어, 아래 코드 스니펫은 Ktor가 현재 클래스패스(classpath)를 기준으로 templates 패키지에서 *.html 템플릿을 찾을 수 있도록 설정합니다:
import io.ktor.server.application.*
import io.ktor.server.thymeleaf.*
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver
fun Application.module() {
install(Thymeleaf) {
setTemplateResolver(ClassLoaderTemplateResolver().apply {
prefix = "templates/"
suffix = ".html"
characterEncoding = "utf-8"
})
}
}응답으로 템플릿 전송하기
resources/templates 경로에 index.html 템플릿이 있다고 가정해 보겠습니다:
<html xmlns:th="http://www.thymeleaf.org">
<body>
<h1 th:text="'Hello, ' + ${user.name}"></h1>
</body>
</html>사용자 데이터 모델은 다음과 같습니다:
data class User(val id: Int, val name: String)지정된 라우트(route)에서 템플릿을 사용하려면, 다음과 같이 ThymeleafContent를 call.respond 메서드에 전달하세요:
get("/index") {
val sampleUser = User(1, "John")
call.respond(ThymeleafContent("index", mapOf("user" to sampleUser)))
}예제: Thymeleaf 템플릿 자동 리로드
아래 예제는 개발 모드(development mode)를 사용할 때 Thymeleaf 템플릿을 자동으로 리로드하는 방법을 보여줍니다.
package com.example
import io.ktor.server.application.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import io.ktor.server.thymeleaf.*
import org.thymeleaf.templateresolver.*
fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)
fun Application.module() {
install(Thymeleaf) {
setTemplateResolver((if (developmentMode) {
FileTemplateResolver().apply {
cacheManager = null
prefix = "src/main/resources/templates/"
}
} else {
ClassLoaderTemplateResolver().apply {
prefix = "templates/"
}
}).apply {
suffix = ".html"
characterEncoding = "utf-8"
})
}
routing {
get("/index") {
val sampleUser = User(1, "John")
call.respond(ThymeleafContent("index", mapOf("user" to sampleUser)))
}
}
}
data class User(val id: Int, val name: String)전체 예제는 여기에서 확인할 수 있습니다: thymeleaf-auto-reload.
