使用Ktor Kotlin处理FreeMaker模板 [英] Handling FreeMaker template with Ktor Kotlin
本文介绍了使用Ktor Kotlin处理FreeMaker模板的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我对Kotlin
(和Java)以及Ktor
和FreeMaker
都很陌生,试图制作一个将所有这些都结合在一起的应用程序,但是看起来我在做与FreeMaker
模板操作.
I'm very new to Kotlin
(and Java), as well as Ktor
and FreeMaker
, trying to make an app combining all of them, but looks I'm doing something wrong related to the FreeMaker
templates manipulating.
我的应用程序结构为:
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) } }
}
启动服务器后,我得到以下输出:
I got the below output upon starting the server:
推荐答案
我得到了答案这里
模板加载必须安装为:
import org.jetbrains.ktor.freemarker.*
import freemarker.cache.*; // template loaders live in this package
install(FreeMarker) {
templateLoader = ClassTemplateLoader(TheApp::class.java.classLoader, "templates")
}
然后可以使用call.respond()
方法加载保存在resources/templates
中的模板:
Then the template saved in resources/templates
can be loaded using call.respond()
method:
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模板的良好启动.
I found this also to be a good startup for learning FTL template.
这篇关于使用Ktor Kotlin处理FreeMaker模板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文