pushlet给特定用户,分组,群发推送消息(新手亲测,解决新手使用遇到的困难!)


首先这是第一次写,可能有各种问题,希望大神们指出和谅解下。这里的亮点可能会很详细,因为作为新生的我发现,网上虽然很多资源优秀,但是对于新手来说,会出现各种问题,比如运行都不会....本人经历过,这篇文章就教新手如何写,理解,正确运行!也算是无聊的程序员屌丝,国庆没机会出去,只能宅宿舍的打发时间。好,废话不多说,进入正题!

一、pushlet新手入门

可以去看下这个http://cuisuqiang.iteye.com/blog/1416771通过这个找下成就感。我用JavaEE导入的mypushlet的时候会出现部署上的问题,无法用Tomcat启动,不过不用着急,代码都可以运行的,至少我亲测,可以自己重新建一个动态的WEB项目。然后按照上面的加代码和文件就成功了。

二、功能介绍

SpringSpringMvc,Hibernate,Maven(主要用于加包),前台用到jsjqueryjspel表达式,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方法,才会有效果。前面的入门,是代码里面作者自己定义,服务器启动就调用。

欢迎各种吐槽,新手第一次写。。。。后面会好好改进!!

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值