百度空间 | 百度首页 
 
查看文章
 
DWR学习小记(三)
2007/11/01 17:22

       dwr是开源项目,拿到其源代码后还是很想了解它是如何实现这种js到java的调用。花了一个下午的时间从页面的js调用开始一步步跟踪,有了个基本的认识。给出下面一个示例,然后一步步说明先后的调用关系。
这里有一个类
package cn.iscas.dwr.test;
class HelloDWR{
public String hello(String name)
{
   return "hello:\t"+name;
}
}
在dwr.xml文件中添加HelloDWR的声明:
<?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="Demo">
      <param name="class" value="cn.iscas.dwr.test.HelloDWR"/>
    </create>
</allow>
</dwr>
        web应用的应用名为DwrTest,测试html的代码为:hello.html
<script type='text/javascript' src='/DwrTest/dwr/engine.js'> </script>
<script type='text/javascript' src='/DwrTest/dwr/util.js'> </script>
<script type='text/javascript' src='/DwrTest/dwr/interface/Demo.js'>

</script>
<script type='text/javascript'>
function update() {
var name = dwr.util.getValue("demoName");
Demo.hello(name, function(data) {
    dwr.util.setValue("demoReply", data);
});
}
</script>
<p>
Name:
<input type="text" id="demoName"/>
<input value="Send" type="button" onclick="update()"/>
<br/>
Reply: <span id="demoReply"></span>
</p>

        该页面的给出了一个输入框和按钮,在输入框中写入你的名字,然后点击按钮,那么在Reply后面会出现从服务器我们写好的HelloDWR的hello返回的字符串“hello ***”。

下面说明从访问hello.html到调用发生返回这些过程中的细节
1.hello.html的访问
       当访问我们的html页面的时候http://localhost:8080/DwrTest/hello.html,已经与dwr有了三次交互。来于我们在hello.html中添加的对/DwrTest/dwr/engine.js,/DwrTest/dwr/util.js,/DwrTest/dwr/interface/Demo.js的引用。

       在web.xml中我们有添加servlet uk.ltd.getahead.dwr.DWRServlet,这个servlet受理了我们应用下所有dwr/*下的所有url。uk.ltd.getahead.dwr.DWRServlet继承的org.directwebremoting.servlet.DWRServlet。如果你想通过debug来学习dwr的源码结构,可以在org.directwebremoting.servlet.DWRServlet的doPost函数中设置断点开始。这里就不细说了,有兴趣的自己看看吧!
        这三个js,前面两个是dwr自己生成的js,在dwr进行处理的时候和所有/dwr/interface/*的js是不同的处理方法,/dwr/interface/*下面的都是我们在dwr.xml中配置可以我们调用的类。/DwrTest/dwr/interface/Demo.js的生成的详细情况可以查看org.directwebremoting.impl.DefaultRemoter的方法generateInterfaceScript,这个方法给出了生成js的详细过程,方法的返回即该js内容。这个js的内容包括了该类的所有方法名,方法参数,返回值类型。如访问http://localhost:8080/DwrTest/dwr/interface/Demo.js我们得到的内容是
// Provide a default path to dwr.engine
if (dwr == null) var dwr = {};
if (dwr.engine == null) dwr.engine = {};
if (DWREngine == null) var DWREngine = dwr.engine;

if (Demo == null) var Demo = {};
Demo._path = '/TestWeb/dwr';
Demo.hello = function(p0, callback) {
dwr.engine._execute(Demo._path, 'Demo', 'hello', p0, callback);
}
      js中的函数Demo.hello的参数只有1个为p0,该参数是我们类HelloDWR的方法hello的参数;第二个参数callback是回调函数,也就是在dwr处理对HelloDWR的hello方法的调用完成后,会执行js函数callback。
       总之在访问hello.html时加载了三个js,engine.js和util.js是dwr自己的js,Demo.js中声明了HelloDWR的所有方法的js访问方式。
2.调用发生
       当我们在输入框中填写了“Kate”后点击按钮,此时执行hello.html中的js函数update()。
function update() {
var name = dwr.util.getValue("demoName");//取出输入框中输入的字符串
//调用Demo.hello
Demo.hello(name, function(data) {dwr.util.setValue("demoReply", data); });
}
        在Demo.hello中的function(data) {dwr.util.setValue("demoReply", data); }就是回调函数,参见Demo.js中的函数Demo.hello,该函数作为了dwr.engine._execute的参数,这些js的调用我也都单步跟踪过,有兴趣的也可以试试,其功能是创建XMLHttpRequest,发送到地址/TestWeb/dwr/call/plaincall/Demo.hello.dwr,同时将回调函数进行保存,当有返回时,再调用回调函数。详细过程可以看engine.js中的dwr.engine._execute,dwr.engine.beginBatch,dwr.engine.endBatch,dwr.engine._sendData,关于调用返回的几个js函数dwr.engine._remoteHandleCallback,dwr.engine._stateChange。


类别:Web | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu