• DWR入门


    © 版权声明:本文为博主原创文章,转载请注明出处


    1. 作用

    • 可以动态生成基于JAVA类的JavaScript代码,使得可以使用JavaScript调用JAVA方法
    • 可以进行内容推送,将指定内容推送给某个人或某些人(需要页面进行触发

    2. 实现

    2.1 pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	
    	<groupId>org.dwr</groupId>
    	<artifactId>DwrDemo</artifactId>
    	<packaging>war</packaging>
    	<version>0.0.1-SNAPSHOT</version>
    
    	<dependencies>
    		<!-- junit -->
    		<dependency>
    			<groupId>junit</groupId>
    			<artifactId>junit</artifactId>
    			<version>4.12</version>
    			<scope>test</scope>
    		</dependency>
    		<!-- dwr -->
    		<dependency>
    		    <groupId>org.directwebremoting</groupId>
    		    <artifactId>dwr</artifactId>
    		    <version>3.0.2-RELEASE</version>
    		</dependency>
    		<!-- commons-logging -->
    		<dependency>
    		    <groupId>commons-logging</groupId>
    		    <artifactId>commons-logging</artifactId>
    		    <version>1.2</version>
    		</dependency>
    	</dependencies>
    	<build>
    		<finalName>DwrDemo</finalName>
    		<plugins>
    			<plugin>
    				<groupId>org.apache.maven.plugins</groupId>
    				<artifactId>maven-compiler-plugin</artifactId>
    				<version>3.7.0</version>
    				<configuration>
    					<target>1.8</target>
    					<source>1.8</source>
    					<encoding>UTF-8</encoding>
    				</configuration>
    			</plugin>
    		</plugins>
    	</build>
    </project>
    

    2.2 web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      version="3.0" metadata-complete="true">
      
      	<servlet>
      		<servlet-name>dwr</servlet-name>
      		<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
      		<init-param>
      			<param-name>activeReverseAjaxEnabled</param-name>
      			<param-value>true</param-value>
      			<description>使用服务器推技术(反转AJAX)</description>
      		</init-param>
      		<init-param>
      			<param-name>crossDomainSessionSecurity</param-name>
      			<param-value>false</param-value>
      			<description>使能够从其他域进行请求 true:开启 false:关闭</description>
      		</init-param>
      		<init-param>
      			<param-name>allowScriptTagRemoting</param-name>
      			<param-value>true</param-value>
      			<description>允许远程JS</description>
      		</init-param>
      		<init-param>
      			<param-name>debug</param-name>
      			<param-value>true</param-value>
      			<description>启动调试模式</description>
      		</init-param>
      	</servlet>
      	<servlet-mapping>
      		<servlet-name>dwr</servlet-name>
      		<url-pattern>/js/dwr/*</url-pattern>
      	</servlet-mapping>
      
    </web-app>
    

    2.3 java代码实现

    java代码用两种方式实现
    
    • 使用以前的老方法,现在已经被标注为过时,但依旧可以使用。适合使用旧版本的人使用
    • 使用最新的方法,适合使用新版本的人使用

    2.3.1 DwrPush.java

    package org.dwr.util;
    
    import java.util.Collection;
    
    import org.directwebremoting.ScriptBuffer;
    import org.directwebremoting.ScriptSession;
    import org.directwebremoting.WebContext;
    import org.directwebremoting.WebContextFactory;
    import org.directwebremoting.proxy.dwr.Util;
    
    public class DwrPush {
    
    	@SuppressWarnings("deprecation")
    	public void send(String msg) {
    		// 获取WebContext对象,获取request,session等的辅助类
    		WebContext webContext = WebContextFactory.get();
    		// 获取访问页面的所有用户
    		Collection<ScriptSession> sessions = webContext.getAllScriptSessions();
    		// 创建ScriptBuffer对象
    		ScriptBuffer sb = new ScriptBuffer();
    		// 调用old_callback方法,传入参数
    		sb.appendCall("old_callback", msg);
    		// 根据ScriptSession创建DWR的Util对象
    		Util util = new Util(sessions);
    		// 回调js方法
    		util.addScript(sb);
    	}
    	
    }
    

    2.3.2 NewDwrPush.java

        package org.dwr.util;
    
    import java.util.Collection;
    
    import org.directwebremoting.Browser;
    import org.directwebremoting.ScriptBuffer;
    import org.directwebremoting.ScriptSession;
    
    public class NewDwrPush {
    	
    	public void send(String msg) {
    		// 创建Runnable对象,设置回调对象以及回调方法
    		Runnable runnable = new Runnable() {
    			
    			// 创建ScriptBuffer对象
    			private ScriptBuffer script = new ScriptBuffer();
    			
    			@Override
    			public void run() {
    				// 设置要调用的js及参数
    				script.appendCall("new_callback", msg);
    				// 得到所有的ScriptSession对象
    				Collection<ScriptSession> sessions = Browser.getTargetSessions();
    				// 遍历每一个ScriptSession
    				for (ScriptSession session: sessions) {
    					session.addScript(script); // 将推送内容添加到ScriptSession中
    				}
    			}
    		};
    		
    		// 执行推送
    		Browser.withAllSessions(runnable);
    	}
    	
    }
    

    2.4 dwr.xml

    • dwr.xml默认必须放在WEB-INF
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE dwr PUBLIC
        "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN"
        "http://directwebremoting.org/schema/dwr30.dtd">
    <dwr>
    	<allow>
    		<create creator="new" javascript="DwrPush">
    			<param name="class" value="org.dwr.util.DwrPush"/>
    		</create>
    		
    		<create creator="new" javascript="NewDwrPush">
    			<param name="class" value="org.dwr.util.NewDwrPush"/>
    		</create>
    	</allow>
    </dwr>
    

    2.5 index.jsp

    • 页面里引入的js是由Dwr自动生成的,不用自己手动引入
    • engine.js和util.js路径是由配置在web.xml中的url-pattern去掉最前面的/加上名称。本例中指定的为/js/dwr/,则路径应为js/dwr/engine.jsjs/dwr/util.js*。
    • 自定义的js(js名称即为dwr.xml中create标签的javascript属性指定的)前缀跟engine.js等一样,不过要多加一层interface,本例即为js/dwr/interface/NewPush.js
    • engine.js和util.js需放在jquery.js之前
    <%@ 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>Dwr 测试</title>
    </head>
    <body>
    	<ul id="new_ul" style="color: red; font-size: 30px;">
    		<li>新推送方式</li>
    	</ul>
    	
    	<input type="text" name="new_msg" id="new_msg" size="30" style="height: 40px; font-size: 30px;"/>
    	<input type="button" id="new_sign" value="新方式发布信息"/>
    	
    	<ul id="old_ul" style="color: red; font-size: 30px;">
    		<li>旧推送方式</li>
    	</ul>
    	
    	<input type="text" name="old_msg" id="old_msg" size="30" style="height: 40px; font-size: 30px;"/>
    	<input type="button" id="old_sign" value="旧方式发布信息"/>
    	
    	
    	<!-- 处理所有服务器通信 -->
    	<script type="text/javascript" src="js/dwr/engine.js"></script>
    	<!-- 帮助你用你从服务器得到的数据改变网页 -->
    	<script type="text/javascript" src="js/dwr/util.js"></script>
    	<script type="text/javascript" src="js/dwr/interface/DwrPush.js"></script>
    	<script type="text/javascript" src="js/dwr/interface/NewDwrPush.js"></script>
    	<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
    	<script type="text/javascript">
    	
    		$(function() {
    			
    			// 启动该页面的Reverse Ajax功能
    			dwr.engine.setActiveReverseAjax(true);
    			
    			// 调用旧推送方式
    			$("#old_sign").click(function() {
    				DwrPush.send($("#old_msg").val());
    				
    			});
    			
    			// 调用新推送方式
    			$("#new_sign").click(function() {
    				NewDwrPush.send($("#new_msg").val());
    				
    			});
    			
    		});
    	
    		// 旧方式推送回调函数
    		function old_callback(msg) {
    			$("#old_ul").html($("#old_ul").html() + "<br/>" + msg);
    		}
    		
    		// 新方式推送回调函数
    		function new_callback(msg) {
    			$("#new_ul").html($("#new_ul").html() + "<br/>" + msg);
    		}
    	
    	</script>
    </body>
    </html>
    

    参考:
    Dwr实现JAVA服务器端向客户端推送消息
    更好的MarkDown体验:https://www.zybuluo.com/chy282/note/1012299


  • 相关阅读:
    测试心得---杂七杂八
    Redis 集群缓存测试要点--关于 线上 token 失效 BUG 的总结
    linux基础
    如何获取新系统的业务逻辑?
    python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon)
    python笔记8-多线程threading之封装式
    redis监控key失效
    使用PageHepler分页
    使用token和redis怎样判断账户是否失效和异地登录
    JSONObject
  • 原文地址:https://www.cnblogs.com/jinjiyese153/p/8250314.html
Copyright © 2020-2023  润新知