EL条件方法表达式

gue*_*lla 3 jsf facelets el conditional-operator methodexpression

我想在EL中声明一个条件方法表达式,如下所示:

<p:dataTable id="#{cc.attrs.datatableId}" var="overview" 
    rowSelectListener="#{cc.attrs.detailsMode == 'single' ? cc.attrs.bean.onRowSelect : cc.attrs.bean.onRowUrlSelect}">
Run Code Online (Sandbox Code Playgroud)

但是,它抛出一个EL异常:

javax.el.E​​LException:不是有效的方法表达式:#{cc.attrs.detailsMode =='single'?cc.attrs.bean.onRowSelect:cc.attrs.bean.onRowUrlSelect}

我如何声明条件EL方法表达式?

Bal*_*usC 6

不幸的是,方法表达式不接受值表达式.最好的办法是拥有一个方法入口点,然后根据detailsMode您传递/设置给bean的方法进一步委托所需的操作方法.

例如

<h:dataTable ... rowSelectListener="#{cc.attrs.bean.onRowSelect}">
Run Code Online (Sandbox Code Playgroud)
 public void onRowSelect(SelectEvent event) {  
     if ("single".equals(detailsMode)) {
         onRowSingleSelect(event);
     } else {
         onRowUrlSelect(event);
     }
 }
Run Code Online (Sandbox Code Playgroud)

鉴于您实际上正在使用复合组件,您可以根据需要将其隐藏在支持组件中以减少辅助bean中的样板:

<cc:interface componentType="yourComponent">
...
<h:dataTable ... rowSelectListener="#{cc.onRowSelect}">
Run Code Online (Sandbox Code Playgroud)
@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 });
     }

}
Run Code Online (Sandbox Code Playgroud)