深色模式
4.9 算术运算
Thymeleaf 标准表达式支持常见的算术运算:加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)。
html
<!-- 方式1:运算写在 ${} 外部(由 Thymeleaf 表达式引擎处理) -->
<div th:with="isEven=(${prodStat.count} % 2 == 0)">
偶数行特殊样式
</div>请注意,这些运算符也可以直接用在 OGNL 变量表达式内部(在这种情况下,它们将由 OGNL 执行,而不是由 Thymeleaf 的标准表达式引擎执行)。
html
<!-- 方式2:运算写在 ${} 内部(由 OGNL/SpringEL 引擎处理) -->
<div th:with="isEven=${prodStat.count % 2 == 0}">
偶数行特殊样式
</div>上述两种写法效果完全一致,都是判断 prodStat.count 是否为偶数,并将结果赋值给变量 isEven。
核心规则与补充说明
运算执行主体的差异:
- 方式1(
(${prodStat.count} % 2 == 0)):Thymeleaf 先解析${prodStat.count}得到数值,再由自身的表达式引擎执行% 2 == 0运算; - 方式2(
${prodStat.count % 2 == 0}):整个prodStat.count % 2 == 0作为 OGNL/SpringEL 表达式,由表达式引擎直接计算,Thymeleaf 仅接收最终布尔结果。
日常开发中两种写法无本质区别,方式2更简洁,是主流选择。
- 方式1(
运算符的文本别名: 为了兼容 XML 规范(XML 中
/、%等符号可能有特殊含义),Thymeleaf 为部分运算符提供了文本别名:运算符 别名 示例(等价写法) /div${num / 2}≡${num div 2}%mod${num % 2}≡${num mod 2}示例:
html<!-- 取模运算的别名写法,判断是否为偶数 --> <div th:with="isEven=${prodStat.count mod 2 == 0}">...</div> <!-- 除法运算的别名写法,计算半值 --> <div th:with="halfValue=${price div 2}">...</div>算术运算的常见场景:
- 数值计算:
${quantity * price}(计算总价)、${age + 1}(年龄+1); - 循环/列表处理:
${index % 2 == 0}(奇偶行样式区分)、${totalItems / pageSize}(计算总页数); - 变量赋值:通过
th:with定义计算后的临时变量(如上例的isEven)。
- 数值计算:
关键注意事项
- 运算时需确保参与运算的变量是数值类型:若变量为字符串(如
"10"),运算会按字符串规则执行(如"10" + 2 = "102"),需提前转换或用#numbers工具对象处理; - 除法运算(
//div)在 OGNL/SpringEL 中是“真除法”(如5 / 2 = 2.5),若需整数除法需手动处理(如${(int)(5 / 2)}); - 避免除以 0:需先判断除数非 0,防止异常(如
${denominator != 0 ? (num / denominator) : 0})。
总结
- Thymeleaf 支持
+/-/*///%算术运算,可写在${}内部(OGNL/SpringEL 处理)或外部(Thymeleaf 处理),效果等价; /和%分别有文本别名div、mod,用于兼容 XML 规范,推荐在 XML 模板中使用别名;- 运算前需确保变量为数值类型,避免字符串拼接错误,同时注意除数非 0 等边界情况。
