2011-12-20 19 views
5

me preguntaba si hay un método para colecciones /matriz en EL 2.2 o tendré que hacer una personalizada?Colección/matriz contiene el método

REQUISITO: tengo una matriz de cadenas, y quiero encontrar si contiene una cadena específica.

CASO: Estoy en lazo con la lista de casillas de verificación de entrada para hacerlos, y quiero marcar la casilla actual, si es que existe valor en el conjunto de casillas de verificación.

ACTUALIZACIÓN:

  • es tal método está disponible en El?

  • Si tal método no está disponible, entonces proporcione su sugerencia para mejor rendimiento método para una serie de matriz contiene un elemento.

Respuesta

6

Para una Collection es fácil, sólo tiene que utilizar el método Colleciton#contains() en 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> 

Para una Object[] (matriz), se necesitaría un mínimo de EL 3.0 y utilizar su nuevo soporte 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> 

Si todavía no tienes EL 3.0, necesitarás crear una función EL personalizada. Para un ejemplo concreto, ver How to create a custom EL function to invoke a static method? P. ej.

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

que se coloca como

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

y para ser utilizado como

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

Esto no está disponible en JSTL. Hay un fn:contains(), pero eso solo funciona en los valores String.

+0

Simplemente no use arrays si quiere hacer un poco más que simplemente mantener los datos. Usa colecciones entonces. – BalusC

+0

bueno, lo estoy usando en un atributo de entrada, pero el método no se está llamando: 'checked =" # {utils.contains (myBean.array, 'myBean.someIndicator')? 'Checked': ''} "' –

+0

¿Hay algún error EL? Por cierto, la forma en que usas 'checked 'no es del todo correcta. Se marca una casilla de verificación/botón de radio cuando todo el atributo está presente, independientemente de su valor. Básicamente, desea imprimir el nombre del atributo en lugar del valor del atributo condicionalmente. – BalusC

2

Si está utilizando un String[], primero se puede concatenar todos los elementos de una matriz en una cadena utilizando fn:join():

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

y luego usar la función `fn:contains() con el fin de comprobar si existe un valor en esa cadena:

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

Esta solución simple me ayudó porque quería verificar un '$ {param.stringArray}' de los valores de la casilla de verificación. – ruhong

Cuestiones relacionadas