Передача переменных аргументов в пользовательскую функцию EL возможна?
Я хотел поддержки вызова пользовательских функций с параметрами в JSF-1.2 и наткнулся на этот документ http://docs.oracle.com/javaee/5/tutorial/doc/bnahq.html.
Но возможно ли использовать переменные аргументы для этой функции?
Я пытался с помощью массивов в Tag Library
но похоже, что JSF не распознает функцию в этом случае.
2 ответа
Нет, выражения метода EL не поддерживают переменные. Не в текущей версии EL 2.2, а также в будущей версии EL 3.0.
Вам нужно искать альтернативный подход. Поскольку конкретное функциональное требование неясно, я не могу рекомендовать никого.
Обновление: функциональное требование, таким образом:
Я должен использовать параметризованные сообщения из комплекта сообщений в JavaScript, задействованном на моей странице. Что-то вроде сообщения об ошибке или предупреждении при попытке удалить файл с параметризованным именем файла в пакете сообщений.
Ну, нет никаких умных обходных путей, чтобы обойти это. У вас есть 2 варианта:
Создайте группу EL-функций, принимающих различное количество аргументов.
#{my:format1(...)} #{my:format2(...)} #{my:format3(...)} ...
простираться
<h:outputFormat>
сохранить результат в переменной области запроса вместо ее печати.<my:outputFormat ... var="foo"> <f:param ... /> <f:param ... /> <f:param ... /> ... </my:outputFormat> ... #{foo}
В служебной библиотеке JSF OmniFaces для JSF2 есть оба решения: <o:outputFormat>
компонент и несколько of:formatX()
функции Он не может использоваться в JSF 1.x, но он с открытым исходным кодом и должен дать некоторое представление.
Вы можете передать список или массив пользовательской функции.
Предупреждение: этот код не проверен и может заставить вас чувствовать себя грязным - это полный взлом.
Нам нужны два артефакта, зарегистрированных как управляемые бины.
1) извращенный Map
тип:
/** Important: must be none-scoped */
public class ArrayBuilder extends AbstractMap<Object, Object> {
private List<Object> list = new ArrayList<Object>();
@Override public Object get(Object entry) {
if(entry instanceof MakeArray) {
return list.toArray();
} else {
list.add(entry);
return this;
}
}
@Override public Set<Entry<Object, Object>> entrySet() {
return Collections.emptySet();
}
}
Ядовитая таблетка для запуска создания массива:
/** should be application scoped bean */
public final class MakeArray {
}
EL выражение:
#{fn:foo(arrayBuilder['one']['two']['three'][makeArray])}
Цель кода - передать Object
массив, содержащий три строки для функции foo
,
Я понятия не имею, работает ли это на самом деле.