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