2011-12-20 72 views
5

我想知道是否有包含方法集合/數組在EL 2.2 或我將不得不做一個自定義的?集合/數組包含方法

REQUIREMENT:我有一個字符串數組,我想查找它是否包含特定的字符串。

CASE:我正在循環上的輸入複選框列表來呈現他們,我想檢查當前的複選框,如果它的值複選框的數組中存在。

UPDATE

  • 是這樣的方法是可以在EL?

  • 如果這種方法不可用,那麼請提供您的建議爲一個字符串數組最好的性能方法中包含的元素。

回答

6

對於Collection很容易,只需使用EL的Colleciton#contains()方法。

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

對於Object[](陣列),你需要一個最低EL 3.0和利用其新的LAMBDA支持。

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

如果你還沒有在EL 3.0上,你需要創建一個自定義EL功能。具體例子見How to create a custom EL function to invoke a static method?例如

public static boolean contains(Object[] array, Object item) { 
    return Arrays.asList(array).contains(item); 
} 
,其被註冊爲

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

和用作

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

這不是JSTL可用。有一個fn:contains(),但只適用於String值。

+0

只是不要使用數組,如果你想做的不僅僅是保存數據。然後使用集合。 – BalusC 2011-12-20 14:38:44

+0

嗯,我使用它的輸入屬性,但該方法沒有得到調用:'checked =「#{utils.contains(myBean.array,'myBean.someIndicator')?'checked':''}」' – 2011-12-20 14:55:51

+0

是否有任何EL錯誤?順便說一句,你如何使用'checked'並不完全正確。當整個屬性存在時檢查複選框/單選按鈕,不管其值如何。你基本上想要有條件地打印屬性名稱而不是屬性值。 – BalusC 2011-12-20 14:58:28

2

如果您使用的是String[],您可以先使用fn:join()串聯陣列中的所有元素轉換成字符串:

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

然後使用fn:contains()`功能,以檢查是否在存在價值該字符串:

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

這個簡單的解決方案幫助我,因爲我想檢查複選框值的$ {param.stringArray}。 – ruhong 2016-09-27 05:00:58