Я не уверен в "правильном" способе работы с выражениями методов в составных компонентах.
В моем композите используется класс поддержки с методами действий.Тезисы выполняют некоторые действия по умолчанию или делегируют методу действия, переданному составным пользователем в качестве атрибута:
При использовании страницы:
<my:component action="#{myBean.actionMethod}" />
Составной:
<cc:interface componentType="mycomponentType">
<cc:attribute name="action" method-signature="java.lang.String action()" required="false" />
</cc:interface>
<cc:implementation>
<h:commandButton value="submit" action="#{cc.componentAction}" />
</cc:implementation>
Класс поддержки:
@FacesComponent("mycomponentType")
public class UIMyComponent extends UINamingContainer {
public String action() {
String outcome = "";
ValueExpression ve = getValueExpression("action");
String expression = ve.getExpressionString();
FacesContext facesContext = FacesContext.getCurrentInstance();
Application application = facesContext.getApplication();
ELContext elContext = facesContext.getELContext();
ExpressionFactory expressionFactory = application .getExpressionFactory();
MethodExpression methodExpression = expressionFactory.createMethodExpression(elContext, expression, String.class, new Class[0]);
outcome = (String) methodExpression.invoke(elContext, new Object[0]);
if (outcome.equals("whatever")) {
// set another outcome
}
return outcome;
}
}
Приведенный выше код работает, как и ожидалось, но я считаю его довольно громоздким, и он создает выражение ValueExpression для извлечения выражения метода из объявленного атрибута "action".
UIComponentBase предлагает getValueExpression("attributeName")
, но нет ничего похожего на MethodExpressions.
Поэтому мой вопрос заключается в том, есть ли лучший способ оценить MethodExpressions
, объявленный как атрибуты в составных компонентах, чем приведенный выше код.
Thx