转载地址: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>
'dwr/util.js'>"text/javascript" "dwr/interface/MessagePush.js">script>
页面引用了三个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
1
2
3
4
5
6
7
8
9
10
11
dwr>
allow>
create creator="new" javascript="MessagePush">
param name="class" value="com.huatech.messageremind.service.MessagePush"/>
create>
"TestPush">
"com.huatech.messageremind.service.Test"/>
create>
allow>
dwr>
java代码
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 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 */
static void sendMessageSingle(String userid,String message) {
final String userId = userid;
final String autoMessage = message;
Browser.withAllSessionsFiltered(new ScriptSessionFilter() {
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();
void run() {
script.appendCall("showMessage",autoMessage);
Collection<ScriptSession> sessions = Browser
.getTargetSessions();
for (ScriptSession scriptSession : sessions) {
scriptSession.addScript(script);
}
}
});
}
//广播 public static void sendBroadcastMessage(final String message) { Browser.withPage(“/dwr/”,new Runnable(){ public void run(){ ScriptSessions.addFunctionCall(“showMessage”,message); } }); }
}
自动生成的MessagePush.js
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
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',0); box-sizing: border-box;">'onPageLoad',arguments);
};
@param {class java.lang.String} p1 a param * @param {function|Object} callback callback function or options object */
p.sendMessageSingle = function(p0,p1,0); box-sizing: border-box;">'sendMessageSingle',102); box-sizing: border-box;">@param {function|Object} callback callback function or options object */
p.sendBroadcastMessage = function(p0,0); box-sizing: border-box;">'sendBroadcastMessage',arguments);
};
dwr.engine._setObject("MessagePush",p);
}
})();
可见,当我们在页面中使用MessagePush.sendMessageSingle(param); 调用服务器端Java的方法sendMessageSingle()时,实际上是执行是 dwr.engine._execute(p._path,‘MessagePush’,‘sendMessageSingle’,arguments);该请求同样被DwrServlet处理,然后在dwr.xml中查询到MessagePush的对应项目,然后根据配置信息,自己根据反射生成对象或者由spring注入对象,然后调用方法sendMessageSingle() ,将处理结果返回给浏览器,最后执行回调函数. (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|