2010-06-23 67 views
58

cố gắng sử dụng jstl này để xây dựng một chuỗi json, làm thế nào tôi có thể làm cho đoạn không đặt dấu phẩy ở cuối bản ghi cuối cùng? lưu ý dấu phẩy ở cuốijstl foreach bỏ qua một phần tử trong hồ sơ cuối cùng

<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> 
+0

tất cả các yếu tố cần} nhưng cuối cùng không phải có dấu phẩy, – nokheat

Trả lời

135

Chỉ cần sử dụng 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> 

Bạn cũng có thể sử dụng toán tử điều kiện trong EL thay vì <c:if>:

${!loop.last ? ',' : ''} 
+0

+1. Một giải pháp tốt hơn nhiều so với tôi. @nokheat: bạn nên đánh dấu đây là câu trả lời được chấp nhận. –

2

Một điều tôi chưa bao giờ thích về JSTL (thực ra tôi nghĩ là điều duy nhất :)) là không có cách nào để lấy kích thước của danh sách/bộ sưu tập.

EDIT:. ok, vì vậy nó là có thể nhưng tôi không biết nó :(see here

Thẻ forEachvarStatus thuộc tính mà bạn có thể sử dụng để xác định các chỉ số của hàng (index/count thuộc tính trên biến varStatus) nhưng bạn phải kiểm tra xem bạn đang ở vị trí cuối cùng trong danh sách, có nghĩa là có kích thước danh sách trước:

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

nhưng bạn sẽ phải đặt thứ e listSize trong phạm vi, theo cách thủ công, trước khi thực hiện loại điều này.

Những gì tôi đã làm trong một dự án của tôi là tạo ra cho mình một thẻ mà có một bộ sưu tập và trả về giá trị:

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

Bạn có thể làm như vậy nếu bạn có loại mã này thường xuyên (nếu không bạn chỉ có thể thêm nó vào phạm vi với bất kỳ điều gì thuận tiện cho bạn).

+0

này sẽ giải quyết vấn đề của tôi! cảm ơn nhiều – nokheat

+0

Sau khi tìm kiếm nhanh, tôi tìm thấy điều này: http://stackoverflow.com/questions/851880/check-a-collection-size-with-jstl. Có lẽ nó có thể giúp bạn nhiều hơn. –

+0

vì đối tượng danh sách có hàm size(), tôi có thể sử dụng list.size để làm cho nó trông tao nhã hơn không? – nokheat

2

bởi Check a collection size with JSTL câu trả lời là sử dụng thẻ chức năng

đặt này ở phía trên cùng của trang để cho phép không gian tên fn

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

và sử dụng như thế này trong trang jsp của bạn

<p>The length of the companies collection is : ${fn:length(companies)}</p> 
Các vấn đề liên quan