不幸的是,方法表达式不接受值表达式。您最好的选择是拥有一个单一的方法入口点,该入口点又进一步委托给所需的操作方法,基于detailsMode
您还传递/设置给 bean 的方法。
例如
<h:dataTable ... rowSelectListener="#{cc.attrs.bean.onRowSelect}">
public void onRowSelect(SelectEvent event) {
if ("single".equals(detailsMode)) {
onRowSingleSelect(event);
} else {
onRowUrlSelect(event);
}
}
鉴于您实际上使用的是复合组件,如有必要,您可以将其隐藏在支持组件中以减少支持 bean 中的样板:
<cc:interface componentType="yourComponent">
...
<h:dataTable ... rowSelectListener="#{cc.onRowSelect}">
@FacesComponent("yourComponent")
public class YourComponent extends UINamingContainer {
public void onRowSelect(SelectEvent event) {
String methodName = "single".equals(detailsMode) ? "onRowSingleSelect" : "onRowUrlSelect";
MethodExpression method = (MethodExpression) getAttributes().get(methodName);
method.invoke(getFacesContext().getELContext(), new Object[] { event });
}
}