javajohn

金色年华

DWR源码学习(一)

DWR一个外国人实现的很有前途的AJAX框架。
多余的话就不说了,请看DWR的例子程序:
web.xml
 1<?xml version="1.0" encoding="ISO-8859-1"?>
 2<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
 3
 4<web-app id="dwr">
 5
 6  <display-name>DWR (Direct Web Remoting)</display-name>
 7  <description>A demo of how to call Java on the server directly from Javascript on the client</description>
 8
 9  <servlet>
10    <servlet-name>dwr-invoker</servlet-name>
11    <display-name>DWR Servlet</display-name>
12    <description>Direct Web Remoter Servlet</description>
13    <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
14    <!--
15    <init-param>
16      <param-name>config</param-name>
17      <param-value>WEB-INF/dwr.xml</param-value>
18    </init-param>
19    -->
20    <init-param>
21      <param-name>debug</param-name>
22      <param-value>true</param-value>
23    </init-param>
24    <init-param>
25      <param-name>scriptCompressed</param-name>
26      <param-value>false</param-value>
27    </init-param>
28    <load-on-startup>1</load-on-startup>
29  </servlet>
30
31  <servlet-mapping>
32    <servlet-name>dwr-invoker</servlet-name>
33    <url-pattern>/dwr/*</url-pattern>
34  </servlet-mapping>
35
36</web-app>
servlet(uk.ltd.getahead.dwr.DWRServlet)里:
 1     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException
 2     {
 3         try
 4         {
 5             builder.set(req, resp, getServletConfig(), getServletContext(), container);
 6             ServletLoggingOutput.setExecutionContext(this);
 7 
 8             processor.handle(req, resp);//该方法对所有request路径/dwr/*有效,在引用JS的时候,使用这个路径执行dwr生成的javascript代码

    finally
11         {
12             builder.unset();
13             ServletLoggingOutput.unsetExecutionContext();
14         }
15     }

index.html
 1 <?xml version="1.0" encoding="ISO-8859-1" ?>
 2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
 3 <html xmlns="http://www.w3.org/1999/xhtml">
 4 <head>
 5   <title>DWR - Test Home</title>
 6   <script type='text/javascript' src='dwr/interface/Test.js'></script>
 7   <script type='text/javascript' src='dwr/engine.js'></script>
 8   <script type='text/javascript' src='dwr/util.js'></script>
 9   <script>
10     function init() {
11       // This turns off the no-javascript message
12       document.getElementById("start").style.display = "none";
13       // This checks for file: URLs and loading problems
14       if (window.DWREngine == null || window.DWRUtil == null) {
15         document.getElementById("file").style.display = "block";
16         return;
17       }
18       // DWR setup
19       DWREngine.setErrorHandler(function(message) { alert(message); });
20       DWREngine.setWarningHandler(function(message) { alert(message); });
21       DWRUtil.useLoadingMessage();
22       // Turn on the generic error div
23       $("error").style.display = "block";
24       // Load a message from the server
25       Test.getInsert(load);
26     }
27 
28     function load(data) {
29       $("error").style.display = "none";
30       DWRUtil.setValue("reply", data);
31       $("reply").style.display = "block";
32     }
33   </script>
34 </head>
35 
36 <body onload="init()">
37 .
这一部分经过了SERVLET处理:
  <script type='text/javascript' src='dwr/interface/Test.js'></script>
  
<script type='text/javascript' src='dwr/engine.js'></script>
  
<script type='text/javascript' src='dwr/util.js'></script>
dwrservlet.doPost方法内processor.handle(req, resp)这个方法如下:
 1     public void handle(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException
 2     {
 3         String pathInfo = req.getPathInfo();
 4         String servletPath = req.getServletPath();
 5 
 6         if (nullPathInfoWorkaround && pathInfo == null)
 7         {
 8             pathInfo = req.getServletPath();
 9             servletPath = HtmlConstants.PATH_ROOT;
10             log.debug("Default servlet suspected. pathInfo=" + pathInfo + "; contextPath=" + req.getContextPath() + "; servletPath=" + servletPath); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
11         }
12 
13         if (pathInfo == null ||
14             pathInfo.length() == 0 ||
15             pathInfo.equals(HtmlConstants.PATH_ROOT))
16         {
17             resp.sendRedirect(req.getContextPath() + servletPath + HtmlConstants.FILE_INDEX);
18         }
19         else if (pathInfo.startsWith(HtmlConstants.FILE_INDEX))
20         {
21             index.handle(req, resp);
22         }
23         else if (pathInfo.startsWith(HtmlConstants.PATH_TEST))
24         {
25             test.handle(req, resp);
26         }
27         else if (pathInfo.startsWith(HtmlConstants.PATH_INTERFACE))
28         {
29             iface.handle(req, resp);//这个方法是我们要关注的
             }
     。。。。。。。
     }
 iface.handle(req, resp);//这个方法是我们要关注的,来自DefaultInterfaceProcessor
 1     public void handle(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
 2     {
 3         String pathinfo = req.getPathInfo();
 4         String servletpath = req.getServletPath();
 5         if (pathinfo == null)
 6         {
 7             pathinfo = req.getServletPath();
 8             servletpath = HtmlConstants.PATH_ROOT;
 9         }
10         String scriptname = pathinfo;
11         scriptname = LocalUtil.replace(scriptname, HtmlConstants.PATH_INTERFACE, HtmlConstants.BLANK);
12         scriptname = LocalUtil.replace(scriptname, HtmlConstants.EXTENSION_JS, HtmlConstants.BLANK);
13         Creator creator = creatorManager.getCreator(scriptname);
14 
15         //resp.setContentType("text/javascript");
16         PrintWriter out = resp.getWriter();
17         out.println();
18 
19         out.println("function " + scriptname + "() { }"); //从这里开始DWR自动生成javascript
             String   path = overridePath;
22         if (path == null)
23         {
24             path = req.getContextPath() + servletpath;
25         }
26         out.println(scriptname + "._path = '" + path + "';"); //$NON-NLS-1$ //$NON-NLS-2$
27 
28         Method[] methods = creator.getType().getMethods();
29         for (int i = 0; i < methods.length; i++)
30         {
31             Method method = methods[i];
32             String methodName = method.getName();
33 
34             // We don't need to check accessControl.getReasonToNotExecute()
35             // because the checks are made by the doExec method, but we do check
36             // if we can display it
37             String reason = accessControl.getReasonToNotDisplay(req, creator, scriptname, method);
38             if (reason != null && !allowImpossibleTests)
39             {
40                 continue;
41             }
42 
43             // Is it on the list of banned names
44             if (jsutil.isReservedWord(methodName))
45             {
46                 continue;
47             }
48 
49             out.print('\n');
50             out.print(scriptname + '.' + methodName + " = function("); //$NON-NLS-1$
51             Class[] paramTypes = method.getParameterTypes();
52             for (int j = 0; j < paramTypes.length; j++)
53             {
54                 if (!LocalUtil.isServletClass(paramTypes[j]))
55                 {
56                     out.print("p" + j + ""); //$NON-NLS-1$ //$NON-NLS-2$
57                 }
58             }
59             out.println("callback) {"); //$NON-NLS-1$
60 
61             out.print("    DWREngine._execute(" + scriptname + "._path, '" + scriptname + "', '" + methodName + "\', "); //实现javascript调用java内的方法
                 for (int j = 0; j < paramTypes.length; j++)
63             {
64                 if (LocalUtil.isServletClass(paramTypes[j]))
65                 {
66                     out.print("false, "); //$NON-NLS-1$
67                 }
68                 else
69                 {
70                     out.print("p" + j + ""); //$NON-NLS-1$ //$NON-NLS-2$
71                 }
72             }
73             out.println("callback);"); //$NON-NLS-1$
74 
75             out.println('}');
76         }
77 
78         out.flush();
79     }
DWR例子程序下载地址:http://www.blogjava.net/Files/javajohn/dwr.rar
(待续)

posted on 2006-05-27 19:23 javajohn 阅读(5536) 评论(13)  编辑  收藏 所属分类: AJAX

Feedback

# 求助 2006-06-11 16:21 Aivon

近来才开始接触AJAX
想在一个大作业中使用DWR
在网上找了很多配置教程
但我在自己机上老是测试不成功
郁闷中……
近来赶大作业,就要考试了,还请大哥能帮帮忙,给点提示
小弟的QQ是:4034947  回复  更多评论   

# re: DWR源码学习(一) 2006-06-12 08:51 javajohn

mail to me
DWR的配置例子在下载的代码里有demo  回复  更多评论   

# re: DWR源码学习(一) 2006-06-13 01:05 Aivon

找不到你的email阿...

我在官方网站下在的demo运行时显示:
Missing DWR Javascript Functions

自己按照网上的教程进行配置
也显示js文件错误

能否给我一份你使用正常的代码?
我的email是:aivon@163.com
谢谢了  回复  更多评论   

# re: DWR源码学习(一) 2006-06-13 09:20 javajohn

我的mail:thesecondbull@yahoo.com.cn
DWR代码下载地址http://www.blogjava.net/Files/javajohn/dwr.rar
下载的文件后缀更名为.war  回复  更多评论   

# re: DWR源码学习(一) 2006-06-13 10:30 Aivon

还是出现以下问题:
Missing DWR Javascript Functions
This is a fairly advanced page that tests DWR to check that everything is setup properly for you.

It appears that you may be attempting to run DWR outside a servlet container (possibly using a file: URL). We think this because this page has missing Javascript functions that should have been produced by DWR. To fix the problem please use DWR from within a servlet container.

If this is not the cause of the problem, please report it to the DWR mailing list, including your browser, server, OS configuration and any error messages that appeared either in the browser (including the Javascript console if one exists) and the server console log.

DWR is testing installation ...
This is a fairly advanced page that tests DWR. If you can see this message for a prolonged period of time then you should check the following:

Can you see the test pages?
If not it is likely that DWR has not deployed in your web server properly; Check the web server console and log files for error messages.
If you can see the test pages then DWR is loaded but is something is preventing DWR working. Check your browser Javascript console for error messages, or see the main DWR website for more information.
If none of these steps fixes the error, please report it to the DWR mailing list, including your browser, server, OS configuration and any error messages that appeared either in the browser (including the Javascript console if one exists) and the server console log.

For general information about DWR see:

不解~~~  回复  更多评论   

# re: DWR源码学习(一) 2006-06-13 10:59 javajohn

@Aivon
说一下你的JDK和TOMCAT的版本,JDK如果为1.5以上TOMCAT需要5.5以上的版本  回复  更多评论   

# re: DWR源码学习(一) 2006-06-13 12:27 Aivon

哈,原来是tomcat的版本问题
换了5.5的就OK了

谢谢了~~~  回复  更多评论   

# re: DWR源码学习(一) 2006-07-10 09:43 snackok

下载了,提示Test对象不存在,发现dwr/interface/目录下缺少test.js  回复  更多评论   

# re: DWR源码学习(一) 2006-07-10 15:11 javajohn

test.js是由DWR自动生成的,不再是我们以前开发时的那种概念上的js文件了.如果不清楚请再详细阅读我BLOG里的另一篇《dwr源码学习函数调用篇》  回复  更多评论   

# re: DWR源码学习(一) 2006-07-25 14:46 Sandy


可以跟我讲下DWR2.0中JAVA调用JS吗?  回复  更多评论   

# re: DWR源码学习(一) 2006-08-20 09:31 东北小白

不错哈哈,谢谢搂住  回复  更多评论   

# re: DWR源码学习(一) 2006-09-14 14:42 vircomagice

搂主有没有DWR的源码和发行包啊,我这里下载不了https的连接,很郁闷。。。
如果有的话,能不能发我一封啊
vircomagice@yahoo.com.cn  回复  更多评论   

# re: DWR源码学习(一) 2006-09-14 19:05

@vircomagice
发行包到处都有啊,你到www.springside.org.cn下载不就行了  回复  更多评论   



只有注册用户登录后才能发表评论。


网站导航:
 

My Links

Blog Stats

常用链接

留言簿(7)

随笔分类(36)

随笔档案(39)

classmate

good blog

企业管理网站

好友

站点收藏

搜索

最新评论

阅读排行榜

评论排行榜