<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>狼的原野</title>
    <description>我在生活与梦想的边缘挣扎着</description>
    <link>http://lszone.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>DWR源码学习</title>
        <author>lszone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lszone.javaeye.com">lszone</a>&nbsp;
                    链接：<a href="http://lszone.javaeye.com/blog/24421" style="color:red;">http://lszone.javaeye.com/blog/24421</a>&nbsp;
          发表时间: 2006年09月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          DWR源码学习（一） <br />DWR一个外国人实现的很有前途的AJAX框架。<br />多余的话就不说了，请看DWR的例子程序：<br />web.xml<br /><pre name="code" class="xml">
 1&lt;?xml version="1.0" encoding="ISO-8859-1"?>
 2&lt;!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&lt;web-app id="dwr">
 5
 6  &lt;display-name>DWR (Direct Web Remoting)&lt;/display-name>
 7  &lt;description>A demo of how to call Java on the server directly from Javascript on the client&lt;/description>
 8
 9  &lt;servlet>
10    &lt;servlet-name>dwr-invoker&lt;/servlet-name>
11    &lt;display-name>DWR Servlet&lt;/display-name>
12    &lt;description>Direct Web Remoter Servlet&lt;/description>
13    &lt;servlet-class>uk.ltd.getahead.dwr.DWRServlet&lt;/servlet-class>
14    &lt;!--
15    &lt;init-param>
16      &lt;param-name>config&lt;/param-name>
17      &lt;param-value>WEB-INF/dwr.xml&lt;/param-value>
18    &lt;/init-param>
19    -->
20    &lt;init-param>
21      &lt;param-name>debug&lt;/param-name>
22      &lt;param-value>true&lt;/param-value>
23    &lt;/init-param>
24    &lt;init-param>
25      &lt;param-name>scriptCompressed&lt;/param-name>
26      &lt;param-value>false&lt;/param-value>
27    &lt;/init-param>
28    &lt;load-on-startup>1&lt;/load-on-startup>
29  &lt;/servlet>
30
31  &lt;servlet-mapping>
32    &lt;servlet-name>dwr-invoker&lt;/servlet-name>
33    &lt;url-pattern>/dwr/*&lt;/url-pattern>
34  &lt;/servlet-mapping>
35
36&lt;/web-app>
</pre><br /><br />servlet（uk.ltd.getahead.dwr.DWRServlet）里：<br /><br /><pre name="code" class="java">
 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     }
</pre><br /><br />index.html<br /><pre name="code" class="html">
 1 &lt;?xml version="1.0" encoding="ISO-8859-1" ?>
 2 &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
 3 &lt;html xmlns="http://www.w3.org/1999/xhtml">
 4 &lt;head>
 5   &lt;title>DWR - Test Home&lt;/title>
 6   &lt;script type='text/javascript' src='dwr/interface/Test.js'>&lt;/script>
 7   &lt;script type='text/javascript' src='dwr/engine.js'>&lt;/script>
 8   &lt;script type='text/javascript' src='dwr/util.js'>&lt;/script>
 9   &lt;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   &lt;/script>
34 &lt;/head>
35 
36 &lt;body onload="init()">
37 .这一部分经过了SERVLET处理：
  &lt;script type='text/javascript' src='dwr/interface/Test.js'>&lt;/script>
  &lt;script type='text/javascript' src='dwr/engine.js'>&lt;/script>
  &lt;script type='text/javascript' src='dwr/util.js'>&lt;/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 &amp;&amp; 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 &lt; 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 &amp;&amp; !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 &lt; 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 &lt; 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     }
</pre><br /><br />DWR例子程序下载地址:http://www.blogjava.net/Files/javajohn/dwr.rar
          <br/><br/>
          <span style="color:red;">
            <a href="http://lszone.javaeye.com/blog/24421#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 15 Sep 2006 10:48:56 +0800</pubDate>
        <link>http://lszone.javaeye.com/blog/24421</link>
        <guid>http://lszone.javaeye.com/blog/24421</guid>
      </item>
      </channel>
</rss>