﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-lishen226-随笔分类-DWR</title><link>http://www.blogjava.net/lishen226/category/38298.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 16 Mar 2009 04:18:48 GMT</lastBuildDate><pubDate>Mon, 16 Mar 2009 04:18:48 GMT</pubDate><ttl>60</ttl><item><title>dwr配置文件dwr.xml祥解</title><link>http://www.blogjava.net/lishen226/archive/2009/03/16/259927.html</link><dc:creator>锋行</dc:creator><author>锋行</author><pubDate>Mon, 16 Mar 2009 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/lishen226/archive/2009/03/16/259927.html</guid><wfw:comment>http://www.blogjava.net/lishen226/comments/259927.html</wfw:comment><comments>http://www.blogjava.net/lishen226/archive/2009/03/16/259927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lishen226/comments/commentRss/259927.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lishen226/services/trackbacks/259927.html</trackback:ping><description><![CDATA[<div class="tit">dwr配置文件dwr.xml祥解</div>
<div class="date">2007-08-10 00:16</div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text">
            <p>本人对dwr 中文文档关于dwr.xml做的一个整理,纯粹体力活，有用得着的朋友别忘顶一下，留个联系方式一起交流学习！</p>
            <p>dwr.xml是DWR的配置文件。默认情况下，应该把它放到WEB-INF目录(web.xml的目录)下</p>
            <h2><a name="dwr.xml-%E5%88%9B%E5%BB%BAdwr.xml%E6%96%87%E4%BB%B6"></a>创建dwr.xml文件</h2>
            <p>dwr.xml文件的结构如下:</p>
            <div class="code">
            <div class="codeContent">
            <pre class="code-xml">&lt;!DOCTYPE dwr PUBLIC&nbsp;&nbsp;&nbsp;&nbsp;<span class="code-quote">"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="code-quote">"http://www.getahead.ltd.uk/dwr/dwr10.dtd"</span>&gt;<span class="code-tag">&lt;dwr&gt;</span>&nbsp;&nbsp;<span class="code-tag"><span class="code-comment">&lt;!-- init is only needed if you are extending DWR --&gt;</span></span>&nbsp;&nbsp;<span class="code-tag">&lt;init&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="code-tag">&lt;creator id=<span class="code-quote">"..."</span> class=<span class="code-quote">"..."</span>/&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="code-tag">&lt;converter id=<span class="code-quote">"..."</span> class=<span class="code-quote">"..."</span>/&gt;</span>&nbsp;&nbsp;<span class="code-tag">&lt;/init&gt;</span>&nbsp;&nbsp;<span class="code-tag"><span class="code-comment">&lt;!-- without allow, DWR isn't allowed to do anything --&gt;</span></span>&nbsp;&nbsp;<span class="code-tag">&lt;allow&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="code-tag">&lt;create creator=<span class="code-quote">"..."</span> javascript=<span class="code-quote">"..."</span>/&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="code-tag">&lt;convert converter=<span class="code-quote">"..."</span> match=<span class="code-quote">"..."</span>/&gt;</span>&nbsp;&nbsp;<span class="code-tag">&lt;/allow&gt;</span>&nbsp;&nbsp;<span class="code-tag"><span class="code-comment">&lt;!-- you may need to tell DWR about method signatures --&gt;</span></span>&nbsp;&nbsp;<span class="code-tag">&lt;signatures&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp; ...&nbsp;&nbsp;<span class="code-tag">&lt;/signatures&gt;</span><span class="code-tag">&lt;/dwr&gt;</span></pre>
            </div>
            </div>
            <h2><a name="dwr.xml-%E6%9C%AF%E8%AF%AD"></a>术语</h2>
            <p>这里是一些必须理解的术语 - 参数会被<strong>converted</strong>，远程Bean会被<strong>created</strong>。所以如果你有一个叫A的bean，它有一个方法叫A.blah(B) 那么你需要一个A的<strong>creator</strong>和一个B的<strong>converter</strong>。</p>
            <h2><a name="dwr.xml-%3Callow%3E"></a>一：&lt;allow&gt;</h2>
            <p><em>allow</em>段落里面定义的试DWR可以创建和转换的类。</p>
            <h2><a name="dwr.xml-Creators"></a>二：Creators</h2>
            <p>dwr.xml文件中的create元素的结构如下：</p>
            <div class="code">
            <div class="codeContent">
            <pre class="code-xml"><span class="code-tag">&lt;allow&gt;</span>&nbsp;&nbsp;<span class="code-tag">&lt;create creator=<span class="code-quote">"..."</span> javascript=<span class="code-quote">"..."</span> scope=<span class="code-quote">"..."</span>&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="code-tag">&lt;param name=<span class="code-quote">"..."</span> value=<span class="code-quote">"..."</span>/&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="code-tag">&lt;auth method=<span class="code-quote">"..."</span> role=<span class="code-quote">"..."</span>/&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="code-tag">&lt;exclude method=<span class="code-quote">"..."</span>/&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="code-tag">&lt;include method=<span class="code-quote">"..."</span>/&gt;</span>&nbsp;&nbsp;<span class="code-tag">&lt;/create&gt;</span>&nbsp;&nbsp; ...<span class="code-tag">&lt;/allow&gt;</span></pre>
            </div>
            </div>
            <p>这里的多数元素都是可选的 - 你真正必须知道的是指定一个creator和一个javascript名字。</p>
            <p><strong>creator属性</strong> 是必须的 - 它用来指定使用那种创造器。</p>
            <p>默认情况下DWR1.1有8种创造器。它们是：</p>
            <ul>
                <li><a href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#new">new</a>: 用Java的new关键字创造对象。
                <li><a title="None Creator on Creators" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#none">none</a>: 它不创建对象，看下面的原因。 (v1.1+)
                <li><a title="Scripted Creator" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#scripted">scripted</a>: 通过BSF使用脚本语言创建对象，例如BeanShell或Groovy。
                <li><a title="Spring Integration" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#spring">spring</a>: 通过Spring框架访问Bean。
                <li><a title="JSF Integration" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#JSF">jsf</a>: 使用JSF的Bean。 (v1.1+)
                <li><a title="Struts Integration" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#Struts">struts</a>: 使用Struts的FormBean。 (v1.1+)
                <li><a title="Beehive Integration" href="http://blog.csdn.net/phevose/archive/2007/05/16/1611601.aspx#pageflow">pageflow</a>: 访问Beehive或Weblogic的PageFlow。 (v1.1+) </li>
            </ul>
            <p>&nbsp;</p>
            <p>如果你需要写自己的创造器，你必须在init部分注册它。</p>
            <p><strong>javascript属性</strong> 用于指定浏览器中这个被创造出来的对象的名字。你不能使用Javascript的关键字。</p>
            <p><strong>scope属性</strong> 非常类似servlet规范中的scope。 它允许你指定这个bean在什么生命范围。选项有"application", "session", "request" 和"page"。这些值对于Servlet和JSP开发者来说应该相当熟悉了。</p>
            <p>scope属性是可选的。默认是"page"。如果要使用"session"需要cookies。当前的DWR不支持ULR重写。</p>
            <p><strong>param元素</strong> 被用来指定创造器的其他参数，每种构造器各有不同。例如，"new"创造器需要知道要创建的对象类型是什么。每一个创造器的参数在各自的文档中能找到。请查看上面的链接。</p>
            <p><strong>include和exclude元素</strong> 允许创造器来限制类中方法的访问。一个创造器必须指定include列表或exclude列表之一。如果是include列表则暗示默认的访问策略是"拒绝"；如果是exclude列表则暗示默认的访问策略是"允许"。</p>
            <p>例如要拒绝防范除了<em>setWibble()</em>以外的所有方法，你应该把如下内容添加到dwr.xml中。</p>
            <div class="code">
            <div class="codeContent">
            <pre class="code-xml"><span class="code-tag">&lt;create creator=<span class="code-quote">"new"</span> javascript=<span class="code-quote">"Fred"</span>&gt;</span>&nbsp;&nbsp;<span class="code-tag">&lt;param name=<span class="code-quote">"class"</span> value=<span class="code-quote">"com.example.Fred"</span>/&gt;</span>&nbsp;&nbsp;<span class="code-tag">&lt;include method=<span class="code-quote">"setWibble"</span>/&gt;</span><span class="code-tag">&lt;/create&gt;</span></pre>
            </div>
            </div>
            <p>对于加入到create元素中的类的所有方法都是默认可见的。</p>
            <p><strong>auth元素</strong> 允许你指定一个J2EE的角色作为将来的访问控制检查:</p>
            <div class="code">
            <div class="codeContent">
            <pre class="code-xml"><span class="code-tag">&lt;create creator=<span class="code-quote">"new"</span> javascript=<span class="code-quote">"Fred"</span>&gt;</span>&nbsp;&nbsp;<span class="code-tag">&lt;param name=<span class="code-quote">"class"</span> value=<span class="code-quote">"com.example.Fred"</span>/&gt;</span>&nbsp;&nbsp;<span class="code-tag">&lt;auth method=<span class="code-quote">"setWibble"</span> role=<span class="code-quote">"admin"</span>/&gt;</span><span class="code-tag">&lt;/create&gt;</span></pre>
            </div>
            </div>
            <hr />
            <p>&nbsp;</p>
            <p><a name="new"></a><strong><font size="3">new</font></strong>创造器在DWR中已经默认声明了：<strong>&lt;creator id="new" class="uk.ltd.getahead.dwr.create.NewCreator"/&gt;</strong> 。你不需要在dwr.xml文件中添加这段话，它已经存在于DWR的内部dwr.xml文件中了。</p>
            <p>这个创造器通过类默认的够早函数创造对象实例。用new创造器有一些好处：</p>
            <ul>
                <li>安全:DWR创造的对象生存的事件越短，多次调用中间的值不一致的错误机会越少。
                <li>内存消耗低： 如果你的站点用户量非常大，这个创造器可以减少VM的内存溢出。 </li>
            </ul>
            <p>你可以通过下面的方式使用new创造器来创造远程调用Bean：</p>
            <div class="code">
            <div class="codeContent">
            <pre class="code-xml"><span class="code-tag">&lt;allow&gt;</span>&nbsp;&nbsp;<span class="code-tag">&lt;create creator=<span class="code-quote">"new"</span> javascript=<span class="code-quote">"Blah"</span>&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="code-tag">&lt;param name=<span class="code-quote">"class"</span> value=<span class="code-quote">"java.util.Date"</span>/&gt;</span>&nbsp;&nbsp;<span class="code-tag">&lt;/create&gt;</span>&nbsp;&nbsp; ... <span class="code-tag">&lt;/allow&gt;</span></pre>
            </div>
            </div>
            <p>这些代码把 <strong>java.util.Date</strong> 映射成Javascript，并且命名为Blah，所以在Javascript中当你调用Blah.toString(reply) 那么一个新的 <strong>java.util.Date</strong> 就会通过默认的构造函数创造出来， 然后 <strong>toString()</strong> 方法被调用， 然后结果数据返回给reply方法(在这个例子中date是字符串格式)。</p>
            <p>&nbsp;</p>
            <hr />
            <p>&nbsp;</p>
            <p><font size="3"><strong><a name="none"></a>none</strong></font>'创造器不创建任何对象 - 它会假设你不需要创建对象。这有可能是对的，有两个原因。</p>
            <p>你可能在使用的scope不是"page"(看上面)，并在在前面已经把这个对象创建到这个scope中了，这时你就不需要再创建对象了。</p>
            <p>还有一种情况是要调用的方法是静态的，这时也不需要创建对象。DWR会在调用创建器之前先检查一下这个方法是不是静态的。</p>
            <p>对于上诉两种情况，你仍然需要class参数，用来告诉DWR它是在操作的对象类型是什么。</p>
            <p>&nbsp;</p>
            <hr />
            <p>&nbsp;</p>
            <p><font size="3"><strong><a name="scripted"></a>scripted</strong></font><font size="2">创造器在DWR中已经默认声明了：&lt;creator id="script" class="uk.ltd.getahead.dwr.create.ScriptedCreator"/&gt;</font></p>
            <p>这个创造器用BSF来执行脚本得到Bean，例如：</p>
            <div class="code">
            <div class="codeContent">
            <pre class="code-xml"><span class="code-tag">&lt;allow&gt;</span>&nbsp;&nbsp; ...&nbsp;&nbsp;<span class="code-tag">&lt;create creator=<span class="code-quote">"script"</span> javascript=<span class="code-quote">"EmailValidator"</span>&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="code-tag">&lt;param name=<span class="code-quote">"language"</span> value=<span class="code-quote">"beanshell"</span>/&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="code-tag">&lt;param name=<span class="code-quote">"script"</span>&gt;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import org.apache.commons.validator.EmailValidator;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return EmailValidator.getInstance();&nbsp;&nbsp;&nbsp;&nbsp;<span class="code-tag">&lt;/param&gt;</span>&nbsp;&nbsp;<span class="code-tag">&lt;/create&gt;</span>&nbsp;&nbsp; ...<span class="code-tag">&lt;/allow&gt;</span></pre>
            </div>
            </div>
            <p>script创造器有如下参数：</p>
            <p>
            <table class="confluenceTable">
                <tbody>
                    <tr>
                        <th class="confluenceTh">参数</th>
                        <th class="confluenceTh">DWR版本</th>
                        <th class="confluenceTh">描述</th>
                    </tr>
                    <tr>
                        <td class="confluenceTd">language</td>
                        <td class="confluenceTd">1.0</td>
                        <td class="confluenceTd">脚本语言，字符串，例如'beanshell'. (必需)</td>
                    </tr>
                    <tr>
                        <td class="confluenceTd">script</td>
                        <td class="confluenceTd">1.0</td>
                        <td class="confluenceTd">要执行的脚本。 (必需，除非scriptPath参数存在)</td>
                    </tr>
                    <tr>
                        <td class="confluenceTd">scriptPath</td>
                        <td class="confluenceTd">1.1</td>
                        <td class="confluenceTd">脚本文件路径。 (必需，除非script参数存在)</td>
                    </tr>
                    <tr>
                        <td class="confluenceTd">reloadable</td>
                        <td class="confluenceTd">1.1</td>
                        <td class="confluenceTd">是否检测脚本文件的改动，以重新加载 (可选, 默认true)</td>
                    </tr>
                    <tr>
                        <td class="confluenceTd">class</td>
                        <td class="confluenceTd">1.0</td>
                        <td class="confluenceTd">创造出对象的类型(可选). 如果没有DWR通过创造器得到类型。</td>
                    </tr>
                </tbody>
            </table>
            </p>
            <h1><a name="ScriptedCreator-%E9%9C%80%E8%A6%81%E4%BA%86%E8%A7%A3%E7%9A%84%E4%B8%BB%E9%A2%98"></a><font size="2">需要了解的主题</font></h1>
            <p>要使用这个创造器，你需要把一些辅助库放到WEB-INF/lib文件夹下：<span class="nobr"><a title="Visit page outside Confluence" href="http://jakarta.apache.org/site/downloads/downloads_bsf.html" rel="nofollow">BSF的jar包<sup><img class="rendericon" height="7" src="http://wiki.javascud.org/images/icons/linkext7.gif" width="7" align="absMiddle" border="0"  alt="" /></sup></a></span>，你要用的<span class="nobr"><a title="Visit page outside Confluence" href="http://jakarta.apache.org/bsf/projects.html" rel="nofollow">脚本语言的jar包<sup><img class="rendericon" height="7" src="http://wiki.javascud.org/images/icons/linkext7.gif" width="7" align="absMiddle" border="0"  alt="" /></sup></a></span>。</p>
            <p>当一个类是用script创造出来的，并且scope是session或application，如果你的脚本改变，session中的类和script中的类就不一致了。这样会出现错误。虽然web容器不用重启，但是用户需要先登出(或以某种方式清空session)，然后再登录。</p>
            <p>当clazz参数不为空，并且用来创造新实例，DWR简单的调用 <em>class.newInstance()</em> 方法。这种方法是没问题的，除非脚本正在用某个参数创建一个类，或者调用某个函数来配置这个类。 不幸的是，每次请求都要重新运行script并造成上面的问题。</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/lishen226/aggbug/259927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lishen226/" target="_blank">锋行</a> 2009-03-16 09:13 <a href="http://www.blogjava.net/lishen226/archive/2009/03/16/259927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>