pushlet原理及例子

Pushlet是一种comet实现:在Servlet机制下,数据从server端的Java对象直接推送(push)到(动态)HTML页面,而无需任何Java applet或者插件的帮助。它使server端可以周期性地更新client的web页面,这与传统的request/response方式相悖。浏览器client为兼容JavaScript1.4版本以上的浏览器(如Internet Explorer、FireFox),并使用JavaScript/Dynamic HTML特性。而底层实现使用一个servlet通过Http连接到JavaScript所在的浏览器,并将数据推送到后者。有关JavaScript版本的知识请参看Mozilla开发中心提供的《JavaScript核心参考》和Stephen Chapman编写的《What Version of Javascript》。

这种机制是轻量级的,它使用server端的servlet连接管理、线程工具、javax.servlet API,并通过标准Java特性中Object的wait()和notify()实现的生产者/消费者机制。原则上,Pushlet框架能够运行在任何支持servlet的server上、防火墙的后面。当在client中使用JavaScript/DHTML时,Pushlet提供了通过脚本快速建立应用、使用HTML/CSS特性集成和布局新内容的便利方法。

首先去下载pushlet,下载地址:http://www.pushlets.com/,我下载的是一个当下最新的版本2.0.4。下面以一个例子做下说明,详细的可以看一下pushlet自身带的例子,源码也不是很复杂,包括几个js文件。有空大家看看源码可能更好些。

首先建立一个web工程projPushlet,将pushlet.jar放到lib目录中,引入到工程。并且将pushlet.propertiessources.properties两个文件拷贝到WEB-INF目录中去。工程的目录结构如图示


我们一般只需要对sources.properties进行修改即可。创建的消息源必须在这个文件中进行配置。消息源需要实现EventSource接口

先看一下web.xml文件的servlet配置

1xml version="1.0"encoding="UTF-8"?>

2<web-appversion="2.5"

3xmlns="http://java.sun.com/xml/ns/javaee"

4xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

5xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

6http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

7<servlet>

8<servlet-name>pushletservlet-name>

9<servlet-class>nl.justobjects.pushlet.servlet.Pushletservlet-class>

10<load-on-startup>1load-on-startup>

11servlet>

12

13

14

15

16<servlet-mapping>

17<servlet-name>pushletservlet-name>

18<url-pattern>/pushlet.srvurl-pattern>

19servlet-mapping>

20web-app>

注意,缺省不需要修改/pushlet.srv,如果修改,需要在对应的js文件中也要修改。pushlt缺省就是通过pushlet.srv触发servlet的。

==========================================

看一下index.jsp这个文件的内容

1 <%@pagecontentType="text/html;charset=UTF-8"language="java" %>

2 <html>

3 <head>

4 <scripttype="text/javascript"src="ajax-pushlet-client.js">script>

5 <scripttype="text/javascript">

6 PL._init();

7 PL.joinListen('/zhaoyang/hi');

8 functiononData(event) {

9 alert(event.get("hw"));

10 }

11 script>

12 head>

13

14 <body>

15 <h1>my first pushleth1>

16 body>

17 html>

其中,第6行,是对pushlet的初始化,触发web.xml中的servlet。其中,第七行特别重要,这里的监听的主题,必须在sources.properties中配置的对象中声明这个主题。sources.properties配置着事件源(EventSources),在服务器启动时会自动激活。可以通过服务器的启动记录查看的到。可以将这个文件放到WEB-INF目录下面或者classess目录下面都可以。(详细可以看sources.properties内的注释)

然后看一下sources.properties这个文件内容。如下图示:

注意,source1是系统缺省自带的,source2是我自己配置的,并且在index.jsp中的脚本中,配置的/zhaoyang/hi是和这儿是对应的。具体是这样的。HwPlushlet是com.css.HelloWorldPlushlet对象的一个内部类,并且继承EventPullSource接口。大家看一下HelloWorldPlushlet.java就全明白了。代码如下:

1packagecom.css;
2

3importnl.justobjects.pushlet.core.Event;
4
importnl.justobjects.pushlet.core.EventPullSource;
5
6
importjava.io.Serializable;
7
8
/**
9*Created by IntelliJ IDEA.
10* User:liuzhy
11* Date: 2011-1-18
12* Time:10:54:35
13*/
14
publicclassHelloWorldPlushletimplementsSerializable{
15
static public classHwPlushletextendsEventPullSource {
16
17@Override
18
protected longgetSleepTime() {
19
return1000;
20}
21
22@Override
23
protectedEvent pullEvent() {
24Event event =Event.createDataEvent(
"/zhaoyang/hi");
25event.setField(
"hw","hello,world");
26
returnevent;
27}
28}
29}
30

在上面的代码中,可以看到创建事件(createDataEvent)的主题(aSubject)是
/zhaoyang/hi,和index.jsp中PL.joinListen('/zhaoyang/hi');是对应的。EventPullSource有两个方法,一个是设置休眠时间(getSleepTime),另一个是创建事件(pullEvent)。其中,业务部分就写在pullEvent()方法中即可,这个方法会被定时调用

这样这个基本的例子就OK了,运行一下,看看吧。

访问http://localhost:8080/ 会定时弹出alert窗口,窗口的内容就是event.setField("hw","hello,world");,呵呵。如图:

如果这个页面关闭了,服务器会自动取消订阅,和移除对应的session信息。下面是我关闭页面后,服务器端的输出信息,如图:


-----------------------------------------------

这里,因为我没有对pushlet的原理进行说明,主要是写了一个例子,如果要了解原理,可以上网Google一下,原理方面的资料很多,但是实际的例子确很少,呵呵。

你可能感兴趣的:(pushlet原理及例子)