2013-04-25 2 views
2

Есть ли способ программно, в Java-коде, зарегистрировать специальную ссылку taglib?
Я использую JSF 1.2_09, богатые лица 3.3.3, jsf-facelets 1.1.14.Программно зарегистрировать ссылку taglib

В частности:

В этом коде JSF язык выражений используется, чтобы сделать какую-то работу для нас, как конкатенация 2 результатов в одной области или аналогичного материала ..

FacesContext ctx = FacesContext.getCurrentInstance(); 
Application app = ctx.getApplication(); 
ExpressionFactory ef = app.getExpressionFactory(); 
ELContext elContext = ctx.getELContext(); 
ValueExpression valueExpression = new OverrideValueExpression(singleResult.getClass(), singleResult); 
elContext.getVariableMapper().setVariable("row", valueExpression); 

for (int i = 0; i < jsfDisplayValue.size(); i++){ 
    Object value = ef.createValueExpression(elContext, jsfDisplayValue.get(i), Object.class).getValue(ctx.getELContext()); 
//Do something with value... 
} 

Например, элементы jsfDisplayValue может быть:
"# {row.name} # {row.surname}", "# {row.age}", "#{tagfoo:fooFunction(row.age)}" ...
проблема возникает, когда выражение содержит функцию, как выделенный, tagfoo:fooFunction.

Стек след:

javax.el.ELException: Function 'tagfoo:fooFunction' not found 
    at org.apache.el.lang.ExpressionBuilder.visit(ExpressionBuilder.java:198) 
    at org.apache.el.parser.SimpleNode.accept(SimpleNode.java:147) 
    at org.apache.el.lang.ExpressionBuilder.prepare(ExpressionBuilder.java:155) 
    at org.apache.el.lang.ExpressionBuilder.build(ExpressionBuilder.java:173) 
    at org.apache.el.lang.ExpressionBuilder.createValueExpression(ExpressionBuilder.java:217) 
    at org.apache.el.ExpressionFactoryImpl.createValueExpression(ExpressionFactoryImpl.java:67) 

ELContext не распознает пользовательскую функцию, и она не может решить эту функцию, так как неизвестна ELContext. Как я могу зарегистрировать ссылку taglib в классе java, поэтому ELContext может распознавать пользовательские функции?

На странице JSF, я хотел бы сделать это:

<jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page" 
xmlns:tagfoo="http://tagfoo.org/tags"> 

P.S.
Мои пользовательские функции работают правильно на страницах jsf.

ответ

2

Прошу прощения, я немного опоздал, но сегодня я наткнулся на ту же проблему.

Проверяя экземпляры ElContext и FunctionMapper, я видел, что они определенно являются пользовательскими реализациями стандартного абстрактного класса.

Как я хочу, чтобы мой код был переносимым, я решил не участвовать в написании кода для конкретной реализации, а поскольку абстрактный класс определяет только контракт на чтение и опускает сторону записи, я просто написал обычай FunctionMapper. Вот код значимый:

public void register(String prefix, String function, Method method) { 
    register.put(prefix + ":" + function, method); 
} 

@Override 
public Method resolveFunction(String prefix, String localName) { 
    if (register.containsKey(prefix + ":" + localName)) { 
     return register.get(prefix + ":" + localName); 
    } 
    for (FunctionMapper it : delegates) { 
     final Method current = it.resolveFunction(prefix, localName); 
     if (current != null) { 
      return current; 
     } 
    } 
    return null; 
} 

обертывания стандартного FunctionMapper, я могу легко добавить свои собственные функции и сохранить стандартную среду нормально. В моем случае мне пришлось написать обычную реализацию ElContext, которая в основном клонирует ElContext по умолчанию и просто обертывает FunctionMapper.

Я доволен результатами, надеюсь, что это поможет.

+0

Спасибо за ответ. Я сам понял, что мне нужно переопределить метод resolveFunction. Разве вы не думаете, что лучшее решение будет заключаться в том, что ваш код автоматически находит все теги и использует их для решения этой функции? –

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