DWR — 应用于JAVA的AJAX框架


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

DWR:是java的AJAX,它用来完成服务器上的bean对象与和客户端上的js对象的交互,可认为:dwr提供了用js操作java类对象的方式!!!

应用流程如下:

1,下载jar包放在web-inf 下的 lib中,同时注意dwr 需要commons-logging.包的支持,项目中也要有此包

2,编辑配置文件-web.xml

加入如下代码:
<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>

//这就为查看自动生成的映射文件 http://localhost:8080/lj/dwr/ 打下基础,
// 并且在页面中<script type=’text/javascript’ src=’/dwr/util.js’></script>时就会调用dwr这个servlet,完成功能。

注:DWR执行流程:
页面调用JLogin.checkLogin 之类的方法,会将其转到XMLHttpRequest,以get或post发送,当然地址中会用/dwr,
以让服务器接收时转到在web.xml中定义的servlet,这个servlet就会将传来的方法转到java方法调用,之后得用
XMLHttpRequest的回调函数传回数据
DWR:从事的就是javascript语法与java语法的转换工作。

3,在与web.xml同一目录下建立dwr.xml文件

<!DOCTYPE dwr PUBLIC
“-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN”
“http://getahead.org/dwr/dwr20.dtd”>

<dwr>
<allow>???????????????? //标签中包括可以暴露给javascript访问的东西。
<create creator=”new” javascript=”JDate”>
<param name=”class” value=”java.util.Date”/>
<include method=”checkLogin”/>
</create>
<create creator=”new” javascript=”Demo”>
<param name=”class” value=”your.java.Bean”/>
</create>

<convert converter=”bean” match=”com.lvjian.User”>
<param name=”include” value=”user” />
</convert>

</allow>
</dwr>

注:(1)creator=”new”代表用无参构造器来创建对象 ,也可用spring,由spring代理类的生命周期的管理
(2)javascript=”JDate” 指定在js中应用对象时的名称
(3)<param name=”class” value=”java.util.Date”/> 指定js对象JDate对应的java类
(4) <include method=”checkLogin”/> 指定公开给javascript的方法。不指定的话就公开所有方法。
对应有:<exclude>? 标签指定要防止被访问的方法。

(5)<convert>: <creator>标签负责公开用于Web远程的类和类的方法,<convertor>? 标签则负责这些方法
的参数和返回类型。
convert? 元素的作用是告诉DWR在服务器端Java对象表示和序列化的JavaScript之间如何转换数据类型。DWR? 自动地在Java和JavaScript
表示之间调整简单数据类型。这些类型包括? Java? 原生类型和它们各自的封装类表示,还有? String? 、Date? 、
数组和集合类型。??? DWR? 也能把? JavaBean? 转换成? JavaScript? 表示,但是出于安全性的原因,
要求显式的配置,
<convertor>? 标签就是完成此功能的。? converter=”bean”? 属性指定转换的方式采用? JavaBean? 命名规范,
match=””com.dwr.TestBean”? 属性指定要转换的? javabean? 名称,? <param>? 标签指定要转换的JavaBean? 属性。

若参数是集合类型,且其中的元素是自定义元素,那么就要用如下方式指定:

<dwr>
<allow>
<create creator=”new” javascript=”testClass” >
<param name=”class” value= “com.dwr.TestClass” />
<include method=”testMethod7″/>
</create>
<convert converter=”bean” match= “com.dwr.TestBean “>
<param name=”include” value=”username,password” />
</convert>
</allow>
<signatures>
<![CDATA[
import java.util.List;
import com.dwr.TestClass;
import com.dwr.TestBean;
TestClass.testMethod7(List<TestBean>);
]]>
</signatures>
</dwr>

<signatures>? 标签是用来声明? java? 方法中? List? 、? Set? 或者? Map? 参数所包含的确切类,以便? java? 代码作出判断

注:上述方式完成了js与java类对象的映射,在java类中定义方法时要注意两点:

(1)因js中delete为其关键字,故在java类在定义方法时不能指定delete方法。
(2)因js不支持重载方法,故其对应的类中不能有重载方法,不然在应用中调用的总会是重载方法中的最后一个方法

4,查看DWR自动生成的映射文件 http://localhost:8080/lj/dwr/,其中如下代码要包含在jsp文件中,

<script type=’text/javascript’ src=’/dwr/interface/JLogin.js’></script>
<script type=’text/javascript’ src=’/dwr/engine.js’></script>
<script type=’text/javascript’ src=’/dwr/util.js’></script>

5,应用:编写js文件,调用即可
(1) jsp:
包含的js文件:
<script type=’text/javascript’ src=’/dwr/interface/JLogin.js’></script>
<script type=’text/javascript’ src=’/dwr/engine.js’></script>
<script type=’text/javascript’ src=’/dwr/util.js’></script>

<script type=’text/javascript’ src=’js/login.js’></script>? //用来处理

调用:
<input type=”text” name=”userName” id=”userName” value=”goodday” onblur=”check()”>? //check来自login.js
<span id=”demoReply” style=”background:#eeffdd; padding-left:4px; padding-right:4px;”>&nbsp;</span>

(2) login.js如下:

function check(){
var name = dwr.util.getValue(“userName”);
JLogin.checkLogin(name, function(data) {
dwr.util.setValue(“demoReply”, data);
});
}

JLogin.checkLogin(name, function(data)) :
调用Login.checkLogin(name), 当结果返回时用data接收,并调用其后的方法(回调函数)

可以是:(1) JLogin.checkLogin(name, function(data))
(2) JLogin.checkLogin(name, myCallBack)

(3) JLogin.checkLogin(42, {
callback:myCallBack
});
第三种方式不仅易读,并且也可指定超时参数,及异常处理函数

JLogin.checkLogin(42, {
callback:myCallBack,
timeout:5000,
errorHandler:function(message) { alert(“Oops: ” + message); }
});

注:在js中创建对象并传递给java的方法:
(1) var p = {
name:”Fred Bloggs”,
age:42,
appointments:[ new Date(), new Date(“1 Jan 2008″) ]
};

JLogin.checkLogin(p, myCallBack)?? 那么在类的checkLogin参数须是一个类对象来接收封装而来的数据
(2) 带集合且集合元素都是自定义类

data = [
{
username:”user1″,
password:”password2″????????????????????? //第一个对象
},
{
username:”user2″,
password:” password2″???????????????????? //第二个对象
}
];

JLogin.checkLogin(p, myCallBack)??????? 那么在类的checkLogin参数须是一个类对象来接收封装而来的数据

6, 在js中访问java对象
JLogin.checkLogin(name, function(data))
(1)data为基型,直接操作
(2) data为一自定义对象, (在web.xml中配置<conventor>)
for(var property in data){
alert(“property:”+property);
alert(property+”:”+data[property]);? //或data.username
}

7,dwr.util

(1)获取及设置页面元素value
1) $()???????? 注:$ = document.getElementById
即:var user = $(‘admin.accounts’).value? 等同于 var user = document.getElementById(‘admin.accounts’).value

2)DWRUtil.getValue(id) 可以根据id取得value,使用这个方法,你不必在意div和select list的不同。

3)DWRUtil.getValues() 这个方法和getValue()一样,只是它传入的是一个包含名字和数值的javascript对象.这个名字就
是HTML元素的ID。这个方法不会返回任何对象,它只会将ID的value映射给传入的value。例:
4)DWRUtil.setValue(id, value) 用ID找到元素,并更新value
5)DWRUtil.setValues() 和setValue(id,value)一样,只是它需要的参数是个javascript对象

(2)操作页面元素
addRows()和removeAllRows()用于编辑tables。
addOptions()和removeAllOptions()用于编辑lists(如:select lists、ul、ol)。

DWR:是java的AJAX,它用来完成服务器上的bean对象与和客户端上的js对象的交互,可认为:dwr提供了用js操作java类对象的方式!!!

应用流程如下:

1,下载jar包放在web-inf 下的 lib中,同时注意dwr 需要commons-logging.包的支持,项目中也要有此包

2,编辑配置文件-web.xml

加入如下代码:
<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>

//这就为查看自动生成的映射文件 http://localhost:8080/lj/dwr/ 打下基础,
// 并且在页面中<script type=’text/javascript’ src=’/dwr/util.js’></script>时就会调用dwr这个servlet,完成功能。

注:DWR执行流程:
页面调用JLogin.checkLogin 之类的方法,会将其转到XMLHttpRequest,以get或post发送,当然地址中会用/dwr,以让服务器接收时
转到在web.xml中定义的servlet,这个servlet就会将传来的方法转到java方法调用,之后得用XMLHttpRequest的回调函数传回数据
DWR:从事的就是javascript语法与java语法的转换工作。

3,在与web.xml同一目录下建立dwr.xml文件

<!DOCTYPE dwr PUBLIC
“-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN”
“http://getahead.org/dwr/dwr20.dtd”>

<dwr>
<allow>???????????????? //标签中包括可以暴露给javascript访问的东西。
<create creator=”new” javascript=”JDate”>
<param name=”class” value=”java.util.Date”/>
<include method=”checkLogin”/>
</create>
<create creator=”new” javascript=”Demo”>
<param name=”class” value=”your.java.Bean”/>
</create>

<convert converter=”bean” match=”com.lvjian.User”>
<param name=”include” value=”user” />
</convert>

</allow>
</dwr>

注:(1)creator=”new”代表用无参构造器来创建对象 ,也可用spring,由spring代理类的生命周期的管理
(2)javascript=”JDate” 指定在js中应用对象时的名称
(3)<param name=”class” value=”java.util.Date”/> 指定js对象JDate对应的java类
(4) <include method=”checkLogin”/> 指定公开给javascript的方法。不指定的话就公开所有方法。
对应有:<exclude>? 标签指定要防止被访问的方法。

(5)<convert>: <creator>标签负责公开用于Web远程的类和类的方法,<convertor>? 标签则负责
这些方法的参数和返回类型。convert? 元素的作用是告诉DWR在服务器端Java对象表示和序列化的JavaScript
之间如何转换数据类型。DWR? 自动地在Java和JavaScript表示之间调整简单数据类型。这些类型包括? Java? 原生类型
和它们各自的封装类表示,还有? String? 、Date? 、数组和集合类型。
DWR? 也能把? JavaBean? 转换成? JavaScript? 表示,但是出于安全性的原因,要求显式的配置,
<convertor>? 标签就是完成此功能的。? converter=”bean”? 属性指定转换的方式采用? JavaBean? 命名规范,
match=””com.dwr.TestBean”? 属性指定要转换的? javabean? 名称,? <param>? 标签指定要转换的? JavaBean? 属性。

若参数是集合类型,且其中的元素是自定义元素,那么就要用如下方式指定:

<dwr>
<allow>
<create creator=”new” javascript=”testClass” >
<param name=”class” value= “com.dwr.TestClass” />
<include method=”testMethod7″/>
</create>
<convert converter=”bean” match= “com.dwr.TestBean “>
<param name=”include” value=”username,password” />
</convert>
</allow>
<signatures>
<![CDATA[
import java.util.List;
import com.dwr.TestClass;
import com.dwr.TestBean;
TestClass.testMethod7(List<TestBean>);
]]>
</signatures>
</dwr>

<signatures>? 标签是用来声明? java? 方法中? List? 、? Set? 或者? Map? 参数所包含的确切类,以便? java? 代码作出判断

注:上述方式完成了js与java类对象的映射,在java类中定义方法时要注意两点:

(1)因js中delete为其关键字,故在java类在定义方法时不能指定delete方法。
(2)因js不支持重载方法,故其对应的类中不能有重载方法,不然在应用中调用的总会是重载方法中的最后一个方法

4,查看DWR自动生成的映射文件 http://localhost:8080/lj/dwr/,其中如下代码要包含在jsp文件中,

<script type=’text/javascript’ src=’/dwr/interface/JLogin.js’></script>
<script type=’text/javascript’ src=’/dwr/engine.js’></script>
<script type=’text/javascript’ src=’/dwr/util.js’></script>

5,应用:编写js文件,调用即可
(1) jsp:
包含的js文件:
<script type=’text/javascript’ src=’/dwr/interface/JLogin.js’></script>
<script type=’text/javascript’ src=’/dwr/engine.js’></script>
<script type=’text/javascript’ src=’/dwr/util.js’></script>

<script type=’text/javascript’ src=’js/login.js’></script>? //用来处理

调用:
<input type=”text” name=”userName” id=”userName” value=”goodday” onblur=”check()”>? //check来自login.js
<span id=”demoReply” style=”background:#eeffdd; padding-left:4px; padding-right:4px;”>&nbsp;</span>

(2) login.js如下:

function check(){
var name = dwr.util.getValue(“userName”);
JLogin.checkLogin(name, function(data) {
dwr.util.setValue(“demoReply”, data);
});
}

JLogin.checkLogin(name, function(data)) :
调用Login.checkLogin(name), 当结果返回时用data接收,并调用其后的方法(回调函数)

可以是:(1) JLogin.checkLogin(name, function(data))
(2) JLogin.checkLogin(name, myCallBack)

(3) JLogin.checkLogin(42, {
callback:myCallBack
});
第三种方式不仅易读,并且也可指定超时参数,及异常处理函数

JLogin.checkLogin(42, {
callback:myCallBack,
timeout:5000,
errorHandler:function(message) { alert(“Oops: ” + message); }
});

注:在js中创建对象并传递给java的方法:
(1) var p = {
name:”Fred Bloggs”,
age:42,
appointments:[ new Date(), new Date(“1 Jan 2008″) ]
};

JLogin.checkLogin(p, myCallBack)?? 那么在类的checkLogin参数须是一个类对象来接收封装而来的数据? (2) 带集合且集合元素都是自定义类

data = [
{
username:”user1″,
password:”password2″????????????????????? //第一个对象
},
{
username:”user2″,
password:” password2″???????????????????? //第二个对象
}
];

JLogin.checkLogin(p, myCallBack)??????? 那么在类的checkLogin参数须是一个类对象来接收封装而来的数据

6, 在js中访问java对象
JLogin.checkLogin(name, function(data))
(1)data为基型,直接操作
(2) data为一自定义对象, (在web.xml中配置<conventor>)
for(var property in data){
alert(“property:”+property);
alert(property+”:”+data[property]);? //或data.username
}

7,dwr.util

(1)获取及设置页面元素value
1) $()???????? 注:$ = document.getElementById
即:var user = $(‘admin.accounts’).value? 等同于 var user = document.getElementById(‘admin.accounts’).value

2)DWRUtil.getValue(id) 可以根据id取得value,使用这个方法,你不必在意div和select list的不同。

3)DWRUtil.getValues() 这个方法和getValue()一样,只是它传入的是一个包含名字和数值的javascript对象.这个名字就
是HTML元素的ID。这个方法不会返回任何对象,它只会将ID的value映射给传入的value。例:
4)DWRUtil.setValue(id, value) 用ID找到元素,并更新value
5)DWRUtil.setValues() 和setValue(id,value)一样,只是它需要的参数是个javascript对象

(2)操作页面元素
addRows()和removeAllRows()用于编辑tables。
addOptions()和removeAllOptions()用于编辑lists(如:select lists、ul、ol)。