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>
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
- DWR实现服务器端向客户端推送消息
- DWR实现服务器端向客户端推送消息
- Dwr实现JAVA服务器端向客户端推送消息
- 服务端向客户端推送消息-Dwr实现
- DWR实现服务器向客户端推送消息(可用于大屏消息墙等)JAVA
- DWR3实现服务器端向客户端精确推送消息
- DWR3实现服务器端向客户端精确推送消息
- DWR3实现服务器端向客户端精确推送消息
- DWR3实现服务器端向客户端精确推送消息
- DWR3实现服务器端向客户端精确推送消息
- DWR3实现服务器端向客户端精确推送消息
- 服务器主动向客户端推送消息-java之comet4j实现
- DWR实现消息推送
- dwr消息推送---向指定用户推送
- dwr消息推送----向所有用户推送
- 使用Pushlet来实现服务器端向客户端推送信息
- 使用Pushlet来实现服务器端向客户端推送信息
- Pushlet实现消息从服务器端推送到客户端
- hibernate一级缓存和二级缓存的区别
- (三)jmeter 用户自定义变量和http默认请求
- 为什么要考虑到分库分表?分库分表存在的问题?
- crontab
- UART学习笔记三:最优接收模型
- Dwr实现JAVA服务器端向客户端推送消息
- HDU 3349 lazy gege 计算几何
- TCP选项之SO_RCVBUF和SO_SNDBUF
- FishC笔记—33 讲 异常处理:你不可能总是对的2
- Javascript事件模型、事件绑定、事件委托。
- 白盒测试和黑盒测试
- SpannableString和TextAppearanceSpan实现一个textView两种颜色
- 文件过滤器的使用
- springMVC上传多个文件带参数