使用dwr实现精准发送消息到页面

帮朋友实现的一个demo,github:git@github.com:frentso/dwrPro.git    https://github.com/frentso/dwrPro

使用到的技术::

https://yq.aliyun.com/articles/58187

DWR框架简单实例  

DWR:搜索百度百科解释--DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站。它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。 
原因:是因为Javascript无法直接调用java函数,但是为了达到AJAX异步特性(部分刷新页面,减少数据库传输大小)。DWR可以根据java函数产生相应的js(含有函数相应的方法),从而在网页上可以直接通过js调用java函数中的方法类,达到异步效果。 

具体方法如下: 
[list]
  • 导包:将dwr.jar文件放到你的webapp的WEB-INF/lib目录下;
  • web.xml的配置:
Java代码  收藏代码
  1. <servlet>  
  2.   <servlet-name>dwr-invoker</servlet-name>  
  3.   <display-name>DWR Servlet</display-name>  
  4.   <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>  
  5.   <init-param>  
  6.      <param-name>debug</param-name>  
  7.      <param-value>true</param-value>  
  8.   </init-param>  
  9. </servlet>  
  10. <servlet-mapping>  
  11.   <servlet-name>dwr-invoker</servlet-name>  
  12.   <url-pattern>/dwr/*</url-pattern>  
  13. </servlet-mapping>  
  • dwr.xml的配置:
   
Java代码  收藏代码
  1. <dwr>  
  2.     <allow>  
  3.     <create creator="new" javascript="TestDwr">//-->产生的Js的名称,与jsp中调用名称一致  
  4.       <param name="class" value="com.edr.dwr.TestDwr"/>  
  5.     </create>  
  6.     </allow>  
  7. </dwr>  
  • jsp上调用产生的js:
Java代码  收藏代码
  1. <!-- 导入dwr的JS引擎 -->  
  2.     <script type="text/javascript" src="dwr/interface/TestDwr.js"></script>  
  3.     <script type="text/javascript" src="dwr/engine.js"></script>  
  4.     <script type="text/javascript" src="dwr/util.js"></script>  
  5.     <!-- 调用后台类 -->  
  6.     <script type="text/javascript">  
  7.         //删除一条数据    
  8.         function do_delete(name){  
  9.             alert("确定要删除? "+name);  
  10.             TestDwr.doDelete(name);//具体方法类  
  11.         }  
  12. </script> 

http://blog.csdn.net/pangliang_csdn/article/details/68945872

dwr实现消息精准推送

标签: dwrcomet消息推送java精准

关于dwr具体概念本文不做赘述,只谈实现。在参考了好几篇网上的博文后,把dwr整合到我的项目里面了,跑起来也没有问题。java推送有许多实现方式,诸如comet4j,websocket等等,还有一些收费的比如goeasy等,有兴趣朋友可以看看,废话不多说开始实现。

一:项目的应用场景

在项目里面有一个审批流程,上级领导把一个线索分配给下级实现,中途还可以变更下级,这样一来就会出现原来的下级正在对线索进行操作,而该线索已经不属于他,这时候我们需要一个消息实时推送给原来的下级,告诉他线索不属于你你甭干了,乖乖去玩吧!

二:实现

1:maven项目引入jar包,非maven项目去dwr官网下载

[html] view plain copy
 
  1. <dependency>  
  2.    <groupId>org.directwebremoting</groupId>  
  3.    <artifactId>dwr</artifactId>  
  4.    <version>3.0.2-RELEASE</version>  
  5. </dependency>  

2:在web.xml配置
[html] view plain copy
 
  1. <!-- dwr的配置 -->  
  2.     <servlet>    
  3.           <servlet-name>dwr-invoker</servlet-name>    
  4.           <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>    
  5.           <init-param>    
  6.             <param-name>debug</param-name>    
  7.             <param-value>true</param-value>    
  8.           </init-param>    
  9.           <init-param>    
  10.             <param-name>activeReverseAjaxEnabled</param-name>    
  11.             <param-value>true</param-value>    
  12.           </init-param>    
  13.           <init-param>    
  14.             <param-name>pollAndCometEnabled</param-name>    
  15.             <param-value>true</param-value>    
  16.           </init-param>    
  17.           <init-param>    
  18.             <param-name>crossDomainSessionSecurity</param-name>    
  19.             <param-value>false</param-value>    
  20.           </init-param>    
  21.           <init-param>    
  22.             <param-name>allowScriptTagRemoting</param-name>    
  23.             <param-value>true</param-value>    
  24.           </init-param>    
  25.           <load-on-startup>1</load-on-startup>    
  26.      </servlet>    
  27.     <servlet-mapping>    
  28.       <servlet-name>dwr-invoker</servlet-name>    
  29.       <url-pattern>/dwr/*</url-pattern>    
  30.     </servlet-mapping>    

3:编写一个java类,用于要通知的页面把用户id传入保存session,这样服务端才能知道给谁发

[java] view plain copy
 
  1. public class MessagePush {  
  2.   
  3.     public void onPageLoad(String userId) {    
  4.             
  5.         ScriptSession scriptSession = WebContextFactory.get().getScriptSession();    
  6.     
  7.         scriptSession.setAttribute("userId", userId); //把前台传入的id保存   
  8.     
  9.         DwrScriptSessionManagerUtil dwrScriptSessionManagerUtil = new DwrScriptSessionManagerUtil();    
  10.     
  11.         try {    
  12.     
  13.             dwrScriptSessionManagerUtil.init();    
  14.     
  15.         } catch (ServletException e) {    
  16.     
  17.             e.printStackTrace();    
  18.     
  19.         }    
  20.     
  21.     }    
  22. }  

还需要一个DwrScriptSessionManagerUtil工具类
[java] view plain copy
 
  1. import javax.servlet.ServletException;  
  2. import javax.servlet.http.HttpSession;  
  3.   
  4. import org.directwebremoting.Container;  
  5. import org.directwebremoting.ServerContextFactory;  
  6. import org.directwebremoting.WebContextFactory;  
  7. import org.directwebremoting.event.ScriptSessionEvent;  
  8. import org.directwebremoting.event.ScriptSessionListener;  
  9. import org.directwebremoting.extend.ScriptSessionManager;  
  10. import org.directwebremoting.servlet.DwrServlet;  
  11.   
  12. /** 
  13.  * @author Administrator 
  14.  * 
  15.  */  
  16.   
  17. public class DwrScriptSessionManagerUtil extends DwrServlet{  
  18.   
  19.      public void init() throws ServletException {    
  20.             
  21.             Container container = ServerContextFactory.get().getContainer();    
  22.         
  23.             ScriptSessionManager manager = container .getBean(ScriptSessionManager.class);    
  24.         
  25.             ScriptSessionListener listener = new ScriptSessionListener() {    
  26.         
  27.                 public void sessionCreated(ScriptSessionEvent ev) {    
  28.         
  29.                     HttpSession session = WebContextFactory.get().getSession();    
  30.         
  31.                     String userId = (String) session.getAttribute("userId");    
  32.         
  33.                     System.out.println(">>>>>>>>>a ScriptSession is created!");    
  34.         
  35.                     ev.getSession().setAttribute("userId", userId);    
  36.         
  37.                 }    
  38.         
  39.                 public void sessionDestroyed(ScriptSessionEvent ev) {    
  40.         
  41.                     System.out.println(">>>>>>>>a ScriptSession is distroyed");    
  42.         
  43.                 }    
  44.         
  45.             };    
  46.         
  47.             manager.addScriptSessionListener(listener);    
  48.         
  49.         }    
  50. }  

4:在与web.xml同级的目录下新建一个dwr.xml
[html] view plain copy
 
  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <!DOCTYPE dwr PUBLIC    
  3.     "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"    
  4.     "http://directwebremoting.org/schema/dwr30.dtd">    
  5. <dwr>    
  6.     <allow>    
  7.         <create javascript="MessagePush" creator="new">    
  8.             <param name="class" value="com.gtcity.web.util.MessagePush"></param>    
  9.         </create>    
  10.     </allow>    
  11. </dwr>   

value="com.gtcity.web.util.MessagePush"代表对应的java类,javascript="MessagePush"代表页面引用的js名称,dwr目的就是要让js调用java方法

5:需要通知的页面

[javascript] view plain copy
 
  1. <script type="text/javascript" src="${pageContext.request.contextPath }/dwr/engine.js"></script>     
  2. <script type="text/javascript" src="${pageContext.request.contextPath }/dwr/util.js"></script>  
  3. <script type="text/javascript" src="${pageContext.request.contextPath }/dwr/interface/MessagePush.js"></script>  
这几个写法就是写死的,就是第三个*.js需要对应你在第4步上javascript="MessagePush"里面定义的名字
[html] view plain copy
 
  1. <body style="overflow-x:hidden;" onload="dwr.engine.setActiveReverseAjax(true);dwr.engine.setNotifyServerOnPageUnload(true);onPageLoad();">  

这几个也是必须的
[javascript] view plain copy
 
  1. function onPageLoad(){  
  2.              var userId = '${user.userId}';  
  3.              MessagePush.onPageLoad(userId);  
  4.          }  
  5.           
  6.          //推送信息    
  7.  function showMessage(autoMessage){    
  8.                   
  9.              alert(autoMessage);  
  10.                   
  11.         }    

6:具体写消息推送的类,结合自身项目情景,我这里是在上级更改了下级后写的

A:给一个人发

[java] view plain copy
 
  1. //修改成功给张三发消息  
  2.         final String userId = "2";  //这个我写死张三userId=2  
  3.             final String autoMessage = "上级已经更改了这条线索的归属人了!";    
  4.             Browser.withAllSessionsFiltered(new ScriptSessionFilter() {    
  5.                 public boolean match(ScriptSession session){  //验证符合条件的发送人  
  6.                     if (session.getAttribute("userId") == null){    
  7.                         return false;    
  8.                     }else  {  
  9.                         return (session.getAttribute("userId")).equals(userId);    
  10.                     }  
  11.                 }    
  12.             }, new Runnable(){    
  13.                     
  14.                 private ScriptBuffer script = new ScriptBuffer();    
  15.                     
  16.                 public void run(){    
  17.                         
  18.                     script.appendCall("showMessage", autoMessage);    
  19.                         
  20.                     Collection<ScriptSession> sessions = Browser    
  21.         
  22.                     .getTargetSessions();    
  23.                         
  24.                     for (ScriptSession scriptSession : sessions){    
  25.                         scriptSession.addScript(script);    
  26.                     }    
  27.                 }    
  28.             });    

B:给多个人
[java] view plain copy
 
  1. //修改成功给张三,李四发消息  
  2.         final String userId = "2,3,***";    
  3.             final String autoMessage = "上级已经更改了这条线索的归属人了!";    
  4.             Browser.withAllSessionsFiltered(new ScriptSessionFilter() {    
  5.                 public boolean match(ScriptSession session){    
  6.                     if (session.getAttribute("userId") == null){    
  7.                         return false;    
  8.                     }else  {  
  9.                         String attribute = (String) session.getAttribute("userId");  
  10.                         return (userId.contains(attribute));  
  11.                         
  12.                     }  
  13.                 }    
  14.             }, new Runnable(){    
  15.                     
  16.                 private ScriptBuffer script = new ScriptBuffer();    
  17.                     
  18.                 public void run(){    
  19.                         
  20.                     script.appendCall("showMessage", autoMessage);    
  21.                         
  22.                     Collection<ScriptSession> sessions = Browser    
  23.         
  24.                     .getTargetSessions();    
  25.                         
  26.                     for (ScriptSession scriptSession : sessions){    
  27.                         scriptSession.addScript(script);    
  28.                     }    
  29.                 }    
  30.             });    
原文地址:https://www.cnblogs.com/frentso/p/8429922.html