DWR服务器推技术(实现消息实时推送功能)

来源:互联网 发布:服务器主流软件 编辑:程序博客网 时间:2024/05/01 14:49
技术原理:                                                          
DWR是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站。它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。
它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据。另外一方面一个JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动态改变网页的内容。

现有模式:
参考现有聊天工具,当我们有消息时,聊天工具的图标会跳动,提醒我们有未读消息可以查看,这种功能在C/S模式下很容易实现,但是如果要在B/S模式如何来实现呢。
我们的肯定会想到在客服端调用ajax在后台不断的查询服务器.看是否有关于自己的消息,如果有则查询返回。这种做法肯定会大量的占用系统的资源,是一种效率比较低的做法,不可取。
而现在DWR的反转AJAX功能,允许我们从服务器端来控制客服端,不需要客户端请求,服务器就可以自动把消息发给指定的客户端。

应用场景:

使用本技术,可以实现即使聊天,消息实时推送,实时动态网页等功能。


具体使用:

下面我们就用一个简单的例子来介绍一下dwr服务器推技术的实现。(本实例demo以及使用到的相关资料DEMO已上传至我的资源,仅供参考)

1.新建一个web工程,导入dwr.jar



2.在web.xml文件中加入dwr配置,具体配置内容如下:

<!-- DWR服务器推技术 -->

    <servlet> 

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

        <servlet-class> 

            org.directwebremoting.servlet.DwrServlet 

        </servlet-class> 

        <init-param> 

            <description>调试DWR,发布系统时应将其设为false</description> 

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

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

        </init-param> 

        <init-param> 

            <description>使用服务器推技术(反转AJAX)</description> 

            <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>100</param-value> 

        </init-param> 

        <load-on-startup>4</load-on-startup> 

    </servlet> 

    <servlet-mapping> 

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

        <url-pattern>/dwr/*</url-pattern> 

    </servlet-mapping> 


3.在web.xml的同级目录下新建dwr.xml文件,具体内容如下:

<?xmlversion="1.0"encoding="UTF-8"?> 

<!DOCTYPEdwrPUBLIC "-//GetAheadLimited//DTD Direct Web Remoting 2.0//EN""http://getahead.org/dwr/dwr20.dtd"> 

<dwr> 

   <allow> 

        <createcreator="new"javascript="DemoTest"> 

             <paramname="class"value="com.demo.DemoTest"/> 

        </create> 

   </allow> 

</dwr> 

这是dwr的基本配置,DemoTest在web页面的javascript中使用,com.demo.DemoTest是实现了需要调用的方法,相当于java类中的一个映射,在javascript中调用DemoTest.java类中的方法,即可在dwr中调用。

    其中DemoTest.java类中,下面两个方法尤为重要,这两个方法,是用来加载页面时,获取在线用户使用,如下图:



4.接下来开始进行消息推送,在推送页面和接受页面引入下面三个文件,上面个js文件是导入jar包自带的,下面一个js文件是根据dwr.xml配置自动生成的,无需另外引入项目中,并对dwr进行ajax激活反转:



5.根据dwr.xml中配置的映射,通过DemoTest调用java类中的方法进行消息推送,java类中方法如下:

public voidsendMsg(String userid, String message, String jsFuc) {

        final String userId = userid;

        final String msg = message;

        final String jsFunc = jsFuc;

        Browser.withAllSessionsFiltered(new ScriptSessionFilter() {

            public boolean match(ScriptSessionsession) {

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

                    returnfalse;

                }else {

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

                }

            }

        },newRunnable() {

            private ScriptBufferscript =new ScriptBuffer();

            public void run() {

                // 推送消息

                script.appendCall(jsFunc,msg);

                Collection<ScriptSession>sessions = Browser.getTargetSessions();

                for (ScriptSessionscriptSession : sessions) {

                    scriptSession.addScript(script);

                }

            }

        });

    }

调用时,只需传入被推送人userid,推送的消息message,和用来处理信息的js方法名,被推送页面自动寻找对应的js方法,并接受推送信息进行处理。方便快捷的实现了消息传递功能。

其中,userid是被推送消息的人,message则为你想推送的消息,jsFuc为被推送的页面中的js方法,此方法用于接受msg,得到并处理推送内容,具体js处理消息代码如下。


本例以推送所有用户在线页面为例,同时开三个浏览器,一个作为推送方,两个作为被推送方,效果如下:




0 0
原创粉丝点击