我想在on*
属性中调用托管bean操作方法。在我的特定情况下,如果用户空闲3分钟,我需要注销用户,如下所示:
<p:idleMonitor onidle="#{mybean.processTimeOut()}" timeout="180000" />
但是,在页面加载时会立即调用托管bean操作方法。这是怎么造成的,我该如何解决?
答案 0 :(得分:3)
与所有JSF组件the onidle
attribute must represent a JavaScript callback上的所有其他on*
属性一样,而不是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?