DWR的学习

1、DWR简介

    借用百度百科的原话--DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站。它可以允许在浏览器里的代码使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样。

    这段话对于初学者来说有点难理解,按照我的理解是,这是一个可以在JavaScript上调用java方法的框架,并且还有更加强大的推送功能--在java语言里指定调用任何一个jsp/html页面里的任何js函数。从而实现精准推送。

2、开始准备DWR环境

    (1)下载jar包

        可以在DWR官方页面中下载,里面有开发文档、jar包和官方的例子,这里我们只下载jar包,连接地址为http://directwebremoting.org/dwr/

    (2)配置工作环境

        1、首先在myeclipse/eclipse新建web项目,在导入dwr.jar包后,还需导入另外一个必须的jar包,初学者容易在这里吃亏,如:,接着在web.xml文件里添加如下代码:

<!-- DWR服务器推技术 -->
    <servlet> 
        <servlet-name>dwr-invoker</servlet-name> 
        <servlet-class> 
            org.directwebremoting.servlet.DwrServlet 
        </servlet-class> 
        <init-param> 
            <description>调试DWR,发布系统时应将其设为false</description> 
            <param-name>debug</param-name> 
            <param-value>true</param-value> 
        </init-param> 
        <init-param> 
            <description>使用服务器推技术(反转AJAX)</description> 
            <param-name>activeReverseAjaxEnabled</param-name> 
            <param-value>true</param-value> 
        </init-param> 
        <init-param> 
            <param-name> 
               initApplicationScopeCreatorsAtStartup 
            </param-name> 
            <param-value>true</param-value> 
        </init-param>
        <init-param> 
            <param-name>maxWaitAfterWrite</param-name> 
            <param-value>100</param-value> 
        </init-param> 
        <load-on-startup>4</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
        <servlet-name>dwr-invoker</servlet-name> 
        <url-pattern>/dwr/*</url-pattern> 
    </servlet-mapping> /

        2、第二步,在与web.xml文件同一级的目录下新建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>
		<!-- creator="new"指java的创建方法 ,在与spring融合后,这里配置为creator="spring"-->
		<!-- javascript="dwrTest"指在javascript中调用java方法的变量名 -->
		<!-- scope属性与servlet规范定义的scope属性基本相同,有"application", "session", "request", "page"(默认),还有一个"script" -->
		<create creator="new" javascript="dwrTest" scope="application">
			<!-- name属性在与spring融合后,值为beanName -->
			<param name="class" value="com.jason.test.DwrTest"></param>
			<!-- include指可使用的方法,另外还有exclude不可使用的方法 -->
				<include method="getHello"/>
				<include method="getStudent"/>
				<exclude/>
		</create>
		
	</allow>
</dwr>

   (3)新建一个 java类

        这里新建的类用户演示dwr的基础功能--在JavaScript中调用java方法,上一步的第一个create的配置与之对应,其类的代码如下:

package com.jason.test;

import java.util.Date;

public class DwrTest {
	
	public String getHello(){
		System.out.println("已执行。。。。");
		return "Hello World ,now it is "+new Date();
	}
}

    (4)在jsp页面配置

        在页面上加上如下代码:

        <script type='text/javascript' src='dwr/engine.js'></script>  
	<script type='text/javascript' src='dwr/util.js'></script>  
	<script type='text/javascript' src='dwr/interface/dwrTest.js'></script>

        前面两条是必须,最后一条是引用在dwr.xml配置的javascript="dwrTest"。

        具体的代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	
	<script type='text/javascript' src='dwr/engine.js'></script>  
	<script type='text/javascript' src='dwr/util.js'></script>  
	<script type='text/javascript' src='dwr/interface/dwrTest.js'></script>
  </head>
  
  <body>
    <button name="testDwr" οnclick="testDwr()">DWR测试</button>
    <input type="text" id="demo" size="40">
  </body>
  <script type="text/javascript">
  	function testDwr(){
  		dwrTest.getHello(callback); //调用java方法,其参数为回调函数,如是java带参的方法,则在回调函数前放参数值。
  		
  	}
  	var callback = function mycall(data){
  		dwr.util.setValue("demo",data);
  	}
  </script>
</html>

当DWR测试按钮点击后,其页面如下:


至此,dwr最基本的功能已实现。。。

3、DWR推送功能

    (1)新建java类

        引用上面的配置,首先新建一个DwrScriptSessionManagerUtil类,继承dwr的DwrServlet类,其作用可在页面创建打开时,记录当前用户,但这里只做展示

package com.jason.push;

import org.directwebremoting.Container;
import org.directwebremoting.ServerContextFactory;
import org.directwebremoting.event.ScriptSessionEvent;
import org.directwebremoting.event.ScriptSessionListener;
import org.directwebremoting.extend.ScriptSessionManager;
import org.directwebremoting.servlet.DwrServlet;
/**
 * 加载页面时,获取在线用户
 * @author jason
 *
 */
public class DwrScriptSessionManagerUtil extends DwrServlet{

	private static final long serialVersionUID = 1L;

	public void init(){
		Container container = ServerContextFactory.get().getContainer();
		ScriptSessionManager manager = container.getBean(ScriptSessionManager.class);
		ScriptSessionListener listener = new ScriptSessionListener() {
			
			@Override
			public void sessionDestroyed(ScriptSessionEvent ev) {
				System.out.println("a ScriptSession sessionDestroyed!");
				
			}
			
			@Override
			public void sessionCreated(ScriptSessionEvent ev) {
				System.out.println("a ScriptSession sessionCreated");
				//ev.getSession().setAttribute("userId", userId);
				
			}
		};
		manager.addScriptSessionListener(listener);
	}

}

        接着再新建DemoTest类,用于实现主要功能

package com.jason.push;

import java.util.Collection;

import org.directwebremoting.Browser;
import org.directwebremoting.ScriptBuffer;
import org.directwebremoting.ScriptSession;
import org.directwebremoting.ScriptSessionFilter;
import org.directwebremoting.WebContextFactory;

public class DemoTest {
	
	public void onPageLoad(String userId){
		ScriptSession scriptSession = WebContextFactory.get().getScriptSession();
		scriptSession.setAttribute("userId", userId);  //记录登录用户
		DwrScriptSessionManagerUtil dssm = new DwrScriptSessionManagerUtil();
		dssm.init();
	}
	
	public void sendMsg(String userid, String message) {

        final String userId = userid;

        final String msg = message;

        final String jsFunc = "receiveMsg";   //推送到页面的JavaScript函数名
        System.out.println("sendMsg");
        Browser.withAllSessionsFiltered(new ScriptSessionFilter() {

            public boolean match(ScriptSession session) {   //过滤推送,在此可以实现精准推送

                if (session.getAttribute("userId")==null){

                    return false;

                }else {

                    return (session.getAttribute("userId")).equals(userId);

                }

            }

        },new Runnable() {

            private ScriptBuffer script = new ScriptBuffer();

            public void run() {

                // 推送消息

                script.appendCall(jsFunc,msg);

                Collection<ScriptSession> sessions = Browser.getTargetSessions();

                for (ScriptSession scriptSession : sessions) {

                    scriptSession.addScript(script);

                }

            }

        });

    }

}

    (2)配置dwr.xml

    加上如下代码即可

           <create creator="new" javascript="DemoTest">
			<param name="class" value="com.jason.push.DemoTest"></param>
		</create>

    (3)新建jsp页面

    在这里我新建两个jsp页面进行演示,新建push.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'Push.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	<script type='text/javascript' src='dwr/engine.js'></script>  

	<script type='text/javascript' src='dwr/util.js'></script>  

	<script type='text/javascript' src='dwr/interface/DemoTest.js'></script>
  </head>
  
  <body>
	消息:<input type="text" id="msg"/>
	<button οnclick="send();">发送</button><br>
	接收的消息:<div id="receive"></div>
	
  </body>
  <script type="text/javascript">
  	function init(){
  		dwr.engine.setActiveReverseAjax(true);  //激活ajax反转
  		dwr.engine.setNotifyServerOnPageUnload(true);
  		DemoTest.onPageLoad("1");
  	}
  	window.onload = init;
  	function send(){
  		var msg = document.getElementById("msg").value;
  		DemoTest.sendMsg("2",msg);
  	}
  	var receiveMsg = function receiveMsg(msg){
  		document.getElementById("receive").innerText += msg+"\r\n";
  	}
  </script>
</html>

        新建receive.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'Push.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	<script type='text/javascript' src='dwr/engine.js'></script>  

	<script type='text/javascript' src='dwr/util.js'></script>  

	<script type='text/javascript' src='dwr/interface/DemoTest.js'></script>
  </head>
  
  <body>
  	消息:<input type="text" id="msg"/>
	<button οnclick="send();">发送</button><br>
	接收的消息:<div id="receive"></div>
  </body>
  <script type="text/javascript">
  	function init(){
  		dwr.engine.setActiveReverseAjax(true);  //激活ajax反转
  		dwr.engine.setNotifyServerOnPageUnload(true);
  		DemoTest.onPageLoad("2");
  	}
  	window.onload = init;
  	function send(){
  		var msg = document.getElementById("msg").value;
  		DemoTest.sendMsg("1",msg);
  	}
  	var receiveMsg = function receiveMsg(msg){
  		document.getElementById("receive").innerText += msg+"\r\n";
  	}
  </script>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值