web-dev-qa-db-ja.com

jstl foreachは最後のレコードの要素を省略します

このJSTLを使用してJSON文字列を作成しようとしていますが、最後のレコードの最後にコンマを入れないようにセグメントを作成するにはどうすればよいですか?最後のカンマに注意してください

<c:forEach items="${fileList}" var="current">
    { id:1001,data:["<c:out value="${current.fileName}" />" , "<c:out value="${current.path}" />" , "<c:out value="${current.size}" />" , "<c:out value="${current.type}" />"] },
</c:forEach>
63
nokheat

LoopTagStatus#isLast() を使用するだけです。

<c:forEach items="${fileList}" var="current" varStatus="loop">
    { id: 1001,
      data: [
        "<c:out value="${current.fileName}" />",
        "<c:out value="${current.path}" />",
        "<c:out value="${current.size}" />",
        "<c:out value="${current.type}" />"
      ]
    }<c:if test="${!loop.last}">,</c:if>
</c:forEach>

<c:if>の代わりにELで条件演算子を使用することもできます。

    ${!loop.last ? ',' : ''}
156
BalusC

私がJSTLについて決して好きにならなかったことの1つは(実際のところ、唯一のものだと思う:))、リスト/コレクションのサイズを取得する方法がないという事実です。

EDIT:OK、それは可能だったが、私はそれを知らなかった:( こちらを参照

forEachタグにはvarStatus属性があり、これを使用して行のインデックスを決定できます(index変数のcount/varStatusプロパティ)リストの最後の位置にいるかどうかをテストする必要があります。つまり、リストのサイズを事前に設定する必要があります。

<c:forEach items="${fileList}" var="current" varStatus="status">
   ...
  <c:if test="${not (status.count eq listSize)}">,</c:if>
</c:forEach>

ただし、この種のことを行う前に、手動でlistSizeをスコープに配置する必要があります。

私のプロジェクトの1つでしたことは、コレクションを取得して値を返すタグを自分で作成することでした。

  <myLib:collectionSize collection="${fileList}" var="listSize" />
  <c:forEach items="${fileList}" var="current" varStatus="status">
     ...
    <c:if test="${not (status.count eq listSize)}">,</c:if>
  </c:forEach>

この種のコードを頻繁に使用する場合は、同じことを行うことができます(それ以外の場合は、自分の都合の良いコードをスコープに追加するだけです)。

3
user159088

by JSTLでコレクションサイズを確認 答えはfunctionsタグを使用することでした

これをページの上部に配置して、fn名前空間を許可します

<%@ taglib prefix="fn" uri="http://Java.Sun.com/jsp/jstl/functions" %>

jspページでこのように使用します

<p>The length of the companies collection is : ${fn:length(companies)}</p>
3
nokheat