Lưu ý: tôi đã cố gắng kết hợp các câu trả lời để làm cho một danh sách toàn diện. Tôi đã đề cập đến tên khi thích hợp để cung cấp tín dụng khi đến hạn.
Có rất nhiều cách để giải quyết vấn đề này, với những ưu/nhược điểm gắn liền với mỗi:
tinh khiết JSP Giải pháp
Như ScArcher2 đề cập ở trên, một giải pháp rất dễ dàng và đơn giản cho vấn đề là để thực hiện nó trực tiếp trong JSP như sau:
<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}
Vấn đề với giải pháp này là JSP trở nên khó hiểu đến mức bạn cũng có thể có các tập bản giới thiệu. Nếu bạn dự đoán rằng tất cả mọi người nhìn vào trang sẽ có thể làm theo logic thô sơ, nó là một lựa chọn tốt.
tinh khiết EL giải pháp
Nếu bạn đã có trên EL 3.0 (Java EE 7/Servlet 3.1), sử dụng hỗ trợ mới cho 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 Chức năng
Một cách khác để xuất tổng số mà không đưa mã scriplet vào JSP của bạn là sử dụng hàm EL. Các hàm EL cho phép bạn gọi một phương thức tĩnh công cộng trong một lớp công khai. Ví dụ, nếu bạn muốn lặp qua bộ sưu tập của bạn và tổng hợp các giá trị bạn có thể định nghĩa một phương thức tĩnh công cộng được gọi là tổng (Liệt kê mọi người) trong một lớp công khai, có lẽ được gọi là PersonUtils. Trong tập tin TLD của bạn, bạn sẽ đặt các tuyên bố sau đây:
<function>
<name>sum</name>
<function-class>com.example.PersonUtils</function-class>
<function-signature>int sum(java.util.List people)</function-signature>
</function>
Trong JSP của bạn, bạn sẽ viết:
<%@ taglib prefix="f" uri="/your-tld-uri"%>
...
<c:out value="${f:sum(personList)}"/>
JSP EL Chức năng có một số lợi ích. Chúng cho phép bạn sử dụng các phương thức Java hiện có mà không cần mã vào một giao diện người dùng cụ thể (Thư viện thẻ tùy chỉnh). Chúng cũng nhỏ gọn và sẽ không gây nhầm lẫn cho một người không định hướng lập trình.
Tuỳ chỉnh Tag
Tuy nhiên, tùy chọn khác là để cuộn thẻ tùy chỉnh của riêng bạn. Tùy chọn này sẽ liên quan đến việc thiết lập nhiều nhất nhưng sẽ cung cấp cho bạn những gì tôi nghĩ rằng bạn đang esentially tìm kiếm, absolutly không có scriptlets.Một hướng dẫn tốt đẹp cho sử dụng các thẻ tùy chỉnh đơn giản có thể được tìm thấy tại http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/JSPTags5.html#74701
Các bước tham gia bao gồm 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;
}
}
Xác định thẻ trong một tập tin 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>
Khai báo taglib trên đầu JSP của bạn:
<%@ taglib uri="/you-taglib-uri" prefix="p" %>
và sử dụng thẻ:
<c:forEach var="person" items="${personList}">
<tr><td>${person.name}<td><td>${person.age}</td></tr>
</c:forEach>
<p:personSum personList="${personList}"/>
Display Tag
Như zmf đề cập trước đó, bạn cũng có thể sử dụng thẻ hiển thị, mặc dù bạn sẽ cần phải bao gồm các thư viện thích hợp:
http://displaytag.sourceforge.net/11/tut_basic.html
Bạn có đang thêm tất cả độ tuổi và hiển thị ở hàng cuối cùng không? – ScArcher2