2013-03-19 4 views
1

Мне нужна поддержка специального вызова функции с параметрами в JSF-1.2 и наткнулась на этот документ http://docs.oracle.com/javaee/5/tutorial/doc/bnahq.html#bnaio.Возможно передать переменные аргументы пользовательской функции EL?

Но можно ли использовать переменные аргументы для этой функции?

Я попытался использовать массивы в Tag Library, но, похоже, JSF не распознает функцию в этом случае.

ответ

4

Нет, выражения метода EL не поддерживают varargs. Не в текущем EL 2.2 version, также не в будущем EL 3.0 version.

Вам нужно искать альтернативный подход. Поскольку конкретное функциональное требование неясно, я не могу рекомендовать его.


Update: функциональное требование таким образом:

Я должен использовать параметризованные сообщения от Message Bundle в JavaScript, участвующих в моей странице. Что-то вроде сообщения об ошибке или предупреждении при попытке удалить файл с именем файла, параметризованным в комплекте сообщений.

У нас нет умных обходных путей, чтобы обойти это. У вас есть 2 варианта:

  1. Создайте кучу функций EL, используя различное количество аргументов.

    #{my:format1(...)} 
    #{my:format2(...)} 
    #{my:format3(...)} 
    ... 
    
  2. Продлить <h:outputFormat> для хранения результата в запросе области видимости, вместо его печати.

    <my:outputFormat ... var="foo"> 
        <f:param ... /> 
        <f:param ... /> 
        <f:param ... /> 
        ... 
    </my:outputFormat> 
    
    ... 
    #{foo} 
    

OmniFaces JSF utility library для JSF2 имеет оба решения в аромате <o:outputFormat> component и несколько of:formatX() functions. Его нельзя использовать в JSF 1.x, но он имеет открытый исходный код и должен дать некоторое представление.

+0

Спасибо за такой быстрый ответ, @ Balusc !! Фактически, я должен использовать параметризованные сообщения из пакета сообщений в JavaScript, участвующих в моей странице. Сообщение об ошибке или предупреждении о попытке удалить файл с именем файла, параметризованным в комплекте сообщений. – BenhurCD

+0

См. Обновленный ответ. – BalusC

0

Вы можете передать список или массив в пользовательскую функцию.

Предупреждение: этот код не проверен и может заставить вас чувствовать себя грязным - это полный взлом.

Нам нужны два артефакта, зарегистрированных как управляемые бобы.

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

Выражение ЭЛ:

#{fn:foo(arrayBuilder['one']['two']['three'][makeArray])} 

Цель этого кода передать массив Object, содержащий три строки, к функции foo.

Я понятия не имею, действительно ли это работает.

Смежные вопросы