pushlet 传递页面request参数

原帖地址:http://blog.csdn.net/meikidd/article/details/7446778

最近项目中有服务器端推送的需求,考察了一下,感觉pushlet比较适合我们的情况。

用起来比较简单,网上资料也比较多(参考:开源框架Pushlet入门),就不多费笔墨了。


最常见的用法如下:

[java]  view plain copy
  1. package com.ljq.test;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import nl.justobjects.pushlet.core.Event;  
  6. import nl.justobjects.pushlet.core.EventPullSource;  
  7.   
  8. @SuppressWarnings("serial")  
  9. public class HelloWorldPlushlet extends EventPullSource implements Serializable {  
  10.   
  11.     /** 
  12.      * 设置休眠时间 
  13.      */  
  14.     @Override  
  15.     protected long getSleepTime() {  
  16.         return 1000;  
  17.     }  
  18.   
  19.     /** 
  20.      * 创建事件 
  21.      *  
  22.      * 业务部分写在pullEvent()方法中,这个方法会被定时调用。 
  23.      */  
  24.     @Override  
  25.     protected Event pullEvent() {  
  26.         Event event = Event.createDataEvent("/linjiqin/hw");  
  27.         event.setField("hw""HelloWorld!!!!");  
  28.         return event;  
  29.     }  
  30.   
  31. }  


在使用的过程中发现,如果要在pullEvent()方法中获取参数比较麻烦,看了半天官方文档也没有找到好的方法(也可能是我没有找对地方,总感觉pushlet不会有这种问题,如果你们知道请一定告诉我)。只好去看源代码,发现在nl.justobjects.pushlet.servlet.Pushlet中已经将request参数传进了Session(注意是nl.justobjects.pushlet.core.Session)。但是在session构造的时候没有用到request。看到这里,就大概知道改怎么改了。代码如下:

1. nl.justobjects.pushlet.core.Session,添加了event域和getEvent()方法,修改了public static Session create(String anId, Event anEvent)方法

[java]  view plain copy
  1. public class Session implements Protocol, ConfigDefs {  
  2.     private Controller controller;  
  3.     private Subscriber subscriber;  
  4.     private Event event;  
  5.   
  6.     ...  
  7.   
  8.     /** 
  9.      * Create instance through factory method. 
  10.      * 
  11.      * @param anId a session id 
  12.      * @return a Session object (or derived) 
  13.      * @throws PushletException exception, usually misconfiguration 
  14.      */  
  15.     public static Session create(String anId, Event anEvent) throws PushletException {  
  16.         Session session;  
  17.         try {  
  18.             session = (Session) Config.getClass(SESSION_CLASS, "nl.justobjects.pushlet.core.Session").newInstance();  
  19.         } catch (Throwable t) {  
  20.             throw new PushletException("Cannot instantiate Session from config", t);  
  21.         }  
  22.   
  23.         // Init session  
  24.         session.id = anId;  
  25.         session.controller = Controller.create(session);  
  26.         session.subscriber = Subscriber.create(session);  
  27.         session.event = anEvent;  
  28.         return session;  
  29.     }  
  30.   
  31.     ...  
  32.   
  33.     /** 
  34.      * Return event. 
  35.      */  
  36.     public Event getEvent() {  
  37.         return event;  
  38.     }  
  39.   
  40.     ...  
  41.       
  42. }  
2. nl.justobjects.pushlet.core.SessionManager,修改了createSession()方法

[java]  view plain copy
  1. /** 
  2.  * Create new Session (but add later). 
  3.  */  
  4. public Session createSession(Event anEvent) throws PushletException {  
  5.     // Trivial  
  6.     return Session.create(createSessionId(), anEvent);  
  7. }  

3. ajax-pushlet-client.js,PL添加了parameters属性,修改了_doRequest函数,在函数的最后加了如下一段:

[javascript]  view plain copy
  1. if(PL.parameters.length > 0) {  
  2.     for (var i = 0; i < PL.parameters.length; i++) {  
  3.         var para = PL.parameters[i];  
  4.         url += "&" + para.name + "=" + para.value;  
  5.     }  
  6. }  

修改后的ajax-pushlet-client.js -_doRequest()函数:

[javascript]  view plain copy
  1. _doRequest: function(anEvent, aQuery) {  
  2.         ...  
  3.   
  4.         // Construct base URL for GET  
  5.         var url = PL.pushletURL + '?p_event=' + anEvent;  
  6.   
  7.         // Optionally attach query string  
  8.         if (aQuery) {  
  9.             url = url + '&' + aQuery;  
  10.         }  
  11.   
  12.         // Optionally attach session id  
  13.         if (PL.sessionId != null) {  
  14.             url = url + '&p_id=' + PL.sessionId;  
  15.             if (anEvent == 'p_leave') {  
  16.                 PL.sessionId = null;  
  17.             }  
  18.         }  
  19.   
  20.         if(PL.parameters.length > 0) {  
  21.             for (var i = 0; i < PL.parameters.length; i++) {  
  22.                 var para = PL.parameters[i];  
  23.                 url += "&" + para.name + "=" + para.value;  
  24.             }  
  25.         }  
  26.         PL.debug('_doRequest', url);  
  27.         PL._getXML(url, PL._onResponse);  
  28.     },  


好了,源代码修改完毕,下面是一个如何传递参数的例子

在页面上js代码:

[javascript]  view plain copy
  1. // pushlet服务器推送,更新实时监控模块  
  2. var initPushlet = function() {  
  3.     PL.parameters.push({"name":"user-id""value":"001");  
  4.     PL._init();  
  5.     PL.joinListen('/source/event');  
  6. };  

在HelloWorldPlushlet的pullEvent()方法调用:

[java]  view plain copy
  1. Session[] sessions = SessionManager.getInstance().getSessions();  
  2. String userId = sessions[0].getEvent().getField("user-id");  


这样就实现了从页面到pushlet的参数传递

你可能感兴趣的:(服务端推-Pushlet)