Handling FreeMaker template with Ktor Kotlin

别来无恙 提交于 2019-12-22 21:53:33

问题


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.

My app structure is:

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:

package blog

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:


回答1:


I got the answer here.

Template Loading is required to be installed as:

import org.jetbrains.ktor.freemarker.*
import freemarker.cache.*; // template loaders live in this package

install(FreeMarker) {
    templateLoader = ClassTemplateLoader(TheApp::class.java.classLoader, "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"))

Where index.ftl is:

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

I found this also to be a good startup for learning FTL template.



来源:https://stackoverflow.com/questions/46455185/handling-freemaker-template-with-ktor-kotlin

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!