zoukankan      html  css  js  c++  java
  • 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


  • 相关阅读:
    LeetCode 42. Trapping Rain Water
    LeetCode 209. Minimum Size Subarray Sum
    LeetCode 50. Pow(x, n)
    LeetCode 80. Remove Duplicates from Sorted Array II
    Window10 激活
    Premiere 关键帧缩放
    AE 「酷酷的藤」特效字幕制作方法
    51Talk第一天 培训系列1
    Premiere 视频转场
    Premiere 暴徒生活Thug Life
  • 原文地址:https://www.cnblogs.com/jinjiyese153/p/8250314.html
Copyright © 2011-2022 走看看