<c:forEach var="expData" items="${expenseDataList}">
<tr>
<td>
<div class="custom-control custom-checkbox">
<label><aui:input
cssClass="custom-control-input expense select-all"
type="checkbox" data-amount="${expData.expenseAmount}" data-expenseid="${expData.expenseId}"
id="expenseCheckbox" name="expenseCheckbox" label="" />
</label>
</div>
</td>
....
<td>
<c:forEach var="previewUrl1" items="${previewUrl}">
<aui:button icon=" icon-download-alt"
style="border:none; background-color: #1E47C2; color:white"
data-previewurl="${previewUrl1}" cssClass="download"
name="downloadButton" id="downloadButton" />
</c:forEach>
</td>
</tr>
</c:forEach>
我正在使用内部,它正在创建2个下载按钮,因为我正在迭代另一个附近的下载按钮..我在previewUrl1中获取值但它正在创建2个按钮,因为它迭代两次因为在另一个< /强>
这是我的portlet端代码
long fileEntryId = 0L;
String previewURL = StringPool.BLANK;
List<String> s1=new ArrayList<String>();
try {
for (int i = 0; i < expenseDataList.size(); i++) {
fileEntryId = expenseDataList.get(i).getFileEntryId();
if (fileEntryId > 0) {
FileEntry fileEntry = DLAppLocalServiceUtil.getFileEntry(fileEntryId);
previewURL = DLUtil.getPreviewURL(fileEntry, fileEntry.getFileVersion(), themeDisplay, StringPool.BLANK);
}
renderRequest.setAttribute("previewUrl", previewURL);
s1.add(previewURL);
LOG.info("File Entries"+fileEntryId);
LOG.info("Preview URl " + previewURL);
}
LOG.info(s1);
renderRequest.setAttribute("previewUrl", s1);
} catch (Exception e) {
e.printStackTrace();
}
答案 0 :(得分:0)
我不完全理解您对所发生情况的描述。但是,如果内循环有多次迭代,则在两种情况下生成重复的id
属性:在aui:input
的外循环中,在aui:button
的内循环中。根据HTML规则,id必须是唯一的,否则你将获得未定义的行为(或者每个元素,但第一个被忽略)
编辑:
在您的代码中,您使用renderRequest.setAttribute("previewUrl", previewURL);
,例如您设置恰好一个 previewURL。稍后,您将该属性更改为列表,通过renderRequest.setAttribute("previewUrl", s1);
- 不要这样做:它使您的代码无法维护并欺骗读者(像我或其他人一样)认为previewURL是单个值,当它确实列出时
话虽如此:似乎您有两个具有相同条目数的列表,并且一个列表中的每个元素都指向另一个列表中具有相同索引的元素。如果嵌套这些列表,您将自然地显示列表1的每个元素的列表2的所有元素。因此:不嵌套循环。您只需要一个循环,并通过索引直接从另一个循环访问相应的元素。
我的肌肉记忆中没有JSTL:在剩余(外部)forEach中,跟踪索引(通过varStatus,see this question on how to do it)并使用此索引访问第二个列表中的匹配元素。