Spring中Thymeleaf非对象列表(数字/字符串)过滤方法咨询
解决Thymeleaf中基本类型列表的SpEL过滤问题
嘿,我之前也踩过这个坑!当你处理数字、字符串这类基本类型/包装类型列表时,直接写${numbers.?[>10]}确实不会生效——原因是SpEL需要明确知道你要比较的是当前迭代的元素本身,这时候就得用#this关键字来指代列表里的每一个元素。
正确的语法示例
1. 数字列表过滤
要筛选出大于10的数字,把表达式改成这样:
${numbers.?[#this > 10]}
比如后台传了List<Integer> numbers = Arrays.asList(3, 12, 9, 15, 7);,在Thymeleaf里遍历过滤后的结果:
<ul> <li th:each="num : ${numbers.?[#this > 10]}" th:text="${num}"></li> </ul>
最终会渲染出12和15两个列表项。
2. 字符串列表过滤
如果是字符串列表,同样用#this来操作当前元素:
- 筛选长度大于5的字符串:
${strings.?[#this.length() > 5]} - 筛选包含特定子串的字符串:
${strings.?[#this.contains('spring')]} - 筛选等于指定值的字符串:
${strings.?[#this == 'thymeleaf']}
为什么之前的写法不生效?
对于对象列表(比如Person列表),我们用${persons.?[age >= 18]},这里的age是Person对象的属性,SpEL会自动把当前迭代的Person对象作为上下文,去取它的age属性。但对于基本类型列表,没有属性可以引用,必须显式用#this告诉SpEL:“我要比较的就是当前这个元素本身”。
内容的提问来源于stack exchange,提问作者Markus Weninger
相关产品推荐
相关产品推荐

