Hinweis: Ich habe versucht, Antworten kombiniert zu machen eine umfassende Liste. Ich habe Namen erwähnt, wo es angebracht ist, Kredit zu geben, wo es fällig ist.
Es gibt viele Möglichkeiten, um dieses Problem zu lösen, mit Vor/Nachteilen mit jedem verbunden:
reiner JSP-Lösung
Wie ScArcher2 oben erwähnt, eine sehr einfache und einfache Lösung für das Problem ist, es direkt in der JSP zu implementieren, wie so:
<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}
das Problem bei dieser Lösung ist, dass die JSP zu dem Punkt verwirrend wird, wo Sie auch haben könnten ich Einführung von Scriplets. Wenn Sie erwarten, dass jeder, der auf die Seite schaut, in der Lage ist, der rudimentären Logik zu folgen, ist dies eine gute Wahl.
Reine EL Lösung
Wenn Sie bereits auf EL 3.0 (Java EE 7/Servlet 3.1) verwenden, um neue Unterstützung für 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 Funktionen
Eine andere Möglichkeit, die Summe auszugeben, ohne Scriplet-Code in Ihre JSP einzufügen, ist die Verwendung einer EL-Funktion. Mit EL-Funktionen können Sie eine öffentliche statische Methode in einer öffentlichen Klasse aufrufen. Wenn Sie beispielsweise über Ihre Sammlung iterieren und die Werte summieren möchten, können Sie eine öffentliche statische Methode namens sum (List people) in einer öffentlichen Klasse definieren, die möglicherweise als PersonalUtils bezeichnet wird. In Ihrer TLD-Datei würden Sie die folgende Erklärung setzen:
<function>
<name>sum</name>
<function-class>com.example.PersonUtils</function-class>
<function-signature>int sum(java.util.List people)</function-signature>
</function>
Innerhalb Ihrer JSP würden Sie schreiben:
<%@ taglib prefix="f" uri="/your-tld-uri"%>
...
<c:out value="${f:sum(personList)}"/>
JSP EL Funktionen einige Vorteile haben. Sie ermöglichen es Ihnen, vorhandene Java-Methoden zu verwenden, ohne dass Sie für eine bestimmte Benutzeroberfläche codieren müssen (Custom Tag Libraries). Sie sind auch kompakt und werden eine nicht programmierorientierte Person nicht verwirren.
Eigener Tag
Eine weitere Option ist Ihren eigenen benutzerdefinierten Tag zu rollen. Diese Option beinhaltet die meisten Einstellungen, aber wird Ihnen geben, was ich denke, dass Sie im Wesentlichen suchen, absolut keine Skriptlets.Ein nettes Tutorial für einfache benutzerdefinierte Tags verwenden, können bei http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/JSPTags5.html#74701
Die Schritte, die zu finden sind Subklassifizieren 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;
}
}
das Tag in einer TLD-Datei definieren:
<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>
die taglib Deklarieren auf Oben auf der JSP:
und verwenden Sie das Tag:
<c:forEach var="person" items="${personList}">
<tr><td>${person.name}<td><td>${person.age}</td></tr>
</c:forEach>
<p:personSum personList="${personList}"/>
Anzeige Tag
Wie zmf bereits erwähnt, können Sie auch das Display-Tag verwenden, obwohl Sie die entsprechenden Bibliotheken umfassen müssen:
http://displaytag.sourceforge.net/11/tut_basic.html
Addieren Sie alle Altersgruppen zusammen und zeigen das in der letzten Zeile an? – ScArcher2