DWR使用

huanglianhuabj00 2014-12-25

一、简介

DWR(DirectWebRemoting)是一个WEB远程调用框架.利用这个框架可以让AJAX开发变得很简单.利用DWR可以在客户端利用JavaScript直接调用服务端的Java方法并返回值给JavaScript就好像直接本地客户端调用一样(DWR根据Java类来动态生成JavaScrip代码).它通过反射,将java翻译成javascript,然后利用回调机制,轻松实现了javascript调用Java代码。

二、开发过程

其大概开发过程如下:

1.编写业务代码,该代码是和dwr无关的。

2.确认业务代码中哪些类、哪些方法是要由javascript直接访问的。

3.编写dwr组件,对步骤2的方法进行封装。

4.配置dwr组件到dwr.xml文件中,如果有必要,配置convert,进行java和javascript类型互转。

5.通过反射机制,dwr将步骤4的类转换成javascript代码,提供给前台页面调用。

6.编写网页,调用步骤5的javascript中的相关方法(间接调用服务器端的相关类的方法),执行业务逻辑,将执行结果利用回调函数返回。

7.在回调函数中,得到执行结果后,可以继续编写业务逻辑的相关javascript代码。

三、配置

1).配置web.xml

<servlet>

<servlet-name>dwr-invoke</servlet-name>

<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet>

<init-param>//这个是调试用,如果正式发布请该为false,不过听说2.0就默认为true了

<param-name>debug</param-value>

<param-value>true</param-value>

</init-param>

<init-param>//这个是DWR2.0必须的,不然会报java.lang.IllegalArgumentException

<param-name>classes</param-value>

<param-value>java.lang.Object</param-value>

</servlet>

<servlet-mapping>

<servlet-name>dwr-invoke</servlet-name>

<url-pattern>/dwr/*</url-pattern>

</servlet-mapping>

2).配置dwr.xml

dwr.xml的作用是让你告诉DWR哪些class中的哪些方法你需要暴露给前台使用,当DWR启动时候根据dwr.xml这个文件把java类中的方法转成js中可用的类中方法,使前台可以使用。

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEdwrPUBLIC"-//GetAheadLimited//DTDDirectWebRemoting2.0//EN""http://getahead.org/dwr/dwr20.dtd">

<!--通用dwr配置-->

<dwr>

<allow>

<!--建立JS对象,将目标对象的方法转换成JS对象的方法-->

<createjavascript="testService"creator="new">

<paramname="class"value="services.testService"></param></create>

<!--从Spring中获取Java对象-->

<createjavascript="deptSrv"creator="spring">

<paramname="beanName"value="deptServices"></param>

<!--禁止执行-->

<excludemethod="deleteDept"/>

</create>

<createjavascript="loginSrv"creator="spring">

<paramname="beanName"value="loginSrv"></param></create>

<!--指定针对于特定对象的转换器-->

<convertmatch="entity.*"converter="bean"></convert>

<convertmatch="java.lang.Throwable"converter="bean"><paramname="include"value="message"></param>

</convert>

</allow>

</dwr>

3).js引入和调用

<scriptsrc="<%=basePath%>dwr/interface/testService.js"></script><scriptsrc="<%=basePath%>dwr/engine.js"></script>

//Dwr的脚本驱动Js,以上两个必写

<scriptsrc="<%=basePath%>dwr/util.js"></script>

//这是个工具包,可以不调用

<scripttype="text/javascript">

functiondoMethod()

{

//调用方法:若公开的类是testService,公开的testService里的方法是test([参数]);

testService.test([参数],callBack);//回调函数callBack()

}

functioncallBack(data)//data是后台返回的值,名字自取,也可省略,因为JS允许

{

处理方法……;//如果callBack()没有写明返回值,可以通过argments[0]拿到

}

</script>

DWR自动地在Java和JavaScript表示之间调整简单数据类型,这些类型包括Java原生类型和它们各自的封装类表示,还有String、Date、数组和集合类型。但如果参数类型非简单数据类型,则要通过转换。

在dwr.xml的<allow>标签中加入

<convertconverter="bean"match="***一般来说是javabean***">

//int,String,list等不需要显式的转换就可以被js拿到

<paramname="include"value="***javabean中的属性,用','隔开***"/></convert>

(1)调用有JavaBean参数的java方法

在JS端,把要传入的参数写成javabean方式,例:要传入一个名为student的javabean,参数有name,password,则

varstu={name:"zhangsan",password:"zspassword"};//这是json的表示方法

AAA.bbb(stu,callBack);

(2)调用返回List、Set或者Map的java方法

在JS端,以List,里面数据是bean为例,data是一个List型,只要用for循环就可以依次拿到数据。

遍历方法1:

for(vari=0;i<data.length;i++)

/*对于java方法的返回值为List(Set)的情况,DWR将其转化为Object数组,传递个javascript*/

{

alert(data[i].name+":"+data[i].password);

}

遍历方法2:

for(varpropertyindata)//property为序号,从0开始

{

varbean=data[property];

alert(bean.name+":"+bean.password);

}

如果java方法的返回值为Map,则如下

//property为key值

for(varpropertyindata)

/*对于java方法的返回值为Map的情况,DWR将其转化为一个Object,

其中Object的属性为原Map的key值,属性值为原Map相应的value值*/

{

varbean=data[property];

alert(bean.username);

alert(bean.password);

}

调用有List、Set或者Map参数的java方法

在dwr.xml的<dwr>标签内加入:<signatures>标签。

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

<signatures>

<![CDATA[

importjava.util.List;

importcom.dwr.AAA;//AAA的包路径要写完整

importcom.dwr.TestBean;//javabean

AAA.bbb(List<TestBean>);

]]>

</signatures>

参数是javabean的Map,key是String,value是javabean,如下:

varstu=

{

"key1":{name:"zhangsan",password:"zspassword"},

"key2":{name:"lisi",password:"lspassword"}

};

AAA.bbb(stu,callBack);

并且在dwr.xml中增加如下的配置段(刚才试验了下,不加也可以)

<signatures>

<![CDATA[

importjava.util.List;

importcom.dwr.AAA;//AAA的包路径要写完整

importcom.dwr.TestBean;//javabean

AAA.bbb(Map<String,TestBean>);

]]>

</signatures>

相关推荐