【问题标题】:Using conditional operator in h:inputText value and h:commandButton actionListener在 h:inputText 值和 h:commandButton actionListener 中使用条件运算符
【发布时间】:2013-09-07 16:53:42
【问题描述】:

我想在 .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 get request params 等于 'TERMINAL' 我想加载 'terminalsList' 托管 bean,否则 'merchantsList' 托管 bean。

此代码不起作用。

【问题讨论】:

  • 哪个代码不工作?请向我们展示所有相关代码。这包括 xhtml 和相关的支持 bean。另外,描述什么不起作用。堆栈跟踪?还是一些意想不到的行为?
  • 这是 xhtml 代码,格式化无法正常工作
  • 贴一些示例代码,帮助我们解决问题
  • 您是要在 dataTable 或任何其他组件中加载列表

标签: jsf el conditional-operator


【解决方案1】:

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

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

  1. 使用抽象基类和标记文件。目前,不幸的是,您的支持 bean 方法名称没有以它们在两个类上完全相同的方式对齐。您只有 globalFilter 属性对齐,但动作侦听器方法没有。我建议将它们重命名为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}


  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>
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 2010-11-21
    • 2020-11-22
    相关资源
    最近更新 更多