深色模式
字符串工具(Strings)
#strings 是 Thymeleaf 标准表达式中最常用的工具对象,专为 String 类型提供空值安全的操作方法(所有方法均对 null 做了兼容处理),底层对应 org.thymeleaf.expression.Strings 类(可参考其 JavaDoc 获取完整 API)。
java
/*
* ======================================================================
* 请查阅 org.thymeleaf.expression.Strings 类的 Javadoc API 文档
* ======================================================================
*/
/*
* 空值安全的 toString() 方法(避免 null 调用 toString() 抛异常)
*/
${#strings.toString(obj)} // 同样支持数组、列表、集合的批量处理(array*/list*/set* 方法)
/*
* 检查字符串是否为空(或 null)。检查前会先执行 trim() 去除首尾空格。
* 此方法同样适用于数组、列表(List)或集合(Set)类型的参数。
*/
${#strings.isEmpty(name)}
${#strings.arrayIsEmpty(nameArr)}
${#strings.listIsEmpty(nameList)}
${#strings.setIsEmpty(nameSet)}
/*
* 对字符串执行 isEmpty() 检查:若结果为 false(非空)则返回原字符串;
* 若为 true(为空)则返回指定的默认字符串。
* 此方法同样适用于数组、列表(List)或集合(Set)类型的参数。
*/
${#strings.defaultString(text,default)}
${#strings.arrayDefaultString(textArr,default)}
${#strings.listDefaultString(textList,default)}
${#strings.setDefaultString(textSet,default)}
/*
* 检查字符串中是否包含指定片段(子串)。
* 此方法同样适用于数组、列表(List)或集合(Set)类型的参数。
*/
${#strings.contains(name,'ez')} // 同样支持数组、列表、集合的批量处理
${#strings.containsIgnoreCase(name,'ez')} // 忽略大小写的包含检查,同样支持批量处理
/*
* 检查字符串是否以指定片段开头/结尾。
* 此方法同样适用于数组、列表(List)或集合(Set)类型的参数。
*/
${#strings.startsWith(name,'Don')} // 开头检查,同样支持批量处理
${#strings.endsWith(name,endingFragment)} // 结尾检查,同样支持批量处理
/*
* 字符串子串相关操作。
* 此方法同样适用于数组、列表(List)或集合(Set)类型的参数。
*/
${#strings.indexOf(name,frag)} // 获取子串首次出现的索引,同样支持批量处理
${#strings.substring(name,3,5)} // 截取子串(从索引3到5,左闭右开),同样支持批量处理
${#strings.substringAfter(name,prefix)} // 截取前缀之后的部分,同样支持批量处理
${#strings.substringBefore(name,suffix)} // 截取后缀之前的部分,同样支持批量处理
${#strings.replace(name,'las','ler')} // 替换子串,同样支持批量处理
/*
* 字符串前缀/后缀拼接。
* 此方法同样适用于数组、列表(List)或集合(Set)类型的参数。
*/
${#strings.prepend(str,prefix)} // 在字符串开头拼接前缀,同样支持批量处理
${#strings.append(str,suffix)} // 在字符串结尾拼接后缀,同样支持批量处理
/*
* 大小写转换。
* 此方法同样适用于数组、列表(List)或集合(Set)类型的参数。
*/
${#strings.toUpperCase(name)} // 转大写,同样支持批量处理
${#strings.toLowerCase(name)} // 转小写,同样支持批量处理
/*
* 拆分与拼接(仅针对数组/列表/集合)
*/
${#strings.arrayJoin(namesArray,',')} // 将字符串数组用指定分隔符拼接为单个字符串
${#strings.listJoin(namesList,',')} // 将字符串列表用指定分隔符拼接为单个字符串
${#strings.setJoin(namesSet,',')} // 将字符串集合用指定分隔符拼接为单个字符串
${#strings.arraySplit(namesStr,',')} // 将字符串按分隔符拆分为字符串数组(返回 String[])
${#strings.listSplit(namesStr,',')} // 将字符串按分隔符拆分为字符串列表(返回 List<String>)
${#strings.setSplit(namesStr,',')} // 将字符串按分隔符拆分为字符串集合(返回 Set<String>)
/*
* 去除首尾空格。
* 此方法同样适用于数组、列表(List)或集合(Set)类型的参数。
*/
${#strings.trim(str)} // 去除首尾空格,同样支持批量处理
/*
* 计算字符串长度。
* 此方法同样适用于数组、列表(List)或集合(Set)类型的参数。
*/
${#strings.length(str)} // 获取字符串长度,同样支持批量处理
/*
* 字符串缩写:将文本截断为最大长度 n,若原文本超过该长度则截断并以 "..." 结尾。
* 此方法同样适用于数组、列表(List)或集合(Set)类型的参数。
*/
${#strings.abbreviate(str,10)} // 缩写为最大长度10,同样支持批量处理
/*
* 转换首字符大小写(反之亦然)
*/
${#strings.capitalize(str)} // 首字符转大写,同样支持批量处理
${#strings.unCapitalize(str)} // 首字符转小写,同样支持批量处理
/*
* 将每个单词的首字符转为大写
*/
${#strings.capitalizeWords(str)} // 按默认分隔符(空格)拆分单词,首字符大写,同样支持批量处理
${#strings.capitalizeWords(str,delimiters)} // 按指定分隔符拆分单词,首字符大写,同样支持批量处理
/*
* 字符串转义
*/
${#strings.escapeXml(str)} // XML 转义,同样支持批量处理
${#strings.escapeJava(str)} // Java 转义(如 \n/\t),同样支持批量处理
${#strings.escapeJavaScript(str)} // JavaScript 转义,同样支持批量处理
${#strings.unescapeJava(str)} // Java 反转义,同样支持批量处理
${#strings.unescapeJavaScript(str)} // JavaScript 反转义,同样支持批量处理
/*
* 空值安全的字符串比较与拼接
*/
${#strings.equals(first, second)} // 字符串相等比较(区分大小写)
${#strings.equalsIgnoreCase(first, second)} // 字符串相等比较(忽略大小写)
${#strings.concat(values...)} // 拼接多个字符串(null 会被当作空字符串处理)
${#strings.concatReplaceNulls(nullValue, values...)}// 拼接多个字符串(null 替换为指定的 nullValue)
/*
* 生成随机字符串
*/
${#strings.randomAlphanumeric(count)} // 生成指定长度的随机字母数字字符串补充说明(贴合 Thymeleaf 字符串操作技术语境)
1. 核心术语解析
| 英文术语 | 译法/说明 |
|---|---|
| Null-safe | 空值安全(处理 null 时不抛异常,如 toString(null) 返回空字符串而非 NPE) |
| trim() | 去除首尾空格(isEmpty 检查前会执行,即 " " 会被判定为 empty) |
| abbreviate | 字符串缩写(如 abbreviate("HelloWorld123",6) 返回 "Hello...") |
| capitalizeWords | 单词首字母大写(默认按空格拆分,如 capitalizeWords("hello world") 返回 "Hello World") |
| concatReplaceNulls | 拼接并替换 null(如 concatReplaceNulls("-", null, "abc") 返回 "-abc") |
| randomAlphanumeric | 随机字母数字字符串(仅包含 a-z、A-Z、0-9,长度由 count 指定) |
2. 关键逻辑解读(高频用法示例)
html
<!-- 1. 空值处理与默认值 -->
<div th:with="username=${null}, defaultName='游客'">
用户名:<span th:text="${#strings.defaultString(username, defaultName)}"></span> <!-- 输出 游客 -->
</div>
<!-- 2. 包含性检查(忽略大小写) -->
<div th:with="name='Thymeleaf'">
是否包含 'leaf':<span th:text="${#strings.containsIgnoreCase(name, 'leaf')}"></span> <!-- true -->
</div>
<!-- 3. 字符串缩写 -->
<div th:with="longText='Thymeleaf 是优秀的模板引擎'">
缩写(长度8):<span th:text="${#strings.abbreviate(longText, 8)}"></span> <!-- 输出 "Thymeleaf..." -->
</div>
<!-- 4. 拆分与拼接 -->
<div th:with="strList=${#lists.toList(new String[]{'张三','李四','王五'})}">
列表拼接:<span th:text="${#strings.listJoin(strList, '|')}"></span> <!-- 输出 "张三|李四|王五" -->
字符串拆分:<span th:text="${#strings.listSplit('苹果,香蕉,橙子', ',')}"></span> <!-- 输出 [苹果,香蕉,橙子] -->
</div>
<!-- 5. 空值安全拼接 -->
<div th:with="str1='Hello', str2=${null}, str3='World'">
普通拼接:<span th:text="${#strings.concat(str1, str2, str3)}"></span> <!-- 输出 "HelloWorld" -->
替换null拼接:<span th:text="${#strings.concatReplaceNulls('-', str1, str2, str3)}"></span> <!-- 输出 "Hello-World" -->
</div>- 核心特性:
- 所有带
array*/list*/set*后缀的方法,均为“批量处理”(如listIsEmpty会遍历列表中所有字符串,只要有一个非空则返回 false); isEmpty检查前会执行trim(),即全空格的字符串会被判定为 empty;- 转义方法(
escapeXml/escapeJavaScript)是前端防 XSS 的常用手段,推荐在渲染用户输入内容时使用。
- 所有带
3. 句式优化说明
- 统一补充“(同样支持数组、列表、集合的批量处理)”解释
// also array*, list* and set*,避免重复且贴合中文阅读习惯; - 对易混淆的方法补充括号注释(如
substring的“左闭右开”、capitalizeWords的“默认分隔符”); - 拆分长句为“功能+规则”的结构(如缩写方法的“截断+结尾...”),突出核心逻辑;
- 保留
${#strings.xxx}表达式原样,注释兼顾“精准”与“易懂”,适配新手理解。
总结
#strings是 Thymeleaf 最常用的工具类,覆盖空值处理、内容检查、截取替换、大小写转换、拆分拼接、转义等所有字符串操作场景;- 核心特性:所有方法均为“空值安全”(避免 NPE),且支持数组/列表/集合的批量处理;
- 高频用法:
- 空值兜底:
defaultString(str, default); - 内容检查:
contains/containsIgnoreCase; - 拆分拼接:
listJoin/listSplit; - 防 XSS:
escapeXml/escapeJavaScript; - 空值安全拼接:
concatReplaceNulls。
- 空值兜底:
