JSTL所支持的迭代标签有两个,分别是<c:forEach>和<c:forTokens>
<c:forEach>标签的作用就是迭代输出标签内部的内容。它既可以进行固定次数的迭代输出,也可以依据集合中对象的个数来决定迭代的次数。
<c:forEach>标签,需要与el表达式联合使用
<c:forEach>标签的语法定义如下所示。
<c:forEach>标签用到的参数含义:
<c:forEach var="每个变量名字" items="要迭代的list" varStatus="每个对象的状态" begin="循环从哪儿开始" end="循环到哪儿结束" step="循环的步长"> 循环要输出的content </c:forEach>
参数对应的属性:
var: 迭代的变量。
items: 迭代的集合。
varStatus: 迭代的状态。可以访问迭代自身的信息。
begin: 迭代从items[begin]开始。
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:forEach var="item" items="list" varStatus="status"> ${status.count}(当前迭代的次数) ---- ${item}(输出的元素值) </c:forEach>
项目中的使用:
1 <c:forEach var="f" items="${requestScope.interfaces}" varStatus="status"> 2 <div style="height:20px;"></div> 3 <div style="padding:20px;padding-top:10px;background:#f6f6f6; margin-top:20px;font-size:14px;color:#999;"> 4 <div style="margin-left:-10px;font-size:18px;font-weight:bold;color:#407aaa;">${ status.index + 1}、 ${f.model.interfaceName}</div> 5 <h3>${status.count}.1 功能说明</h3> 6 ${f.model.remark} 7 <br/> 8 <h3>${status.count}.2 URL地址</h3> 9 ${f.model.moduleUrl}${f.model.url} 10 <br/> 11 <br/> 12 <h3>${status.count}.3 版本号</h3> 13 ${f.model.version} 14 <br/> 15 <br/> 16 <h3>${status.count}.4 Mock地址</h3> 17 正确:${f.trueMockUrl}<br/> 18 错误:${f.falseMockUrl} 19 <br/> 20 <br/> 21 22 <h3>${status.count}.5 HTTP请求方式</h3> 23 ${f.model.method} 24 <br/> 25 <br/> 26 <h3>${status.count}.6 请求头说明</h3> 27 <table style="width:100%;"> 28 <tr style="background:#407aaa;color:#fff;"> 29 <td>名称</td> 30 <td>是否必须</td> 31 <td>类型</td> 32 <td>默认值</td> 33 <td style="width:260px;">备注</td> 34 </tr> 35 <c:forEach var="v" items="${f.headers}"> 36 <tr> 37 <td>${v.name}</td> 38 <td>${v.necessary}</td> 39 <td>${v.type}</td> 40 <td>${v.def}</td> 41 <td>${v.remark}</td> 42 </tr> 43 </c:forEach> 44 </table> 45 <br/> 46 <h3>${status.count}.7 输入参数说明<c:if test="${f.customParams!=null}">(自定义参数)</c:if></h3> 47 <c:if test="${f.formParams!=null}"> 48 <table style="width:100%;"> 49 <tr style="background:#407aaa;color:#fff;"> 50 <td>名称</td> 51 <td>是否必须</td> 52 <td>参数位置</td> 53 <td>类型</td> 54 <td>默认值</td> 55 <td style="width:260px;">备注</td> 56 </tr> 57 58 <c:forEach var="v" items="${f.formParams}"> 59 60 <tr> 61 <td>${v.name}</td> 62 <td>${v.necessary}</td> 63 <td>${v.inUrl=='true'?'URL地址':'普通参数'}</td> 64 <td>${v.type}</td> 65 <td>${v.def}</td> 66 <td>${v.remark}</td> 67 </tr> 68 </c:forEach> 69 </table> 70 </c:if> 71 <c:if test="${f.customParams!=null}"> 72 <h5 style="color:#999999;">请求示列</h5> 73 ${f.customParams} 74 <br/><br/> 75 <h5 style="color:#999999;">参数备注</h5> 76 <table style="width:100%;"> 77 <tr style="background:#407aaa;color:#fff;"> 78 <th style="width:30px;"></th> 79 <th>名称</th> 80 <th style="width:60px;">类型</th> 81 <th style="width:50px;">是否必须</th> 82 <th style="width:80px;">备注</th> 83 </tr> 84 <c:forEach var="v" items="${f.paramRemarks}"> 85 <tr> 86 <td style="color:red;">${v.deep}</td> 87 <td style="padding-left:20px;"> 88 <div style="padding-left: ${v.deep*10}px;">${v.name}</div> 89 </td> 90 <td>${v.type}</td> 91 <td>${v.necessary}</td> 92 <td>${v.remark}</td> 93 </tr> 94 </c:forEach> 95 </table> 96 </c:if> 97 <br/> 98 <h3>${status.count}.8 请求示例</h3> 99 <div style="background:#F0F0F0; padding:10px;"> 100 <pre style="font-family: SimSun;">${f.model.requestExam}</pre> 101 </div> 102 <br/> 103 <h3>${status.count}.9 返回参数说明</h3> 104 <table style="width:100%;"> 105 <tr style="background:#407aaa;color:#fff;"> 106 <th style="width:30px;"></th> 107 <th>名称</th> 108 <th style="width:60px;">类型</th> 109 <th style="width:50px;">是否必须</th> 110 <th style="width:80px;">备注</th> 111 </tr> 112 <c:forEach var="v" items="${f.responseParam}"> 113 <tr> 114 <td style="color:red;">${v.deep}</td> 115 <td style="padding-left:20px;"> 116 <div style="padding-left: ${v.deep*10}px;">${v.name}</div> 117 </td> 118 <td>${v.type}</td> 119 <td>${v.necessary}</td> 120 <td>${v.remark}</td> 121 </tr> 122 </c:forEach> 123 </table> 124 <br/> 125 <h3>${status.count}.10 正确返回示例</h3> 126 <div style="background:#F0F0F0; padding:10px;"> 127 <pre>${f.model.trueExam}</pre> 128 </div> 129 <br/> 130 <h3>${status.count}.11 错误返回示例</h3> 131 <div style="background:#F0F0F0; padding:10px;"> 132 <pre>${f.model.falseExam}</pre> 133 </div> 134 <br/> 135 <h3>${status.count}.12 错误码</h3> 136 <table style="width:100%;"> 137 <tr style="background:#407aaa;color:#fff;"> 138 <td>Code</td> 139 <td>Msg</td> 140 </tr> 141 <c:forEach var="v" items="${f.errors}"> 142 <tr> 143 <td>${v.errorCode}</td> 144 <td>${v.errorMsg}</td> 145 </tr> 146 </c:forEach> 147 </table> 148 </div> 149 </c:forEach>