# JVue Template Engine **Repository Path**: iteachyou/jvue-template-engine ## Basic Information - **Project Name**: JVue Template Engine - **Description**: JVue Template Engine 是一款纯 Java 开发的高性能模板引擎,将前端开发者熟悉的 Vue 模板语法引入到 Java 服务端渲染场景中。无需学习新语法,开箱即用,让 Java 开发者也能享受 Vue 风格的模板体验。 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 15 - **Forks**: 0 - **Created**: 2026-04-24 - **Last Updated**: 2026-06-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: jvue, 模板引擎 ## README ## JVue Template Engine [![JDK](https://img.shields.io/badge/JDK-17%2B-blue)](https://openjdk.org/) [![License](https://img.shields.io/badge/License-MIT-green)](LICENSE) [![Version](https://img.shields.io/badge/version-1.0.2-orange)](https://gitee.com/iteachyou/jvue-template-engine) ## 简介 **JVue Template Engine** 是一款纯 Java 开发的高性能模板引擎,将前端开发者熟悉的 [Vue](https://vuejs.org/) 模板语法引入到 Java 服务端渲染(SSR)场景中。无需学习新语法,开箱即用,让 Java 开发者也能享受 Vue 风格的模板体验。 > **核心理念:用 Vue 写模板,用 Java 跑引擎。** ```html

{{ title }}

共 {{ items.length }} 条记录

``` --- ## 功能特性 | 类别 | 特性 | 状态 | |------|------|------| | 🎯 **Vue 指令** | `v-if` / `v-else-if` / `v-else` 条件渲染 | ✅ | | 🔄 **列表渲染** | `v-for` 支持 List / Map / 带索引遍历 | ✅ | | 🔗 **属性绑定** | `:href`、`:class`(对象/数组)、`:style` 动态绑定 | ✅ | | 👁️ **显示控制** | `v-show`(渲染为 `display:none`) | ✅ | | 📝 **内容指令** | `v-text` / `v-html` / `v-pre` | ✅ | | 🔌 **自定义指令** | 通过 `JVueDirectiveHandler` 注册任意自定义指令 | ✅ | | 🧮 **插值表达式** | `{{ }}` 支持算术运算、三元表达式、属性访问、链式调用 | ✅ | | 🛠️ **自定义方法** | 注册 Java 方法,在模板表达式中直接调用 | ✅ | | 📦 **模板包含** | `` + `v-include` 动态包含 | ✅ | | 🚀 **多源加载** | Classpath / 文件系统 / 组合加载器(按优先级链 fallback) | ✅ | | 💾 **编译缓存** | AST 级缓存 + ConcurrentHashMap 线程安全 | ✅ | | 🔒 **XSS 防护** | 插值默认 HTML 转义,`v-html` 可控输出 | ✅ | | 🛡️ **路径穿越防护** | FileLoader / ClasspathLoader 均拒绝 `../` 越界访问 | ✅ | | 🧩 **零运行时依赖** | 纯 Java 实现,无第三方库依赖 | ✅ | | ☕ **JDK 兼容** | 要求 Java 17 及以上版本 | ✅ | --- ## 快速开始 ### 添加依赖 **Maven** ```xml cc.iteachyou.jvue jvue-template-engine 1.0.2 ``` **Gradle** ```groovy implementation 'cc.iteachyou.jvue:jvue-template-engine:1.0.2' ``` ### 5 分钟上手 ```java import cc.iteachyou.jvue.JVueTemplateEngine; import java.util.*; // 1. 准备模板 String template = "
" + "

VIP 用户

" + "" + "跳转" + "" + "
"; // 2. 创建引擎实例(传入模板加载器) JVueTemplateEngine engine = new JVueTemplateEngine( name -> { if ("index".equals(name)) return template; throw new IllegalArgumentException("未找到模板: " + name); } ); // 3. 渲染输出 String html = engine.render("index", Map.of( "vip", true, "items", List.of("Apple", "Banana"), "link", "/home" )); ``` --- ## 语法参考 ### 插值表达式 `{{ }}` ```html

{{ username }}

合计:{{ price * quantity }}

{{ isVip ? '尊享会员' : '普通用户' }}

{{ user.address.city }}

``` ### 条件渲染 `v-if / v-else-if / v-else` ```html
优秀
及格
不及格
``` ### 列表渲染 `v-for` ```html
  • {{ item.name }}
  • {{ index + 1 }}. {{ item.name }}
  • {{ key }}: {{ value }}
  • ``` ### 属性绑定 ```html
    动态类名
    数组类名

    动态样式

    ``` ### 其他内置指令 | 指令 | 说明 | |------|------| | `v-show="expr"` | 控制可见性(渲染为 `display:none`) | | `v-text="expr"` | 设置文本内容 | | `v-html="raw"` | 输出原始 HTML(注意 XSS) | | `v-pre` | 跳过该节点编译 | | `v-cloak` | 标记未编译节点 | ### 模板包含 ```html
    ``` ### 自定义指令 ```java engine.registerDirective(new JVueDirectiveHandler() { @Override public String name() { return "v-upper"; } @Override public String apply(JVueDirectiveAttribute attr, JVueElementNode node, JVueRenderContext ctx, JVueTemplateEngine e) { Object val = e.getExpressionEvaluator().evaluate(attr.value(), ctx); return "<" + node.getTagName() + ">" + String.valueOf(val).toUpperCase() + ""; } }); // 模板:CURSOR ``` ### 自定义方法 ```java engine.registerMethod("upper", args -> String.valueOf(args.get(0)).toUpperCase() ); // 模板:

    {{ upper(name) }}

    CURSOR

    ``` ### 多源模板加载 ```java // 组合加载器:优先磁盘 → fallback 到 classpath JVueCompositeTemplateLoader loader = new JVueCompositeTemplateLoader( new JVueFileTemplateLoader(Path.of("/var/templates")), new JVueClasspathTemplateLoader("templates/") ); JVueTemplateEngine engine = new JVueTemplateEngine(loader); ``` --- ## 安全机制 ### XSS 防护(插值默认转义) ```java engine.render("x", Map.of("input", "")); // 输出: <script>alert('xss')</script> ← 已自动转义 ``` ### 路径穿越防护 ```java FileLoader loader = new JVueFileTemplateLoader(baseDir); loader.load("../../etc/passwd"); // ❌ 抛出 IllegalStateException loader.load("../secret.txt"); // ❌ 抛出 IllegalStateException loader.load("normal.html"); // ✅ 正常返回 ``` --- ## 与 Spring Boot 集成 推荐使用配套的 [jvue-template-engine-spring-boot-starter](https://gitee.com/iteachyou/jvue-template-engine-spring-boot-starter) 实现零配置接入: ```xml cc.iteachyou.jvue jvue-template-engine-spring-boot-starter 1.0.1 ``` ```yaml # application.yml jvue: template: prefix: classpath:/templates/ suffix: .html cache: true encoding: UTF-8 ``` 详细用法请查看 [Starter 文档](https://gitee.com/iteachyou/jvue-template-engine-spring-boot-starter) 和 [在线 Demo](https://gitee.com/iteachyou/jvue-template-engine-spring-boot-starter-demo)。 --- ## 性能基准 测试环境:JDK 17 · 4 核 CPU | 场景 | 模板大小 | QPS(约) | 平均耗时 | |------|---------|----------|---------| | 简单插值(10 变量) | ~500B | ~850K | < 0.2ms | | 中等复杂度(v-for × 50) | ~2KB | ~120K | < 1ms | | 复杂嵌套(多层 v-for + v-if) | ~10KB | ~28K | ~4ms | > 模板编译结果会被 AST 缓存,重复渲染无编译开销。 --- ## 版本历史 | 版本 | 更新内容 | |------|---------| | **1.0.2** | 🔧 修复 `