Dwr初认识

来源:互联网 发布:网络用语奶是什么意思 编辑:程序博客网 时间:2024/05/22 10:51

转载地址:http://blog.csdn.net/u013628152/article/details/52069501

与此文无关的一个demo: http://download.csdn.net/detail/abcd1101/9739260

1、介绍

是一个框架,允许JavaScript通过DWR访问服务器上的Java代码。

2、组成和原理

基于AJAX的框架,包含两个主要部分: 
一个运行在服务器端的JavaServlet,它处理请求并且向浏览器发回响应; 
一个运行在浏览器端的Javascript,它发送请求而且能动态更新网页。

DWR的工作原理是,通过反射,将java翻译成javascript,然后利用回调机制,轻松实现了javascript调用Java代码 
大大简化了编写ajax的工作量,它不需要任何网页浏览器插件就能运行在网页上。

3:优点

(1)浏览器兼容; 
(2)json的封装; 
(3)多种对象的转换; 
(4)可以写更少的JS代码,做更多的事情。

4:应用

注意怎么应用,可以参考前一篇文章。《DWR消息推送技术》 
(这个标题有点狭隘O(∩_∩)O~)

<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/MessagePush.js"></script>
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

页面引用了三个js,第一个js是dwr的引擎,第二个js是dwr的工具类,第三个js是dwr自动生成的。

当访问页面时,并执行engine.js时,由于在web.xml配置了/dwr路径。 
(注意:在web.xml中配置DwrServlet的url-pattern,需要指到engine.js引擎所在的目录,否则DWR无法自动生成js文件)

DWR的DwrServlet会处理请求,然后将engine.js以流的形式发送给浏览器, 
根据dwr.xml配置的class路径,找到对应的java类,根据java类自动生成MessagePush.js,并同样以流的形式发送给浏览器,MessagePush.js都可以在浏览器的缓存里找到。

dwr.xml

<dwr><allow>      <create creator="new" javascript="MessagePush">       <param name="class" value="com.huatech.messageremind.service.MessagePush"/>    </create>     <create creator="new" javascript="TestPush">       <param name="class" value="com.huatech.messageremind.service.Test"/>    </create></allow></dwr>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

java代码

public class MessagePush {  /**   * 接收上线用户   * @param userId   */  public void onPageLoad(String userId) {    ScriptSession scriptSession = WebContextFactory.get().getScriptSession();    scriptSession.setAttribute(userId, userId);    DwrScriptSessionManagerUtil dwrScriptSessionManagerUtil = new DwrScriptSessionManagerUtil();    try {      dwrScriptSessionManagerUtil.init();    } catch (ServletException e) {      e.printStackTrace();    }  }  /**   * 单个设备推送   * @param userid   * @param message   */  public static void sendMessageSingle(String userid, String message) {    final String userId = userid;    final String autoMessage = message;    Browser.withAllSessionsFiltered(new ScriptSessionFilter() {      public boolean match(ScriptSession session) {        if (session.getAttribute("username") == null)          return false;        else          return (session.getAttribute("username")).equals(userId);      }    }, new Runnable() {      private ScriptBuffer script = new ScriptBuffer();      public void run() {        script.appendCall("showMessage", autoMessage);        Collection<ScriptSession> sessions = Browser            .getTargetSessions();        for (ScriptSession scriptSession : sessions) {          scriptSession.addScript(script);        }      }    });  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

//广播 
public static void sendBroadcastMessage(final String message) { 
Browser.withPage(“/dwr/”,new Runnable(){ 
public void run(){ 
ScriptSessions.addFunctionCall(“showMessage”, message); 

}); 
}

}

自动生成的MessagePush.js

if (typeof dwr == 'undefined' || dwr.engine == undefined) throw new Error('You must include DWR engine before including this file');(function() {  if (dwr.engine._getObject("MessagePush") == undefined) {    var p;    p = {};    p._path = '/dwr/dwr';    /**     * @param {class java.lang.String} p0 a param     * @param {function|Object} callback callback function or options object     */    p.onPageLoad = function(p0, callback) {      return dwr.engine._execute(p._path, 'MessagePush', 'onPageLoad', arguments);    };    /**     * @param {class java.lang.String} p0 a param     * @param {class java.lang.String} p1 a param     * @param {function|Object} callback callback function or options object     */    p.sendMessageSingle = function(p0, p1, callback) {      return dwr.engine._execute(p._path, 'MessagePush', 'sendMessageSingle', arguments);    };    /**     * @param {class java.lang.String} p0 a param     * @param {function|Object} callback callback function or options object     */    p.sendBroadcastMessage = function(p0, callback) {      return dwr.engine._execute(p._path, 'MessagePush', 'sendBroadcastMessage', arguments);    };    dwr.engine._setObject("MessagePush", p);  }})();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

可见,当我们在页面中使用MessagePush.sendMessageSingle(param); 
调用服务器端Java的方法sendMessageSingle()时,实际上是执行是 
dwr.engine._execute(p._path, ‘MessagePush’, ‘sendMessageSingle’, arguments);该请求同样被DwrServlet处理,然后在dwr.xml中查询到MessagePush的对应项目,然后根据配置信息,自己根据反射生成对象或者由spring注入对象,然后调用方法sendMessageSingle() ,将处理结果返回给浏览器,最后执行回调函数. 

0 0
原创粉丝点击