FreeMarker
Code example: freemarker
Ktor allows you to use FreeMarker templates as views within your application by installing the Freemarker plugin (previously known as feature).
Add dependencies
To enable FreeMarker
support, you need to include the ktor-freemarker
artifact in the build script:
implementation "io.ktor:ktor-freemarker:$ktor_version"
implementation("io.ktor:ktor-freemarker:$ktor_version")
<dependency>
<groupId>io.ktor</groupId>
<artifactId>ktor-freemarker</artifactId>
<version>${ktor_version}</version>
</dependency>
Install FreeMarker
To install the FreeMarker
plugin, pass it to the install
function in the application initialization code. Depending on the way used to create a server, this can be the embeddedServer
function call ...
import io.ktor.features.*
// ...
fun main() {
embeddedServer(Netty, port = 8080) {
install(FreeMarker)
// ...
}.start(wait = true)
}
... or a specified module.
import io.ktor.features.*
// ...
fun Application.module() {
install(FreeMarker)
// ...
}
Inside the install
block, you can configure the desired TemplateLoader for loading FreeMarker templates.
Configure FreeMarker
Configure template loading
To load templates, you need to assign the desired TemplateLoader type to the templateLoader
property. For example, the code snippet below enables Ktor to look up templates in the templates
package relative to the current classpath:
install(FreeMarker) {
templateLoader = ClassTemplateLoader(this::class.java.classLoader, "templates")
}
Send a template in response
Imagine you have the index.ftl
template in resources/templates
:
<html>
<body>
<h1>Hello, ${user.name}!</h1>
</body>
</html>
A data model for a user looks as follows:
data class User(val id: Int, val name: String)
To use the template for the specified route, pass FreeMarkerContent
to the call.respond
method in the following way:
get("/index") {
val sampleUser = User(1, "John")
call.respond(FreeMarkerContent("index.ftl", mapOf("user" to sampleUser)))
}