注:回答を組み合わせて包括的なリストを作成してみました。必要に応じてクレジットを与えるために、適切な場所で名前を挙げました。
この問題を解決するには多くの方法があり、それぞれに長所と短所があります。
純粋な 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) を使用している場合は、ストリームとラムダの新しいサポートを使用してください。
<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 関数を使用すると、パブリック クラスで public static メソッドを呼び出すことができます。たとえば、コレクションを反復処理して値を合計したい場合は、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 関数にはいくつかの利点があります。これらを使用すると、特定の UI (カスタム タグ ライブラリ) にコーディングする必要なく、既存の Java メソッドを使用できます。また、コンパクトであり、プログラミングに慣れていない人を混乱させることはありません。
カスタムタグ
さらに別のオプションは、独自のカスタム タグをロールすることです。このオプションにはほとんどのセットアップが含まれますが、本質的に探していると思われるものを提供します。スクリプトレットはまったくありません。シンプルなカスタム タグを使用するための優れたチュートリアルは、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