1:执行一个最简单的DWR程序,通常需要:
首先当然你要加入一个javascript的声明:
<script type='text/javascript' src='js/engine.js'></script>
当然,因为在dwr.xml中我们使用到了"javascript='service'",所以我们必须有以下这个声明,这时service.js文件可以不存在
<script type='text/javascript' src='dwr/interface/service.js'></script>
接下来,要用时,所要添加的便是:
<
script type
=
"
text/javascript
"
>
function
firstDwr()
{
service.sayHello("Jorwen",callBackHello);
}
function
callBackHello(datass)
{
alert(datass);
service.sayGoodBye("roger", {callback:callBackBye,
errorHandler:function(message) { alert("it broke"); },
timeout:0.0001
});
}
function
callBackBye(datasss)
{
alert(datasss);
}
</
script
>
先不管,代码是什么意思,也不讨论,有什么约束。在这里只要看下service.sayGoodBye("roger", ....),请记住,sayGoodBye这个方法是在服务器端的java方法,使用dwr可以让它转化为javascript,具体怎么做,dwr在底层帮我们实现。
在上面,主要有几部份,web.xml, dwr.xml, 几个dwr提供的JS文件,接下来就来讲解这些内容
web.xml
在上面我们看到dwr的servlet的class为
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
但有时我们在网上看到一些实例时,却是:
uk.ltd.getahead.dwr.DWRServlet
这是因为,前者的版本是2.X,后者是1.X。
其实,dwr在应用程序的配置文件中,最重要的便是:<init-param></init-param>的信息
这里给一个列表:
allowGetForSafariButMakeForgeryEasier:它的默认值为:false,以下这段解释摘自dwr官方网站:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
From DWR version 2.0 the default is to disallow GET requests because the majority of Safari users are on less buggy versions of the browser.
If you wish to enable GET for maximum compatibility, and accept the slightly increased security risks, you should set the allowGetForSafariButMakeForgeryEasier init-param to true.
做第一个DWR程序时,我发现有一个错误:session error 错误,后来到网上查了一下:
参数:crossDomainSessionSecurity
这个参数默认为:true, 设置成false使能够从其他域进行请求,它可能引发跨站请求的危险。
参数:debug,默认下为false,如果把它设为true
在debug模式里,DWR将为每个allow的类生成测试页面。这些能变得非常有用帮助了解DWR能做什么和如何工作。这个模式也能警告你以防止javascript的保留字,或者重载问题。
参数:scriptSessionTimeout,script session 超时(MS)
参数:maxCallCount:最大的调用数(批量时有效)
参数:pollAndCometEnabled,可以提高服务器加载能力,默认下为false
参数:maxWaitingThreads 默认值:100 ,最大等待线程数量。
参数:preStreamWaitTime 默认值:29000(单位:毫秒) ,对一个打开流前的反应,等待的最大时间
参数:postStreamWaitTime 默认值:1000(单位:毫秒) ,对一个打开流后的反应,等待的最大时间
先给出这些参数
如果,说只有一个dwr.xml文件,我们可不在这里配置,但是如果出现多个dwr.xml文件呢?
比如说,你想给不同的用户以不同的权限。你可以用这种方法来配置:
<
servlet
>
<
servlet-name
>
dwr-user-invoker
</
servlet-name
>
<
servlet-class
>
org.directwebremoting.servlet.DwrServlet
</
servlet-class
>
<
init-param
>
<
param-name
>
config-user
</
param-name
>
<!--
这个名字,必须以config开头
-->
<
param-value
>
WEB-INF/dwr-user.xml
</
param-value
>
</
init-param
>
</
servlet
>
<
servlet
>
<
servlet-name
>
dwr-admin-invoker
</
servlet-name
>
<
servlet-class
>
org.directwebremoting.servlet.DwrServlet
</
servlet-class
>
<
init-param
>
<
param-name
>
config-admin
</
param-name
>
<
param-value
>
WEB-INF/dwr-admin.xml
</
param-value
>
</
init-param
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>
dwr-admin-invoker
</
servlet-name
>
<
url-pattern
>
/dwradmin/*
</
url-pattern
>
</
servlet-mapping
>
<
servlet-mapping
>
<
servlet-name
>
dwr-user-invoker
</
servlet-name
>
<
url-pattern
>
/dwruser/*
</
url-pattern
>
</
servlet-mapping
>
<
security-constraint
>
<
display-name
>
dwr-admin
</
display-name
>
<
web-resource-collection
>
<
web-resource-name
>
dwr-admin-collection
</
web-resource-name
>
<
url-pattern
>
/dwradmin/*
</
url-pattern
>
</
web-resource-collection
>
<
auth-constraint
>
<
role-name
>
admin
</
role-name
>
</
auth-constraint
>
</
security-constraint
>
<
security-constraint
>
<
display-name
>
dwr-user
</
display-name
>
<
web-resource-collection
>
<
web-resource-name
>
dwr-user-collection
</
web-resource-name
>
<
url-pattern
>
/dwruser/*
</
url-pattern
>
</
web-resource-collection
>
<
auth-constraint
>
<
role-name
>
user
</
role-name
>
</
auth-constraint
>
</
security-constraint
>
以上为对web.xml的分析,接下来将对dwr.xml这个文件进行分析
dwr.xml
<?
xml version="1.0" encoding="UTF-8"
?>
<!
DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd"
>
<
dwr
>
<!--
仅当需要扩展DWR时才需要
-->
<
init
>
<!-- 在init部分里有了定义只是告诉DWR这些扩展类的存在,
给出了如何使用的信息。这时他们还没有被使用。 -->
<
creator
id
="..."
class
="..."
/>
<
converter
id
="..."
class
="..."
/>
</
init
>
<!--
没有它DWR什么也做不了
-->
<
allow
>
<
create
creator
="..."
javascript
="..."
/>
<
convert
converter
="..."
match
="..."
/>
</
allow
>
<!--
有必要告诉DWR方法签名
-->
<
signatures
>
...
</
signatures
>
</
dwr
>
接下就小结一下dwr中的JS
由于ajax是异步的,而java是同步的,这里就涉及了需要使ajax也能实现同步,这里用到回调。
这里有两种方法来回调:
scriptName.javaMethod(params, jsMethod);
function jsMethod(data)
{
这里的参数,应该最多只有一个。
}
当然也可以scriptName.javaMethod(params, function(data){...});代替上面的代码。
另外,我们还可以用到DWR中为我们提供的元对象来实现。
scriptName.javaMethod(params,
callback:function(data){...});我们还可以在这里面用到更多
比如:timeout:5000,
errorHandler:function(message) { alert("Oops: " + message); }
如果在java方法参数不是一般类型,我们应该在JS传值过程中这样做:
var temp = {
id:101,
code:"dafadfadfa",
array:[new Date(),new Date("2007-8-14")]
}
scriptName.javaMethod(temp);
其实上面讲了不少engine.js的内容,我们称之为DWR主引擎,在每个文件上要声明
<script type="text/javascript" src="/[YOUR-WEB-APP]/dwr/engine.js"> </script>
engine.js
如果多次使用,以最后一次为准。
小摘一些操作:
- 当然你要有dwr.jar(注意,你的dwr.jar的版本,1.X和2.X相差还是比较大的,以下内容均可用于2.X),并把它放到lib目录下;另外,你还必须要把engine.js放到web应用目录下,这个是必须的。
- 其实,DWR框架就是一个由servlet部署的框架,所以,我们接下来必须到web.xml声明servlet:
< 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 >
< init-param >
< param-name > crossDomainSessionSecurity </ param-name >
< param-value > false </ param-value >
</ init-param >
</ servlet >
< servlet-mapping >
< servlet-name > dwr-invoker </ servlet-name >
< url-pattern > /dwr/* </ url-pattern >
</ servlet-mapping >
- 接下来就是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 ="service" >
< param name ="class" value ="helloWorld.Service" />
</ create >
</ allow >
</ dwr >
首先当然你要加入一个javascript的声明:
<script type='text/javascript' src='js/engine.js'></script>
当然,因为在dwr.xml中我们使用到了"javascript='service'",所以我们必须有以下这个声明,这时service.js文件可以不存在
<script type='text/javascript' src='dwr/interface/service.js'></script>
接下来,要用时,所要添加的便是:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
在上面,主要有几部份,web.xml, dwr.xml, 几个dwr提供的JS文件,接下来就来讲解这些内容
web.xml
在上面我们看到dwr的servlet的class为
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
但有时我们在网上看到一些实例时,却是:
uk.ltd.getahead.dwr.DWRServlet
这是因为,前者的版本是2.X,后者是1.X。
其实,dwr在应用程序的配置文件中,最重要的便是:<init-param></init-param>的信息
这里给一个列表:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
参数:crossDomainSessionSecurity
这个参数默认为:true, 设置成false使能够从其他域进行请求,它可能引发跨站请求的危险。
参数:debug,默认下为false,如果把它设为true
在debug模式里,DWR将为每个allow的类生成测试页面。这些能变得非常有用帮助了解DWR能做什么和如何工作。这个模式也能警告你以防止javascript的保留字,或者重载问题。
参数:scriptSessionTimeout,script session 超时(MS)
参数:maxCallCount:最大的调用数(批量时有效)
参数:pollAndCometEnabled,可以提高服务器加载能力,默认下为false
参数:maxWaitingThreads 默认值:100 ,最大等待线程数量。
参数:preStreamWaitTime 默认值:29000(单位:毫秒) ,对一个打开流前的反应,等待的最大时间
参数:postStreamWaitTime 默认值:1000(单位:毫秒) ,对一个打开流后的反应,等待的最大时间
先给出这些参数
如果,说只有一个dwr.xml文件,我们可不在这里配置,但是如果出现多个dwr.xml文件呢?
比如说,你想给不同的用户以不同的权限。你可以用这种方法来配置:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
以上为对web.xml的分析,接下来将对dwr.xml这个文件进行分析
dwr.xml
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
<!-- 在init部分里有了定义只是告诉DWR这些扩展类的存在,
给出了如何使用的信息。这时他们还没有被使用。 -->
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
- 通常我们不会去用<init></init>这个元素
- <allow></allow>必须要,它定义了用dwr可以转化的类
- 在每一个类中需要有一个:<create></create>
- 它的属性中,creator,代表java对象创建时用什么方法来创建,默认下是new,当然如果这个类的域如果是“session”或更大,又或者方法是静态的,这里就需要用none
- javascript:,通俗的说就是在js中用什么来调用java方法,在文件中要有"javascriptName".js的声明
- scope,也就是域了
- param,这个视具体而言
- include列表则暗示默认的访问策略是"拒绝",include中的每个方法就是允许访问的方法;如果是exclude列表则暗示默认的访问策略是"允许",exclude中的每个方法就是拒绝访问的方法。
- Converter:这个是参数转化,通常,如果是基本类型,就不用在这里声明,比如:
-
你不需要在dwr.xml中<allow>部分的<convert>中定义。它们默认支持。
1所有主要的类型,boolean , int , double等等。
2包装类,Boolean , Integer等等。
3java.lang.String
4java.util.Date 和 java.sql.Times,java.sql.Timestamp。
5数组(存放以上类型的)
6集合类型 (List , Set , Map , Iterator等等) (存放以上类型的)
7DOM对象(来自于DOM , XOM , JDOM和DOM4J)
但是如果是自定义的类型,就需要使用到它了, - 日期转换器:即:java上的Date类型与JS中的String,通常而言,我们可以将string 传到java转化为date再转化string再回到JS。当然也可直接到date传给JS,它会直接转化。
- 数组转换器:有点麻烦,如果能转化为list或者其它就好办了。还有重新看下
- 当然还有一些转换器,还没有理解,以后再补充。
接下就小结一下dwr中的JS
由于ajax是异步的,而java是同步的,这里就涉及了需要使ajax也能实现同步,这里用到回调。
这里有两种方法来回调:
scriptName.javaMethod(params, jsMethod);
function jsMethod(data)
{
这里的参数,应该最多只有一个。
}
当然也可以scriptName.javaMethod(params, function(data){...});代替上面的代码。
另外,我们还可以用到DWR中为我们提供的元对象来实现。
scriptName.javaMethod(params,
callback:function(data){...});我们还可以在这里面用到更多
比如:timeout:5000,
errorHandler:function(message) { alert("Oops: " + message); }
如果在java方法参数不是一般类型,我们应该在JS传值过程中这样做:
var temp = {
id:101,
code:"dafadfadfa",
array:[new Date(),new Date("2007-8-14")]
}
scriptName.javaMethod(temp);
其实上面讲了不少engine.js的内容,我们称之为DWR主引擎,在每个文件上要声明
<script type="text/javascript" src="/[YOUR-WEB-APP]/dwr/engine.js"> </script>
engine.js
如果多次使用,以最后一次为准。
- 为了提高速度与效率,有必要在特定的情况用,批量处理,它是用一个batch以 DWREngine.beginBatch() 开始 ,并以 DWREngine.endBatch() 结束。
- 可以使用DWREngine.setErrorHandler(function)来改变错误处理方式,同样通过DWREngine.setWarningHandler(function)来改变警告处理方式,DWREngine.setTimeout()的单位是毫秒。如果调用超时发生,错误处理器就会被调用