2011-12-20 63 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