4、 編寫監聽器監聽客戶端是否觸發ChatMessageEvent
- package com.hoo.chat;
- import Java.util.Collection;
- import Java.util.Date;
- import Javax.servlet.ServletContext;
- import org.directwebremoting.ScriptBuffer;
- import org.directwebremoting.ScriptSession;
- import org.directwebremoting.ServerContext;
- import org.directwebremoting.ServerContextFactory;
- import org.springframework.context.ApplicationEvent;
- import org.springframework.context.ApplicationListener;
- import org.springframework.web.context.ServletContextAware;
- import com.hoo.entity.Message;
- /**
- * <b>function:</b>監聽客戶端事件,想客戶端推出消息
- * @author hoojo
- * @createDate 2011-6-7 上午11:33:08
- * @file SendMessageClIEnt.Java
- * @package com.hoo.util
- * @project DWRComet
- * @blog http://blog.csdn.Net/IBM_hoojo
- * @email [email protected]
- * @version 1.0
- */
- @SuppressWarnings("unchecked")
- public class ChatMessageClIEnt implements ApplicationListener, ServletContextAware {
- private ServletContext ctx;
- public void setServletContext(ServletContext ctx) {
- this.ctx = ctx;
- }
- @SuppressWarnings("deprecation")
- public void onApplicationEvent(ApplicationEvent event) {
- //如果事件類型是ChatMessageEvent就執行下面操作
- if (event instanceof ChatMessageEvent) {
- Message msg = (Message) event.getSource();
- ServerContext context = ServerContextFactory.get();
- //獲得客戶端所有chat頁面script session連接數
- Collection<ScriptSession> sessions = context.getScriptSessionsByPage(ctx.getContextPath() + "/chat.JSP");
- for (ScriptSession session : sessions) {
- ScriptBuffer sb = new ScriptBuffer();
- Date time = msg.getTime();
- String s = time.getYear() + "-" + (time.getMonth() + 1) + "-" + time.getDate() + " "
- + time.getHours() + ":" + time.getMinutes() + ":" + time.getSeconds();
- //執行setMessage方法
- sb.appendScript("showMessage({msg: '")
- .appendScript(msg.getMsg())
- .appendScript("', time: '")
- .appendScript(s)
- .appendScript("'})");
- System.out.println(sb.toString());
- //執行客戶端script session方法,相當於浏覽器執行JavaScript代碼
- //上面就會執行客戶端浏覽器中的showMessage方法,並且傳遞一個對象過去
- session.addScript(sb);
- }
- }
- }
- }
上面的代碼主要是監聽客戶端的事件,一旦客戶端有觸發ApplicationEvent事件或是其子類,就會執行onApplicationEvent方法。代碼中通過instanceof判斷對象實例,然後再執行。如果有觸發ChatMessageEvent事件,就獲取所有連接chat.JSp這個頁面的ScriptSession。然後像所有的ScriptSession中添加script。這樣被添加的ScriptSession就會在有連接chat.JSP的頁面中執行。
所以這就是客戶端為什麼會執行服務器端的JavaScript代碼。但前提是需要在web.XML中添加dwrComet配置以及在chat頁面添加AJax反轉。
5、 下面開始在bean容器和dwr的配置中添加我們的配置
applicationContext-beans.XML配置
- <bean id="chatService" class="com.hoo.chat.ChatService"/>
- <bean id="chatMessageClIEnt" class="com.hoo.chat.ChatMessageClIEnt"/>
上面的chatService會在dwr配置中用到
dwr.XML配置
- <allow>
- <convert match="com.hoo.entity.Message" converter="bean">
- <param name="include" value="msg,time" />
- </convert>
- <create creator="spring" Javascript="ChatService">
- <param name="beanName" value="chatService" />
- </create>
- </allow>
charService的sendMessage方法傳遞的是Message對象,所以要配置Message對象的convert配置。
上面的create的creator是spring,表示在spring容器中拿chatService對象。裡面的參數的beanName表示在spring容器中找name等於charService的bean對象。