1

有没有办法在不使用 scriptlet 的情况下使用 JSP 创建类似 while 循环的结构?

我问,因为我有一个类似链表的结构(特别是打印异常的原因链),AFAIK 没有用于 forEach 的迭代器接口。

4

5 回答 5

4

我最终做的是一个具有任意上限的静态循环:

<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>
于 2013-07-19T02:30:06.857 回答
3

控制器,其作用是为视图准备数据,应该将这个不可迭代的数据结构转换为可以被<c:forEach>JSTL 标记使用的集合。

于 2013-07-17T14:33:50.810 回答
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));
}
于 2013-07-17T14:39:23.857 回答
1

如果您不想遍历 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 的选择下拉列表

于 2016-07-24T06:36:54.473 回答
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>
于 2013-07-17T14:41:15.630 回答