forEach

JSTL所支持的迭代标签有两个,分别是<c:forEach>和<c:forTokens>。在这里介绍的是<c:forEach>标签。

         简单点说,<c:forEach>标签的作用就是迭代输出标签内部的内容。它既可以进行固定次数的迭代输出,也可以依据集合中对象的个数来决定迭代的次数。

         <c:forEach>标签,需要与el表达式联合使用

         < c : forEach >标签的语法定义如下所示。

                  < c : forEach  var="每个变量名字"   items="要迭代的list"   varStatus="每个对象的状态"

                           begin="循环从哪儿开始"     end ="循环到哪儿结束"    step="循环的步长">

                               循环要输出的东西

                  </c:forEach>


 <c:forEach>标签具有以下一些属性:

l          var:迭代参数的名称。在迭代体中可以使用的变量的名称,用来表示每一个迭代变量。类型为String。 

l          items:要进行迭代的集合。对于它所支持的类型将在下面进行讲解。 

l          varStatus:迭代变量的名称,用来表示迭代的状态,可以访问到迭代自身的信息。 

l          begin:如果指定了items,那么迭代就从items[begin]开始进行迭代;如果没有指定items,那么就从begin开始迭代。它的类型为整数。

l           end :如果指定了items,那么就在items[ end ]结束迭代;如果没有指定items,那么就在 end 结束迭代。它的类型也为整数。

l          step:迭代的步长。 

         < c : forEach >标签的items属性支持Java平台所提供的所有标准集合类型。此外,您可以使用该操作来迭代数组(包括基本类型数组)中的元素。它所支持的集合类型以及迭代的元素如下所示:

l          java.util.Collection:调用iterator()来获得的元素。 

l          java.util.Map:通过java.util.Map.Entry所获得的实例。 

l          java.util.Iterator:迭代器元素。 

l          java.util.Enumeration:枚举元素。 

l          Object实例数组:数组元素。 

l          基本类型值数组:经过包装的数组元素。 

l          用逗号定界的String:分割后的子字符串。 

l          javax.servlet.jsp.jstl.sql.Result:SQL查询所获得的行。 

         不论是对整数还是对集合进行迭代,< c : forEach >的varStatus属性所起的作用相同。和var属性一样,varStatus用于创建限定了作用域的变量(改变量只在当前标签体内起作用)。不过,由varStatus属性命名的变量并不存储当前索引值或当前元素,而是赋予javax.servlet.jsp.jstl.core.LoopTagStatus类的实例。该类包含了一系列的特性,它们描述了迭代的当前状态,如下这些属性的含义如下所示:

l          current:当前这次迭代的(集合中的)项。 

l          index:当前这次迭代从0开始的迭代索引。 

l          count:当前这次迭代从1开始的迭代计数。 

l          first:用来表明当前这轮迭代是否为第一次迭代,该属性为boolean类型。 

l          last:用来表明当前这轮迭代是否为最后一次迭代,该属性为boolean类型。 

l          begin:begin属性的值。 

l           end end 属性的值 

l          step:step属性的值 

下面就来看两个基本的例子,第一个例子是依次输出集合内的元素。 
< c : forEach  var="item" items="${contents}" varStatus="status">
         $status.count:${item} 
</ c : forEach
下面的例子是一个固定次数的迭代,用来输出1到9的平方。 
< c : forEach  var="x" begin="1" end ="9" step="1"> 
         ${x*x} 

</c:forEach>

下面写一下,我做的项目中用到的例子:

分页:

     <table>
       <tr><th>名字</th><th>说明</th><th>图片预览</th></tr>
        <c:forEach items="${data}" var="item">
            <tr><td>${item.advertName}</td><td>${item.notes}</td><td><img src="${item.defPath}"/></td></tr>
        </c:forEach>

     </table>
    <ul>
        <li><a href='?nowPage=${nowPage-1}'>←上一页</a></li>
                   <c:forEach varStatus="i" begin="1" end="${sumPage}">
                        <c:choose>
                           <c:when test="${nowPage==i.count}">
                              <li class='disabled'>${i.count}</li>
                           </c:when>
                           <c:otherwise>
                               <li  class='active'><a href='?nowPage=${i.count}'>${i.count}</a></li>
                           </c:otherwise>
                        </c:choose>
                   </c:forEach>

            <li><a href='?nowPage=${nowPage+1}'>下一页→</a></li>
      </ul>

首页展示图片的例子:

迭代后台传过来的list, src的路径要写绝对路径,写成相对路径会报错,有时绝对路径用<c:ulr>来写

           <c:forEach items="${lists}" var="item">
             <img id="img${i}" height="250" width="500"  class="img" src='UploadImages/${item.advertPath}'/>
            </c:forEach>

获得下标,其中size是后台传过来的list的长度,此处不能写成end="${list.size}"

              <c:forEach begin="1" end="${size}"  step="1" varStatus="i">
                    <li> <a href="http://www.baidu.com/" class="showimg">${i.index}</a></li>
                 </c:forEach>



代码示例展示:

<%
String [] arrs = {"艾米1","艾米2","艾米3","艾米4"};
request.setAttribute("arrs", arrs);
%>
<!-- for(String s : arrs){ }  -->
<c:forEach var="s" items="${ arrs }">
${ s }
</c:forEach>


<h4>遍历集合</h4>
<%
List<String> list = new ArrayList<String>();
list.add("艾米1");
list.add("艾米2");
list.add("艾米3");
list.add("艾米4");
request.setAttribute("list", list);
%>
<c:forEach var="s" items="${ list }">
${ s }
</c:forEach>


<h4>遍历Map集合</h4>
<%
Map<String,String> map = new HashMap<String,String>();
map.put("aa", "美美");
map.put("bb", "小凤");
map.put("cc", "芙蓉");
request.setAttribute("map", map);
%>
<c:forEach var="entry" items="${ map }">
${ entry.key } -- ${ entry.value }
</c:forEach>

<h4>遍历对象的集合</h4>
<%
List<User> uList = new ArrayList<User>();
uList.add(new User("艾米1","123"));
uList.add(new User("艾米2","234"));
uList.add(new User("艾米3","345"));
request.setAttribute("uList", uList);
%>
<c:forEach var="user" items="${ uList }">
${ user.username } -- ${ user.password }
</c:forEach>


<h4>迭代数据</h4>
<h4>迭代从1到10</h4>
<c:forEach var="i" begin="1" end="10" step="2">
${ i }
</c:forEach>




<h4>计算从1加到100的和</h4>
<c:set var="sum" value="0" scope="page"></c:set>
<c:forEach var="i" begin="1" end="100" step="1">
<c:set var="sum" value="${ sum + i }"></c:set>
</c:forEach>
${ sum }

<h4>遍历10到100的偶数,每到第3个数,显示红色</h4>
<c:forEach var="i" begin="10" end="100" step="2" varStatus="status">
<c:choose>
<c:when test="${ status.first }">
<font color="blue">${ i }</font>
</c:when>
<c:when test="${ status.count % 3 eq 0 }">
<font color="red">${ i }</font>
</c:when>
<c:otherwise>
${ i }
</c:otherwise>
</c:choose>
</c:forEach>




### `foreach` 循环的用法和示例 `foreach` 循环是一种用于遍历集合或数组中每个元素的简化方式。它使代码更加简洁、可读性更高,并且在某些语言中避免了索引越界的风险。不同编程语言中的 `foreach` 实现略有差异,但核心思想一致。 #### C# 中的 `foreach` 循环 C# 的 `foreach` 主要用于遍历实现了 `IEnumerable` 接口的集合类型,例如 `List<T>` 和 `ArrayList`。循环过程中,无需手动管理索引,从而减少出错的可能性。 **语法:** ```csharp foreach (type element in collection) { // 处理当前元素的代码 } ``` **示例:** 遍历整型数组并输出每个元素: ```csharp int[] numbers = { 1, 2, 3, 4, 5 }; foreach (int number in numbers) { Console.WriteLine(number); } ``` 遍历字符串列表并输出每个水果名称: ```csharp List<string> fruits = new List<string> { "Apple", "Banana", "Cherry" }; foreach (string fruit in fruits) { Console.WriteLine(fruit); } ``` 需要注意的是,在 C# 的 `foreach` 循环中不能直接修改集合本身(如添加或删除元素),否则会引发异常[^2]。 --- #### Java 中的 `foreach` 循环(增强型 `for` 循环) Java 的 `foreach` 被称为“增强型 `for` 循环”,适用于数组和实现了 `Iterable` 接口的集合类,如 `ArrayList` 和 `HashSet`。 **语法:** ```java for (type variable : arrayOrCollection) { // 处理当前元素的代码 } ``` **示例:** 遍历整型数组并打印每个数字: ```java int[] numbers = {1, 2, 3, 4, 5}; for (int number : numbers) { System.out.println(number); } ``` 遍历字符串列表并打印每个名字: ```java import java.util.ArrayList; import java.util.List; List<String> names = new ArrayList<>(); names.add("Alice"); names.add("Bob"); names.add("Charlie"); for (String name : names) { System.out.println(name); } ``` 与 C# 类似,在 Java 的 `foreach` 循环中也不能修改集合结构(如添加或删除元素),否则可能抛出 `ConcurrentModificationException` 异常[^3]。 --- #### Stata 中的 `foreach` 循环 Stata 提供了两种主要形式的 `foreach` 循环,一种是基于变量列表 (`varlist`),另一种是基于本地宏 (`local`)。 **基本格式:** ```stata foreach v of varlist var1 var2 var3 { // 执行命令 } ``` **示例:** 导入数据并显示变量名及其统计信息: ```stata sysuse auto.dta, clear foreach v of varlist price mpg rep78 { disp "`v'" sum `v' } ``` 使用本地宏定义变量列表进行循环: ```stata local varlist "price mpg rep78" foreach v of varlist `varlist' { disp "`v'" sum `v' } ``` 此外,还可以使用 `in` 替代 `of varlist` 来处理一组值: ```stata foreach v in price mpg rep78 { disp "`v'" sum `v' } ``` 这种方式特别适合批量处理多个变量或执行重复操作[^4]。 --- ### 注意事项 - 在 C# 和 Java 中,`foreach` 循环主要用于读取集合或数组中的元素。 - 如果需要在循环中修改集合内容(如添加或删除元素),建议使用传统的 `for` 循环或迭代器。 - `foreach` 不适用于需要访问索引的情况,此时应选择 `for` 循环。 - 在某些语言中(如 Java 和 C#),如果尝试在 `foreach` 循环中修改集合结构,可能会导致运行时错误。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值