開源框架Pushlet入門

jopen 10年前發布 | 12K 次閱讀 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目錄中去。工程的目錄結構如圖示

開源框架Pushlet入門


我們一般只需要對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$PingEventPullSource

source1~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了

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!