Как создать массив в 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" />