You need to enable JavaScript to run this app. 如何在Ktor中实现PHP同类功能,查找Express框架下EJS的等价实现方案
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ktor中实现PHP同类功能,查找Express框架下EJS的等价实现方案

Ktor 中替代 EJS 的模板方案及类PHP开发效果实现

Ktor官方生态内置对多种服务端模板引擎的支持,其中FreeMarker是最贴合EJS使用习惯、可以直接在HTML中嵌入业务逻辑、实现表单校验提示的首选方案,完全可以实现你要的类PHP开发效果。

实现步骤

1. 引入依赖

Gradle Kotlin DSL配置如下:

implementation("io.ktor:ktor-server-freemarker:$ktor_version")

2. 初始化模板配置

在Ktor服务启动类中安装FreeMarker插件:

install(FreeMarker) {
    templateLoader = ClassTemplateLoader(this::class.java.classLoader, "templates")
    defaultEncoding = "UTF-8"
}

所有模板文件统一放在resources/templates目录下,后缀默认用.ftl。

3. 编写带逻辑的模板(类PHP/EJS写法)

示例模板form.ftl,直接嵌入判断逻辑、展示表单错误提示:

<!DOCTYPE html>
<html>
<body>
  <form action="/submit" method="post">
    <div>
      <label>用户名:</label>
      <input type="text" name="username" value="${(username)!''}">
      <!-- 用户名错误提示,逻辑直接写在模板里 -->
      <#if usernameError??>
        <span style="color:red">${usernameError}</span>
      </#if>
    </div>
    <div>
      <label>密码:</label>
      <input type="password" name="password">
      <#if passwordError??>
        <span style="color:red">${passwordError}</span>
      </#if>
    </div>
    <button type="submit">提交</button>
  </form>
</body>
</html>

4. 编写表单处理路由

和PHP逻辑一致,提交后校验参数,错误信息直接传入模板渲染:

routing {
    // 渲染表单页
    get("/form") {
        call.respond(FreeMarkerContent("form.ftl", emptyMap()))
    }
    // 处理表单提交
    post("/submit") {
        val params = call.receiveParameters()
        val username = params["username"]?.trim() ?: ""
        val password = params["password"]?.trim() ?: ""
        val errors = mutableMapOf<String, String>()
        // 校验逻辑
        if (username.length < 3) {
            errors["usernameError"] = "用户名长度不能少于3位"
        }
        if (password.length < 6) {
            errors["passwordError"] = "密码长度不能少于6位"
        }
        // 有错误就返回表单页,带入错误信息和已填内容
        if (errors.isNotEmpty()) {
            errors["username"] = username
            call.respond(FreeMarkerContent("form.ftl", errors))
            return@post
        }
        // 校验通过走后续逻辑
        call.respondText("提交成功")
    }
}

和EJS的用法对比

  • EJS的<% %>对应FreeMarker的<# >
  • EJS的<%= %>对应FreeMarker的${}
  • 变量空值处理、循环、条件判断的逻辑写法高度一致,学习成本极低

如果你更偏好贴近Kotlin语法的模板,也可以选择Kotlinx HTML,直接用Kotlin代码写HTML结构,完全类型安全,不过写法和EJS差异稍大。

内容的提问来源于stack exchange,提问作者Cetus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 04:36:06