【问题标题】:Why EL in a script getting executed always on when the page is renderred为什么脚本中的 EL 总是在页面呈现时执行
【发布时间】:2014-06-05 09:10:49
【问题描述】:

我在 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>

【问题讨论】:

  • 已评估或未评估?请同时发布您的 bean 代码。
  • 每次页面加载时都会调用 bean.method()
  • 因为每次解析页面时都会评估 EL。否则,您可以(假设您的支持 bean 不是 request 作用域)在 bean.method() 中创建一个标志以检查该方法是否至少被调用一次,并创建一个变量来保存该方法的返回值。

标签: javascript jsf jsf-2 primefaces


【解决方案1】:

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>

【讨论】:

    猜你喜欢
    • 2017-01-09
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2018-02-05
    • 2019-05-21
    • 2013-02-16
    • 1970-01-01
    相关资源
    最近更新 更多