# 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
[](https://openjdk.org/)
[](LICENSE)
[](https://gitee.com/iteachyou/jvue-template-engine)
## 简介
**JVue Template Engine** 是一款纯 Java 开发的高性能模板引擎,将前端开发者熟悉的 [Vue](https://vuejs.org/) 模板语法引入到 Java 服务端渲染(SSR)场景中。无需学习新语法,开箱即用,让 Java 开发者也能享受 Vue 风格的模板体验。
> **核心理念:用 Vue 写模板,用 Java 跑引擎。**
```html
{{ title }}
-
✅ {{ item.name }}
❌ {{ item.name }}
共 {{ 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() +
"" + node.getTagName() + ">";
}
});
// 模板: → 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** | 🔧 修复 `