有没有办法在不使用 scriptlet 的情况下使用 JSP 创建类似 while 循环的结构?
我问,因为我有一个类似链表的结构(特别是打印异常的原因链),AFAIK 没有用于 forEach 的迭代器接口。
我最终做的是一个具有任意上限的静态循环:
<c:forEach begin="0" end="${<upper_bound>}" varStatus="loop">
<c:if test="${!<exit_condition>}">
<!-- loop output here -->
</c:if>
<c:if test="${loop.last && !<exit_condition>}">
<!-- overflow output here -->
</c:if>
</c:forEach>
仅当您对迭代次数有一些先验知识,不介意不显示所有信息或不介意潜在的重大性能影响时,这才真正有用。
请记住,没有提前退出条件,因此将 2,147,483,647 作为上限绝对是个坏主意。
对于输出异常(无格式)的好奇解决方案:
<c:forEach begin="0" end="10" varStatus="loop">
<c:if test="${!loop.first}">
Caused By:
</c:if>
<c:if test="${throwable != null}">
Message: ${throwable.message} <br/>
<c:forEach items="${throwable.stackTrace}" var="trace">
${trace} <br/>
</c:forEach>
</c:if>
<c:if test="${loop.last && throwable != null}">
More causes not listed...
</c:if>
<c:set var="throwable" value="${throwable.cause}" />
</c:forEach>
控制器,其作用是为视图准备数据,应该将这个不可迭代的数据结构转换为可以被<c:forEach>
JSTL 标记使用的集合。
你可以通过遍历一个列表来做到这一点
<c:forEach var="entry" items="${requestScope['myErrorList']}">
${entry.message}<br/>
</c:forEach>
编辑:
您可以使用如下方法将异常及其原因转换为稍后可以使用forEach显示的列表
public static List<Throwable> getExceptionList(Exception ex) {
List<Throwable> causeList = new ArrayList<Throwable>();
causeList.add(ex);
Throwable cause = null;
while ((cause = ex.getCause()) != null && !causeList.contains(cause)) {
causeList.add(cause);
}
return causeList;
}
例如:
try {
...
} catch (... ex) {
request.setAttribute("myErrorList", getExceptionList(ex));
}
如果您不想遍历 Collections,您可以<c:forEach>
通过以下方法将其用作常规循环等效项:
<c:set var="startIndex" scope="page" value="0"/>
<c:set var="endIndex" scope="page" value="12"/>
<select name="milestone_count" id="milestone_count">
<option value="">-select-</option>
<c:forEach begin="${startIndex}" end="${endIndex}" step="1" var="index">
<option value="${index}">${index}</option>
</c:forEach>
</select>
这将产生一个范围从 0 到 12 的选择下拉列表
http://www.tutorialspoint.com/jsp/jstl_core_foreach_tag.htm
<c:forEach var="item" items="${myList}">
${item}"
</c:forEach>
<c:forEach var="entry" items="${myMap}">
Key: <c:out value="${entry.key}"/>
Value: <c:out value="${entry.value}"/>
</c:forEach>