2011-12-20 31 views
5

Mi chiedevo se il metodo contiene collezioni/matrice in EL 2.2 o dovrò effettuare uno personalizzato?Collection/Array contiene il metodo

REQUISITO: ho un array di stringhe e voglio trovare se contiene una stringa specifica.

CASO: Sono ripetuta su elenco di caselle di input per rendere loro, e voglio controllare la casella di controllo in corso, se si tratta di valore esiste nella matrice di caselle di controllo.

UPDATE:

  • è tale metodo è disponibile in EL?

  • Se tale metodo non è disponibile, fornire il suggerimento per il metodo per un array di stringhe contenente un elemento.

risposta

6

Per un Collection è facile, basta utilizzare il metodo Colleciton#contains() in 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> 

Per un Object[] (array), avresti bisogno di un minimo di EL 3.0 e utilizzare il nuovo supporto 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> 

Se non si è ancora su EL 3.0, è necessario creare una funzione EL personalizzata. Per un esempio concreto, vedere How to create a custom EL function to invoke a static method? E.g.

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

che è registrato come

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

e da utilizzare come

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

Questo non è disponibile in JSTL. C'è un fn:contains(), ma funziona solo con i valori String.

+0

Semplicemente non utilizzare gli array se si vuole fare qualcosa di più che tenere semplicemente i dati. Utilizzare quindi le raccolte. – BalusC

+0

beh, lo sto usando su un attributo di input, ma il metodo non viene chiamato: 'checked =" # {utils.contains (myBean.array, 'myBean.someIndicator')? 'Checked': ''} "' –

+0

Ci sono errori EL? A proposito, il modo in cui usi 'checked' non è del tutto corretto. Una checkbox/radiobutton viene controllata quando è presente l'intero attributo, indipendentemente dal suo valore. In pratica, si desidera stampare il nome dell'attributo anziché il valore dell'attributo in modo condizionale. – BalusC

2

Se si utilizza un String[], è possibile prima concatenare tutti gli elementi di un array in una stringa utilizzando fn:join():

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

e quindi utilizzare la `funzione di fn:contains() al fine di verificare se esiste un valore in quella stringa:

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

Questa semplice soluzione mi ha aiutato a controllare un '$ {param.stringArray}' dei valori della casella di controllo. – ruhong