为什么脚本中的EL总是在页面呈现时执行



我在xhtml页面中有一个脚本元素,在这个脚本中,我尝试使用EL调用bean上的方法。我不明白为什么这个EL在页面渲染上被评估。我使用的是primeface 3.5和JSF 2.x。下面是代码

<h:form>
   <p:socket channel="/channel" onMessage="handleMessage"></p:socket>
</h:form>
<script>
  function handleMessage(data){
    var update=data.update;
    if(update){
      #{bean.method()};
    }
  }
</script>

EL表达式在每个 JSF请求的不同阶段进行评估,例如INVOKE_APPLICATION中的操作方法调用,RENDER_RESPONSE阶段中的呈现属性,PROCESS_VALIDATION中的验证器。结果保存在jsf视图中。

您的代码实际上所做的是在JSF生命周期中调用bean.method(),并在输出HTML文件中输出您的方法的返回值。Javascript不会在服务器端处理JSF时执行,只会在客户端执行,所以if条件不会阻止服务器端处理。

你可能想做的是只在javascript从客户端执行时调用bean方法。

您可以使用primefaces p:remoteCommand组件来完成此操作。它将javascript函数作为java bean方法的包装器公开。

<h:form>
   <p:socket channel="/channel" onMessage="handleMessage"></p:socket>
   <p:remoteCommand name="methodWrapper" actionListener="#{bean.method()}" />
</h:form>
<script>
   function handleMessage(data){
   var update=data.update;
   if(update){
      methodWrapper();
   }
}
</script>

相关内容

  • 没有找到相关文章

最新更新