Làm cách nào để lấy độ dài của một ArrayList
biểu thức JSF EL?
#{MyBean.somelist.length}
không hoạt động.
Làm cách nào để lấy độ dài của một ArrayList
biểu thức JSF EL?
#{MyBean.somelist.length}
không hoạt động.
Câu trả lời:
Có, vì một số thiên tài trong ủy ban tạo Java API đã quyết định rằng, mặc dù một số lớp nhất định có size()
thành viên hoặc length
thuộc tính, chúng sẽ không triển khai getSize()
hoặc getLength()
JSF và hầu hết các tiêu chuẩn khác yêu cầu, bạn không thể làm những gì bạn muốn.
Có một số cách để làm điều này.
Một: thêm một hàm vào Bean của bạn để trả về độ dài:
Trong lớp MyBean: public int getSomelistLength () {return this.somelist.length; } Trong trang JSF của bạn: # {MyBean.somelistLength}
Hai: Nếu bạn đang sử dụng Khuôn mặt (Ôi, Chúa ơi, tại sao bạn không sử dụng Khuôn mặt!), Bạn có thể thêm không gian tên fn và sử dụng hàm độ dài
Trong trang JSF: # {fn: length (MyBean.somelist)}
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
Bạn có nghĩa là kích thước () phải không?
#{MyBean.somelist.size()}
phù hợp với tôi (sử dụng JBoss Seam có phần mở rộng Jboss EL)
#{MyBean.somelist.size}
(không có dấu ngoặc đơn ở cuối).
Lưu ý: Giải pháp này tốt hơn cho các phiên bản cũ hơn của JSTL. Đối với các phiên bản lớn hơn 1.1, tôi khuyên bạn nên sử dụng fn:length(MyBean.somelist)
theo đề xuất của Bill James .
Bài viết này có một số thông tin chi tiết hơn, bao gồm một giải pháp khả thi khác;
Vấn đề là chúng tôi đang cố gắng gọi phương thức kích thước của danh sách (là phương thức LinkedList hợp lệ), nhưng nó không phải là phương thức getter tuân thủ JavaBeans, vì vậy không thể đánh giá biểu thức list.size-1.
Có hai cách để giải quyết tình huống khó xử này. Đầu tiên, bạn có thể sử dụng thư viện RT Core, như sau:
<c_rt:out value='<%= list[list.size()-1] %>'/>
Thứ hai, nếu bạn muốn tránh mã Java trong các trang JSP của mình, bạn có thể triển khai một lớp trình bao bọc đơn giản chứa danh sách và cung cấp quyền truy cập vào thuộc tính kích thước của danh sách bằng phương thức getter tuân thủ JavaBeans. Đậu đó được liệt kê trong Liệt kê 2.25.
Vấn đề với phương thức c_rt là bạn cần lấy biến từ yêu cầu theo cách thủ công, vì nó không nhận ra nó theo cách khác. Tại thời điểm này, bạn đang đặt rất nhiều mã cho những gì nên được xây dựng trong chức năng. Đây là một thiếu sót KHỔNG LỒ ở NCT.
Tôi đã kết thúc bằng cách sử dụng phương thức "wrapper", đây là lớp cho nó;
public class CollectionWrapper {
Collection collection;
public CollectionWrapper(Collection collection) {
this.collection = collection;
}
public Collection getCollection() {
return collection;
}
public int getSize() {
return collection.size();
}
}
Một tùy chọn thứ ba mà chưa ai đề cập là đặt kích thước danh sách của bạn vào mô hình (giả sử bạn đang sử dụng MVC) như một thuộc tính riêng biệt. Vì vậy, trong mô hình của bạn, bạn sẽ có "someList" và sau đó là "someListSize". Đó có thể là cách đơn giản nhất để giải quyết vấn đề này.
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>
Trên màn hình, nó hiển thị kích thước Bảng
Thí dụ: Table Size = 5
Cuối cùng, bạn có thể mở rộng ngôn ngữ EL bằng cách sử dụng EL Functor , cho phép bạn gọi bất kỳ phương thức Java bean nào, ngay cả với các tham số ...
Sau 7 năm ... giải pháp vòng tay vẫn hoạt động tốt đối với tôi với tư cách là một người dùng jsf
bao gồm không gian tên như
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
và sử dụng EL làm
#{fn:length(myBean.someList)}
ví dụ nếu sử dụng trong jsf ui: segment dưới đây ví dụ hoạt động tốt
<ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
<!-- Do something here-->
</ui:fragment>
Bạn có thể nhận được độ dài bằng cách sử dụng EL sau:
# {Bean.list.size ()}