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' /> <input type='button' id="button" value="publish"> </body></html>js代码(包括:util.js,engine.js,DwrPush.js)获取方法如下:
![]()
运行结果: