巢狀的用法與for的區別
阿新 • • 發佈:2018-12-23
上週在工作中遇到了頁面迭代的情況,初來乍到只知道簡單的迭代用法,但是我要處理的情況是一個List A 需要每18條資料去一個迭代成行 每六條資料在每行中迭代出三列 再把每條資料放在這三列中形成六個點。聽上去有些亂啊!確實挺頭疼的,呵呵
這樣可能看的就清晰些了。
先簡單說一下<c:forEach></c:forEach>的用法吧
<c:forEach>標籤的語法定義如下所示。
<c:forEachvar="name" items="expression" varStatus="name"
begin="expression"
body content
</c:forEach>
<c:forEach>標籤具有以下一些屬性:
var:迭代引數的名稱。在迭代體中可以使用的變數的名稱,用來表示每一個迭代變數。型別為String。
items:要進行迭代的集合。對於它所支援的型別將在下面進行講解。
varStatus:迭代變數的名稱,用來表示迭代的狀態,可以訪問到迭代自身的資訊。
begin:如果指定了items,那麼迭代就從items[begin]開始進行迭代;如果沒有指定items,那麼就從begin開始迭代。它的型別為整數。
end:如果指定了items,那麼就在items[end]結束迭代;如果沒有指定items,那麼就在end結束迭代。它的型別也為整數。
step:迭代的步長。
<c:forEach>標籤的items屬性支援Java平臺所提供的所有標準集合型別。此外,您可以使用該操作來迭代陣列(包括基本型別陣列)中的元素。它所支援的集合型別以及迭代的元素如下所示:
java.util.Collection:呼叫iterator()來獲得的元素。
java.util.Map:通過java.util.Map.Entry所獲得的例項。
java.util.Iterator:迭代器元素。
java.util.Enumeration:列舉元素。
Object例項陣列:陣列元素。
基本型別值陣列:經過包裝的陣列元素。
用逗號定界的String:分割後的子字串。
javax.servlet.jsp.jstl.sql.Result:SQL查詢所獲得的行。
不論是對整數還是對集合進行迭代,<c:forEach>的varStatus屬性所起的作用相同。和var屬性一樣,varStatus用於建立限定了作用域的變數(改變數只在當前標籤體內起作用)。不過,由varStatus屬性命名的變數並不儲存當前索引值或當前元素,而是賦予javax.servlet.jsp.jstl.core.LoopTagStatus類的例項。該類包含了一系列的特性,它們描述了迭代的當前狀態,如下這些屬性的含義如下所示:
current:當前這次迭代的(集合中的)項。
index:當前這次迭代從0開始的迭代索引。
count:當前這次迭代從1開始的迭代計數。
first:用來表明當前這輪迭代是否為第一次迭代,該屬性為boolean型別。
last:用來表明當前這輪迭代是否為最後一次迭代,該屬性為boolean型別。
begin:begin屬性的值。
end:end屬性的值
step:step屬性的值
下面就來看兩個基本的例子,第一個例子是依次輸出集合內的元素。
<c:forEachvar="item" items="${contents}" varStatus="status">
$status.count:${item}
</c:forEach>
下面的例子是一個固定次數的迭代,用來輸出1到9的平方。
<c:forEachvar="x" begin="1"end="9" step="1">
${x*x}
</c:forEach>
好了,現在說說我的問題
很顯然我遇到的問題,需要巢狀迭代。說實話,如果是用for去實現這個,在我看來還是很簡單的。但是在jsp中植入指令碼語言不是很正規(主要是領導不讓),所以只好迭代。
與forEach與for的區別最主要是沒有i++這個操作,所以用起來不太一樣。forEach提供了index屬性可以幫我們解決這個問題。當使用for時,最裡層的for迴圈中獲取的時間複雜度也就是迴圈次數為每層for迴圈的次數相乘 而在forEach中,我們只能利用index屬性在最裡層進行認為計算。在每層也要規定它的迴圈次數,才能最終獲得指定的資料。似乎我的表達能力有限,可能說的不是很明白。不過沒關係,有程式碼有真相~~~
1 <c:forEach var="data"items="${statusSource}" begin="1" step="18" varStatus="st1" > 2 <tr class="multicolor1" > 3 <c:forEach var="td" begin="1" end="6" varStatus="st2"> 4 <td style="TEXT-ALIGN: center;"> 5 <c:forEach begin="1" end="3" var="subcol" varStatus="st3"> 6 7 ${statusSource[(st1.index-1)+(st2.index-1)*6+(st3.index)-1]} 8 9 </c:forEach> 10 </td> 11 </c:forEach> 12 </tr> 13 </c:forEach>
學習了~~