胸腺生长因子index.xhtml -
EL1012E:不能索引为空值
<div class="mylist" th:each="row,rowStat : *{dataList}">
Folder: <span th:text="*{dataList[__${rowStat.index}__].folderName}" />
<div class="invalid-feedback"
th:if="${dataList[__${rowStat.index}__].folderName == appFolderName}">
Folder already exists. Please choose different folder name.
</div>
</div>它显示的是folderName,而不是验证th:if,而appFolderName是一个模型属性值。
发布于 2022-06-22 17:32:32
对于th:each="row,rowStat : *{dataList}"迭代器,我会将该代码简化为:
th:each="row : ${dataList}"您可以认为这与以下Java循环大致等价:
List<DataItem> dataList = ...; // assume this is populated with DataItems
for (DataItem dataItem : dataList) {
System.out.println(dataItem.getFolderName());
}在上面的for -循环中,我们不需要按索引访问列表,Thymeleaf语法也是如此。
Thymeleaf允许您访问对象中的字段,而无需引用getter方法。
因此,既然我们有了来自row的th:each="row : ${dataList}"变量,我们就可以这样做了:
<div class="mylist" th:each="row,rowStat : *{dataList}">
Folder: <span th:text="${row.folderName}" />
<div class="invalid-feedback"
th:if="${row.folderName == appFolderName}">
Folder already exists. Please choose different folder name.
</div>
</div>在上面的代码中,您可以看到${row.folderName} -这意味着Thymeleaf将在row对象上调用getFolderName()方法。这依赖于您的对象使用JavaBean命名标准为您的getter。
您可以通过添加第二个变量来增强Thymeleaf th:each处理器--这就是您在问题中所做的:rowStat。
th:each="row,rowStat : ${dataList}"这使您可以访问有关Thymeleaf迭代器状态的额外信息--您可以看到所有这些额外数据值的列表这里。
在您的情况下,不需要这些额外的值。但是它们在其他情况下可能很有用--例如,如果您想要标识列表中的first或last记录,或者所有even记录,等等。
问题中的示例使用了__${...}__ 预处理语法,它非常强大,非常有用。但是,您的基本功能并不需要它。
您的示例使用${...}和*{...}语法来创建Thymeleaf变量。理解它们之间的基本区别是很重要的。
描述星号语法的文档中包含了这种差异。
星号语法计算选定对象的表达式,而不是整个上下文。也就是说,只要没有选定的对象,美元和星号语法就会完全相同。选择的对象是什么?使用th:object属性的表达式的结果。
文档中有一些例子。
最后,因为您使用的是Spring (根据您的问题中的标记),那么您实际上使用的是Spring的Thymeleaf和SpEL方言-- 弹簧表达式语言。
这与标准(非Spring) Thymeleaf方言使用的标准(OGNL)表达式语言大致相似,但它有几个非常有用的增强功能。
其中一个改进是我在评论中提到的安全航行操作员:
${row?.folderName}在这里,如果?是null,则row将立即返回null。如果没有这种情况,当Thymeleaf试图在空getFolderName()对象上调用row方法时,您将得到一个空指针异常。
https://stackoverflow.com/questions/72717450
复制相似问题