Jsp 计算c:forEach循环中所有数字的总和

Jsp 计算c:forEach循环中所有数字的总和,jsp,foreach,sum,jstl,totals,Jsp,Foreach,Sum,Jstl,Totals,我有一个Java bean,如下所示: class Person { int age; String name; } <c:forEach var="person" items="${personList}"> <tr><td>${person.name}<td><td>${person.age}</td></tr> </c:forEach> 我想在JSP中迭代这些bean的集合,在一

我有一个Java bean,如下所示:

class Person {
  int age;
  String name;
}
<c:forEach var="person" items="${personList}">
  <tr><td>${person.name}<td><td>${person.age}</td></tr>
</c:forEach>
我想在JSP中迭代这些bean的集合,在一个HTML表格行中显示每个人,在表格的最后一行,我想显示所有年龄段的总和

生成表行的代码如下所示:

class Person {
  int age;
  String name;
}
<c:forEach var="person" items="${personList}">
  <tr><td>${person.name}<td><td>${person.age}</td></tr>
</c:forEach>

${person.name}${person.age}

然而,我正在努力找到一种方法来计算将在最后一行显示的年龄总和,而无需借助scriptlet代码,有什么建议吗?

这有点老套,但在控制器代码中,您可以创建一个包含总数的虚拟Person对象


您如何检索您的对象?HTML允许您设置一个元素,该元素将位于您拥有的任何数据的底部,因此您可以将总数与Person对象分开设置,并将其按原样输出到页面上,而无需在JSP页面上进行任何计算。

签出显示标记

你想把所有的年龄加起来吗

您可以在控制器中计算它,并且只在jsp中显示结果

您可以编写自定义标记来进行计算

您可以在jsp中使用jstl计算它,如下所示

<c:set var="ageTotal" value="${0}" />
<c:forEach var="person" items="${personList}">
  <c:set var="ageTotal" value="${ageTotal + person.age}" />
  <tr><td>${person.name}<td><td>${person.age}</td></tr>
</c:forEach>
${ageTotal}

${person.name}${person.age}
${ageTotal}

ScArcher2最简单。如果您想要尽可能紧凑的东西,可以创建一个带有“sum”函数的标记库。比如:

class MySum {
public double sum(List list) {...}
}
<%@ taglib uri="/myfunc" prefix="f" %>

${f:sum(personList)}
在TLD中:

<function>
<name>sum</name>
<function-class>my.MySum</function-class>
<function-signature>double sum(List)</function-signature>
</function>

总和
糠秕
双和(列表)
在JSP中,您将有如下内容:

class MySum {
public double sum(List list) {...}
}
<%@ taglib uri="/myfunc" prefix="f" %>

${f:sum(personList)}

${f:sum(个人列表)}
注意:我尝试将答案组合在一起,形成一个全面的列表。我在适当的地方提到了名字,以便在适当的时候给予赞扬

解决此问题的方法有很多,每种方法都有利弊:

纯JSP解决方案

正如上面提到的ScArcher2,解决这个问题的一个非常简单的方法是直接在JSP中实现它,如下所示:

<c:set var="ageTotal" value="${0}" />
<c:forEach var="person" items="${personList}">
  <c:set var="ageTotal" value="${ageTotal + person.age}" />
  <tr><td>${person.name}<td><td>${person.age}</td></tr>
</c:forEach>
${ageTotal}
在tld文件中定义标记:

<tag>
   <name>personSum</name>
   <tag-class>example.PersonSumTag</tag-class>
   <body-content>empty</body-content>
   ...
   <attribute>
      <name>personList</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
      <type>java.util.List</type>
   </attribute>
   ...
</tag>

个人
example.PersonSumTag
空的
...

您可以根据以下步骤使用JSTL对集合进行迭代

<c:forEach items="${numList}" var="item">
      ${item}
</c:forEach>
<c:forEach items="${numMap}" var="entry">
  ${entry.key},${entry.value}<br/>
</c:forEach>

${item}
如果它是一张地图,你可以在下面做

<c:forEach items="${numList}" var="item">
      ${item}
</c:forEach>
<c:forEach items="${numMap}" var="entry">
  ${entry.key},${entry.value}<br/>
</c:forEach>

${entry.key},${entry.value}

在控制器(而不是JSP)中计算总计/或其他摘要确实是非常可取的

使用Java代码&一种MVC方法,例如springmvc框架,而不是试图在JSP或JSTL中做太多事情;用这些语言进行重要的计算是很弱和缓慢的,并且会使JSP页面变得不那么清晰

例如:

class PersonList_Controller implements Controller {
    ...
    protected void renderModel (List<Person> items, Map model) {
        int totalAge = 0;
        for (Person person : items) {
            totalAge += person.getAge();
        }
        model.put("items", items);
        model.put("totalAge", totalAge);
    }
}
类PersonList\u控制器实现控制器{
...
受保护的无效渲染模型(列表项、地图模型){
整数总年龄=0;
用于(个人:项目){
totalAge+=person.getAge();
}
模型。放置(“项目”,项目);
模型。put(“总计”,总计);
}
}
从设计决策的角度来看——任何需要一个总数的地方,可以想象下个月会扩展到需要一个平均值、一个中位数、一个标准差


JSTL的计算和总结很难结合在一起,只能得到一个总数。您真的想在JSTL中满足任何进一步的概要需求吗?我相信答案是否定的,因此正确的设计决策是在控制器中计算,同样/更简单、更合理的需求可扩展。

您是否将所有年龄相加并显示在最后一行?在控制器中计算总数(而不是在JSP中)确实是非常可取的。使用MVC框架,例如Spring,而不是尝试在JSP或JSTL中执行太多操作。这不是万能的——无法指定要计算的属性或函数result sum()。要么你已经花了很长的时间来制作一个单一用途的操作符,要么你必须更进一步&对反射进行黑客攻击,使其具有多功能性。简短而正确的回答:在控制器中计算摘要,而不是在JSP中。