Java Dwr3实现消息推送步骤详解

DWR包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据.另外一方面一个JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动态改变网页的内容,DWR采取了一个类似AJAX的新方法来动态生成基于JAVA类的JavaScript代码。这样WEB开发人员就可以在JavaScript里使用Java代码,就像它们是浏览器的本地代码(客户端代码)一样;但是Java代码运行在WEB服务器端而且可以自由访问WEB 服务器的资源。出于安全的理由,WEB开发者必须适当地配置哪些Java类可以安全的被外部使用。下面讲解一下...

1、在工程中引入dwr.jar,之后修改配置web.xml文件,添加配置具体代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

<servlet>

        <servlet-name>dwr-invoker</servlet-name>

        <servlet-class>

            org.directwebremoting.servlet.DwrServlet

        </servlet-class>

        <init-param>

            <param-name>crossDomainSessionSecurity</param-name>

               <param-value>false</param-value>

            </init-param>

        <init-param>

          <param-name>allowScriptTagRemoting</param-name>

          <param-value>true</param-value>

        </init-param>

        <init-param>

          <param-name>classes</param-name>

          <param-value>java.lang.Object</param-value>

        </init-param>

        <init-param>

            <param-name>activeReverseAjaxEnabled</param-name>

            <param-value>true</param-value>

        </init-param>

        <init-param>

           <param-name>initApplicationScopeCreatorsAtStartup</param-name>

           <param-value>true</param-value>

        </init-param>

        <init-param>

            <param-name>maxWaitAfterWrite</param-name>

            <param-value>3000</param-value>

        </init-param>

        <init-param>

            <param-name>debug</param-name>

            <param-value>true</param-value>

        </init-param>

        <init-param>

            <param-name>logLevel</param-name>

            <param-value>WARN</param-value>

        </init-param>

    </servlet>

2、在web.xml统计目录下新增dwr.xml文件,具体内容如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

<!DOCTYPE dwr PUBLIC

          "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"

          "http://getahead.org/dwr/dwr30.dtd">

     <dwr>

          <alow>

               <create creator="new" javascript="MessagePush">

                 <param name="class" value="com.yoodb.service.MessagePush"/>

              </create>

          <create creator="new" javascript="TestPush">  

                  <param name="class" value="com.yoodb.service.TestPush"/>  

              </create>

          </alow>

     </dwr>

MessagePush在页面的javascript中使用,com.yoodb.service.MessagePush实现了想要调用的方法,其中MessagePush.java对被推送页面开放的java类,Test.java是对推送页面开放的java类。在javascript中使用MessagePush.java类中实现的方法,即可在dwr中调用。

3、引入JavaScript文件,具体如下:


1

2

3

<script type="text/javascript" src="<%=basepath%>dwr/engine.js"></script>

<script type="text/javascript" src="<%=basepath%>dwr/util.js"></script>

<script type="text/javascript" src="<%=basepath%>dwr/interface/MessagePush.js"></script>

注意:

1)dwr.xml配置的javascript中engine.js和util.js是必须引入的文件。

2)在任何一个用户登录的时候,都需要将其userId或者其他唯一性标识放入session中,我放的是userId,这里就以userId为唯一性标识。

3)在载入想推送的页面时,需要onload一个我在MessagePush类中实现的方法,当然了,需要使用dwr调用

被推送html页面具体内容代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  

<%  

String path = request.getContextPath();  

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  

%>  

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  

<html>  

  <head>  

    <base href="<%=basePath%>">  

    <title>DWR  DEMO</title>  

    <meta http-equiv="pragma" content="no-cache">  

    <meta http-equiv="cache-control" content="no-cache">  

    <meta http-equiv="expires" content="0">      

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  

    <meta http-equiv="description" content="This is my page">  

  </head>  

  <script type=‘text/javascript‘ src=‘dwr/engine.js‘></script>  

  <script type=‘text/javascript‘ src=‘dwr/util.js‘></script>  

  <script type="text/javascript" src="dwr/interface/MessagePush.js"></script>  

  

  <script type="text/javascript">  

        //通过该方法与后台交互,确保推送时能找到指定用户  

         function onPageLoad(){  

            var userId = ‘${userinfo.userId}‘;  

            MessagePush.onPageLoad(userId);  

          }  

         //推送信息  

         function showMessage(autoMessage){  

                alert(autoMessage);      

        }  

  </script>  

  <body onload="onPageLoad();dwr.engine.setActiveReverseAjax(true);dwr.engine.setNotifyServerOnPageUnload(true);;">   

    This is my DWR DEOM page. <hr>  

    <br>  

    <div id="DemoDiv">demo</div>  

  </body>  

</html>

其中MessagePush.java文件中实现方法,如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

public class MessagePush{  

    public void onPageLoad(String userId) {  

           ScriptSession scriptSession = WebContextFactory.get().getScriptSession();  

         scriptSession.setAttribute(userId, userId);  

           DwrScriptSessionManagerUtil dwrScriptSessionManagerUtil = new DwrScriptSessionManagerUtil();  

         try {  

                dwrScriptSessionManagerUtil.init();  

                System.out.println("cacaca");  

         catch (ServletException e) {  

                e.printStackTrace();  

           }  

    }  

}

对于onPageLoad()方法中DwrScriptSessionManagerUtil类的实现,具体如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

import javax.servlet.ServletException;  

import javax.servlet.http.HttpSession;  

  

import org.directwebremoting.Container;  

import org.directwebremoting.ServerContextFactory;  

import org.directwebremoting.WebContextFactory;  

import org.directwebremoting.event.ScriptSessionEvent;  

import org.directwebremoting.event.ScriptSessionListener;  

import org.directwebremoting.extend.ScriptSessionManager;  

import org.directwebremoting.servlet.DwrServlet;  

  

public class DwrScriptSessionManagerUtil extends DwrServlet{  

  

    private static final long serialVersionUID = -7504612622407420071L;  

  

    public void init()throws ServletException {  

  

           Container container = ServerContextFactory.get().getContainer();  

           ScriptSessionManager manager = container.getBean(ScriptSessionManager.class);  

           ScriptSessionListener listener = new ScriptSessionListener() {  

                  public void sessionCreated(ScriptSessionEvent ev) {  

                         HttpSession session = WebContextFactory.get().getSession();  

  

                         String userId =((User) session.getAttribute("userinfo")).getHumanid()+"";  

                         System.out.println("a ScriptSession is created!");  

                         ev.getSession().setAttribute("userId", userId);  

                  }  

                  public void sessionDestroyed(ScriptSessionEvent ev) {  

                         System.out.println("a ScriptSession is distroyed");  

                  }  

           };  

           manager.addScriptSessionListener(listener);  

    }  

}

4、推送html页面具体内容代码如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  

<%  

String path = request.getContextPath();  

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  

%>  

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  

<html>  

  <head>  

    <base href="<%=basePath%>">  

    <title>My JSP ‘MyJsp.jsp‘ starting page</title>  

    <meta http-equiv="pragma" content="no-cache">  

    <meta http-equiv="cache-control" content="no-cache">  

    <meta http-equiv="expires" content="0">      

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  

    <meta http-equiv="description" content="This is my page">  

    <script type=‘text/javascript‘ src=‘dwr/engine.js‘></script>  

    <script type=‘text/javascript‘ src=‘dwr/util.js‘></script>  

    <script type=‘text/javascript‘ src=‘dwr/interface/TestPush.js‘></script>  

      

    <script type="text/javascript">  

      

    function testPush() {  

        var msg = document.getElementById("msgId").value;  

        TestPush.sendMessageAuto(msg,"www.yoodb.com");  

          

    }  

    </script>  

  </head>  

    

  <body>  

    id值: <input type="text" name="msgId" id="msgId" /> <br />  

    <input type="button" value="Send" onclick="testPush()"  />  

  </body>  

</html>

其中TeshPush.java文件,具体内容如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

public class TestPush{  

    public void sendMessageAuto(String userid, String message){  

          

        final String userId = userid;  

        final String autoMessage = message;  

        Browser.withAllSessionsFiltered(new ScriptSessionFilter() {  

            public boolean match(ScriptSession session){  

                if (session.getAttribute("userId") == null)  

                    return false;  

                else

                    return (session.getAttribute("userId")).equals(userId);  

            }  

        }, new Runnable(){  

              

            private ScriptBuffer script = new ScriptBuffer();  

              

            public void run(){  

                  

                script.appendCall("showMessage", autoMessage);  

                  

                Collection<ScriptSession> sessions = Browser  

  

                .getTargetSessions();  

                  

                for (ScriptSession scriptSession : sessions){  

                    scriptSession.addScript(script);  

                }  

            }  

        });  

    }  

}

时间: 2024-10-05 04:13:17

Java Dwr3实现消息推送步骤详解的相关文章

推送原理解析 极光推送使用详解

推送原理解析 极光推送使用详解 原军锋 12016.09.22 18:10:07字数 5,705阅读 19,494 推送技术产生场景: --服务器端主动性: 客户端与服务器交互都是客户端主动的, 服务器一般不能主动与客户端进行数据交互, 因为服务器端无法得知客户端的 IP 地址 及 状态; --数据实时性: 如果服务器端有紧急数据要传递给客户端, 就必须主动向客户端发送数据; --基本原理: 使客户端实时获取服务器端消息, Pull 方式, 小周期轮询, 费电费流量; 另一个就是 Push 方式

使用【百度云推送】第三方SDK实现推送功能详解

之前介绍过如何使用shareSDK实现新浪微博分享功能,今天介绍如何使用百度云推送SDK实现Android手机后台推送功能. 运行效果如下 第一步,如果使用百度的SDK,当然要先成为百度的开发者啦,这个就不详述了.成为开发者之后,我们要建立一个应用,如下图所示 第二步,创建好应用之后,我们点击开方者服务管理,进入工程管理页面,然后点击左侧云推送,进入云推送功能页面,具体如下图 进入云推送详细页面之后,我们点击推送设置,设置好我们的应用的包名,然后点击快速实例,将系统给我们产生的示例代码下载下来

java后端IM消息推送服务开发——规则

这一部分主要是负责智能消息推送,根据不同公司的不同产品的不同页面的不同事件的不同用户推送不同的消息,这也是整个业务逻辑的核心 技术主要涉及到Mysql,文件读取,dbutils,beanutils,mqtt,C3P0连接池 memcache package net.engyne.mqqt; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import net.engyne.

java后端IM消息推送服务开发——协议

最近在一家saas企业使用Mqtt开发IM消息推送服务,把开发中的一些问题记录下来,项目仍在商用中,完整的消息服务包括4个模块---协议protocol,信令Signal,规则Rule,状态Status,这个主题主要是协议protocol部分. 主要技术涉及到MongoDB,webservice,httpclient,Mqtt等 protocol分为四个模块类来实现,当然这是为了以后的扩展性比较好 首先看一下我们的主类,主要是mqtt基础方法的一个框架 public class MqttProt

【Android应用开发】 推送原理解析 极光推送使用详解 (零基础精通推送)

作者 : octopus_truth 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/45046283 推送技术产生场景 : -- 服务器端主动性 : 客户端与服务器交互都是客户端主动的, 服务器一般不能主动与客户端进行数据交互, 因为服务器端无法得知客户端的 IP 地址 及 状态; -- 数据实时性 : 如果服务器端有紧急数据要传递给客户端, 就必须主动向客户端发送数据; -- 基本原理 : 使客户端实时获取服务器端消息,

iOS 远程推送通知 详解

1: ios本地通知和远程通知 http://wangjun.easymorse.com/?p=1482 2: 苹果远程通知服务申请激活例图 (外国佬写的.) http://mobiforge.com/developing/story/programming-apple-push-notification-services 3:书籍参考:iPhone 开发秘籍 第16章 推送通知. 好了,进入正文: 首先是申请证书的网址 https://developer.apple.com/ios/manag

iOS推送过程详解

闲得无聊集成了一下信鸽推送,首先信鸽推送的文档里面有很详细的关于生成推送证书的教程,以后再要生成证书记不住过程的看它就可以了.即使你不用第三方,证书生成的过程是一样的.推送证书生成详细过程 注:需要强调一点的是,我在生成开发证书和发布证书的过程中犯了一个错误,由于两个成证书都需要生成cerSigningRequest(CSR)文件,因此我的发布和开发证书都使用了同一个,于是就怎么着都推送不成功,重新生成了CSR文件再次制作证书就成功了. 证书的作用 为什么要生成这些证书呢?为了支持APNs中的安

Java中JDBC连接数据库代码和步骤详解总结

JDBC连接数据库 ?创建一个以JDBC连接数据库的程序,包含7个步骤:         1.加载JDBC驱动程序:         在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String className)实现.    例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(ClassNotFoun

使用dwr3.0实现服务端向浏览器做消息推送,做滚动评论或弹幕效果,而且根据视频id做推送消息拦截功能

最近项目要实现视频播放时做弹幕和评论滚动,使用flash做sockt编程不会,就想到使用服务器消息推送做,翻找资料发现使用html5的websocket可以实现,但是ie8是不支持websocket的,最终确定使用dwr3做消息推送,普通的dwr3做消息推送会把消息推送到所有打开的页面,这样针对某一个视频的评论就会弹出到其他的视频中去,实现每个视频弹出各自的评论,就需要做dwr3的消息推送做过滤处理,经过一天的研究终于搞定了 贴出完整的代码demo 1 使用dwr3的web.xml的配置 <se