`

DWR使用

阅读更多
一、简介
   DWR(Direct Web Remoting)是一个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中可用的类中方法,使前台可以使用。
<?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配置 -->
<dwr>   
  <allow>      
  <!-- 建立JS对象,将目标对象的方法转换成JS对象的方法 -->       
<create javascript="testService" creator="new">           
   <param name="class" value="services.testService"></param>        </create>      
<!-- 从Spring中获取Java对象 -->       
<create javascript="deptSrv" creator="spring">           
  <param name="beanName" value="deptServices"></param>           
   <!-- 禁止执行 -->           
  <exclude method="deleteDept" />       
</create>       
<create javascript="loginSrv" creator="spring">           
   <param name="beanName" value="loginSrv"></param>        </create>       
<!-- 指定针对于特定对象的转换器 -->       
  <convert match="entity.*" converter="bean"></convert>       
  <convert match="java.lang.Throwable" converter="bean">              <param name="include" value="message"></param>       
   </convert>  
</allow>
</dwr>

3).js引入和调用
<script src="<%=basePath %>dwr/interface/testService.js"></script>  <script src="<%=basePath %>dwr/engine.js"></script>  
//Dwr的脚本驱动Js,以上两个必写
<script src="<%=basePath %>dwr/util.js"></script>  
//这是个工具包,可以不调用
<script type="text/javascript">
    function doMethod()
    {
        //调用方法:若公开的类是testService,公开的testService里的方法是test([参数]);
        testService.test([参数],callBack);//回调函数callBack()
    }

    function callBack(data)//data是后台返回的值,名字自取,也可省略,因为JS允许
    {
       处理方法……;//如果callBack()没有写明返回值,可以通过argments[0]拿到
    }
</script>

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

<convert converter="bean" match="***一般来说是javabean***"> 
//int,String,list等不需要显式的转换就可以被js拿到
    <param name="include" value="***javabean中的属性,用','隔开***" />  </convert>

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

在JS端,把要传入的参数写成javabean方式,例:要传入一个名为student的javabean,参数有name,password,则
var stu = {name:"zhangsan",password:"zspassword"}; //这是json的表示方法
AAA.bbb(stu,callBack);

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

在JS端,以List,里面数据是bean为例,data是一个List型,只要用for循环就可以依次拿到数据。
遍历方法1:
for(var i=0;i<data.length;i++) 
    /*对于java方法的返回值为List(Set)的情况,DWR将其转                                 化为Object数组,传递个javascript*/
{
    alert(data[i].name+":"+data[i].password);
}

遍历方法2:
for(var property in data) //property为序号,从0开始
{
    var bean = data[property];
    alert(bean.name+":"+bean.password);
}

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

//property为key值
for(var property in data)    
/*对于 java方法的返回值为Map的情况,DWR将其转化为一个Object,
其中Object的属性为原Map的key值,属性值为原Map相应的 value值*/
{
  var bean = 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[
  import java.util.List;
  import com.dwr.AAA;     //AAA的包路径要写完整
  import com.dwr.TestBean;  //javabean
  AAA.bbb(List<TestBean>);
]]>
</signatures>
参数是javabean的Map,key是String,value是javabean,如下:
var stu =

{
    "key1":{name:"zhangsan",password:"zspassword"},
    "key2":{name:"lisi",password:"lspassword"}
};

AAA.bbb(stu,callBack);


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

<signatures>
<![CDATA[
  import java.util.List;
  import com.dwr.AAA;     //AAA的包路径要写完整
  import com.dwr.TestBean;  //javabean
  AAA.bbb(Map<String,TestBean>);
]]>
</signatures>















0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics