我正在使用Thymeleaf的Spring方言迭代一些数据,即使用SpEL。文档描述了如何使用数字或带引号的字符串访问数组,列表和地图:
<p th:text="${map['key']}"></p>
<p th:text="${list[0]}"></p>
但是,这里的键/索引必然是不变的,在这种情况下这对我没有帮助,因为我迭代了多个键(甚至不是字符串)。我尝试了两种变种:
<ul>
<li th:each="key : ${map}">
//SpelParseException: EL1043E:(pos 41): Unexpected token. Expected 'rsquare(])' but was 'lcurly({)'
<p th:text="${otherMap[${key}]}"></p>
//ConverterNotFoundException: No converter found capable of converting from type java.lang.String to type com.example.MyClass
<p th:text="${otherMap[key]}"></p>
</li>
</ul>
第二个让我相信SpEL试图在这里使用key
作为字符串"key"
,但后来断言otherMap
不使用字符串键。
有没有办法访问otherMap
的元素?
答案 0 :(得分:3)
注意强>
您必须使用双下划线 __${key}__
对其进行预处理,并将其包含在下一级处理中。
<强>解决方案强>
这将解决您的问题
<li th:each="key : ${map}">
<p th:text="${otherMap[__${key}__]}"></p>
</li>
鉴于您的控制器看起来像这样
@RequestMapping("/...")
public String index(Model model) {
Map<String, String> otherMap = new HashMap<>();
otherMap.put("one", "1111");
otherMap.put("two", "2222");
....
List<String> keys = new ArrayList<>();
keys.add("one");
keys.add("two");
...
model.addAttribute("otherMap", otherMap);
model.addAttribute("map", keys);
return "<view name>";
}
答案 1 :(得分:2)
对我有用的语法是这样的(注意#th:object
):
<ul>
<li th:each="key : ${map}" th:object="${key}">
<p th:text="${otherMap[#object]}"></p>
</li>
</ul>
虽然SpEL尝试解析${otherMap[*{id}]}
(当然不同,但我还是尝试过)作为乘法,但它正确地解释了#object
符号。
据我所知,#object
是Thymeleaf特有的,所以如果在SpEL的其他用例中存在类似的问题,那么这可能不适用。