如何在客户端获取 sql 列值的总和?

How to get sum of sql column value client-side?

服务器端我有这个 table 叫做 product:

id | prod_name | prod_price | description | points

如上所示,每个产品都有积分值,有点像星巴克,你买的每杯咖啡都会给你一张贴纸,一旦你完成一张卡片,你就会得到免费的咖啡。我对我的商店使用相同的概念。

购买的每件产品都会给用户积分。当然,积分的价值取决于价格。越高越好。

我如何根据他在 basket/cart 中放置的产品向他显示他所累积的总积分?每次他往篮子里放一个产品,总和就需要动态升级。我更喜欢 JSTLSQL 作为最小化 JS 数量的解决方案,但我对后者相当开放。

所以这是 basket.jsp:

<div class="pointsContainer">
    My Reward Points: ( <c:out value="${points + points}" />  )
</div>

<div class='block'> 
    <c:if test="${!empty basket && basket.numberOfItems != 0}">
        <h3 class='boardRowHeader'>My Products</h3> 
    </c:if>
    <c:forEach var="basketItem" items="${basket.items}" varStatus="iter">
    <c:set var="product" value="${basketItem.product}"/>
        <div class="cart_row">
            <div class="cart_img"><a href="viewProduct?${product.id}">
                <img class="image" alt="" src="${initParam.productGalleryImagePath}${product.id} (1).jpg" />
            </div>
            <div class="cart_nme"><a class="category_links" href="viewProduct?${product.id}">${product.name}</a></div>
            <div class="cart_price">$${product.price}</div>
            <div class="cart_update">
                ${product.points} points
            </div>
        </div>
    </c:forEach>
</div>

您可以像这样在 for 循环中使用计数器变量:

<div class="pointsContainer">
    My Reward Points: ( <c:out value="${points + points}" />  )
</div>

<div class='block'>
    <c:if test="${!empty basket && basket.numberOfItems != 0}">
        <h3 class='boardRowHeader'>My Products</h3>
    </c:if>
    <c:forEach var="basketItem" items="${basket.items}" varStatus="iter">
    <c:set var="totalPoints" value="0"/>
    <c:set var="product" value="${basketItem.product}"/>
        <div class="cart_row">
            <div class="cart_img"><a href="viewProduct?${product.id}">
                <img class="image" alt="" src="${initParam.productGalleryImagePath}${product.id} (1).jpg" />
            </div>
            <div class="cart_nme"><a class="category_links" href="viewProduct?${product.id}">${product.name}</a></div>
            <div class="cart_price">$${product.price}</div>
            <div class="cart_update">
                ${product.points} points
            </div>
        </div>
        <c:set var="totalPoints" value=" ${totalPoints + product.points}"/>
    </c:forEach>
</div>

<div class="totalPoints">
   Total Points: <c:out value="${totalPoints}" />
</div>

如果您已经在使用 Java EE 7 / Servlet 3.1 / EL 3.0(Tomcat 8、WildFly 8、GlassFish 4 等),那么只需使用 Stream operations and Lambda EL。这也适用于 Java 6/7,本身不需要 Java 8.

例如

<c:forEach items="${basket.items}" var="basketItem">
    <c:set var="product" value="${basketItem.product}"/>
    <div class="cart_row">
        <div class="cart_update">${product.points} points</div>
    </div>
</c:forEach>
<div class="totalPoints">
   Total Points: ${basket.items.stream().map(item -> item.product.points).sum()}
</div>