2012-01-07 26 views
5

thể trùng lặp:
Access the size of a collection in JSP/JSTL/ELTại sao ArrayList không có getSize() thay vì size()?

Tôi đang tận dụng nặng của ArrayList trong một số trang JSP. Tôi muốn truy cập vào một ArrayList như vậy:

${myArrayList.size} 

Nhưng kể từ khi đối tượng phải để phù hợp với các tiêu chuẩn JavaBean, nơi myArrayList.getMyPropertyName()${myArrayList.myPropertyName} trong JSP/JSTL, các myArrayList.size() chức năng là không thể truy cập.

Có lớp học nào khác mà tôi nên sử dụng không?

Cập nhật:

Đó là một chút khó khăn để chấp nhận rằng một tính năng chẳng hạn như nhận kích thước của ArrayList của bạn trong JSP là trái ra chỉ dành riêng cho sạch một lớp lót nhưng có vẻ như có thể có lý do khác các nhà thiết kế đã chọn .size() thay của .getSize()

Tôi đoán đây thực sự không phải là vấn đề nếu bạn có hỗ trợ cho cú pháp ${fn:length(myArrayList)} hoặc ${myArrayList.getSize()}.

+2

Vì đó là cách họ viết. Sử dụng fn: length theo [here] (http://stackoverflow.com/questions/3579548/access-the-size-of-a-collection-in-jsp-jstl-el) (và nhiều thứ khác). –

Trả lời

11

Tiêu đề nói lên tất cả: Tại sao không ArrayList có getSize () thay vì kích thước()?

Như đã giải thích trong "Java Collections API Design FAQ":

Tại sao bạn không sử dụng "tên Đậu kiểu" cho phù hợp?

Trong khi tên của các phương pháp thu thập mới không tuân thủ "Quy ước đặt tên đậu", chúng tôi tin rằng chúng là hợp lý, nhất quán và phù hợp với mục đích của chúng. Nó nên được nhớ rằng các quy ước đặt tên của Đậu không áp dụng cho toàn bộ JDK ; AWT đã áp dụng các quy ước này, nhưng quyết định có phần gây tranh cãi. Chúng tôi nghi ngờ rằng các API bộ sưu tập sẽ được sử dụng khá phổ biến, thường với nhiều cuộc gọi phương thức trên một dòng mã, vì vậy điều quan trọng là rằng tên sẽ ngắn. Hãy xem xét, ví dụ, các phương pháp Iterator . Hiện tại, vòng lặp trên bộ sưu tập trông giống như sau:

 for (Iterator i = c.iterator(); i.hasNext();) 
     System.out.println(i.next()); 
Mọi thứ vừa gọn gàng trên một dòng, ngay cả khi tên Bộ sưu tập là một biểu thức dài. Nếu chúng tôi đặt tên cho các phương thức "getIterator", "hasNextElement" và "getNextElement", điều này sẽ không còn là trường hợp .Do đó, chúng tôi đã áp dụng kiểu JDK "truyền thống" thay vì kiểu dáng Đậu.

+1

Vì vậy, không có hy vọng rằng kích thước() sẽ được deprectated ủng hộ getSize() sau đó. – Matthew

+3

@Matthew Nó chắc chắn sẽ không được * thay thế * với getSize(), nhưng một trong hai cách, tôi sẽ nghi ngờ thời gian của dự án của bạn sẽ không chịu được thời gian cần thiết cho một sự thay đổi JDK. –

+1

@Matthew: Không. Ngay cả khi mọi người đột nhiên đồng ý rằng 'getSize()' là một tên ưu tiên * ưu tiên, điều đó sẽ không bao giờ thay thế câu thần chú "một API mãi mãi". Sẽ không bao giờ có giá trị để thêm 'getSize()' vào giao diện 'java.util.List' (vì điều đó sẽ phá vỡ tất cả các lớp thực hiện hiện có), và không có thay đổi đó, sẽ không bao giờ đáng để thêm' getSize () 'to' java.util.ArrayList' (vì nó chỉ có thể sử dụng được trên các danh sách mảng được biểu diễn bằng các biểu thức có kiểu chính xác 'ArrayList'). – ruakh

5

Bạn sử dụng chức năng fn:length JSTL (xem docs).

Thứ nhất, khai báo không gian tên fn ở phía trên cùng của JSP:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 

và sau đó:

${fn:length(myArrayList)} 
+0

Tôi ước tôi có thể sử dụng điều này. Tôi đang làm việc với một phiên bản cũ của Tomcat không tương thích. – Matthew

+1

@Matthew: Tại sao không? Bạn nói rằng bạn đang sử dụng JSP EL (ví dụ: '$ {myArrayList.size}'), vậy tại sao không phải chức năng JSTL? – skaffman

+0

@Matthew Sau đó, quấn nó lên trong một thẻ tùy chỉnh hoặc phơi bày chiều dài từ đầu sau. –

1

Phiên bản mới nhất của EL hỗ trợ phương pháp invocations ${collection.size()}

Hai câu trả lời khác cung cấp cho bạn biết thêm chi tiết

  • các bộ sưu tập API không phù hợp với các JavaBeans spec trên mục đích. Lưu ý rằng kích thước không nhất thiết là thuộc tính. Một số triển khai tính toán động. Cùng đi với các phương pháp khác - chúng không phải là các thuộc tính đơn giản, và làm cho chúng trông giống như getters sẽ không phù hợp.
  • trước EL 2.2 bạn có thể sử dụng ${fn:length(collection)}

Bằng cách này, trong một JSP bạn không nên thường cần size() của một bộ sưu tập - bạn chỉ lặp nó. Nếu bạn phải thực hiện một số tính toán, hãy nghĩ đến việc thực hiện điều đó trong servlet/controller. Tất nhiên, tôi đồng ý, nó là hợp lệ để sử dụng đôi khi trong chính jsp.

Các vấn đề liên quan