Примечание: Я пытался комбинируя ответы, чтобы сделать полный список. Я упоминал имена, где это уместно, чтобы давать кредит там, где это необходимо.
Есть много способов решить эту проблему, с плюсы/минусы, связанные с каждым:
Pure 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 становится запутанным до точки, где вы могли бы также иметь я ntroduced scripsts. Если вы ожидаете, что все, кто смотрит на страницу, смогут следить за рудиментарной логикой, это прекрасный выбор.
Чистый раствор 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 Функции
Другой способ вывода итоговой суммы без ввода кода scriplet в ваш 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}"/>
Display Tag
Как уже упоминалось ранее ZMF, вы можете также использовать дисплей тег, хотя вам нужно будет включать соответствующие библиотеки:
http://displaytag.sourceforge.net/11/tut_basic.html
Вы складываете все возрасты и показываете это в последней строке? – ScArcher2 2008-09-19 15:45:08