Skip to content
Server Plugin

Velocity

必要相依性io.ktor:ktor-server-velocity

程式碼範例 velocity

原生伺服器
Ktor 支援 Kotlin/Native,允許您在沒有額外執行階段或虛擬機的情況下執行伺服器。
支援:✖️

Ktor 透過安裝 Velocity 外掛程式,讓您能在應用程式中使用 Velocity 範本 作為視圖。

新增相依性

若要使用 Velocity,您需要在建置指令碼中包含 ktor-server-velocity 構件:

Kotlin
Groovy
XML

安裝 Velocity

若要將 Velocity 外掛程式安裝到應用程式,請將其傳遞給指定

模組
模組允許您透過對路由進行分組來建構應用程式結構。
中的 install 函式。 下方的程式碼片段展示了如何安裝 Velocity ...

  • ... 在 embeddedServer 函式呼叫內。
  • ... 在明確定義的 module 內,該模組是 Application 類別的擴充函式。
kotlin
kotlin

此外,您也可以安裝 VelocityTools 外掛程式,以便獲得新增標準和自訂 Velocity 工具 的能力。

配置 Velocity

配置範本載入

install 區塊內,您可以配置 VelocityEngine。例如,如果您想使用來自 classpath 的範本,請為 classpath 使用資源載入器:

kotlin
import io.ktor.server.application.*
import io.ktor.server.velocity.*
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
import org.apache.velocity.runtime.RuntimeConstants

fun Application.module() {
    install(Velocity) {
        setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath")
        setProperty("classpath.resource.loader.class", ClasspathResourceLoader::class.java.name)
    }
}

在回應中傳送範本

假設您在 resources/templates 中有一個 index.vl 範本:

html
<html>
    <body>
        <h1>Hello, $user.name</h1>
    </body>
</html>

使用者的資料模型如下所示:

kotlin
data class User(val id: Int, val name: String)

若要將範本用於指定的 路由,請按以下方式將 VelocityContent 傳遞給 call.respond 方法:

kotlin
get("/index") {
    val sampleUser = User(1, "John")
    call.respond(VelocityContent("templates/index.vl", mapOf("user" to sampleUser)))
}

新增 Velocity 工具

如果您已安裝VelocityTools 外掛程式,則可以在 install 區塊內存取 EasyFactoryConfiguration 執行個體,以新增標準和自訂的 Velocity 工具,例如:

kotlin
install(VelocityTools) {
    engine {
        // 引擎配置
        setProperty("resource.loader", "string")
        addProperty("resource.loader.string.name", "myRepo")
        addProperty("resource.loader.string.class", StringResourceLoader::class.java.name)
        addProperty("resource.loader.string.repository.name", "myRepo")
    }
    addDefaultTools() // 新增預設工具
    tool("foo", MyCustomTool::class.java) // 新增自訂工具
}