注:我试图合并的答案,使一个全面的清单。我在适当的地方提到了可以在哪里提供贷款的名称。
有许多方法来解决这个问题,以及与每个相关联的优点/缺点:
纯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}
这种解决方案的问题是,JSP变得扑朔迷离的地步,你可能也有我引入的脚本。如果您预计每个看到该页面的人都能够遵循目前的基本逻辑,那么这是一个不错的选择。
纯EL解决方案
如果你已经在EL 3.0(Java EE的7/Servlet的3.1),使用streams and lambdas新的支持:
<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功能
另一种在不将脚本代码引入JSP的情况下输出总和的方法是使用EL函数。 EL函数允许您在公共类中调用公共静态方法。例如,如果您想迭代您的集合并对这些值求和,则可以在公共类中定义一个名为sum(List people)的公共静态方法,也许称为PersonUtils。在您的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>
上声明的taglib JSP顶端:
<%@ 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前面提到的,你也可以使用显示标签,虽然你将需要包括相应的库:
http://displaytag.sourceforge.net/11/tut_basic.html
您是将所有年龄加起来并显示在最后一行吗? – ScArcher2 2008-09-19 15:45:08