有没有办法使用JSP创建类似while的循环,而不使用scriptlet?
我问,因为我有一个类似于链表的结构(特别是打印异常的原因链),AFAIK没有使用forEach的迭代器接口。
答案 0 :(得分:3)
控制器的作用是为视图准备数据,它应该将这个不可迭代的数据结构转换为<c:forEach>
JSTL标记可以使用的集合。
答案 1 :(得分:3)
你可以通过迭代列表
来做到这一点<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));
}
答案 2 :(得分:3)
我最终做的是一个带有任意上限的静态循环:
<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>
答案 3 :(得分:1)
如果您不想迭代集合,可以通过以下方法将0
用作传统的循环等效项:
<c:forEach>
这将产生0到12之间的选择下拉
答案 4 :(得分:0)
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>