Ответ 1
Примечание.. Я попытался объединить ответы, чтобы составить исчерпывающий список. Я упомянул имена, где это уместно, чтобы дать кредит там, где это должно быть.
Существует много способов решить эту проблему: с плюсами/минусами, связанными с каждым из них:
Чистое решение 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 становится запутанным до такой степени, что вы могли бы также ввести скрипты. Если вы ожидаете, что все, кто смотрит на страницу, смогут следить за рудиментарной логикой, это прекрасный выбор.
Решение Pure 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 без необходимости кодирования определенного пользовательского интерфейса (библиотеки пользовательских тегов). Они также компактны и не будут путать ориентированного на программирование человека.
Пользовательский тег
Еще один вариант - запустить свой собственный тег. Этот вариант будет включать в себя большинство настроек, но даст вам то, что я думаю, что вы ищете, абсолютно не скриптлеты. Хороший учебник по использованию простых пользовательских тегов можно найти на 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, вы также можете использовать тег отображения, хотя вам нужно будет включить соответствующие библиотеки: