我想知道EL 2.2中是否包含集合/数组的方法 或者我必须自定义一个?
要求:我有一个字符串数组,我想查找它是否包含特定的字符串。
CASE :我在输入复选框列表上循环以渲染它们,我想检查当前复选框,如果它的值存在于复选框数组中。
更新:
这种方法在EL?
如果此方法不可用,请为包含元素的字符串数组提供最佳性能方法的建议。
答案 0 :(得分: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
值。
答案 1 :(得分:2)
如果您使用的是String[]
,则可以先使用fn:join()
将数组的所有元素连接成一个字符串:
<c:set var="concat" value="${fn:join(myArray, '-')}"/>
然后使用fn:contains()
`函数来检查该字符串中是否存在值:
<c:if test="${fn:contains(concat, 'myString')}">Found!</c:if>