JSTL while循环(没有scriptlet)

时间:2013-07-17 14:25:41

标签: jsp jstl

有没有办法使用JSP创建类似while的循环,而不使用scriptlet?

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

5 个答案:

答案 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>