Следующий код Java позволяет получить доступ к любому объекту или переменной из контекста лиц:
ELContext elCtx = facesContext.getELContext();
ExpressionFactory exprFac = facesContext.getApplication().getExpressionFactory();
MyProperty myProperty = (MyProperty) exprFac.createValueExpression(elCtx, "#{somebean.someattr.someproperty}", MyProperty.class).getValue(elCtx);
Я использую код из своего пользовательского конвертера для чтения дополнительных параметров конвертации из контекста.
Код работает правильно, если #{somebean}
определен как обычный компонент поддержки в контексте JSF.
Facelets позволяют создавать «ярлыки» для выражений JSF. Пример:
<ui:param name="shortcut" value="#{somebean.someattr.someproperty}" />
<div>#{somebean.someattr.someproperty} equals #{shortcut}</div>
В этом случае оба значения #{somebean.someattr.someproperty}
и #{shortcut}
имеют одинаковое значение.
Однако эти «горячие» имена недоступны с помощью кода Java выше. Например:
MyProperty myProperty1 = (MyProperty) exprFac.createValueExpression(elCtx, "#{somebean.someattr.someproperty}", MyProperty.class).getValue(elCtx);
// myProperty1 has expected value
MyProperty myProperty2 = (MyProperty) exprFac.createValueExpression(elCtx, "#{shortcut}", MyProperty.class).getValue(elCtx);
// myProperty2 is null
Есть ли способ получить доступ к контексту Facelets и прочитать значения параметров 'ярлыка', определенные на текущей странице JSF?