订阅
订阅
0有用+1
0

StringTemplate

模板引擎库
StringTemplate(简称ST)是由Terence Parr设计的模板引擎库,最初用于解决jGuru网站模板逻辑耦合问题。该引擎基于Java开发,支持C#PythonRubyObjective-CJavaScriptScala等多语言移植版本,通过严格的模型-视图分离机制生成结构化文本,适用于代码生成、多语言网站开发等场景 [1-3]。核心类包括ST、STGroupDir和STGroupFile,模板语法采用$...$或<...>分隔符,支持动态属性作用域和迭代语法 [1]
StringTemplate遵循BSD协议,其Java版本在2022年9月发布4.3.4,在2025年4月有4.3.2版本的更新记录,支持Maven/Gradle依赖配置和IntelliJ插件集成 [4-5]。数据绑定支持直接注入对象属性和聚合属性注入 [1]。其设计哲学强调“严格模型-视图分离”和“简单性优先”,通过消除模板逻辑提升代码可维护性,在jGuru.com网站重构中验证了商业级可靠性 [3]
外文名
StringTemplate
简    称
ST
基    于
Java
性    质
模板引擎

特点介绍

播报
编辑
使兰洒劝用断市地遥晚Str盼市ingTemplate可以严格保证业务逻辑和表现逻辑相分离,不会互相干扰,提高网站的开发和维护的效率危体兵。模型和视图分离所带来的优点包括:模板文件可以在相似的网站开发中重殃拜糠员用,清晰的模立阀府板文件可以作为网站开发的说立漏去明文档,模板文件可以单独修改。

发展历程

播报
编辑
2012年1月13日,Stanislav Ochotnicky为Fedora系统打包了StringTemplate4的初始版本4.0.4-1。此后项目持续维护,版本不断更新(如4.0.8、4.2、4.3、4.3.1等),并与Fedora等发行版进行了多次系统级重建集成 [4]。2022年9月3日,项目主要维护者Terence Parr将版本更新至4.3.4,同步更新了项目配置及文档中的版本号 [5]。2025年4月29日,openeuler_bot将版本更新至4.3.2-1 [4]

核心技术

播报
编辑
StringTemplate的设计哲学强调严格的模型-视图分离原则 [3],其核心类包括ST、STGroupDir和STGroupFile。模板语法采用$...$或<...>作为表达式分隔符,支持动态属性作用域和迭代语法。数据绑定机制支持直接注入对象属性和聚合属性注入 [1]

运营模式

播报
编辑
StringTemplate是一款开源软件,采用BSD授权协议,其核心开发语言为Java该软件支持跨平台运行,用户可通过MavenGradle等构建工具进行依赖配置,此外官方提供了IntelliJ插件便于在集成开发环境中使用。 [2] [6]
其版本号曾达到4.3.4,亦有发布于2025年的发行版记录为4.3.2。 [4-5]

核心团队

播报
编辑
StringTemplate 由 Terence Parr 创建并主导开发,Terence Parr 是旧金山大学(University of San Francisco)的计算机科学教授。Terence Parr 自1989年起便致力于语言工具的研究,也是著名语言识别工具 ANTLR 的创建者 [8]。StringTemplate 也作为 ANTLR v3 的代码生成模板引擎,并随着 jGuru.com 和 ANTLR 项目的发展而不断完善 [6-7]。Terence Parr 于2007年出版了《The Definitive ANTLR Reference》一书 [7]

基本语法

播报
编辑
StringTemplate支持两种分隔符<...>和$...$
语法
描述
例子
<attribute>
显示变量值或空串
$user$
<user>
<attribute.property>
显示集合或对象的属性值或空串
$user.name$
<user.name>
<attribute.(expr)>
与<attribute.property> 意义相同,但是如果expr是保留字,则必须使用<attribute.(expr)>
$user.(name_label)$
<user.(name_label)>
<multi-valued-attribute>
集合中多个属性连接在一起的值
$users$
<users>
<multi-valued-attribute; separator=expr>
多个属性连接在一起,属性之间使用expr分隔
$users; separator=", "$
<users; separator=", ">
<template(argument-list)>
调用其它模板,可以向该模板传递参数
$bold()$
<bold(item=title)>
<attribute:template(argument-list)>
模板应用
$name:bold()$
<name:checkoutReceipt(items=skus, ship=shipOpt)>
<attribute:{argument-name_ | _anonymous-template}>
应用匿名模板
$users:{s|<li>$s$</li>}; separator="\n"$
<users:{s|<li>$s$</li>}; separator="\n">
<if(!attribute)>subtemplate<endif>
条件语句
$if(users)$ $users:{u|$u$}$ $endif$
<if(users)> <users:{u|<u>}> <endif>
\$ or \<
语法分隔符的转义表达
\$
\<
<\ >, <\n>, <\t>, <\r>
转义字符
$\n$
<\n>
<! comment !>, $! comment !$
注释符号
$! this is a comment !$
<! this is a comment !>