cometd Dojo jetty整合的一个小例子

需要jdk1.5以上,tomcat5.0以上,具体的安装不再说明。

下载jetty源码,将里面demo的软件包导入到所建的工程,将demo中web路径下org文件夹放在所建工程的webroot下。

将Dojo里面的三个文件夹dijit,dojo,dojox放在webroot路径下。

客户端有两个文件chattest.html,chattest.js。服务端有一个java类ChatTestService.java。

 

 

chattest.html

Html代码   收藏代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   
  2.   
  3. "http://www.w3.org/TR/html4/loose.dtd">    
  4. <html>    
  5. <head>    
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    
  7. <title>test chat</title>    
  8. <script type="text/javascript" src="../dojo/dojo.js"    
  9.   
  10. djConfig="parseOnLoad:true"></script>    
  11. <script type="text/javascript" src="t.js"></script>    
  12.   
  13.  </head>    
  14.  <body>    
  15.    
  16.     <div id="root">  
  17.       <div>  
  18.        <label>一个简单的聊天程序</label>  
  19.       </div>  
  20.       <div id="chat"></div>  
  21.        <div>  
  22.             Chat:  
  23.             &nbsp;  
  24.             <input id="message" type="text" />  
  25.             <button id="sendChat">Send</button>  
  26.         </div>  
  27.     </div>  
  28.  </body>    
  29.  </html>    

chattest.js

Js代码   收藏代码
  1. dojo.require("dojox.cometd");  
  2. dojo.require("dojox.cometd.timestamp");  
  3. dojo.require("dojox.cometd.ack");  
  4. dojo.require("dojox.cometd.reload");  
  5. var root = {  
  6.     _chatSubscription: null,  
  7. //初始化  
  8.     _init: function(){    
  9. //简历链接,握手  
  10.         dojox.cometd.init("http://localhost:8080/dojocometd/cometd");  
  11.         root._subscribe();  
  12.                 //点击按钮时调用_chat方法  
  13.         dojo.query("#sendChat").onclick(function(e)  
  14.         {  
  15.             root._chat();  
  16.         });   
  17.           
  18.     },  
  19. //订阅通道,将信息写到界面  
  20.     _subscribe: function(){  
  21.          root._chatSubscription = dojox.cometd.subscribe  
  22.   
  23. ('/test/testchat',root._receive);  
  24.     },  
  25. //取消订阅  
  26.     _unsubscribe: function(){  
  27.         if (room._chatSubscription)  
  28.         {  
  29.             dojox.cometd.unsubscribe(root._chatSubscription);  
  30.         }  
  31.         root._chatSubscription = null;  
  32.     },  
  33. //将客户端信息发送到服务器端  
  34.     _chat:function(){  
  35.         var text=dojo.byId('message').value;  
  36.         dojox.cometd.publish('/test/testchat', {  
  37.                 clientuser: 'test',  
  38.                 chatmessageclient: text  
  39.             });  
  40.          dojo.byId('message').value="";  
  41.     },  
  42. //接受服务器端的信息,显示到界面  
  43.     _receive: function(message)  
  44.     {  
  45.         var chat = dojo.byId('chat');  
  46.         var text=message.data.chatmessageservice;  
  47.         chat.innerHTML += "" + "testchat:" + "&nbsp;" + text + "<br/>";  
  48.     }  
  49. };  
  50. //页面初始渲染时,调用_init方法  
  51. dojo.addOnLoad(root, "_init");  
  52. //关闭页面时断开链接  
  53. dojo.addOnUnload(function()  
  54. {    root._unsubscribe();  
  55.      dojox.cometd.disconnect();  
  56. });  

  ChatTestService.java

 

Java代码   收藏代码
  1. package com.my.service;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7. import javax.inject.Inject;  
  8. import org.cometd.bayeux.server.BayeuxServer;  
  9. import org.cometd.bayeux.server.ConfigurableServerChannel;  
  10. import org.cometd.bayeux.server.ServerMessage;  
  11. import org.cometd.bayeux.server.ServerSession;  
  12. import org.cometd.java.annotation.Configure;  
  13. import org.cometd.java.annotation.Listener;  
  14. import org.cometd.java.annotation.Service;  
  15. import org.cometd.java.annotation.Session;  
  16. import org.cometd.server.authorizer.GrantAuthorizer;  
  17. import org.cometd.server.filter.DataFilter;  
  18. import org.cometd.server.filter.DataFilterMessageListener;  
  19. import org.cometd.server.filter.JSONDataFilter;  
  20. import org.cometd.server.filter.NoMarkupFilter;  
  21.   
  22. @Service  
  23. public class ChatTestService {  
  24. //用来存储订阅了该服务的客户端ID  
  25.     private final List<String> clientId = new ArrayList<String>();  
  26.     @Inject  
  27.     private BayeuxServer _bayeux;  
  28.     @Session  
  29.     private ServerSession _session;  
  30.       
  31.     @SuppressWarnings("unused")  
  32. //配置通道  
  33.     @Configure("/test/testchat")  
  34.     private void configureTestChat(ConfigurableServerChannel channel) {  
  35.         DataFilterMessageListener noMarkup = new DataFilterMessageListener(  
  36.                 _bayeux, new NoMarkupFilter(), new BadWordFilter());  
  37.         channel.setPersistent(true);  
  38.         channel.addListener(noMarkup);  
  39.         channel.addAuthorizer(GrantAuthorizer.GRANT_PUBLISH);  
  40.     }  
  41. //通道监听  
  42.     @Listener("/test/testchat")  
  43.     public void privateTestChat(ServerSession client, ServerMessage message) {  
  44.                 //判断list中是否保存了客户端id  
  45.         if (!clientId.contains(client.getId()))  
  46.             clientId.add(client.getId());  
  47.                 //获取客户端数据  
  48.         Map<String, Object> data = message.getDataAsMap();  
  49.                 //获取所有的client对应的ServerSession  
  50.         ArrayList<ServerSession> ssvs= new ArrayList<ServerSession>(  
  51.                 clientId.size());  
  52.         for (String ssvid: clientId) {  
  53.   
  54.             if ssvid!= null) {  
  55.                 ServerSession ssv = _bayeux.getSession(peerId);  
  56.                 if (ssv != null)  
  57.                     ssvs.add(ssv);  
  58.             }  
  59.         }  
  60.         if (ssvs.size() > 0) {  
  61.   
  62.             Map<String, Object> chat = new HashMap<String, Object>();  
  63.   
  64.             chat.put("userserivce", data.get("clientuser"));  
  65.             chat.put("chatmessageservice", data.get("chatmessageclient"));  
  66.             ServerMessage.Mutable forward = _bayeux.newMessage();  
  67.             forward.setChannel("/test/testchat");  
  68.             forward.setId(message.getId());  
  69.             forward.setData(chat);  
  70.                         //将数据发布到每个订阅的客户端  
  71.             for (ServerSession ssv: ssvs)  
  72.                 if (ssv != client)  
  73.                     ssv.deliver(_session, forward);  
  74.               
  75.             client.deliver(_session, forward);  
  76.         }  
  77.   
  78.     }  
  79.     class BadWordFilter extends JSONDataFilter {  
  80.         @Override  
  81.         protected Object filterString(String string) {  
  82.             if (string.indexOf("dang") >= 0)  
  83.                 throw new DataFilter.Abort();  
  84.             return string;  
  85.         }  
  86.     }  
  87.   
  88. }  

 配置一下web.xml文件

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.4"   
  3.     xmlns="http://java.sun.com/xml/ns/j2ee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   
  6.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  7.   <welcome-file-list>  
  8.     <welcome-file>index.jsp</welcome-file>  
  9.   </welcome-file-list>  
  10.   
  11.   <display-name>Cometd Test WebApp</display-name>  
  12.   
  13.     <!--  Request that Jetty create an MBean to manage the Bayeux instance -->  
  14.     <context-param>  
  15.         <param-name>org.eclipse.jetty.server.context.ManagedAttributes</param-name>  
  16.         <param-value>org.cometd.bayeux,org.cometd.oort.Oort</param-value>  
  17.     </context-param>  
  18.       <!-- Filter to support cross domain requests -->  
  19.     <filter>  
  20.         <filter-name>cross-origin</filter-name>  
  21.         <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>  
  22.         <!--async-supported>true</async-supported-->  
  23.     </filter>  
  24.     <filter-mapping>  
  25.         <filter-name>cross-origin</filter-name>  
  26.         <url-pattern>/cometd/*</url-pattern>  
  27.     </filter-mapping>  
  28.     
  29.       <!-- Cometd Servlet -->  
  30.     <servlet>  
  31.         <servlet-name>cometd</servlet-name>  
  32.         <servlet-class>org.cometd.java.annotation.AnnotationCometdServlet</servlet-class>  
  33.         <!--async-supported>true</async-supported-->  
  34.         <init-param>  
  35.             <param-name>timeout</param-name>  
  36.             <param-value>20000</param-value>  
  37.         </init-param>  
  38.         <init-param>  
  39.             <param-name>interval</param-name>  
  40.             <param-value>0</param-value>  
  41.         </init-param>  
  42.         <init-param>  
  43.             <param-name>maxInterval</param-name>  
  44.             <param-value>10000</param-value>  
  45.         </init-param>  
  46.         <init-param>  
  47.             <param-name>maxLazyTimeout</param-name>  
  48.             <param-value>5000</param-value>  
  49.         </init-param>  
  50.         <init-param>  
  51.             <param-name>long-polling.multiSessionInterval</param-name>  
  52.             <param-value>2000</param-value>  
  53.         </init-param>  
  54.         <init-param>  
  55.             <param-name>logLevel</param-name>  
  56.             <param-value>0</param-value>  
  57.         </init-param>  
  58.         <init-param>  
  59.             <param-name>services</param-name>  
  60.             <param-value>com.my.service.ChatTestService</param-value>  
  61.         </init-param>  
  62.         <load-on-startup>1</load-on-startup>  
  63.     </servlet>  
  64.     <servlet-mapping>  
  65.         <servlet-name>cometd</servlet-name>  
  66.         <url-pattern>/cometd/*</url-pattern>  
  67.     </servlet-mapping>  
  68. </web-app>  

 将代码发布到tomcat下,访问cometdtest.html文件即可,最好用火狐浏览器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值