Передача переменных аргументов в пользовательскую функцию 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 варианта:

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

    #{my:format1(...)}
    #{my:format2(...)}
    #{my:format3(...)}
    ...
    
  2. простираться <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,

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

Другие вопросы по тегам