为什么会有这篇文章呢??
由于最近需要用到服务器推送技术,了解了一下这方面的知识,查找了好多例子,综合考虑使用Comet4j,不过目前这款插件只支持tomcat(按照tomcat的版本需要下载对应的jar包)。
准备工作
1.下载自己对应的版本的jar tomcat6 -----comet4j-tomcat6.jar tomcat7------comet4j-tomcat7.jar
2.下载comet4j.js
3、由于comet4j基于NIO实现,所以需要修改tomcat的server.xml中的配置见下图
将原先的HTTP/1.1改为org.apache.coyote.http11.Http11NioProtocol以支持NIO,这样第一步的准备工作就完成了。
下面 我们准备客户端代码
<html>
<head>
<title>论坛</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript" src="${ctx }/yogurtResource/assembly/comet/comet4j.js"></script>
<script type="text/javascript">
$(document).ready(function(){
init();
});
function init(){
var forum_list = $("#forum_list");
JS.Engine.start('../comet');
JS.Engine.on(
'hello',function(text){
forum_list.html(text);
var html = "<span id='forum_list8'></span>"
$("#list").html(html);
$("#forum_list8").html("我是测是者a");
});
JS.Engine.on('start',function(cId, channelList, engine){
$("#forum_list3").html(cId);
});
}
function addForum(){
$.ajax({
url:'${ctx }/forum/add_forum',
data:{'hello':'hello'},
type:"post",
dataType:"json",
success:function(data){
// alert("异步成功");
},error:function(){
alert("错误!!");
}
});
}
</script>
</head>
<body>
这是论坛页面<br><br><br><br><br><br>
<div>
<form id="addForum" action="">
<input type="text" name="channel" value="hello"/></form>
<button id="forum" οnclick="addForum();">模拟论坛提交</button>
</div>
<div id="list">
<span id="forum_list"></span><br>
<span id="forum_list2"></span>
<span id="forum_list3"></span>
</div>
</body>
</html>
下面我们准备服务端代码
@Controller("forumController")
@RequestMapping("/forum")
public class ForumController extends BaseController{
@RequestMapping(value = "/forum_list")
public ModelAndView forumList(){
return new ModelAndView("forum/forum_list");
}
@RequestMapping(value="/add_forum")
@ResponseBody
public Object addForum(){
String abc="我是向前台推送的消息";
User user=new User();
user.setUsername("伟大的天朝");
// 创建CometEngine实体类
CometEngine engine = CometContext.getInstance().getEngine();
engine.sendToAll("hello", user.getUsername());
return user;
}
}
还需要一个监听来创建信道
public class ChannelComet implements ServletContextListener{
private static final String CHANNEL = "hello";
public void contextInitialized(ServletContextEvent arg0) {
// CometContext是一个单例静态
System.out.println("-----------------------------------------------------------------------------------------");
CometContext cc = CometContext.getInstance();
cc.registChannel(CHANNEL);// 注册应用的channel
System.out.println("注册信道成功");
}
public void contextDestroyed(ServletContextEvent arg0) {
}
}
最后来完成我们的配置工作
<!-- comet4j -->
<listener>
<description>Comet4J容器侦听</description>
<listener-class>org.comet4j.core.CometAppListener</listener-class>
</listener>
<servlet>
<description>Comet连接[默认:org.comet4j.core.CometServlet]</description>
<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>/comet</url-pattern>
</servlet-mapping>
<listener>
<description>ChannelComet</description>
<listener-class>ChannelComet</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
注意:
1、此处不再赘述API中的各个类的具体作用及功能,请自己网络查找(天朝的网络上我是找不到API,就不附赠 了)其他的jar包,js已上传comet4j请下载
2、这里面的配置是有顺序要求的,真正的项目中肯定不只是这么几个配置项,配置顺序不对会导致无法响应后台推送到前台的消息
3、监听要换成咱么自己的监听类
4、CometServlet的url-pattern配置和前台的start项中的要一致
更多编程内容,请扫码关注《coder练习生》,如果觉得有用,也可赠送作者一杯咖啡