当前位置: 代码迷 >> Web前端 >> DWR运行机制简析及容易实例的实现
  详细解决方案

DWR运行机制简析及容易实例的实现

热度:539   发布时间:2012-10-30 16:13:36.0
DWR运行机制简析及简单实例的实现

? 首先,我们讨论什么是真正的DWR。DWR是Direct Web Remoting的缩写,是Java和JavaScript相结合的开源库。通过它,可以简单、容易地构建Ajax程序,无需深入了解XMLRequest的编码 细节。它容许你通过客户端的JavaScript,采用看似调用浏览器本地代码的方法来调用服务器端的代码。这就是DWR的直接含义。相对DWR提高的各种强大功能而言,其体系结构却非常简单。 下面一幅精确的图概要说明了DWR的运行机制。

在图的左侧有一个evenHandler()函数,他调用了AjaxService对象中的getOption()方法。这段代码看上去是执行一段位于本地JavaScript对象的方法,但事实上却是调用服务器上运行的 一个Java对象的方法。看代码时,你无法识别这一点,我认为这是DWR的一大优点。 传送给方法populateList()的参数是另一个JavaScript函数,这是回调函数。它会在远程调用结果返回时 执行,因此带箭头的循环说明双向数据流动。

????? 下面我们来实现一个简单的DWR实例――基本四则运算。 首先应先配置:到官网下载页面可以发现3个文件,分别是dwr.jar、DWR完整源代码、和dwr.war。dwr.jar是最简洁且必须的,如果时间充裕的话,也许希望将dwr.war下载下来。该程序 是DWR的一个小的范例程序,演示了许多DWR功能(包括聊天程序、基于邮政编码自动调入详细地址信息并进行快速地址查询、采用GI的实时股票报价等)。

????? 将dwr.jar,放到工程的WEB-INF/lib目录下,让后配置web.xml,加入以下内容:

  1. <span?style="font-size:?small;"><?xml?version="1.0"?encoding="UTF-8"?>????
  2. <!DOCTYPE?dwr?PUBLIC?"-//GetAhead?Limited//DTD?Direct?Web?Remoting?2.0//EN"?"?http://getahead.org/dwr/dwr20.dtd">????
  3. ????
  4. <dwr>????
  5. ????
  6. ??<allow>????
  7. ????
  8. ????<!--?intro?-?for?the?test?on?index.html?-->????
  9. ????<create?creator="new"?javascript="MathDelegate">????
  10. ??????<param?name="class"?value="cn.dwr.test.MathDelegate"/>????
  11. ????</create>????
  12. ????
  13. ??</allow>????
  14. ????
  15. </dwr>????</span>??
  16. ?? 然后在工程中建立一个Java类
    1. <span?style="font-size:?small;">package?cn.dwr.test;?????
    2. /**???
    3. ?*?简单的加减乘除四则运算类,用于测试第一个DWR???
    4. ?*?@author?Sephiroth???
    5. ?*???
    6. ?*/????
    7. public?class?MathDelegate?{?????
    8. ????
    9. /**???
    10. ?*?两个数相加???
    11. ?*/????
    12. ????public?int?add(int?a,int?b){?????
    13. ????????return?a+b;?????
    14. ????}?????
    15. ?????????
    16. ????/**???
    17. ?????*?两个数相减???
    18. ?????*/????
    19. ????public?int?subtract(int?a,int?b){?????
    20. ????????return?a-b;?????
    21. ????}?????
    22. ?????????
    23. ????/**???
    24. ?????*?两个数相乘???
    25. ?????*/????
    26. ????public?int?multiply(int?a,int?b){?????
    27. ????????return?a*b;?????
    28. ????}?????
    29. ?????????
    30. ????/**???
    31. ?????*?两个数相除???
    32. ?????*/????
    33. ????public?int?divide(int?a,int?b){?????
    34. ????????if(b!=0){?????
    35. ????????????return?a/b;?????
    36. ????????}else{?????
    37. ????????????return?0;?????
    38. ????????}?????
    39. ????}?????
    40. }??</span> ?

    ?细心的你们也许发现这端代码不够稳健,之排查了除0的错误,这样做也是为了示例代码的简洁而已。


    ??????? 接着在WEB-INF目录下,新建dwr.xml(具体的配置文件详解请参照网上相关介绍):

    1. <span?style="font-size:?small;"><?xml?version="1.0"?encoding="UTF-8"?>????
    2. <!DOCTYPE?dwr?PUBLIC?"-//GetAhead?Limited//DTD?Direct?Web?Remoting?2.0//EN"?"http://getahead.org/dwr/dwr20.dtd">????
    3. ????
    4. <dwr>????
    5. ????
    6. ??<allow>????
    7. ????
    8. ????<!--?intro?-?for?the?test?on?index.html?-->????
    9. ????<create?creator="new"?javascript="MathDelegate">????
    10. ??????<param?name="class"?value="cn.dwr.test.MathDelegate"/>????
    11. ????</create>????
    12. ????
    13. ??</allow>????
    14. ????
    15. </dwr>????
    16. </span>??
    17. 该文件目前在这实例中只完成一个任务,就是告诉DWR哪些类可以被远程访问,本例仅有MathDelegate类。可以为用于表示服务器端对象的JavaScript对象重新指定名称,但是通常情况二者取同名,本例就是如此。

      ???

      ????? 最后,附上本示例的唯一而简洁的页面index.html代码:

      Html代码?
      1. <span?style="font-size:?small;"><html>????
      2. ??
      3. <head>????
      4. <title>FirstDWR</title>????
      5. <script?type="text/javascript"?src="dwr/interface/MathDelegate.js"></script>????
      6. <script?type="text/javascript"?src="dwr/engine.js"></script>????
      7. <script>????
      8. ????var?a=0;?????
      9. ????var?b=0;?????
      10. ????var?op="";?????
      11. ????function?doMath(){?????
      12. ????????a=document.getElementById("numA").value;?????
      13. ????????b=document.getElementById("numB").value;?????
      14. ????????op=document.getElementById("op").value;?????
      15. ????????if(op=="add"){?????
      16. ????????????MathDelegate.add(a,b,doMathCallBack);?????
      17. ????????????op="+";?????
      18. ????????}else?if(op=="subtract"){?????
      19. ????????????MathDelegate.subtract(a,b,doMathCallBack);?????
      20. ????????????op="-";?????
      21. ????????}else?if(op=="multiply"){?????
      22. ????????????MathDelegate.multiply(a,b,doMathCallBack);?????
      23. ????????????op="*";?????
      24. ????????}else?if(op=="divide"){?????
      25. ????????????MathDelegate.divide(a,b,doMathCallBack);?????
      26. ????????????op="/";?????
      27. ????????}?????
      28. ????}??????
      29. ????var?doMathCallBack=function(answer){?????
      30. ????????document.getElementById("resultDiv").innerHTML="<h1>"+"Result:"+a+""+op+""+b+"="+answer+"color: #006699; font-weight: bo