開源框架Pushlet入門
一、comet基本概念
1.comet是一個用于描述客戶端和服務器之間交互的術語,即使用長期保持的http連接來在連接保持暢通的情況下支持客戶端和服務器間的事件驅動的通信。
2.傳統的web系統的工作流程是客戶端發出請求,服務器端進行響應,而comet則是在現有技術的基礎上,實現服務器數據、事件等快速push到客戶端,所以會出現一個術語”服務器推“技術。
二、push實現方式
1.原理:
利用jsp/servel技術,在不關閉http流的情況下push數據到客戶端瀏覽器;
2.實現:
基于ajax的長輪詢(long-polling)方式
ajax的出現使得javascript可以調用xmlhttprequest對象發出http請求,javascript響應處理函數根據服務器返回的信息對html頁面的顯示進行更新。使用ajax實現“服務器推”與傳統的ajax應用不同之處在于:
1)、服務器端會阻塞請求直到有數據傳遞或超時才返回。
2)、客戶端 javascript 響應處理函數會在處理完服務器返回的信息后,再次發出請求,重新建立連接。
3)、當客戶端處理接收的數據、重新建立連接時,服務器端可能有新的數據到達;這些信息會被服務器端保存直到客戶端重 新建立連接,客戶端會一次把當前服務器端所有的信息取回。
Pushlet實例
一、首先建立一個web工程pushlet,將pushlet.jar放到lib目錄中,引入到工程。并且將pushlet.properties和sources.properties兩個文件拷貝到WEB-INF目錄中去。工程的目錄結構如圖示
我們一般只需要對sources.properties進行修改即可,創建的消息源必須在這個文件中進行配置。消息源需要實現EventSource接口
二、配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee ; <!-- 注意,缺省不需要修改<url-pattern>/pushlet.srv</url-pattern>,如果修改, 需要在對應的js文件中也要修改。pushlt缺省就是通過pushlet.srv觸發servlet的。 --> <servlet> <servlet-name>pushlet</servlet-name> <servlet-class> nl.justobjects.pushlet.servlet.Pushlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>pushlet</servlet-name> <url-pattern>/pushlet.srv</url-pattern> </servlet-mapping><welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
</web-app></pre> 三、看一下index.jsp這個文件的內容 (使用ajax的推送方式為例 需要引入 ajax-pushlet-client.js)
<%@ 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 HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>">
<title>HelloWorld</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"> <script type="text/javascript" src="ajax-pushlet-client.js"></script> <script type="text/javascript"> //對pushlet的初始化,觸發web.xml中的servlet。 PL._init(); //這里的監聽的主題,必須在sources.properties中配置的對象中聲明這個主題。 //sources.properties配置著事件源(EventSources),在服務器啟動時會自動激活。 //可以通過服務器的啟動記錄查看得到。可以將這個文件放到WEB-INF目錄下面或者classess目錄下面都可以。 PL.joinListen('/linjiqin/hw'); function onData(event) { alert(event.get("hw")); } </script>
</head>
<body> </body> </html></pre>
四、修改sources.properties文件source1=nl.justobjects.pushlet.test.TestEventPullSources$TemperatureEventPullSource source2=nl.justobjects.pushlet.test.TestEventPullSources$SystemStatusEventPullSource source3=nl.justobjects.pushlet.test.TestEventPullSources$PushletStatusEventPullSource source4=nl.justobjects.pushlet.test.TestEventPullSources$AEXStocksEventPullSource source5=nl.justobjects.pushlet.test.TestEventPullSources$WebPresentationEventPullSource source6=nl.justobjects.pushlet.test.TestEventPullSources$PingEventPullSourcesource1~source6是系統缺省自帶的,source7是我自己配置的,并且在index.jsp中的腳本中,
配置的/linjiqin/hw是和這兒是對應的。具體是這樣的。HwPlushlet是com.ljq.test.HelloWorldPlushlet對象的一個內部類,
并且繼承EventPullSource接口。
source7=com.ljq.test.HelloWorldPlushlet</pre> 五、核心代碼HelloWorldPlushlet
package com.ljq.test;import java.io.Serializable;
import nl.justobjects.pushlet.core.Event; import nl.justobjects.pushlet.core.EventPullSource;
@SuppressWarnings("serial") public class HelloWorldPlushlet extends EventPullSource implements Serializable {
/** * 設置休眠時間 */ @Override protected long getSleepTime() { return 1000; } /** * 創建事件 * * 業務部分寫在pullEvent()方法中,這個方法會被定時調用。 */ @Override protected Event pullEvent() { Event event = Event.createDataEvent("/linjiqin/hw"); event.setField("hw", "HelloWorld!!!!"); return event; }
}</pre>
這樣這個基本的例子就OK了