用Ktor Kotlin处理FreeMaker模板

我对Kotlin (和Java)以及KtorFreeMaker ,试图将所有这些应用程序组合起来,但看起来我正在做一些与FreeMaker模板操作有关的错误。

我的应用程序结构是:

在这里输入图像描述

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

包博客

 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) } } } 

在启动服务器时,我得到了下面的输出:

在这里输入图像描述

我在这里得到了答案。

模板加载需要安装为:

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

然后保存在resources/templates可以使用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")) 

其中index.ftl是:

 <!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> 

我发现这也是学习FTL模板的一个很好的启动。

Interesting Posts