Работа с шаблоном FreeMaker с помощью Ktor Kotlin

Я очень новичок в Kotlin (и Java), а также в Ktor и FreeMaker, пытаюсь создать приложение, объединяющее их все, но, похоже, я делаю что-то неправильно, связанное с манипулированием шаблонами 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) } }
}

Я получил следующий вывод при запуске сервера:

введите описание изображения здесь


person Hasan A Yousef    schedule 27.09.2017    source источник


Ответы (1)


Я получил ответ здесь.

Загрузка шаблона требуется для установки как:

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 "[email protected]")
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.

person Hasan A Yousef    schedule 29.09.2017