- 浏览: 458134 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
飞天奔月:
我来个简单点的代码 使用 LinkedHashSetpubli ...
ArrayList去重 -
飞天奔月:
public static <T> List< ...
ArrayList去重 -
aaron7524:
事务隔离级别 -
月陨殇:
wlh269 写道rswh110 写道lz内容写的不错,就是略 ...
事务隔离级别 -
lnx1824:
我的更奇怪,在本地静态的可以,放jetty里的页面后就不然,都 ...
JS得到上传图片尺寸
1.下载dwr.jar,将其加入web-inf/lib目录
2.修改web.xml文件,添加DWRServlet的映射
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
3.配置dwr,即在WEB-INF目录下,添加dwr.xml文件,让dwr知道在运行的时候应该给哪些JavaBean生成相应的javascript库!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="test1">
<param name="class" value="com.bjsxt.dwr.Test1"/>
</create>
</allow>
</dwr>
这个配置的意思是,要创建的是Test1对象的javascript库,而且这个库的名字叫test1,同时,这也是我们在JSP页面上调用这个对象的时候所使用的名称,
dwr.xml也支持spring:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="spring" javascript="aclManager">
<param name="beanName" value="aclManager"/><!--Spring配置文件中的bean:aclManager -->
</create>
</allow>
</dwr>
请看下面的JavaBean代码和JSP实例:
4、下面是Test1这个JavaBean的源代码:package com.bjsxt.dwr;
public class Test1 {
public String sayHello(String name){
return "你好,"+name;
}
}
5、在JSP中的使用!
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<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/test1.js"></script>
<title>Insert title here</title>
<script type="text/javascript">
function sayHello(){
test1.sayHello("李四ddd",
function(data){
alert(data);
}
);
}
</script>
</head>
<body>
<a href="#" onclick="sayHello()">Test1</a>
</body>
</html>
DWR原理
通过前面五章学习,对DWR整体有所了解,但是我仍然对核心细节不是很清楚。我最后的办法就是单步调试,调试之后将所有东西串一串,DWR的原理就清楚了,搞清楚核心生产线,其他全是辅助的,没必要再分析了。老外聪明啊,服。
我们以DWR的第一个样例为例Dynamically Text
1,在index.html里面我们嵌入
<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/Demo.js'> </script>
前面两个都是DWR系统默认需要加载的,Demo.js是Demo.java所对应的。按理论,只要在web.xml和dwr.xml配置好,那么我们就可以在客户端操作Demo.js,类似于操作服务器端的Demo.java。
HTML source:
<p>
Name:
<input type="text" id="demoName"/>
<input value="Send" type="button" onclick="update()"/>
<br/>
Reply: <span id="demoReply"></span>
</p>
Javascript source:
function update() {
var name = dwr.util.getValue("demoName");
Demo.sayHello(name, function(data) {
dwr.util.setValue("demoReply", data);
});
}
Java source:
package org.getahead.dwrdemo.simpletext;
public class Demo {
public String sayHello(String name) {
return "Hello, " + name;
}
}
dwr.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
"http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="Demo">
<param name="class" value="org.getahead.dwrdemo.simpletext.Demo"/>
</create>
</allow>
</dwr>
在浏览器第一次加载本页面时,浏览器第一步发现<script type='text/javascript' src='../dwr/engine.js'> </script>,根据web.xml关于dwr的配置,系统会激发Servlet的POST方法,向客户端输出engine.js文件流,这个文件你可以在IE的缓存里面发现,当然,程序会在最后输出一刻比较客户端是否已经存在该文件,如果要输出的文件流大小和和该文件大小一致,就不输出了,同样util.js、Demo.js也是这么输出的。那么看看Demo.js文件里面的内容如下:
if (typeof this['Person'] != 'function') {
function Person() {
this.address = null;
this.phoneNumber = null;
this.name = null;
this.id = 0;
this.salary = 0;
}
}
// Provide a default path to dwr.engine
if (typeof this['dwr'] == 'undefined') this.dwr = {};
if (typeof dwr['engine'] == 'undefined') dwr.engine = {};
if (typeof this['Demo'] == 'undefined') this.Demo = {};
Demo._path = '/dwr/dwr';
Demo.sayHello = function(p0, callback) {
return dwr.engine._execute(Demo._path, 'Demo', 'sayHello', p0, callback);
};
Demo.getInclude = function(callback) {
return dwr.engine._execute(Demo._path, 'Demo', 'getInclude', callback);
};
这样我们就知道了,实际上Demo.java类的sayHello方法已经被解释到Demo.js中了,只不过后面的调用还不是很清楚而已。
继续!
public String sayHello(String name) {
return "Hello, " + name;
}
翻译成
Demo._path = '/dwr/dwr';
Demo.sayHello = function(p0, callback) {
return dwr.engine._execute(Demo._path, 'Demo', 'sayHello', p0, callback);
};
在调用engine.execute()方法时,最终采用无刷新访问服务器技术。
采用该技术的关键问题是两个参数,一个是url,往什么地方发送;一个是doc,发送什么内容
通过跟踪engine.js我们知道
url=/dwr/dwr/call/plaincall/Demo.sayHello.dwr
发送内容如下:
callCount=1
windowName=DWR-442B435899
c0-scriptName=Demo
c0-methodName=sayHello
c0-id=0
c0-param0=string:Joe
batchId=1
page=/dwr/simpletext/index.html
httpSessionId=
scriptSessionId=1CC3A.0A3
实际上url=/dwr/dwr/call/plaincall/Demo.sayHello.dwr,转向的是DwrServlet,DwrServlet实际上获取了两部分信息,一部分是url,根据这个能够解析到我们的目标java类、方法,另外一部分是发送信息包,实际上这就是SayHello所需要的参数输入信息,最后,返回数据,这些数据格式通过response返回,在engine.js中对应于return batch.reply;通过解析返回对象,采用javascirpt将数据动态刷新到页面。
至此,dwr的核心原理,基本清晰
让我们简单看一下这个JSP文件:首先引入DWR中的两个核心javascript库:engine.js和util.js,它们分别是dwr中的核心引擎库和辅助工具函数库!
第三个引入的dwr/interface/test1.js,实际上这个文件并不存在,这是由dwr在运行的时候动态生成的!test1这个名称,跟dwr.xml文件中配置的对应对象的javascript属性一致!
而且,我们在使用的时候,直接使用test1这个名称,作为这个对象的引用。直接调用这个对象的方法:sayHello,这个方法的名称必须与JavaBean中的方法名称一致!
sayHello方法有一个参数,同时返回一个值。我们可以直接传递参数,同时指定一个javascript函数来处理这个返回值(如上例所示)。
如何传递参数
如果要调用的方法有参数,则将参数放在前面
如何处理返回值
定义一个函数来处理返回值,这个函数有一个参数,就是JavaBean方法的返回值
设置异步/同步模式
默认情况下,DWR以异步的方式跟服务器通信,即可以同时向服务器发送请求,如果想要改为同步的方式,可以调用:dwr.engine.setAsync(false);
获得对某个页面元素对象的引用
$(“元素的ID或名称”)
很不错,是看过的写的比较详细的,准备借鉴下
2.修改web.xml文件,添加DWRServlet的映射
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
3.配置dwr,即在WEB-INF目录下,添加dwr.xml文件,让dwr知道在运行的时候应该给哪些JavaBean生成相应的javascript库!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="test1">
<param name="class" value="com.bjsxt.dwr.Test1"/>
</create>
</allow>
</dwr>
这个配置的意思是,要创建的是Test1对象的javascript库,而且这个库的名字叫test1,同时,这也是我们在JSP页面上调用这个对象的时候所使用的名称,
dwr.xml也支持spring:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="spring" javascript="aclManager">
<param name="beanName" value="aclManager"/><!--Spring配置文件中的bean:aclManager -->
</create>
</allow>
</dwr>
请看下面的JavaBean代码和JSP实例:
4、下面是Test1这个JavaBean的源代码:package com.bjsxt.dwr;
public class Test1 {
public String sayHello(String name){
return "你好,"+name;
}
}
5、在JSP中的使用!
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<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/test1.js"></script>
<title>Insert title here</title>
<script type="text/javascript">
function sayHello(){
test1.sayHello("李四ddd",
function(data){
alert(data);
}
);
}
</script>
</head>
<body>
<a href="#" onclick="sayHello()">Test1</a>
</body>
</html>
DWR原理
通过前面五章学习,对DWR整体有所了解,但是我仍然对核心细节不是很清楚。我最后的办法就是单步调试,调试之后将所有东西串一串,DWR的原理就清楚了,搞清楚核心生产线,其他全是辅助的,没必要再分析了。老外聪明啊,服。
我们以DWR的第一个样例为例Dynamically Text
1,在index.html里面我们嵌入
<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/Demo.js'> </script>
前面两个都是DWR系统默认需要加载的,Demo.js是Demo.java所对应的。按理论,只要在web.xml和dwr.xml配置好,那么我们就可以在客户端操作Demo.js,类似于操作服务器端的Demo.java。
HTML source:
<p>
Name:
<input type="text" id="demoName"/>
<input value="Send" type="button" onclick="update()"/>
<br/>
Reply: <span id="demoReply"></span>
</p>
Javascript source:
function update() {
var name = dwr.util.getValue("demoName");
Demo.sayHello(name, function(data) {
dwr.util.setValue("demoReply", data);
});
}
Java source:
package org.getahead.dwrdemo.simpletext;
public class Demo {
public String sayHello(String name) {
return "Hello, " + name;
}
}
dwr.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
"http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="new" javascript="Demo">
<param name="class" value="org.getahead.dwrdemo.simpletext.Demo"/>
</create>
</allow>
</dwr>
在浏览器第一次加载本页面时,浏览器第一步发现<script type='text/javascript' src='../dwr/engine.js'> </script>,根据web.xml关于dwr的配置,系统会激发Servlet的POST方法,向客户端输出engine.js文件流,这个文件你可以在IE的缓存里面发现,当然,程序会在最后输出一刻比较客户端是否已经存在该文件,如果要输出的文件流大小和和该文件大小一致,就不输出了,同样util.js、Demo.js也是这么输出的。那么看看Demo.js文件里面的内容如下:
if (typeof this['Person'] != 'function') {
function Person() {
this.address = null;
this.phoneNumber = null;
this.name = null;
this.id = 0;
this.salary = 0;
}
}
// Provide a default path to dwr.engine
if (typeof this['dwr'] == 'undefined') this.dwr = {};
if (typeof dwr['engine'] == 'undefined') dwr.engine = {};
if (typeof this['Demo'] == 'undefined') this.Demo = {};
Demo._path = '/dwr/dwr';
Demo.sayHello = function(p0, callback) {
return dwr.engine._execute(Demo._path, 'Demo', 'sayHello', p0, callback);
};
Demo.getInclude = function(callback) {
return dwr.engine._execute(Demo._path, 'Demo', 'getInclude', callback);
};
这样我们就知道了,实际上Demo.java类的sayHello方法已经被解释到Demo.js中了,只不过后面的调用还不是很清楚而已。
继续!
public String sayHello(String name) {
return "Hello, " + name;
}
翻译成
Demo._path = '/dwr/dwr';
Demo.sayHello = function(p0, callback) {
return dwr.engine._execute(Demo._path, 'Demo', 'sayHello', p0, callback);
};
在调用engine.execute()方法时,最终采用无刷新访问服务器技术。
采用该技术的关键问题是两个参数,一个是url,往什么地方发送;一个是doc,发送什么内容
通过跟踪engine.js我们知道
url=/dwr/dwr/call/plaincall/Demo.sayHello.dwr
发送内容如下:
callCount=1
windowName=DWR-442B435899
c0-scriptName=Demo
c0-methodName=sayHello
c0-id=0
c0-param0=string:Joe
batchId=1
page=/dwr/simpletext/index.html
httpSessionId=
scriptSessionId=1CC3A.0A3
实际上url=/dwr/dwr/call/plaincall/Demo.sayHello.dwr,转向的是DwrServlet,DwrServlet实际上获取了两部分信息,一部分是url,根据这个能够解析到我们的目标java类、方法,另外一部分是发送信息包,实际上这就是SayHello所需要的参数输入信息,最后,返回数据,这些数据格式通过response返回,在engine.js中对应于return batch.reply;通过解析返回对象,采用javascirpt将数据动态刷新到页面。
至此,dwr的核心原理,基本清晰
让我们简单看一下这个JSP文件:首先引入DWR中的两个核心javascript库:engine.js和util.js,它们分别是dwr中的核心引擎库和辅助工具函数库!
第三个引入的dwr/interface/test1.js,实际上这个文件并不存在,这是由dwr在运行的时候动态生成的!test1这个名称,跟dwr.xml文件中配置的对应对象的javascript属性一致!
而且,我们在使用的时候,直接使用test1这个名称,作为这个对象的引用。直接调用这个对象的方法:sayHello,这个方法的名称必须与JavaBean中的方法名称一致!
sayHello方法有一个参数,同时返回一个值。我们可以直接传递参数,同时指定一个javascript函数来处理这个返回值(如上例所示)。
如何传递参数
如果要调用的方法有参数,则将参数放在前面
如何处理返回值
定义一个函数来处理返回值,这个函数有一个参数,就是JavaBean方法的返回值
设置异步/同步模式
默认情况下,DWR以异步的方式跟服务器通信,即可以同时向服务器发送请求,如果想要改为同步的方式,可以调用:dwr.engine.setAsync(false);
获得对某个页面元素对象的引用
$(“元素的ID或名称”)
评论
3 楼
cathong
2010-01-05
很不错,是看过的写的比较详细的,准备借鉴下
2 楼
120153216
2009-10-27
也辛苦的哦。
1 楼
gaozi131
2009-10-26
好文章 让我对DWR了解更深了 尤其是对其工作原理 谢谢
发表评论
-
JS判断字符串长度
2010-02-06 15:12 2084//判断字符长度 function CheckLengt ... -
JavaScript 判断文件后缀名!
2010-01-22 09:07 5882浏览含有纳税人信息的Excel文件<b ... -
JavaScript字符串替换
2010-01-04 13:27 2029/** **将所有的字符串fromStr替换成toSt ... -
JavaScript日期格式化
2010-01-04 13:20 1792Date.prototype.format = funct ... -
select中option的选中,撤销、上移和下移,和倒序
2009-12-28 15:24 5199//倒序算法 function reverseO ... -
openwindow 居中
2009-12-23 11:06 1054function openWin(u, w, h) { ... -
div居中(滑动滚动条)
2009-12-15 08:57 2632在滑动滚动条的情况下,div始终定位到当前窗口的中心! ... -
FCKEditor 实例2.5
2009-12-14 16:11 1228好不容易找到一个可以应用的例子, 可以应用于tomcat5,希 ... -
JS得到上传图片尺寸
2009-11-29 14:47 9481<html> <head> & ... -
option的动态添加和选中
2009-11-27 17:43 1909//==========添加option======= ... -
js动态添加和删除一行
2009-11-25 12:54 2434<%@ page languag ... -
javascrpit总结
2009-08-17 13:14 1147//==========找到父窗口的元素==== ... -
鼠标3秒不动,页面自动跳转到别的页面
2009-07-20 17:43 3671index.html <!DOCTYPE htm ... -
js页面刷新总结
2009-04-27 10:36 53022) <script> window.lo ... -
JS正则表达式基础
2009-04-22 00:54 1022字符/ 意义:对于字符,通常表示按字面意义,指出接着的字符为 ... -
JS通用表单验证函数1
2009-04-21 23:44 1166/** * 取得字符串的字节长度 */ fun ... -
js校验常用方法
2009-03-29 19:45 1190function ChkUtil() { } //校验是 ... -
ajax乱码解决总结
2009-03-01 18:30 1147第一,javascript沿用java的字符处理方式,内部是使 ... -
ajax分页显示
2009-02-28 15:54 12251.获得dom(document)的方 ... -
树形展示
2009-02-17 12:48 13001.onreadystatechange后面跟的js函数名;而 ...
相关推荐
在这个压缩包中,包含了一系列关于DWR技术分析、学习资料以及相关的界面开发内容,对于理解和掌握DWR技术至关重要。 首先,DWR的XML配置文件是连接客户端与服务器端的关键,它定义了哪些Java对象和方法可以被...
### DWR源码分析与应用解析 #### DWR框架简介 DWR,全称为Direct Web Remoting,是一款轻量级的远程调用框架,旨在简化Web应用中的JavaScript与Java之间的通信。通过DWR,开发者可以直接从JavaScript调用服务器端...
DWR的实例war文件通常包含了一个预配置的DWR应用,展示了如何在实际项目中集成和使用DWR。通过分析这个war文件,开发者可以学习如何配置DWR的XML配置文件(dwr.xml),以及如何创建可从JavaScript调用的Java方法。 ...
如果使用dwr.xml,你需要在配置文件中定义这些Java类和方法。如果使用注解,只需在Java类中添加相应的DWR注解。 4. **导入JavaScript库**: 在HTML页面中,你需要引入DWR生成的JavaScript文件,这些文件包含了...
在本文中,我们将深入探讨DWR的技术分析、配置使用以及如何将其集成到您的项目中。 **1. DWR的基本概念** DWR的核心功能是提供一种安全、高效的机制,让JavaScript能够调用Java对象的方法,这被称为远程方法调用...
通过分析这些文件,你可以更深入地理解DWR的工作机制和使用方法。 8. **应用场景**:DWR适用于需要实时更新数据的Web应用,如聊天室、股票报价、在线编辑器等。 通过这个实例,你可以学习如何设置DWR环境,编写可...
DWR (Direct Web Remoting) 是一个开源Java库,它允许Web应用程序在浏览器和服务器之间进行实时通信,而无需使用插件或复杂的JavaScript代码。DWR的使用通常结合其他流行的Java开发框架,如Struts、Spring(SSH中的S...
**标题:“dwr和ssh的集成源码”** ...总的来说,这个集成示例对于初学者来说是一份宝贵的教育资源,虽然可能存在不规范之处,但通过对这些代码的分析和修改,可以加深对DWR和SSH框架的理解,进一步提高开发技能。
4. **没有cookies的情况下使用DWR**:提供替代方案,比如使用URL重写来绕过对cookies的依赖。 **10.2 JavaScript高级应用**:深入探讨JavaScript语言的一些高级特性,帮助开发者更好地利用DWR。 1. **用变量操纵...
2. **安全控制**:DWR提供了安全性控制机制,例如使用白名单限制可调用的Java方法,防止跨站脚本攻击(XSS)和跨站请求伪造(CSRF)。 3. **缓存策略**:DWR支持缓存,提高性能,减少网络传输。同时,它也提供了...
通过研究这个"TestDwr"项目,你可以了解到如何在实际应用中集成和使用DWR,理解DWR的工作原理,并掌握创建交互式Web应用的基本技能。这个简单的例子可以帮助你快速上手DWR,为后续深入学习和实践打下基础。
这个“DWR技术文章精选”压缩包文件包含了关于DWR的相关资料,可能是博客文章、笔记或者教程,帮助我们深入理解DWR的核心特性和使用方法。 1. **DWR 概述**: DWR 是一种AJAX框架,它通过JavaScript与Java进行通信...
通过对比 DWR 3.0 和 DWR 2.0 的不同之处,我们可以看出 DWR 3.0 在多个方面进行了显著的改进和增强。无论是在架构设计、性能优化还是安全性增强等方面,DWR 3.0 都展现出了更强的能力。此外,它还提供了更为丰富的 ...
通过对这些文件的分析和学习,我们可以深入理解DWR如何与数据库交互,以及如何构建动态的前端界面。 总之,DWR级联菜单下拉框是利用DWR和AJAX技术实现的动态交互功能,它简化了前后端通信,提供了更流畅的用户体验...
通过上述方法之一或结合使用,可以有效地解决jQuery和DWR.utls之间的冲突,确保两者的正常工作。在实际开发中,理解这些技术并灵活应用,可以帮助我们构建更稳定、更可靠的Web应用程序。在遇到类似问题时,应该首先...
总的来说,DWR分页源码的分析和学习可以帮助开发者更好地理解和实现Ajax分页,提升Web应用的用户体验。通过深入研究这些代码,我们可以学习到DWR与Ajax的集成、服务器端数据处理以及前端交互设计等方面的知识。
这个示例工程提供了从头开始设置和使用DWR的全过程,通过运行并分析其中的代码,开发者可以深入理解DWR的工作方式和实际应用。对于初学者来说,这是一个很好的学习资源,可以帮助他们快速掌握DWR技术。
通过分析和运行这些示例,你可以更深入地理解如何利用DWR实现动态Web交互,例如实时数据更新、异步表单提交、动态图表生成等。 总的来说,DWR是一个强大的工具,它简化了Ajax开发,让Web应用更加生动、交互性更强。...
通过分析和运行这个DEMO,你可以深入理解DWR的工作原理,以及如何在实际项目中利用DWR实现高效、便捷的前后台交互。这将对提升你的Web开发技能,特别是对于需要实时更新和异步交互的应用场景,具有很大的帮助。
标签“源码”和“工具”提示我们,内容可能包括DWR的源代码分析以及它是如何作为一个开发工具来帮助开发者提高效率的。源码分析可以帮助我们理解其内部工作原理,而工具的标签则强调了DWR作为开发者工具箱中的一员,...