4

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

<p:dataTable id="#{cc.attrs.datatableId}" var="overview" 
    rowSelectListener="#{cc.attrs.detailsMode == 'single' ? cc.attrs.bean.onRowSelect : cc.attrs.bean.onRowUrlSelect}">

但是,它会引发 EL 异常:

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

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

4

2 回答 2

6

不幸的是,方法表达式不接受值表达式。您最好的选择是拥有一个单一的方法入口点,该入口点又进一步委托给所需的操作方法,基于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 });
     }

}
于 2011-03-25T14:43:28.183 回答
0

你可以试试

<p:dataTable id="#{cc.attrs.datatableId}" var="overview" 
    rowSelectListener="#{cc.attrs.bean[cc.attrs.detailsMode == 'single' ? 'onRowSelect' : 'onRowUrlSelect']}">

如需进一步参考,您可以参考https://docs.oracle.com/javaee/6/tutorial/doc/bnahu.html#bnahz

于 2018-09-26T16:02:36.927 回答