首先这是第一次写,可能有各种问题,希望大神们指出和谅解下。这里的亮点可能会很详细,因为作为新生的我发现,网上虽然很多资源优秀,但是对于新手来说,会出现各种问题,比如运行都不会....本人经历过,这篇文章就教新手如何写,理解,正确运行!也算是无聊的程序员屌丝,国庆没机会出去,只能宅宿舍的打发时间。好,废话不多说,进入正题!
一、pushlet新手入门
可以去看下这个http://cuisuqiang.iteye.com/blog/1416771通过这个找下成就感。我用JavaEE导入的mypushlet的时候会出现部署上的问题,无法用Tomcat启动,不过不用着急,代码都可以运行的,至少我亲测,可以自己重新建一个动态的WEB项目。然后按照上面的加代码和文件就成功了。
二、功能介绍
在Spring,SpringMvc,Hibernate,Maven(主要用于加包),前台用到js,jquery,jsp,el表达式,jstl。不用害怕啥的,以前我也看到这么多就会恐惧,我一定会让你觉得简单但是又高大上!前台主要是用到Jquery-UI中的dialog。大概需求就是:当系统出现不好状态时,就向特定的用户,分组,群,发送消息。简单说,就是弹出个框,然后说明问题是什么,再来一个文字链接跳转。
三、制作步骤
1.大致目录结构
新建一个maven项目或者普通的动态web项目,maven的话,在pom文件中将log4j.jar加入引用就好了。普通的就直接网上下载一个加入项目中。MyPushlet是个消息推送类。后面会把它配置成servlet。当时自己就在它身上纠结好久....一直奇怪,代码都没问题,为啥不能运行。后面发现需要一个方法调用它,你可以手动调用或者写进代码。我就先手动调用。后面再解释。
2.web.xml代码如下(用于配置servlet,以前不清楚,只会用...):
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>pushlet</servlet-name>
<servlet-class>nl.justobjects.pushlet.servlet.Pushlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet>
<servlet-name>MyPushlet</servlet-name>
<servlet-class>com.up.pushlet.MyPushlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>pushlet</servlet-name>
<url-pattern>/pushlet.srv</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyPushlet</servlet-name>
<url-pattern>/MyPushlet</url-pattern>
</servlet-mapping>
</web-app>
3.修改pushlet的java源代码,找到nl.justobjects.pushlet.core包下的SessionManager类,将它的createSession方法改成,我上传的pushlet源码是已经修改好的:
public Session createSession(Event anEvent) throws PushletException {
// Trivial
//return Session.create(createSessionId());
return Session.create(anEvent.getField("userId", "visitor"));
}
用来获取session中的id,是从后台的userId,而不是特定的字符串,这样就能指定特定的用户,给你想让他接收的人发送。
4.修改ajax-pushlet-client.js
很多方法都是在里面实现和调用的,想详细了解的可以多看看,这里,我就不一一解释了,相信你如果看,一定会看懂的。啥事都不难,难的是有心人。PL对象,在它的最开始添加一个属性userId:'', ,因为分析ajax-pushlet-client.js之后会发现,所有的请求都是get方式,也就是说是将请求参数添加到url里的,我们要做的是在 进行join请求的时候将userId加到url上。找到var url = PL.pushletURL + '?p_event=' + anEvent;这一行。标特殊颜色都是新加的。
var PL = {
NV_P_FORMAT: 'p_format=xml-strict',
NV_P_MODE: 'p_mode=pull',
<span style="color:#ff0000;">userId:'',</span>
pushletURL: null,
webRoot: null,
sessionId: null,
STATE_ERROR: -2,
STATE_ABORT: -1,
STATE_NULL: 1,
STATE_READY: 2,
STATE_JOINED: 3,
STATE_LISTENING: 3,
state: 1,
// Construct base URL for GET
var url = PL.pushletURL + '?p_event=' + anEvent;
//var userid = getMenuValue("userid");
<span style="color:#ff0000;">//设置userId
if (anEvent == 'join' || anEvent == 'join-listen') { url = url + '&userId=' + PL.userId;
} </span>
然后就修改好了,把它放在合适的文件夹就可以引用了。这里新手会出现问题,至少我出现过,而且也纠结了好半会....
5.index.jsp代码(html也差不多)
a.设置路径(框架需要设置,如果是普通的没用到框架就忽略)
<c:set var="path" value="${pageContext.request.contextPath }"></c:set>
b.引用资源文件
<script src="${path}/resource/js/ajax-pushlet-client.js"></script>
<script src="${path}/resource/js/jquery-1.7.2.min.js"></script>
<script src="${path}/resource/js/jquery-ui.js"></script>
<link href="${path}/resource/js/jquery-ui.css" rel="stylesheet">
<!-- <script type="text/javascript" src="resource/js/ajax-pushlet-client.js"></script> --><!-- 普通引用用这种方式 -->
c.写一个JS
<script type="text/javascript">
PL.webRoot = "";
if (PL.sessionId == null) {
PL.userId='${user.userName}';//用EL表达式选择用户名,如果没用到的,
//可以自己直接定义如:“PL.userId="liu"”
}
PL._init();
PL.joinListen('myevent1');
function onData(event) {
var msg = event.get("key1");//获取后台定义消息推送的内容
/* alert(msg); */
isOnclick(msg);
}
function isOnclick(msg) {
var msg2 = $("#dialog").html();//利用Jquer-ui的dialog,选择id为dialog标签的内容赋给msg2。主要是为了放链接,方便跳转
$("#dialog").html(msg2+msg);//让推送的弹出框显示后台消息和自己定义的
$("#dialog").dialog({ //自己可以去了解下Jquer-ui的dialog,简单的话可以直接有alert,不过它
modal : true,
buttons : {
Ok : function() {
$(this).dialog("close");
}
}
});
}
</script>
</pre><p></p><p><span style="font-size:18px">d.HTML里面的body内容</span></p><p style="background:rgb(240,240,240)"></p><pre name="code" class="html"><div id="dialog" title="MyFirstPushlet" style="display: none"><a href="${path}/" title="讨论区">讨论区</a><p>我的第一个消息推送。上面href是链接,你可以自己定义。</p></div>
6.pushlet推送类代码
package com.up.pushlet;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import nl.justobjects.pushlet.core.Dispatcher;
import nl.justobjects.pushlet.core.Event;
import nl.justobjects.pushlet.core.SessionManager;
public class MyPushlet extends HttpServlet {
/* protected long getSleepTime() {
return 1000;
} */
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
myUnicast();
myMulticast();
myBroadcast();
}
private void myUnicast() throws UnsupportedEncodingException
{
HttpServletRequest request;
if(SessionManager.getInstance().hasSession("liu")){
Event event = Event.createDataEvent("myevent1");
String str = "推送特定成员消息hhhh";
str =new String(str.getBytes("UTF-8"),"ISO-8859-1"); //解决中文问题,原始的是不能推送中文字符
event.setField("key1", str);
Dispatcher.getInstance().unicast(event,"liu"); //向ID为liu的用户推送
System.out.println("success!!");
}
else {
System.out.println("liu do not login....0000000000000000");
}
}
private void myMulticast()
{
Event event = Event.createDataEvent("myevent1");
event.setField("key1", "推送分组成功....");
Dispatcher.getInstance().multicast(event); //向所有和myevent1名称匹配的事件推送
System.out.println(" 分组success!!!");
}
private void myBroadcast()
{
Event event = Event.createDataEvent("myevent1"); //向所有的事件推送,不要求和这儿的myevent1名称匹配
event.setField("key1", "推送所有人成功....");
Dispatcher.getInstance().broadcast(event);
System.out.println("所有人推送success!!!");
}
}
7.重点注意事项!!
a.直接运行项目默认index.jsp,你会发现什么效果都没有。这个可能是你资源没用引用争取。强力推荐火狐!使用火狐,如果你前台代码出错,你查看页面源代码会有红色的标记。另外使用火狐F12或者直接右键选择查看元素,然后找到网络,点击网络,然后点击分析最后就出现一个界面,然后查看页面是否使用到js或者样式啥的。
8.应该还不行的!你还没有调用方法使用它。你可以选择手动调用,或者自己再代码里加。简单的就是在重新打开一个页面输入:localhost:8080/push/MyPushlet然后在index页面就会出现一个弹出框!当时自己不知道使用...也纠结了好久。以为直接运行就会有效果。就是你必须收到调用你配置的servlet方法,才会有效果。前面的入门,是代码里面作者自己定义,服务器启动就调用。
欢迎各种吐槽,新手第一次写。。。。后面会好好改进!!