Note: J'ai essayé la combinaison des réponses à faire une liste complète. J'ai mentionné les noms, le cas échéant, pour donner du crédit là où il est dû.
Il y a plusieurs façons de résoudre ce problème, avec avantages/inconvénients associés à chaque:
pure JSP Solution
Comme ScArcher2 mentionné ci-dessus, une solution très facile et simple au problème est de mettre en œuvre directement dans la JSP comme si:
<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}
le problème avec cette solution est que la JSP devient déroutant au point où vous pourriez aussi bien avoir i scriplets ntroduits. Si vous prévoyez que tout le monde regarde la page sera en mesure de suivre la logique rudimentaire présente, c'est un bon choix.
solution pure EL
Si vous êtes déjà sur EL 3.0 (Java EE 7/Servlet 3.1), utiliser un nouveau support pour 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 Fonctions
Une autre façon de générer le total sans introduire de code scriplet dans votre JSP consiste à utiliser une fonction EL. Les fonctions EL vous permettent d'appeler une méthode statique publique dans une classe publique. Par exemple, si vous souhaitez parcourir votre collection et additionner les valeurs, vous pouvez définir une méthode statique publique appelée sum (List people) dans une classe publique, peut-être appelée PersonUtils. Dans votre fichier tld vous placeriez la déclaration suivante:
<function>
<name>sum</name>
<function-class>com.example.PersonUtils</function-class>
<function-signature>int sum(java.util.List people)</function-signature>
</function>
Au sein de votre JSP vous écrivez:
<%@ taglib prefix="f" uri="/your-tld-uri"%>
...
<c:out value="${f:sum(personList)}"/>
Fonctions JSP EL ont quelques avantages. Ils vous permettent d'utiliser des méthodes Java existantes sans avoir besoin de coder pour une interface utilisateur spécifique (bibliothèques de balises personnalisées). Ils sont également compacts et ne vont pas confondre une personne non orientée vers la programmation.
personnalisé Tag
Une autre option est de faire rouler votre propre étiquette personnalisée. Cette option impliquera le plus de configuration mais vous donnera ce que je pense que vous cherchez, absolument pas de scriptlets.Un tutoriel agréable pour l'utilisation des balises simples personnalisés peuvent être trouvés à http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/JSPTags5.html#74701
Les étapes comprennent subclassing 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;
}
}
Définir la balise dans un fichier 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>
Déclarez la taglib sur le dessus de votre JSP:
<%@ taglib uri="/you-taglib-uri" prefix="p" %>
et d'utiliser le tag:
<c:forEach var="person" items="${personList}">
<tr><td>${person.name}<td><td>${person.age}</td></tr>
</c:forEach>
<p:personSum personList="${personList}"/>
Affichage Tag
Comme ZMF mentionné plus haut, vous pouvez également utiliser l'étiquette d'affichage, bien que vous devrez inclure les bibliothèques appropriées:
http://displaytag.sourceforge.net/11/tut_basic.html
Additionnez-vous tous les âges et affichez cela dans la dernière rangée? – ScArcher2