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

本文介绍如何使用DWR框架实现服务器端向客户端实时推送消息的技术。具体包括DWR的工作原理、配置步骤及其实现过程中的关键代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

   服务器端推送技术介绍
   1.服务器端推送技术的产生
   1.1 Ajax应用中存在一个致命的缺陷无法满足传统桌面系统的需求:服务器端需要向客户端主动发送消息
   2.服务器端推送技术的应用场景
   2.1 网页邮箱新邮件提醒
   2.2 网页聊天
   2.3 微信签到墙(现场版)
   3.客户端得到通知的方式
   3.1 定时刷新
   3.2 Ajax轮询
   3.3 Comet长连接
   3.4 Flash XML Socket
   3.5 Java Applet套接口

   Dwr(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样.(Dwr是一个基于Ajax的框架,动态把Java类生成为JavaScript,让客户端JavaScript通过DWR访问Java程序)

Dwr运行原理:


工程目录:

jar包下载:
http://directwebremoting.org/dwr/ (下载地址


web.xml


代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <listener>
    <listener-class>org.directwebremoting.servlet.DwrListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>dwr</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</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
  </servlet-mapping>
</web-app>
dwr.xml
  
代码:

<?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 creator="new" javascript="DwrPush">
            <param name="class" value="com.aitsys.infopublish.util.DwrPush"></param>
            <!-- 这个标签可以写也可以不写,无所谓的-->
            <include method="Send"/>
        </create>
    </allow>
</dwr>
DwrPush.java
 
代码:

package com.aitsys.infopublish.util;
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;
/**
 * Created by gailun on 2018/1/4.
 */

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);
    }
}
index.jsp

代码:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>首次环境搭建</title>
    <script type='text/javascript' src='/springDemo/js/util.js'></script>
    <script type='text/javascript' src='/springDemo/js/engine.js'></script>
    <script type='text/javascript' src='/springDemo/js/DwrPush.js'></script>
    <script type="text/javascript" src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
    <script>
        $(document).ready(function(){
            alert('can get here!');
            // 页面加载的时候进行反转的激活
            /* dwr.engine.setActiveReverseAjax(true); */
            dwr.engine.setActiveReverseAjax(true) ;
            // 点击页面按钮的时候触发的方法
            $("#button").click(function(){
                // 此类即为根据java文件生成的js文件
                var data = document.getElementById("data").value;
                DwrPush.Send(data);
            });
        });
        //////////////////////////////////////用于后台调取的函数
        function callback(msg){
            //alert('test!');
            $("#ul").html($("#ul").html()+"<br />"+msg);
        }
    </script>
</head>
<body>
<ul id="ul"></ul>
<br/>
<hr>
<input type="text" id="data" name='data' />&nbsp;&nbsp;&nbsp;&nbsp;
<input type='button' id="button" value="publish">
</body></html>
js代码(包括:util.js,engine.js,DwrPush.js)获取方法如下:


运行结果:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值