zoukankan      html  css  js  c++  java
  • 使用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.             });    
  • 相关阅读:
    (转)-为什么分布式一定要有Redis?
    (九)redis使用lua脚本
    (八)redis实现分布式锁
    (七)面试题-Redis比较常见的面试题-转载
    (六)redis缓存穿透,击穿,雪崩以及解决方案
    (五)redis的主从复制
    (四)redis的数据持久化-RDB,AOF
    (三)redis的其他功能-Bitmap,HyperLogLog,GEO
    JsTracker
    Web开发者助手 FeHelper
  • 原文地址:https://www.cnblogs.com/frentso/p/8429922.html
Copyright © 2011-2022 走看看