在h:inputText值和h:commandButton actionListener中使用条件运算符

zur*_*uri 6 jsf el conditional-operator

我想在.xhtml文件中加载两个差异面板.

<h:inputText value="#{param['from']=='TERMINAL' ? terminalsList.globalFilter : merchantsList.globalFilter}" size="50" />
<h:commandButton value="Filter" actionListener="#{param['from']=='TERMINAL' ? terminalsList.filterTerminals : merchantsList.filterMerchants}" />
<h:commandButton value="Reset" actionListener="#{param['from']=='TERMINAL' ? terminalsList.resetTerminalsFilter : merchantsList.resetMerchantsFilter}" />
Run Code Online (Sandbox Code Playgroud)

当http get request params equals'TERMINAL'我想加载'terminalsList'托管bean,否则'merchantsList'托管bean.

这段代码不起作用.

Bal*_*usC 10

您不能?:在值和操作表达式中使用条件运算符.值表达式将抛出PropertyNotWritableException表单提交,因为EL语法不表示可写操作,而是一个只读操作.动作表达式已经抛出ELException: not a valid method expression页面加载,因为EL语法不表示方法表达式而是表示值表达式.

你需要以不同的方式解决它,然后以这种方式完全摆脱?:值和动作表达式中的条件运算符.这可以通过以下几种方式实现:

  1. 使用抽象基类和标记文件.目前,您的支持bean方法名称很可能没有以两种类中完全相同的方式对齐.您只有globalFilter属性对齐,但动作侦听器方法不对齐.我建议将它们重命名为filter()resetFilter().然后,您可以从这些bean类中提取抽象基类,并将其用于自定义标记文件,如下所示:

    <my:filter beanName="#{param.from eq 'TERMINAL' ? 'terminalsList' : 'merchantsList'}" />
    
    Run Code Online (Sandbox Code Playgroud)

    实现如下(假设那些bean是请求作用域):

    <h:inputText value="#{requestScope[beanName].globalFilter}" size="50" />
    <h:commandButton value="Filter" actionListener="#{requestScope[beanName].filter}" />
    <h:commandButton value="Reset" actionListener="#{requestScope[beanName].resetFilter}" />
    
    Run Code Online (Sandbox Code Playgroud)

    (如果你的bean在不同的范围内,只需相应地改变#{requestScope},例如#{viewScope})


  2. 使用JSTL有条件地构建视图.这真的很笨拙(不是DRY),但对于初学者来说可能更容易,而且如果你因某些不明原因无法改变方法签名,那么实际上这是唯一的方法.

    <c:choose>
        <c:when test="#{param.from eq 'TERMINAL'}">
            <h:inputText value="#{terminalsList.globalFilter}" size="50" />
            <h:commandButton value="Filter" actionListener="#{terminalsList.filterTerminals}" />
            <h:commandButton value="Reset" actionListener="#{terminalsList.resetTerminalsFilter}" />
        </c:when>
        <c:otherwise>
            <h:inputText value="#{merchantsList.globalFilter}" size="50" />
            <h:commandButton value="Filter" actionListener="#{merchantsList.filterMerchants}" />
            <h:commandButton value="Reset" actionListener="#{merchantsList.resetMerchantsFilter}" />
        </c:otherwise>
    </c:choose>
    
    Run Code Online (Sandbox Code Playgroud)