Nota: Probé la combinación de respuestas para hacer una lista completa Mencioné nombres donde correspondía para dar crédito donde es debido.
Hay muchas maneras de resolver este problema, con ventajas/desventajas asociadas con cada uno:
Solución JSP puro
Como ScArcher2 se mencionó anteriormente, una solución muy fácil y sencilla al problema es para implementar directamente en el JSP como así:
<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}
el problema de esta solución es que el JSP se vuelve confuso hasta el punto en que también podría tener i scriplets presentados. Si anticipa que todos los que miran la página podrán seguir el rudimentario presente de la lógica, es una buena elección.
solución EL puro
Si ya estás en EL 3.0 (Java EE 7/servlet 3.1), utilizar un nuevo soporte para streams and lambdas: Funciones
<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
Otra forma de generar el total sin introducir código scriplet en su JSP es usar una función EL. Las funciones EL le permiten llamar a un método público estático en una clase pública. Por ejemplo, si desea iterar sobre su colección y sumar los valores, podría definir un método público estático denominado sum (List people) en una clase pública, quizás llamada PersonUtils. En el archivo TLD que le coloque la siguiente declaración:
<function>
<name>sum</name>
<function-class>com.example.PersonUtils</function-class>
<function-signature>int sum(java.util.List people)</function-signature>
</function>
Dentro de su JSP que iba a escribir:
<%@ taglib prefix="f" uri="/your-tld-uri"%>
...
<c:out value="${f:sum(personList)}"/>
Funciones JSP El presentan algunas ventajas. Le permiten usar métodos Java existentes sin la necesidad de codificar a una IU específica (Bibliotecas de etiquetas personalizadas). También son compactos y no confundirán a una persona no orientada a la programación.
etiqueta personalizada
Sin embargo, otra opción es la de rodar su propia etiqueta personalizada. Esta opción implicará la mayor cantidad de configuración, pero le dará lo que creo que está buscando esencialmente, absolutamente ningún scriptlets.Un tutorial agradable para el uso de etiquetas personalizadas simples se puede encontrar en http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/JSPTags5.html#74701
Los pasos a seguir incluyen subclases 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;
}
}
Definir la etiqueta en un archivo 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>
declarar la taglib en la parte superior de su JSP:
<%@ taglib uri="/you-taglib-uri" prefix="p" %>
y utilice la etiqueta:
<c:forEach var="person" items="${personList}">
<tr><td>${person.name}<td><td>${person.age}</td></tr>
</c:forEach>
<p:personSum personList="${personList}"/>
visualización de la etiqueta
Como ZMF se mencionó anteriormente, también se puede utilizar la etiqueta de presentación, aunque tendrá que incluir las bibliotecas apropiadas:
http://displaytag.sourceforge.net/11/tut_basic.html
¿Está sumando todas las edades y exhibiendo eso en la última fila? – ScArcher2