Làm cách nào để bạn có được độ dài của danh sách trong ngôn ngữ biểu thức JSF?


117

Làm cách nào để lấy độ dài của một ArrayListbiểu thức JSF EL?

#{MyBean.somelist.length}

không hoạt động.



@GBa, bạn có thể sử dụng # {MyBean.somelist.size ()} để hiển thị kích thước danh sách.
Umair

Bạn cũng có thể sử dụng c: forEach để lặp qua danh sách và trong phần thân của vòng lặp gán giá trị đếm cho một biến, như: <c: set var = "nr_of_items" value = "$ {varStatus.count}" />. Đặc biệt hữu ích khi bạn vẫn đang lặp lại danh sách.
David Balažic

Câu trả lời:


166

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 lengththuộ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)}

2
fn có lẽ là cách để đi, tiếc là nó chỉ có sẵn trong các phiên bản JSTL lớn hơn 1.1.
James McMahon

27
Sử dụng fn: length đã phù hợp với tôi với JSP trần (không có JSF, Khuôn mặt; dự án siêu kế thừa được cập nhật nhẹ trước khi bị loại bỏ). Taglib thích hợp để sử dụng:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
Christopher Parker

57
Đối với những người hạ cánh ở đây như tôi, vẫn còn 2 năm sau, considere bạn có thể thêm không gian tên sau đây để facelet của bạn: xmlns:fn="http://java.sun.com/jsp/jstl/functions"
Damien MIRAS

59

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)


Có thể các thông số kỹ thuật mới hơn của EL hỗ trợ phương pháp kích thước? bất cứ ai có thể xác nhận hay phủ nhận điều này?
James McMahon

2
@nemo - vấn đề này đang được giải quyết trong bản phát hành bảo trì JSR245: blog.sun.com/kchung/entry/jsr_245_mr_part_i (Về mặt thông số kỹ thuật JEE, đó sẽ là JEE6)
McDowell

@McDowell, Cảm ơn bạn đã cung cấp thông tin, tôi thực sự ngạc nhiên vì họ đã mất nhiều thời gian để khắc phục sự cố.
James McMahon

Cảm ơn bạn. Nó cũng làm việc cho tôi. +1. Nhưng cho đến khi JEE 6 được hỗ trợ rộng rãi, có lẽ tôi sẽ gắn bó với hàm JSTL "chuẩn hơn".
Hosam Aly 02/09/09

BTW, nó có thể hoạt động trong JBoss để chỉ nói #{MyBean.somelist.size}(không có dấu ngoặc đơn ở cuối).
Hosam Aly

14

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.



6
<%@ 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


Vâng, tôi thấy đây là cách đơn giản nhất để làm điều đó. Tôi đang sử dụng websphere6 với JSP (hệ thống kế thừa). đã sử dụng cùng một tablib và sau đó sử dụng 'ký hiệu đô la' thay vì 'băm' vì hàm băm không hoạt động. tức là: {fn: length (SystemBean.list)}
JackDev

0

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ố ...


-1

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>

-5

Bạn có thể nhận được độ dài bằng cách sử dụng EL sau:

# {Bean.list.size ()}


1
Đây về cơ bản là câu trả lời giống như Damo .
Artjom B.

6
Là @ArtjomB. gợi ý, ở đây nói chung là không tốt khi đăng số lượng câu trả lời tương tự như người khác đã đăng. Trong trường hợp này, gần sáu năm trước .
Andrew Barber,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.