2017-09-27 1 views
0

Je suis très nouveau pour Kotlin (et Java), ainsi que Ktor et FreeMaker, en essayant de faire une application combinant tous, mais il semble que je fais quelque chose de mal lié à la FreeMaker modèles de manipulation.Handling modèle FreeMaker avec Ktor Kotlin

Ma structure app est:

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

J'ai obtenu le résultat ci-dessous lors du démarrage du serveur:

enter image description here

Répondre

1

Je suis la réponse here.

Template Loading doit être installé comme:

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

install(FreeMarker) { 
    templateLoader = ClassTemplateLoader(TheApp::class.java.classLoader, "templates") 
} 

Ensuite, le modèle enregistré dans resources/templates peut être chargé en utilisant la méthode 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 est:

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

J'ai trouvé this également être une bonne start-up pour apprendre le modèle FTL.