2011-12-20 27 views
5

tôi đã tự hỏi liệu có phương pháp nào cho bộ sưu tập/mảng trong EL 2.2 hoặc tôi sẽ phải tạo một tùy chỉnh?Bộ sưu tập/Mảng chứa phương pháp

YÊU CẦU: tôi có một mảng chuỗi và tôi muốn tìm xem nó có chứa chuỗi cụ thể không.

TRƯỜNG HỢP: tôi đang lặp trên danh sách các hộp kiểm đầu vào để render họ, và tôi muốn kiểm tra hộp kiểm hiện nay, nếu nó là giá trị tồn tại trong mảng các hộp kiểm.

CẬP NHẬT:

  • được phương pháp này là có sẵn trong EL?

  • Nếu không có phương pháp như vậy, vui lòng cung cấp đề xuất của bạn cho phương pháp hiệu suất tốt nhất cho mảng chuỗi chứa phần tử.

Trả lời

6

Thật dễ dàng, chỉ cần sử dụng phương pháp Colleciton#contains() trong EL.

<h:panelGroup id="p1" rendered="#{bean.panels.contains('p1')}">...</h:panelGroup> 
<h:panelGroup id="p2" rendered="#{bean.panels.contains('p2')}">...</h:panelGroup> 
<h:panelGroup id="p3" rendered="#{bean.panels.contains('p3')}">...</h:panelGroup> 

Để có Object[] (mảng), bạn cần tối thiểu EL 3.0 và sử dụng hỗ trợ Lambda mới.

<h:panelGroup id="p1" rendered="#{bean.panels.stream().anyMatch(v -> v == 'p1').get()}">...</h:panelGroup> 
<h:panelGroup id="p2" rendered="#{bean.panels.stream().anyMatch(v -> v == 'p2').get()}">...</h:panelGroup> 
<h:panelGroup id="p3" rendered="#{bean.panels.stream().anyMatch(v -> v == 'p3').get()}">...</h:panelGroup> 

Nếu bạn chưa sử dụng EL 3.0, bạn cần tạo một hàm EL tùy chỉnh. Để biết ví dụ cụ thể, hãy xem How to create a custom EL function to invoke a static method? Ví dụ:

public static boolean contains(Object[] array, Object item) { 
    return Arrays.asList(array).contains(item); 
} 

được đăng ký như

<function> 
    <function-name>contains</function-name> 
    <function-class>com.example.Functions</function-class> 
    <function-signature>boolean contains(java.lang.Object[], java.lang.Object)</function-signature> 
</function> 

và được sử dụng như

<h:panelGroup ... rendered="#{func:contains(bean.panels, 'u1')}"> 

Đây không phải là có sẵn trong JSTL. Có một fn:contains(), nhưng chỉ hoạt động với giá trị String.

+0

Chỉ không sử dụng mảng nếu bạn muốn làm nhiều hơn là chỉ giữ dữ liệu. Sử dụng bộ sưu tập sau đó. – BalusC

+0

tốt, tôi đang sử dụng nó trên một thuộc tính đầu vào, nhưng phương pháp không được gọi là: 'checked =" # {utils.contains (myBean.array, 'myBean.someIndicator')? 'Checked': ''} "' –

+0

Có lỗi EL nào không? Nhân tiện, cách bạn sử dụng 'kiểm tra' không hoàn toàn đúng. Một hộp kiểm/radiobutton được kiểm tra khi toàn bộ thuộc tính có mặt, bất kể giá trị của nó. Về cơ bản, bạn muốn in tên thuộc tính thay vì giá trị thuộc tính có điều kiện. – BalusC

2

Nếu bạn đang sử dụng một String[], trước tiên bạn có thể ghép tất cả các yếu tố của một mảng thành một chuỗi sử dụng fn:join():

<c:set var="concat" value="${fn:join(myArray, '-')}"/> 

Và sau đó sử dụng fn:contains() 'chức năng để kiểm tra xem một giá trị tồn tại trong chuỗi đó:

<c:if test="${fn:contains(concat, 'myString')}">Found!</c:if> 
+0

Giải pháp đơn giản này đã giúp tôi vì tôi muốn kiểm tra giá trị hộp kiểm '$ {param.stringArray}'. – ruhong

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