1、基础概念:Pushlet是一种comet实现:在Servlet机制下,数据从server端的Java对象直接推送(push)到(动态)HTML页面,而无需任何Java applet或者插件的帮助。
2、一个简单的demo:
1)导入所需要的jar包:pushlet.jar
2)将配置文件pushlet.properties、sources.properties导入到src目录下
pushlet.properties:
config.version=1.0.2 controller.class=nl.justobjects.pushlet.core.Controller dispatcher.class=nl.justobjects.pushlet.core.Dispatcher logger.class=nl.justobjects.pushlet.util.Log4jLogger sessionmanager.class=nl.justobjects.pushlet.core.SessionManager session.class=nl.justobjects.pushlet.core.Session subscriber.class=nl.justobjects.pushlet.core.Subscriber subscription.class=nl.justobjects.pushlet.core.Subscription log.level=4 sources.activate=true session.id.generation=randomstring session.timeout.mins=5 queue.size=24 queue.read.timeout.millis=20000 queue.write.timeout.millis=20 listen.force.pull.all=false listen.force.pull.agents=safari pull.refresh.timeout.millis=45000 pull.refresh.wait.min.millis=2000 pull.refresh.wait.max.millis=6000 poll.refresh.timeout.millis=60000 poll.refresh.wait.min.millis=6000 poll.refresh.wait.max.millis=10000
source.properties:
source6=cn.ffcs.pushmessage.plushlet.MessagePlushlet$Plushlet
3)修改web.xml文件如下(url-pattern暂时设置为/pushlet.srv)
Xml代码
4)编写一个java类如下
Java代码
package cn.ffcs.pushmessage.plushlet;
import java.io.Serializable;
import nl.justobjects.pushlet.core.Event;
import nl.justobjects.pushlet.core.EventPullSource;
import nl.justobjects.pushlet.core.Session;
import nl.justobjects.pushlet.core.SessionManager;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import cn.ffcs.pushmessage.domain.PushMessage;
import cn.ffcs.pushmessage.service.api.IPushMessageService;
@SuppressWarnings("serial")
public class MessagePlushlet implements Serializable, BeanFactoryAware{
private IPushMessageService pushMessageService;
public static class Plushlet extends EventPullSource{
/**
* 设置休眠时间
*/
@Override
protected long getSleepTime() {
return 4000;
}
/**
* 创建事件
*
* 业务部分写在pullEvent()方法中,这个方法会被定时调用。
*/
@Override
protected Event pullEvent() {
Event event = Event.createDataEvent("/message/plushlet");
IPushMessageService pushMessageService = (IPushMessageService) getBean("cn.ffcs.pushmessage.service.impl.PushMessageServiceImpl");
PushMessage pushMessage = pushMessageService.getById(1);
System.out.println(event.getField("p_id") + "==================");
System.out.println(event.getField("userId") + "==================");
System.out.println(event.getField("p_format") + "==================");
System.out.println(event.getSubject());
Session[] sessions = SessionManager.getInstance().getSessions();
//sessions[0].getEvent().getField("userId");
System.out.println(sessions[0].getEvent().getField("userId"));
event.setField("id", "1");
return event;
}
}
public IPushMessageService getPushMessageService() {
return pushMessageService;
}
public void setPushMessageService(IPushMessageService pushMessageService) {
this.pushMessageService = pushMessageService;
}
private static BeanFactory beanFactory;
public static Object getBean(String beanName) {
return beanFactory.getBean(beanName);
}
public static <T> T getBean(String beanName, Class<T> clazs) {
return clazs.cast(getBean(beanName));
}
@SuppressWarnings("static-access")
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
}
还有就是注意Event event = Event.createDataEvent("/message/plushlet");// 事件标识
5)编写jsp文件如下<%@ page language="java" contentType="text/html; charset=UTF-8"
Java代码
<script type="text/javascript" src="/scripts/jquery.min.js"></script>
<script type="text/javascript" src="/scripts/ajax-pushlet-client.js"></script>
<script src="/scripts/yanue.pop.js" type="text/javascript"></script>
<script type="text/javascript" src="/scripts/jquery.jplayer.min.js"></script>
<script type="text/javascript">
//对pushlet的初始化,触发web.xml中的servlet。
PL._init();
//这里的监听的主题,必须在sources.properties中配置的对象中声明这个主题。
//sources.properties配置着事件源(EventSources),在服务器启动时会自动激活。
//可以通过服务器的启动记录查看得到。可以将这个文件放到WEB-INF目录下面或者classess目录下面都可以。
//PL.parameters.push({"userId":"1", "value":"4214f0c0da6760a9e95e3c164998ac06"});
PL.joinListen('/message/plushlet');
function onData(event) {
//alert('123');
//event.setField("userId","123");
var pop=new Pop("这里是标题,哈哈",
"http://www.yanue.info/js/pop/pop.html",
"请输入你的内容简介,这里是内容简介.请输入你的内容简介,这里是内容简介.请输入你的内容简介,这里是内容简介");
getRingData();
}
//onData();
function getRingData(){
//alert('123');
var attachmentUrl = "http://localhost:8080/upload/ring/1394107276542.mp3";
$('#jqDiv div').remove(); //将jplayer渲染的div层移除后重新添加,不然jplayer只会播放一次
$('#jqDiv').append('<div id="jquery_jplayer_1" class="jp-jplayer" style="width:500px;"></div>');
$("#jquery_jplayer_1").jPlayer("stop");
$("#jquery_jplayer_1").jPlayer({
ready: function (event) {
$(this).jPlayer("setMedia", {
mp3:attachmentUrl
}).jPlayer("play");
},
swfPath: "js",
supplied: "m4a, oga, mkv, mp3, mp4",
wmode: "window"
});
}
</script>
<div id="jqDiv">
<div id="jquery_jplayer_1" class="jp-jplayer" style="width:500px;"></div>
</div>
调用getRingData()为弹窗显示后的声音提醒。
<body>
<div id="pop" style="display:none;">
<style type="text/css">
*{margin:0;padding:0;}
#pop{background:#fff;width:260px;border:1px solid #e0e0e0;font-size:12px;position: fixed;right:10px;bottom:10px;}
#popHead{line-height:32px;background:#f6f0f3;border-bottom:1px solid #e0e0e0;position:relative;font-size:12px;padding:0 0 0 10px;}
#popHead h2{font-size:14px;color:#666;line-height:32px;height:32px;}
#popHead #popClose{position:absolute;right:10px;top:1px;}
#popHead a#popClose:hover{color:#f00;cursor:pointer;}
#popContent{padding:5px 10px;}
#popTitle a{line-height:24px;font-size:14px;font-family:'微软雅黑';color:#333;font-weight:bold;text-decoration:none;}
#popTitle a:hover{color:#f60;}
#popIntro{text-indent:24px;line-height:160%;margin:5px 0;color:#666;}
#popMore{text-align:right;border-top:1px dotted #ccc;line-height:24px;margin:8px 0 0 0;}
#popMore a{color:#f60;}
#popMore a:hover{color:#f00;}
</style>
<div id="popHead">
<a id="popClose" title="关闭">关闭</a>
<h2>温馨提示</h2>
</div>
<div id="popContent">
<dl>
<dt id="popTitle"><a href="http://yanue.info/" target="_blank">这里是参数</a></dt>
<dd id="popIntro">这里是内容简介</dd>
</dl>
<p id="popMore"><a href="http://yanue.info/" target="_blank">查看 »</a></p>
</div>
</div>
<div id="jquery_jplayer_1"></div>
</body>
6)下面说一下web.xml中<url-pattern>的配置问题,查看ajax-pushlet-client.js源码会发现有下面这段代码_getWebRoot: function() {
Js代码
/** Return directory of this relative to document URL. */
if (PL.webRoot != null) {
return PL.webRoot;
}
//derive the baseDir value by looking for the script tag that loaded this file
var head = document.getElementsByTagName('head')[0];
var nodes = head.childNodes;
for (var i = 0; i < nodes.length; ++i) {
var src = nodes.item(i).src;
if (src) {
var index = src.indexOf("lib/ajax-pushlet-client.js");
if (index >= 0) {
PL.webRoot = src.substring(0, index);
break;
}
}
}
return PL.webRoot;
},
注意var index = src.indexOf("lib/ajax-pushlet-client.js");这句话 这个方法就是取webRoot跟路径的,所以<url-pattern>的设置跟这里有关系,还有就是跟你使用ajax-pushlet-client.js的jsp页面有关系,我上面的jsp页面中src="js/ajax-pushlet-client.js"是这样导入js包的,所以我把ajax-pushlet-client.js中的代码改为 var index = src.indexOf("js/ajax-pushlet-client.js"); 取根路径了。