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

Jsf 在h:inputText值和h:commandButton actionListener中使用条件运算符,jsf,el,conditional-operator,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.filterT

我想在.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请求参数等于'TERMINAL'时,我想加载'terminalsList'托管bean,否则加载'merchantsList'托管bean


此代码不起作用。

不能在值和操作表达式中使用条件运算符
?:
。值表达式将在表单提交时抛出一个
PropertyNotWritableException
,因为EL语法并不表示可写操作,而是只读操作。操作表达式在页面加载时已抛出
ELException:不是有效的方法表达式
,因为EL语法不表示方法表达式,而是表示值表达式

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

  • 使用抽象基类和标记文件。目前,遗憾的是,您的backingbean方法名称没有以这样的方式对齐,即它们在两个类上完全相同。您只对齐了
    globalFilter
    属性,但没有对齐操作侦听器方法。我建议将它们重命名为
    filter()
    resetFilter()
    。然后,您可以从这些bean类中提取一个抽象基类,并将其用于以下类似的应用程序:

    
    
    实现如下(假设这些bean是请求范围的):

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


  • 使用JSTL有条件地构建视图。这真的很笨拙(不是),但对于初学者来说可能更容易,而且实际上是因为某些不清楚的原因而无法更改方法签名的唯一方法

    
    

  • 哪个代码不起作用?请给我们看所有相关代码。这包括xhtml和relevand支持bean。此外,请描述哪些不起作用。Stacktrace?还是一些意想不到的行为?这是xhtml代码,格式化不起作用,所以请提供一些示例代码,它将帮助我们解决问题。您是否尝试在dataTable或任何其他组件中加载列表