Как создать массив в JSF EL?

Я хочу создать массив в JSF EL. Как я могу это сделать? Это вообще возможно?

чтобы проиллюстрировать, что я пытаюсь:

<rich:pickList addAllText="" addText="" removeAllText="" removeText="">
    <f:selectItems value="#{'Test', 'TestTest', 'TestTestTest'}" />
</rich:pickList>

3 ответов


если вы находитесь на EL 3.0 или новее, вы можете построить коллекции непосредственно в EL.

<f:selectItems value="#{['Test','TestTest','TestTestTest']}" />

если вы еще не на EL 3.0, вы можете решить этот конкретный случай С fn:split() трюк.

<html ... xmlns:fn="http://java.sun.com/jsp/jstl/functions">
...
<f:selectItems value="#{fn:split('Test,TestTest,TestTestTest', ',')}" />

в любом случае, для этого требуется минимум JSF 2.0 для поддержки List<T> на <f:selectItems>.


это возможно с EL 3.0:

[1, 2, 3].toArray()

сначала создается список, а затем преобразуется в массив.

по крайней мере, с последними версиями JSF вам даже не нужен массив для f:selectItems, любой Iterable будет делать. Итак:

<f:selectItems value="#{['Test', 'TestTest', 'TestTestTest']}" />

для получения дополнительной информации о строительстве коллекции в EL см. спецификация Эль 3.0 - финальная версия, 2.2 строительство объектов сбора.


Я использую ArrayUtils из apache для этого. сначала зарегистрируйте класс ArrayUtils как bean, чтобы получить к нему доступ из EL.

<managed-bean>
    <managed-bean-name>arrayUtils</managed-bean-name>
    <managed-bean-class>org.apache.commons.lang3.ArrayUtils</managed-bean-class>
    <managed-bean-scope>application</managed-bean-scope>
</managed-bean>

тогда вы можете вызвать методы ArrayUtils:

#{myBean.aMethod(arrayUtils.add(ArrayUtils.EMPTY_INT_ARRAY, 1))}

приведенный выше код не будет работать, если вы не можете получить доступ к константе EMPTY_INT_ARRAY. Для этого я использовал компонент primefaces p: importConstants, не уверен, что это можно сделать в обычном JSF.

вот как я его использую:

<p:importConstants type="org.apache.commons.lang3.ArrayUtils" var="ArrayUtils" />