计算c:forEach循环中所有数字的总和
我有一个像这样的Java Bean:
class Person { int age;
String name;
}
我想在JSP中遍历这些bean的集合,在HTML表格行中显示每个人,在表格的最后一行中,我想显示所有年龄段的总数。
生成表行的代码如下所示:
<c:forEach var="person" items="${personList}"> <tr><td>${person.name}<td><td>${person.age}</td></tr>
</c:forEach>
但是,我正在努力寻找一种方法来计算将在最后一行中显示的年龄总计, ,有什么建议吗?
回答:
我尝试合并答案以列出完整的列表。我在适当的地方提到了一些名称,以便在适当的时候给予认可。
解决此问题的方法有很多,每种方法都有各自的优点/缺点:
正如上面的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}
该解决方案的问题在于,JSP可能会令人困惑,以至于您可能还引入了scriplet。如果您希望每个人在浏览该页面时都能遵循当前的基本逻辑,那么这是一个不错的选择。
如果您已经在使用EL 3.0(Java EE 7 / Servlet
3.1),请使用对流和lambda的新支持:
<c:forEach var="person" items="${personList}"> <tr><td>${person.name}<td><td>${person.age}</td></tr>
</c:forEach>
${personList.stream().map(person -> person.age).sum()}
在不向JSP中引入脚本代码的情况下输出总计的另一种方法是使用EL函数。EL函数允许您在公共类中调用公共静态方法。例如,如果您想遍历集合并求和值,则可以在公共类(可能称为PersonUtils)中定义一个称为sum(List
people)的公共静态方法。在您的tld文件中,您将放置以下声明:
<function> <name>sum</name>
<function-class>com.example.PersonUtils</function-class>
<function-signature>int sum(java.util.List people)</function-signature>
</function>
在您的JSP中,您应该编写:
<%@ taglib prefix="f" uri="/your-tld-uri"%>...
<c:out value="${f:sum(personList)}"/>
JSP EL函数有一些好处。它们使您可以使用现有的Java方法,而无需编写特定的UI(自定义标签库)代码。它们也很紧凑,不会混淆非编程人员。
另一个选择是滚动您自己的自定义标签。此选项将涉及最多的设置,但会为您提供我认为基本上所需的内容,绝对没有scriptlet。可以在http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/JSPTags5.html#74701中找到使用简单自定义标签的不错的教程。
涉及的步骤包括将TagSupport子类化:
public PersonSumTag extends TagSupport { private List personList;
public List getPersonList(){
return personList;
}
public void setPersonList(List personList){
this.personList = personList;
}
public int doStartTag() throws JspException {
try {
int sum = 0;
for(Iterator it = personList.iterator(); it.hasNext()){
Person p = (Person)it.next();
sum+=p.getAge();
}
pageContext.getOut().print(""+sum);
} catch (Exception ex) {
throw new JspTagException("SimpleTag: " +
ex.getMessage());
}
return SKIP_BODY;
}
public int doEndTag() {
return EVAL_PAGE;
}
}
在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>
在JSP顶部声明taglib:
<%@ taglib uri="/you-taglib-uri" prefix="p" %>
并使用标签:
<c:forEach var="person" items="${personList}"> <tr><td>${person.name}<td><td>${person.age}</td></tr>
</c:forEach>
<p:personSum personList="${personList}"/>
正如前面的zmf所提到的,尽管您需要包括适当的库,但是您也可以使用display标记:
http://displaytag.sourceforge.net/11/tut_basic.html
以上是 计算c:forEach循环中所有数字的总和 的全部内容, 来源链接: utcz.com/qa/420740.html