使用Comet為了實(shí)現(xiàn)java后臺(tái)給前臺(tái)頁(yè)面推送消息通知
準(zhǔn)備
web項(xiàng)目中引入comet4j.js文件和comet4j-tomcat7.jar包
web.xml
修改web.xml,添加以下comet配置
<listener>
<listener-class>org.comet4j.core.CometAppListener</listener-class>
</listener>
<listener>
<description>HelloWorld</description>
<listener-class>com.aerors.listener.TestComet</listener-class>
</listener>
<servlet>
<display-name>CometServlet</display-name>
<servlet-name>CometServlet</servlet-name>
<servlet-class>org.comet4j.core.CometServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CometServlet</servlet-name>
<url-pattern>/conn</url-pattern>
</servlet-mapping>
com.aerors.listener.TestComet改為實(shí)際java類位置
com.aerors.listener.TestComet
package com.aerors.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.comet4j.core.CometContext;
import org.comet4j.core.CometEngine;
public class TestComet implements ServletContextListener {
private static final String CHANNEL = "test";
private static int number1 = 0 ;
public void contextInitialized(ServletContextEvent arg0) {
CometContext cc = CometContext.getInstance();
cc.registChannel(CHANNEL);// 注冊(cè)應(yīng)用的channel
Thread helloAppModule = new Thread(new HelloAppModule(),
"Sender App Module");
// 是否啟動(dòng)
helloAppModule.setDaemon(true);
// 啟動(dòng)線程
helloAppModule.start();
}
class HelloAppModule implements Runnable {
public void run() {
while (true) {
try {
// 睡眠時(shí)間
Thread.sleep(2000);
} catch (Exception ex) {
ex.printStackTrace();
}
CometEngine engine = CometContext.getInstance().getEngine();
// 獲取消息內(nèi)容
long l = getFreeMemory();
// 開始發(fā)送
engine.sendToAll(CHANNEL, number1++);
}
}
}
}
前臺(tái)頁(yè)面JSP頁(yè)面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Comet4J Hello World</title>
<script type="text/javascript" src="js/libs/jquery/jquery.min.js"></script>
<script type="text/javascript" src="js/libs/comet4j/comet4j.js"></script>
<script type="text/javascript">
function init(){
var kbDom = document.getElementById('kb');
JS.Engine.on({
test : function(aa){//偵聽一個(gè)channel
kbDom.innerHTML = aa;
console.log(aa);
}
});
JS.Engine.start('conn');
JS.Engine.on(
'test',function(cId,channelList,engine){
console.dir('連接已建立,連接ID為:' + cId);
});
}
function test(){
var kbDom = document.getElementById('kb');
JS.Engine.start('conn');
JS.Engine.on({
test : function(aa){//偵聽一個(gè)channel
kbDom.innerHTML = aa;
console.log(aa);
}
});
}
</script>
</head>
<body onload="init();">
<span id="kb">...</span> <br/>
<button onclick="test();">click</button>
</body>
</html>
兩種方式加載都可以
注意:前臺(tái)為動(dòng)態(tài)JSP頁(yè)面,不能是靜態(tài)html頁(yè)面

image.png
可以看出請(qǐng)求一直保持,頁(yè)面上數(shù)字也一直在刷新
