JTE是一个模板引擎用于在 Spring Boot 应用程序中开发使用 Java 语法的用户界面应用程序与 Freemarker、Thymeleaf、Mustache 和 Velocity 等其他引擎并驾齐驱。许多开发人员广泛使用 Spring Boot一个简化 Java 应用程序开发的框架而像我这样的模板引擎则简化了创建动态和响应式用户界面的过程。JTE 文档强调Java Template Engine(jte) 是为 Java 和 Kotlin 量身定制的安全高效的解决方案。 JTE 旨在尽量减少新关键字的引入并使用现有的语言特性从而简化对模板功能的理解。特点提供简化且用户友好的语法。*]你可以用纯 Java 或 [Kotlin 编写表达式。系统在编译时执行上下文感知的 HTML 转义。*][IntelliJ 插件 提供了 Intellisense 和重构功能。自动重新加载功能在开发过程中出现。保证提高执行速度。有关更多详细信息请参阅此链接Java 模板引擎JTE能够与各种框架集成。Spring MVCSpring BootKtorMicronautQuarkusJavalinEclipse Vert.xSeverellhttp4kMave:dependency groupIdgg.jte/groupId artifactIdjte/artifactId version3.1.13/version /dependencyGradleimplementation(gg.jte:jte:3.1.13)要呈现任何模板您必须为整个应用程序使用一个 gg.jte.TemplateEngine 实例。import gg.jte.ContentType; import gg.jte.TemplateEngine; import gg.jte.CodeResolver; import gg.jte.resolve.DirectoryCodeResolver; // ... CodeResolver codeResolver new DirectoryCodeResolver(Path.of(jte)); // 这是存放 .jte 文件的目录。 TemplateEngine templateEngine TemplateEngine.create(codeResolver, ContentType.Html);完全初始化模板引擎实例后我们就可以开始渲染模板了。import gg.jte.TemplateOutput; import gg.jte.output.StringOutput; // ... TemplateOutput templateOutput new StringOutput(); templateEngine.render(home.jte, model, templateOutput);在这里templateOutput模板输出一词表示模板渲染的位置。gg.jte.output.StringOutput--以字符串形式生成输出。gg.jte.output.FileOutput--将内容写入指定的 java.io.File。gg.jte.output.PrintWriterOutput--输出到 PrintWriter例如从 HttpServletRequest 获取的 writer。gg.jte.output.WriterOutput - 将数据传输到 java.io.Writer 中。SpringBoot实例模型指的是提供给该模板的数据可以是任何类的实例。 现在我们就来参与一个实际的 Spring Boot 示例。第一步访问 start.spring.io第二步选择项目、语言、Spring Boot 版本最好是已发布的版本、项目元数据以及 Java 版本第三步在依赖选择下请添加 Web 和 JTE模板引擎依赖 第四步然后生成并下载项目?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.3.4/version relativePath/ !-- lookup parent from repository -- /parent groupIdcom.bsmlabs/groupId artifactIdspring-boot-jte/artifactId version0.0.1-SNAPSHOT/version namespring-boot-jte/name descriptionSpring Boot Project with Java Template Engine/description url/ licenses license/ /licenses developers developer/ /developers scm connection/ developerConnection/ tag/ url/ /scm properties java.version23/java.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdgg.jte/groupId artifactIdjte/artifactId version3.1.13/version /dependency dependency groupIdgg.jte/groupId artifactIdjte-spring-boot-starter-3/artifactId version3.1.13/version /dependency dependency groupIdcom.h2database/groupId artifactIdh2/artifactId scoperuntime/scope /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies build plugins plugin groupIdgg.jte/groupId artifactIdjte-maven-plugin/artifactId version3.1.13/version executions execution idjte-generate/id phasegenerate-sources/phase goals goalgenerate/goal /goals configuration sourceDirectory${project.basedir}/src/main/jte/sourceDirectory contentTypeHtml/contentType binaryStaticContenttrue/binaryStaticContent targetResourceDirectory${project.build.outputDirectory}/targetResourceDirectory /configuration /execution /executions /plugin plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build /project解压缩项目并导入 IntelliJ /Eclipse IDE 让我们创建一个名为 IndexController 的简单控制器并创建带有实例字段的页面布局package com.bsmlabs.jte; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; Controller public class IndexController { GetMapping(/) public String getIndex(Model model) { model.addAttribute(name, Welcome To Java Template Engine); model.addAttribute(page, new Page(Hello JTE, JTE Application)); return index; } } package com.bsmlabs.jte; public record Page(String title, String description) { }下一步是在 /src/main/jte 文件夹中创建一个 index.jte 模板该目录是在 start.spring.io 生成过程中建立的。import com.bsmlabs.jte.Page param String name param Page page !DOCTYPE html html langen head title${page.title()}/title if(page.description() ! null) meta namedescription content${page.description()} endif script srchttps://cdn.tailwindcss.com/script /head body nav classbg-gray-800 div classhidden sm:ml-6 sm:block div classflex space-x-4 a href# classrounded-md bg-gray-900 px-3 py-2 text-sm font-medium text-white aria-currentpageDashboard/a a href# classrounded-md px-3 py-2 text-sm font-medium text-gray-300 hover:bg-gray-700 hover:text-whiteBlog/a a href# classrounded-md px-3 py-2 text-sm font-medium text-gray-300 hover:bg-gray-700 hover:text-whiteProjects/a /div /div /nav p classtext-slate-700 dark:text-slate-500 font-medium${name}!/p /body /html在此上下文中指令 import 与 Java 导入直接对应从而确保 com.bsmlabs.jte.Page 被模板识别。该模板所需的参数是 Page 对象即 param Page pageif/endif 结构表示 if 块。括号内的内容page.getDescription() ! null由标准 Java 代码组成。${} 用于在表达式中写入模板输出。我们将在 application.properties 中添加以下属性# 当 developmentMode 设置为 true 时jte 文件监视器将监控模板更改并相应地重新编译。 gg.jte.development-modetrue spring.application.namespring-boot-jte # 默认情况下模板文件位于 /src/main/jte gg.jte.templateLocationsrc/main/jte # 用 templateSuffix 表示 .jte gg.jte.templateSuffix.jte由于我们使用 Spring Boot 进行开发并结合了 spring-boot-starter-web 起动器因此 org.springframework.web.servlet.ViewResolver 和 templateEngine 都将自动配置。结论通过将 Java 模板引擎 (JTE) 集成到各种框架中人们可以体验到一种新颖的方法这种方法具有显著的优势包括卓越的性能、更高的并发性和更快的模板渲染。代码 Github.