如何在 JSF 组件的 on* 属性中调用托管 bean 操作方法

How to invoke a managed bean action method in on* attribute of a JSF component

我想在 on* 属性中调用托管 bean 操作方法。在我的特殊情况下,如果用户空闲 3 分钟,我需要注销用户,如下所示:

<p:idleMonitor onidle="#{mybean.processTimeOut()}" timeout="180000" /> 

但是,托管 bean 操作方法会在页面加载时立即调用。这是怎么造成的,我该如何解决?

与所有 JSF 组件上的所有其他 on* 属性一样,the onidle attribute must represent a JavaScript callback 不是 JSF 支持 bean 操作方法。 on* 属性中的任何 EL 表达式将在生成 HTML 输出期间立即被评估为 String 值表达式,期望它们打印(部分)JavaScript 代码。

就像您在做 <h:outputText value="#{mybean.processTimeout()}"> 一样。如果您删除了括号 (),您将面临一个 PropertyNotFoundException,它本身也暗示它被评估为值表达式而不是方法表达式。

为了使用 JavaScript 调用 JSF 支持 bean 方法,您需要额外的 <p:remoteCommand>.

<p:idleMonitor onidle="processTimeout()" timeout="180000" /> 
<p:remoteCommand name="processTimeout" action="#{mybean.processTimeOut}" />

如果您不在使用 PrimeFaces,请转到此相关答案中发布的备选方案:How to invoke a JSF managed bean on a HTML DOM event using native JavaScript?