对pushlet开源的改造
1、拓展了一个userid属性,开启了整个架构的前后台参数传递的机制,同时修改了默认的pushlet sessionId标识,采用了servlet服务端sessionId,达到了和服务端的统 一。
2、对后台进行了URLEncoder.encode(message.getMsg(),"UTF-8")编码,前台对应decodeURIComponent(event.get("msg")解码,解决了推送中文无响应的bug
重点知识介绍
<script type="text/javascript" src="<%=path%>/javascript/ajax-pushlet-client.js"></script>
<script type="text/javascript">
PL.webRoot=sy.contextPath+"/";
PL.userId="${sessionId}";
PL._init();
PL.joinListen('/MessageFactory/getMsg');//建立链接通道
function onData(event) {
$.messager.alert("温馨提示",decodeURIComponent(event.get("msg")));
//PL.leave();// 断开链接
}
</script>
此段初始化代码如果遇到了前有母版页和iframe的框架,需要放置在最外层
public class MessageCenterPlushlet extends EventPullSource implements Serializable{
/*
* 设置休眠时间
* */
@Override
protected long getSleepTime() {
return 3000;
}
/*
* 推送的消息
*/
@Override
protected Event pullEvent() {
Event event = Event.createDataEvent("/MessageFactory/getMsg");
try {
event.setField("msg", URLEncoder.encode("您的帐号已在异地登录,您被迫下线,请注意密码保护!","UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return event;
}
}
继承EventPullSource,并重写getSleepTime和pullEvent 即可实现静态的消息推送
这个需要配置
#source7=com.spark.common.MessageCenterPlushlet
(不太方便)
/*
* 将消息推送到指定的用户
* */
public boolean RunPull(MessageModel message,String userId){
boolean success=false;
Event event = Event.createDataEvent("/MessageFactory/getMsg");//创建消息通道
try {
event.setField("msg", URLEncoder.encode(message.getMsg(),"UTF-8"));
event.setField("showType", message.getShowType());
event.setField("isExecuteText",String.valueOf(message.isExecuteText()));
event.setField("shouldGologin", String.valueOf(message.isShouldGologin()));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//推送给全部用户
if(userId==null||userId.equals("")){
Dispatcher.getInstance().multicast(event); // 向所有和myevent1名称匹配的事件推送
}else{//推送给指定的用户
Dispatcher.getInstance().unicast(event,userId);// 向ID为piero的用户推送
}
return success;
}
由服务器主动推送
Dispatcher提供broadcast、multicast、unicast来进行消息的广播、多播和单播
配置web.xml
<!-- pushlet配置 -->
<servlet>
<servlet-name>pushlet</servlet-name>
<servlet-class>nl.justobjects.pushlet.servlet.Pushlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<!-- Define the Servlet Mappings. -->
<!-- The pushlet -->
<servlet-mapping>
<servlet-name>pushlet</servlet-name>
<url-pattern>/pushlet.srv</url-pattern>
</servlet-mapping>