程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> Spring整合DWR comet 實現無刷新 多人聊天室(4)

Spring整合DWR comet 實現無刷新 多人聊天室(4)

編輯:J2EE

4、 編寫監聽器監聽客戶端是否觸發ChatMessageEvent

  1. package com.hoo.chat;
  2. import Java.util.Collection;
  3. import Java.util.Date;
  4. import Javax.servlet.ServletContext;
  5. import org.directwebremoting.ScriptBuffer;
  6. import org.directwebremoting.ScriptSession;
  7. import org.directwebremoting.ServerContext;
  8. import org.directwebremoting.ServerContextFactory;
  9. import org.springframework.context.ApplicationEvent;
  10. import org.springframework.context.ApplicationListener;
  11. import org.springframework.web.context.ServletContextAware;
  12. import com.hoo.entity.Message;
  13. /**
  14. * <b>function:</b>監聽客戶端事件,想客戶端推出消息
  15. * @author hoojo
  16. * @createDate 2011-6-7 上午11:33:08
  17. * @file SendMessageClIEnt.Java
  18. * @package com.hoo.util
  19. * @project DWRComet
  20. * @blog http://blog.csdn.Net/IBM_hoojo
  21. * @email [email protected]
  22. * @version 1.0
  23. */
  24. @SuppressWarnings("unchecked")
  25. public class ChatMessageClIEnt implements ApplicationListener, ServletContextAware {
  26. private ServletContext ctx;
  27. public void setServletContext(ServletContext ctx) {
  28. this.ctx = ctx;
  29. }
  30. @SuppressWarnings("deprecation")
  31. public void onApplicationEvent(ApplicationEvent event) {
  32. //如果事件類型是ChatMessageEvent就執行下面操作
  33. if (event instanceof ChatMessageEvent) {
  34. Message msg = (Message) event.getSource();
  35. ServerContext context = ServerContextFactory.get();
  36. //獲得客戶端所有chat頁面script session連接數
  37. Collection<ScriptSession> sessions = context.getScriptSessionsByPage(ctx.getContextPath() + "/chat.JSP");
  38. for (ScriptSession session : sessions) {
  39. ScriptBuffer sb = new ScriptBuffer();
  40. Date time = msg.getTime();
  41. String s = time.getYear() + "-" + (time.getMonth() + 1) + "-" + time.getDate() + " "
  42. + time.getHours() + ":" + time.getMinutes() + ":" + time.getSeconds();
  43. //執行setMessage方法
  44. sb.appendScript("showMessage({msg: '")
  45. .appendScript(msg.getMsg())
  46. .appendScript("', time: '")
  47. .appendScript(s)
  48. .appendScript("'})");
  49. System.out.println(sb.toString());
  50. //執行客戶端script session方法,相當於浏覽器執行JavaScript代碼
  51. //上面就會執行客戶端浏覽器中的showMessage方法,並且傳遞一個對象過去
  52. session.addScript(sb);
  53. }
  54. }
  55. }
  56. }

上面的代碼主要是監聽客戶端的事件,一旦客戶端有觸發ApplicationEvent事件或是其子類,就會執行onApplicationEvent方法。代碼中通過instanceof判斷對象實例,然後再執行。如果有觸發ChatMessageEvent事件,就獲取所有連接chat.JSp這個頁面的ScriptSession。然後像所有的ScriptSession中添加script。這樣被添加的ScriptSession就會在有連接chat.JSP的頁面中執行。

所以這就是客戶端為什麼會執行服務器端的JavaScript代碼。但前提是需要在web.XML中添加dwrComet配置以及在chat頁面添加AJax反轉。

5、 下面開始在bean容器和dwr的配置中添加我們的配置

applicationContext-beans.XML配置

  1. <bean id="chatService" class="com.hoo.chat.ChatService"/>
  2. <bean id="chatMessageClIEnt" class="com.hoo.chat.ChatMessageClIEnt"/>

上面的chatService會在dwr配置中用到

dwr.XML配置

  1. <allow>
  2. <convert match="com.hoo.entity.Message" converter="bean">
  3. <param name="include" value="msg,time" />
  4. </convert>
  5. <create creator="spring" Javascript="ChatService">
  6. <param name="beanName" value="chatService" />
  7. </create>
  8. </allow>

charService的sendMessage方法傳遞的是Message對象,所以要配置Message對象的convert配置。

上面的create的creator是spring,表示在spring容器中拿chatService對象。裡面的參數的beanName表示在spring容器中找name等於charService的bean對象。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved