如何检查具有动态名称的 argument/collection 是否存在?

How to check if argument/collection with dynamic name exists?

在我的控制器中,我向模型添加了动态调用的属性,例如:

model.addAttribute("message"+singleMessage.getId()+"comments", messageComments);

所以在我的 jsp 视图中,我有 message1comments、message7comments、message457comments 等集合。

现在,当我在显示 ID 为 19 的消息时浏览消息集合时,我想通过检查 attribute/collection 之类的 "message19comments" 是否存在来检查它是否有任何评论。

问题是:怎么做?我不知道如何构造这样的名称并检查是否存在具有此名称的参数。我试过了:

<c:if test="${not empty "message"+message.id+"comments"}>

和其他一些东西但无济于事。当我打印

${requestScope}

我可以看到所有那些评论集。但是如何检查动态生成的名称是否存在?

A Map<messageId, listOfComments> 可以让您通过提供消息 ID 轻松调用与任何消息关联的评论列表,因此您可以尝试在模型中放置一个地图,如以下代码示例所示(调整它与你的数据类型):

Map<Long, List<Comment>> commentMap = new HashMap<>();
for (Message singleMessage : messages) {
  /* retrieve messageComments for this singleMessage here */
  commentMap.put(singleMessage.getId(), messageComments);
}
model.addAttribute("commentMap", commentMap);

然后,在 JSP 中您可以使用消息 ID 调用评论列表:

<c:if test="${not empty commentMap[YOUR_MESSAGE_ID_HERE]}>

另请参阅 Get value from hashmap based on key to JSTL 了解更多信息。