gpt4 book ai didi

jsf - 在 h :inputText value and h:commandButton actionListener 中使用条件运算符

转载 作者:行者123 更新时间:2023-12-04 14:01:44 25 4
gpt4 key购买 nike

我想在 .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}" />

当 http 获取请求参数等于“TERMINAL”时,我想加载“terminalsList”托管 bean,否则加载“merchantsList”托管 bean。

此代码不起作用。

最佳答案

您不能使用条件运算符 ?:在值(value)和行动表达。值表达式会抛出 PropertyNotWritableException在表单提交上,因为 EL 语法不代表可写操作,而是只读操作。 Action 表达式已经抛出 ELException: not a valid method expression在页面加载时,因为 EL 语法不表示方法表达式而是值表达式。

您需要以不同的方式解决它,然后以这样的方式摆脱条件运算符 ?:在值(value)和行动表达完全。这可以通过多种方式实现:

  • 使用抽象基类和标记文件。目前,不幸的是,您的支持 bean 方法名称没有以它们在两个类上完全相同的方式对齐。你只有 globalFilter属性对齐,但 Action 监听器方法未对齐。我建议将它们重命名为 filter()resetFilter() .然后你可以从这些 bean 类中提取一个抽象基类并在 custom tag file 上使用它。如下:

    <my:filter beanName="#{param.from eq 'TERMINAL' ? 'terminalsList' : 'merchantsList'}" />

    其实现如下(假设这些 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}" />

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

  • 使用 JSTL 有条件地构建 View 。这真的很笨拙(不是 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>
  • 关于jsf - 在 h :inputText value and h:commandButton actionListener 中使用条件运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18609493/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com