Dwr实现JAVA服务器端向客户端推送消息

来源:互联网 发布:pc蛋蛋机器人源码 编辑:程序博客网 时间:2024/05/20 17:58

一、服务器端推送技术dwr

1.Ajax技术存在一个缺陷,就是它无法满足服务器端向客户端主动发送消息。比如说网页邮箱新邮件提醒、网页聊天、微信签到墙。

2.客户端可以得到通知的方式:

  定时刷新:带动整个页面刷新,给客户体验不好,频繁的刷新,对服务器端产生巨大的压力。

  ajax轮询:间隔时间问题,实时性没有保证。

  comet长连接:服务端以一种非常慢的响应,长期占用长连接的资源。

  flash XML Scoket和Java Applet套接口,不过不怎么常用。

3.dwr的使用

  dwr是一个基于Ajax的框架,它可以动态把java类生成JavaScript代码,让客户端JavaScript通过DWR访问java程序。

  一个重要的名词:scriptSession

  创建:每次都会创建一个scriptSession

  在Dwr 3.0中 Collection<ScriptSession> sessions = Browser.getTargetSessions();

  在Dwr 2.x中 Collection pages = webContext.getScriptSessionsByPage("/xxx.jsp");


具体的web.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"         version="3.1">    <listener>        <listener-class>org.directwebremoting.servlet.DwrListener</listener-class>    </listener>    <!--配置dwr-->    <servlet>        <servlet-name>dwr-invoker</servlet-name>        <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>        <init-param>            <param-name>debug</param-name>            <param-value>true</param-value>        </init-param>        <!--使用服务器推技术(反转Ajax)-->        <init-param>            <param-name>activeReverseAjaxEnabled</param-name>            <param-value>true</param-value>        </init-param>        <!-- 使能够从其他域进行请求true:开启 false:关闭 -->        <init-param>            <param-name>crossDomainSessionSecurity</param-name>            <param-value>false</param-value>        </init-param>        <!-- 允许远程js -->        <init-param>            <param-name>allowScriptTagRemoting</param-name>            <param-value>true</param-value>        </init-param>        <load-on-startup>1</load-on-startup>    </servlet>    <servlet-mapping>        <servlet-name>dwr-invoker</servlet-name>        <url-pattern>/StudyDWR/dwr/*</url-pattern>    </servlet-mapping></web-app>

dwr配置文件如下:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd"><dwr>  <allow>    <!--     这里需要特别注意的是create标签中的JavaScript属性。这个值就作为在页面上直接调用的js的名称    -->    <create creator="new" javascript="DwrPush">      <param name="class" value="utils.DwrPush"/>      <include method="send"/>    </create>  </allow></dwr>


下面的是java类内容:

package utils;import org.directwebremoting.ScriptBuffer;import org.directwebremoting.ScriptSession;import org.directwebremoting.WebContext;import org.directwebremoting.WebContextFactory;import org.directwebremoting.proxy.dwr.Util;import java.util.Collection;/** * 获取到服务器上当前在线的所有的session会话,最后发送给所有的这些用户。 */public class DwrPush {    public static void send(String msg){        WebContext webContext = WebContextFactory.get();        Collection<ScriptSession> sessions = webContext.getAllScriptSessions();        // 构建发送所需的JS脚本        ScriptBuffer scriptBuffer = new ScriptBuffer();        // 调用客户端的js脚本函数        scriptBuffer.appendScript("callback(");        // 这个msg可以被过滤处理一下,或者做其他的处理操作。这视需求而定。        scriptBuffer.appendData(msg);        scriptBuffer.appendScript(")");        // 为所有的用户服务        Util util = new Util(sessions);        util.addScript(scriptBuffer);    }}

再看一下jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html>  <head>    <title>厉害了.....</title>    <script type='text/javascript' src='/StudyDWR/dwr/util.js'></script>    <script type='text/javascript' src='/StudyDWR/dwr/engine.js'></script>    <script type='text/javascript' src='/StudyDWR/dwr/interface/DwrPush.js'></script>    <script type="text/javascript" src="js/jquery-3.1.1.min.js"></script>    <script>      $(function () {         //页面加载进行反转激活          dwr.engine.setActiveReverseAjax(true);          // 点击页面按钮的时候触发的方法          $("#button").click(function(){              // 此类即为根据java文件生成的js文件              var data = document.getElementById("data").value;              DwrPush.send(data);          });      });      //用于后台调取的函数      function callback(msg){          $("#ul").html($("#ul").html()+"<br />"+msg);      }    </script>  </head>  <body>    <ul id="ul">    </ul>    <br/>    <hr>    <input type="text" id="data" name='data' />        <input type='button' id="button" value="publish">    <span>这个小功能上边引用的js可以用这个地址去生成,前提是配置好web路径</span>    <a href="http://localhost:8080/StudyDWR/dwr/index.html">查看引用js路径</a>  </body></html>

这样一个小程序调用dwr就实现了。虽然很小,但是要熟悉dwr的配置很重要!!!!!!!!!!!!!!!

下面就是项目的目录结构:





 


0 0
原创粉丝点击