Manejo de la plantilla de FreeMaker con Ktor Kotlin

Soy muy nuevo en Kotlin (y Java), así como Ktor y FreeMaker , tratando de hacer una aplicación que los combine a todos, pero parece que estoy haciendo algo mal relacionado con la manipulación de templates de FreeMaker .

La estructura de mi aplicación es:

enter image description here

template.ftl :

 <#macro mainLayout title="Welcome"> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>${title} | Kweet</title> </head> <body> HI </body> </html> </#macro> 

index.ftl :

 <#import "template.ftl" as layout /> imported title: ${title} <@layout.mainLayout title="Welcome"> <div class="posts"> <h3 class="content-subhead">Top 10</h3> </div> </@layout.mainLayout> 

BlogApp.kt :

blog de package

 import kotlinx.html.* import org.jetbrains.ktor.freemarker.* import org.jetbrains.ktor.host.* // for embededServer import org.jetbrains.ktor.netty.* // for Netty import org.jetbrains.ktor.application.* import org.jetbrains.ktor.features.* import org.jetbrains.ktor.html.* import org.jetbrains.ktor.routing.* import org.jetbrains.ktor.response.* fun Application.module() { install(DefaultHeaders) install(CallLogging) install(Routing) { get("/") { val model = mapOf("id" to 1, "title" to "Hello, World!") call.respond(FreeMarkerContent("index.ftl", model, "e")) } } } fun main(args: Array<String>) { embeddedServer(Netty, 8080, watchPaths = listOf("BlogAppKt"), module = Application::module).start() } 

build.gradle :

 group 'Example' version 'alpha' buildscript { ext.kotlin_version = '1.1.4-3' ext.ktor_version = '0.4.0' repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } apply plugin: 'java' apply plugin: 'kotlin' sourceCompatibility = 1.8 repositories { jcenter() mavenCentral() maven { url "http://dl.bintray.com/kotlin/ktor" } maven { url "https://dl.bintray.com/kotlin/kotlinx" } } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" compile "org.jetbrains.ktor:ktor-core:$ktor_version" compile "org.jetbrains.ktor:ktor-netty:$ktor_version" compile "org.jetbrains.ktor:ktor-html-builder:$ktor_version" compile "org.jetbrains.ktor:ktor-freemarker:$ktor_version" compile "org.apache.commons:commons-email:1.4" compile "org.slf4j:slf4j-simple:1.7.25" compile "ch.qos.logback:logback-classic:1.2.1" testCompile group: 'junit', name: 'junit', version: '4.12' } compileKotlin { kotlinOptions.jvmTarget = "1.8" } compileTestKotlin { kotlinOptions.jvmTarget = "1.8" } kotlin { experimental { coroutines "enable" } } jar { baseName 'abc' manifest { attributes 'Main-Class': 'blog.BlogAppKt' } from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } } 

Obtuve el siguiente resultado al iniciar el server:

enter image description here

Tengo la respuesta aquí .

Se requiere que la carga de la plantilla se instale como:

 import org.jetbrains.ktor.freemarker.* import freemarker.cache.*; // template loaders live in this package install(FreeMarker) { templateLoader = ClassTemplateLoader(TheApp::class.java.classLoader, "templates") } 

Luego, la plantilla guardada en resources/templates se puede cargar usando el método call.respond() :

 val user = mapOf("title" to "Welcome guy", "name" to "user name", "email" to "user@example.com") call.respond(FreeMarkerContent("index.ftl", user, "e")) 

Donde index.ftl es:

 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>${title} | Kweet</title> </head> <body> <@greet person="${name}"!/> Your email address is ${email} <#include "/copyright_footer.html"> </body> </html> <#macro greet person color="black"> <font size="+2" color="${color}">Hello ${person}!</font> </#macro> 

También encontré esto como un buen inicio para aprender la plantilla FTL.

  • Errores de ejemplo de inicio de Ktor