Javascript 是否忽略jsf.ajax.request的onevent选项?
我正在尝试使用JavaEE7创建一个交互式聊天web应用程序,特别是使用JSF2.2和ajax 其思想是,总是有一个缓慢的挂起异步ajax请求等待 在服务器上为每个单独的客户端。一旦新消息到达服务器, 返回所有等待的请求,以便在所有客户端中呈现消息。 请求完成后,客户端将发送新的等待请求。 如果在30秒内没有消息到达,则返回请求,以便生成新消息 可以在旧的一个超时之前提交 我可以这样做: index.xhtml:Javascript 是否忽略jsf.ajax.request的onevent选项?,javascript,ajax,jsf,Javascript,Ajax,Jsf,我正在尝试使用JavaEE7创建一个交互式聊天web应用程序,特别是使用JSF2.2和ajax 其思想是,总是有一个缓慢的挂起异步ajax请求等待 在服务器上为每个单独的客户端。一旦新消息到达服务器, 返回所有等待的请求,以便在所有客户端中呈现消息。 请求完成后,客户端将发送新的等待请求。 如果在30秒内没有消息到达,则返回请求,以便生成新消息 可以在旧的一个超时之前提交 我可以这样做: index.xhtml: <?xml version='1.0' encoding='UTF-8' ?
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>async jsf app</title>
<h:outputScript library="js" name="resendscript.js" />
</h:head>
<h:body>
async jsf app
<h:form id="jsfappform">
say something:
<h:inputText id="newmsg" value="#{jsfAsync.newMessage}" />
<h:commandButton id="sendbut" value="say" action="#{jsfAsync.say}" />
<br /><br />
Messages:
<br /><br />
<h:outputText id="msgs" value="#{jsfAsync.msgs}" escape="false">
<h:outputScript>resendRequest()</h:outputScript>
</h:outputText>
<h:commandButton id="reloadbut" value="" action="#{jsfAsync.resend}" style="visibility: hidden">
<f:ajax execute="@this" render="msgs" onevent="handleAjax" onerror="handleError" />
</h:commandButton>
<h:commandButton id="clearbut" value="clear" action="#{jsfAsync.clear}" />
<h:outputScript>resendRequest()</h:outputScript>
</h:form>
</h:body>
</html>
支持bean JsfAsync.java:
package jsfasync;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ApplicationScoped;
@ManagedBean
@ApplicationScoped
public class JsfAsync
{
private final List<String> messages;
private final Object wakeup;
public JsfAsync()
{
wakeup = new Object();
messages = new ArrayList<String>();
}
public void setNewMessage(String msg)
{
synchronized(messages) { messages.add(msg); }
}
public void say()
{
synchronized(wakeup) { wakeup.notifyAll(); }
}
public void resend()
{
try {
synchronized(wakeup) { wakeup.wait(30000); }
} catch (Exception e) { }
}
public void clear()
{
synchronized(messages) { messages.clear(); }
say();
}
public String getNewMessage() { return ""; }
public String getMsgs()
{
StringBuilder msgs = new StringBuilder();
synchronized(messages)
{
for (String m : messages)
{
msgs.append(m);
msgs.append("<br />");
}
return msgs.toString();
}
}
}
不幸的是,我不能这样做。调用可以执行ajax请求,但似乎忽略了onevent选项,并且在该请求完成时未调用事件处理程序。您是否有任何关于如何使其以这种方式工作的提示?有关提示,请查看
的生成HTML源代码。您将看到JSF将其生成为'onevent':handleAjax
。实际上,作为函数引用而不是字符串
相应地进行修正:
jsf.ajax.request('jsfappform:reloadbut', null,
{'javax.faces.behavior.event': 'action',
'execute': 'jsfappform:reloadbut',
'render': 'jsfappform:msgs',
'onevent': handleAjax,
'onerror': handleError});
jsf.ajax.request('jsfappform:reloadbut', null,
{'javax.faces.behavior.event': 'action',
'execute': 'jsfappform:reloadbut',
'render': 'jsfappform:msgs',
'onevent': 'handleAjax',
'onerror': 'handleError'});
jsf.ajax.request('jsfappform:reloadbut', null,
{'javax.faces.behavior.event': 'action',
'execute': 'jsfappform:reloadbut',
'render': 'jsfappform:msgs',
'onevent': handleAjax,
'onerror': handleError});