前言
近日接触到一个比较旧的项目,框架使用的是Status2+Spring3,前端jsp大量内嵌了java代码,几乎未使用jstl和el表达式。
个人习惯原因,已经很不喜欢使用这种通过写java代码在jsp上做逻辑控制的方式,很不好让别人读代码。
表达式循环有几种方式,这里只说c:forEach。
在网上看了一下,没有自己需要的,自己写一个。
场景需求:
某用户登录后查看自己的购物车,及时显示其购物车内的商品种类和合计金额。
原理:
自己创建jstl变量,存储自己需要统计的内容放到循环体里执行即可。
定义2个变量,row_total统计金额,row_count统计数量
<c:set var="row_total" value="0"></c:set>
<c:set var="row_count" value="0"></c:set>
之后自己在循环体里进行运算,这个是自加1
<c:set var="row_count" value="${row_count+1}" />
这个是进行运算
<c:set var="row_total" value="${row_total +(productprice*rowData.productnum) }" />
之后在循环体外直接使用表达式,就是你需要的统计数据了
${row_total }
${row_count }
然后备注一下,jsp页面头请引入jstl标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
补充1
上面的例子上使用到了下面的标签,作用是格式化数字的
fmt:parseNumber
头部需引入
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
补充2
在c:foreach里同样也有统计字段,可以使用该字段进行统计,但只能在循环体内,完整用法如下,使用${status.count}可以获取循环次数,不过需要注意一下,它的计数是从1开始,而不是0
<c:forEach var=”data" items=”list" varStatus=”status”>
<c:out value=”${status.current}”/> 当前对象
<c:out value=”${status.index}”/> 此次迭代的索引
<c:out value=”${status.count}”/> 已经迭代的数量
<c:out value=”${status.first}”/> 是否是第一个迭代对象
<c:out value=”${status.last}”/> 是否是最后一个迭代对象
</c:forEach>
下面是完整例子,用于实现购物车商品的展现与统计
<c:set var="row_total" value="0"></c:set>
<c:set var="row_count" value="0"></c:set>
<c:forEach var="rowData" items="${shopping_data}">
<fmt:parseNumber var="productprice" value="${rowData.productprice}" type="number" />
<c:set var="row_total" value="${row_total + (productprice*rowData.productnum) }" />
<c:set var="row_count" value="${row_count+1}" />
<li>
<div class="p-img fl">
<a href="${path }/productDetail?productId=${rowData.productid }">
<img src="${path }${rowData.f_productimg}" width="50" height="50" alt=""></a>
</div>
<div class="p-name fl">
<span></span>
<a href="${path }/productDetail?productId=${rowData.productid }" title="${rowData.productname}">
${rowData.productname}
</a>
</div>
</li>
</c:forEach>