﻿<?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-黑灵客栈-随笔分类-AJAX</title><link>http://www.blogjava.net/mstar/category/2359.html</link><description>搞软件开发就像被强奸,如果不能反抗,就享受它吧！</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 18:34:38 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 18:34:38 GMT</pubDate><ttl>60</ttl><item><title>用DWR2.0做的一个Server日志查看器</title><link>http://www.blogjava.net/mstar/archive/2007/01/03/Ajax_DWR2_LogViewer.html</link><dc:creator>黑灵</dc:creator><author>黑灵</author><pubDate>Wed, 03 Jan 2007 14:21:00 GMT</pubDate><guid>http://www.blogjava.net/mstar/archive/2007/01/03/Ajax_DWR2_LogViewer.html</guid><wfw:comment>http://www.blogjava.net/mstar/comments/91645.html</wfw:comment><comments>http://www.blogjava.net/mstar/archive/2007/01/03/Ajax_DWR2_LogViewer.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/mstar/comments/commentRss/91645.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mstar/services/trackbacks/91645.html</trackback:ping><description><![CDATA[
		<p>有时候我需要查看已经部署到服务器上的应用程序的日志，每次都要远程登录服务器感觉很麻烦，所以一般我会把log文件的目录用apache做个网站，这样通过IE就可以访问到了。但是有时要看即时输出情况，就要不断的F5，很麻烦。所以就有个想法，不如用DWR2.0的反转Ajax来做个程序，让日志有变化时自动的发送到客户端，这样就我一个劲的按F5了。<br /><br />我下面就把这个程序分享给大家，希望大家提提意见。<br /><br />首先是环境：<br />DWR 2.0.rc1<br />Sun JDK 1.5<br /><br />先看张运行起来的图吧，大家一看就知道这是个什么东西了。<br /><img height="509" alt="logviewer.png" src="http://www.blogjava.net/images/blogjava_net/mstar/pics2007/logviewer.png" width="776" border="0" /><br />你可以制定要监视的log文件，当然有哪些文件文件可以被监视，你必须在服务端的xml配置中文件设置，当然你也可以监视一个目录里的log文件，这对于而log文件是每天生成一个的情况很有用。你可以设定在浏览器上显示的行数，操作行数，屏幕会自动滚动。你还可以添加一些过滤器，过滤掉不想看见的行，我目前只做了到了过滤掉一些信息，当然如果你有兴趣，你也再添加一些更复杂的过滤器。过滤器的模式是用正则表达式表示的。<br /><br />下面是点击“开始监听”，运行后样子<br /><img height="598" alt="logviewer2.png" src="http://www.blogjava.net/images/blogjava_net/mstar/pics2007/logviewer2.png" width="776" border="0" /><br />如果服务器上的catalina.2006-12-09.log文件发生变化，客户端的浏览器上log显示区也会自动的向上滚动。<br /><br /><br />下面我就大致的介绍一下如何用DWR2.0来实现这样的功能。在这里介绍的可能不是很详细，不清楚的地方请看我提供的源码。<br /><br />先来介绍一下目录结构<br />├─lib  -- 编译和测试用的第三方类库<br />├─webapp -- 部署目录<br />├─test -- 测试程序<br />├─java -- 主程序<br />└─build.xml -- ant构建文件<br /><br />webapp下的文件和目录<br />│  style.css  -- 样式表文件<br />│  index.html -- 主画面文件<br />│<br />├─WEB-INF<br />│  │  web.xml -- 部署配置文件<br />│  │  dwr.xml -- dwr的配置文件<br />│  │  conf.xml -- 我们这个应用程序配置文件，主要是配置log文件<br />│  │<br />│  ├─classes <br />│  │<br />│  └─lib <br />│<br />└─script -- javascript文件<br /><br /><br />index.html中就是我们上面的图片上能看到的页面元素。其中的控件的事件处理都写在\script\logviewer.js文件中。<br /></p>
		<p>当页面加载时执行startPoll()方法，复杂开始与服务器的通信，并且把log文件选择框初始化，把已经添加过滤器列表显示出来。 </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #0000ff">function</span>
				<span style="COLOR: #000000"> startPoll() {<br />    DWREngine.setActiveReverseAjax(</span>
				<span style="COLOR: #0000ff">true</span>
				<span style="COLOR: #000000">);<br /><br />    LogManager.getLogFileNames(</span>
				<span style="COLOR: #0000ff">function</span>
				<span style="COLOR: #000000"> (data) {<br />        DWRUtil.removeAllOptions(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">log_file</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">);<br />        DWRUtil.addOptions(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">log_file</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">, data);<br />    });<br /><br />    LogManager.getFilters(</span>
				<span style="COLOR: #0000ff">function</span>
				<span style="COLOR: #000000">(data) {<br />        </span>
				<span style="COLOR: #0000ff">for</span>
				<span style="COLOR: #000000"> (</span>
				<span style="COLOR: #0000ff">var</span>
				<span style="COLOR: #000000"> i </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">; i </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000"> data.length; i</span>
				<span style="COLOR: #000000">++</span>
				<span style="COLOR: #000000">) {<br />            addFilterDiv(data[i].pattern, data[i].id);<br />        }<br />    });<br />}</span>
		</div>
		<p>
				<br />当点击“开始监听”按钮时调用服务端的LogManager的send方法，服务端开启监听线程，开始监听做为参数传递的文件，如果文件有变动就会把最近增加的行发送到浏览器上来。 <br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #0000ff">var</span>
				<span style="COLOR: #000000"> startWatch </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">function</span>
				<span style="COLOR: #000000">() {<br />    clearLog();<br />    LogManager.send(DWRUtil.getValue(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">log_file</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">));<br />}</span>
		</div>
		<p>
				<br />
		</p>
		<p>当点击“结束监听”按钮，调用LogManager的stop()方法，结束掉监听线程。<br /></p>
		<p>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #0000ff">function</span>
				<span style="COLOR: #000000"> stopWatch() {<br />    LogManager.stop();<br />}</span>
		</div>
		<p>
		</p>
		<p>
				<br />当点击“清空日志”按钮，清除mainPanel中的所有子元素</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #0000ff">function</span>
				<span style="COLOR: #000000"> clearLog() {<br />    </span>
				<span style="COLOR: #0000ff">var</span>
				<span style="COLOR: #000000"> mainPanel </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> $(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">main_panel</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">);<br />    </span>
				<span style="COLOR: #0000ff">while</span>
				<span style="COLOR: #000000"> (mainPanel.hasChildNodes()) {<br />        mainPanel.removeChild(mainPanel.firstChild);<br />    }<br />}</span>
		</div>
		<p>当点击“添加过滤器”，填充输入框，要求输入做为过滤器的正则表达式，输入完成后，要做两件事：<br />1、LogManager.addFilter方法，把输入的正则表达式传送给服务端。<br />2、把这个正则表达式添加到页面上。</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #0000ff">function</span>
				<span style="COLOR: #000000"> addFilter() {<br />    </span>
				<span style="COLOR: #0000ff">var</span>
				<span style="COLOR: #000000"> regex </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> prompt(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">输入正则表达式</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #000000">""</span>
				<span style="COLOR: #000000">);<br />    </span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000"> (regex </span>
				<span style="COLOR: #000000">!=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">null</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">&amp;&amp;</span>
				<span style="COLOR: #000000"> regex </span>
				<span style="COLOR: #000000">!=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">""</span>
				<span style="COLOR: #000000">) {<br />        LogManager.addFilter(regex, </span>
				<span style="COLOR: #0000ff">function</span>
				<span style="COLOR: #000000"> (filterId) {<br />            addFilterDiv(regex, filterId);<br />        });<br />    }<br />}</span>
		</div>注意这里，我们用到了DWR的回调模式，在调用服务端方法LogManager.addFilter成功后我们才调用客户端的addFilterDiv方法把这个输入的正则表达式显示到页面上。<br /><br />如果你足够细心的话，应该会发现在这个js文件中有一个叫做addNewLine的方法在index.html中是没有被调用的。这个方法其实是给服务端的LogManager.send函数调用的。<br /><br />上面这些内容就是服务端脚本的主要内容了，其实很简单。主要负责通过DWR与服务端通信和处理页面显示。<br /><br />下面介绍服务端的核心类：LogManager<br /><br />这个类主要就这样几个方法：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">   </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * 停止监控<br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> stop() {<br />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (watcher </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) {<br />            watcher.halt();<br />        }<br />    }<br /><br />    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * 发送log信息<br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> send(String filename) {<br />        WebContext wctx </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> WebContextFactory.get();<br />        </span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> ScriptSession scriptSession </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> wctx.getScriptSession();<br />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (watcher </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) {<br />            watcher.halt();<br />        }<br /><br />        </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> {<br />            watcher </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> LogFileWatcher(filename);<br />            watcher.addListener(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> LogUpdateListener() {<br />                </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> onLogUpdate(List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> lines) {<br />                    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (String line : lines) {<br />                        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (checkFilters(line)) {<br />                            ScriptBuffer scriptBuffer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ScriptBuffer();<br />                            scriptBuffer.appendScript(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">addNewLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br />                                    .appendData(line)<br />                                    .appendScript(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />                            scriptSession.addScript(scriptBuffer);<br />                        }<br />                    }<br />                }<br />            });<br />            watcher.start();<br />        } </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (IOException e) {<br />            ScriptBuffer scriptBuffer </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ScriptBuffer();<br />            scriptBuffer.appendScript(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">addNewLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br />                    .appendData(e.getMessage())<br />                    .appendScript(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />            scriptSession.addScript(scriptBuffer);<br />            log.warn(e);<br />        }<br />    }<br /><br />    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * 取得指定的日志文件路径<br />     *<br />     * </span><span style="COLOR: #808080">@return</span><span style="COLOR: #008000"> 指定的日志文件路径<br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> getLogFileNames() {<br />        List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> filenames </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArrayList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">();<br />        </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> {<br />            XMLConfiguration config </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> getConfiguration();<br />            List logfiles </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> config.getList(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">log-files.file</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />            </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (Object o : logfiles) {<br />                filenames.add((String) o);<br />            }<br />        } </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (ConfigurationException e) {<br />            log.warn(e);<br />        }<br /><br />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> filenames;<br />    }<br /><br />    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * 取得指定的日志目录下的文件<br />     *<br />     * </span><span style="COLOR: #808080">@return</span><span style="COLOR: #008000"> 指定的日志目录下的文件<br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> getLogFileNamesFromDir() {<br />        List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> filenames </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArrayList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">();<br />        </span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"> {<br />            XMLConfiguration config </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> getConfiguration();<br />            String dir </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> config.getString(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">log-dir.dir</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (dir </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) {<br />                File rootDir </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> File(dir);<br />                </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (rootDir.exists()) {<br />                    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (rootDir.isFile()) {<br />                        filenames.add(rootDir.getPath().replace(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\\</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">));<br />                    } </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (rootDir.isDirectory()) {<br />                        String patternString </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> config.getString(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">log-dir.filter</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />                        File[] files;<br />                        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (patternString </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">patternString.equals(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">)) {<br />                            files </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> rootDir.listFiles(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> LogFileFilter(patternString));<br />                        } </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"> {<br />                            files </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> rootDir.listFiles();<br />                        }<br /><br />                        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (File file : files) {<br />                            filenames.add(file.getPath().replace(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\\</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">));<br />                        }<br />                    }<br />                }<br />            }<br />        } </span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000"> (ConfigurationException e) {<br />            log.warn(e);<br />        }<br /><br />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> filenames;<br />    }<br /><br />    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * 添加一个过滤器，返回过滤器的id<br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> addFilter(String regex) {<br />        </span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000"> (filters) {<br />            Filter filter </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Filter(regex, SequenceGenerator.getInstance().next(), FilterType.INCLUDE);<br />            filters.add(filter);<br />            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> filter.getId();<br />        }<br /><br />    }<br /><br />    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * 根据id删除一个过滤器<br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> removeFilter(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> id) {<br />        </span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000"> (filters) {<br />            filters.remove(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Filter(id));<br />        }<br />    }<br /><br />    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * 取得现在所有的过滤器列表<br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String, Object</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000"> getFilters() {<br />        List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String, Object</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000"> result </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArrayList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String, Object</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">();<br />        </span><span style="COLOR: #0000ff">synchronized</span><span style="COLOR: #000000"> (filters) {<br />            </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (Filter filter : filters) {<br />                Map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String, Object</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> filterItem </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HashMap</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String, Object</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">();<br />                filterItem.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">id</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, filter.getId());<br />                filterItem.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pattern</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, filter.getPattern().pattern());<br />                result.add(filterItem);<br />            }<br />        }<br />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> result;<br />    }</span></div><br />对于大家都做过Java的朋友来说，这些代码应该很容易就能看懂，我就不多说了。大家主要注意一下ScriptSession类，这个类就是起到主要功能的类了。<br /><br />其中的LogFileWatcher是一个Thread类，它是用来监视log文件的。<br /><br />SequenceGenerator.java是用来生成过滤器的id的。<br /><br />LogUpdateListener.java是一个接口，用于实现事件回调的。<br /><br />然后看一个dwr的配置文件<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">allow</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">create </span><span style="COLOR: #ff0000">creator</span><span style="COLOR: #0000ff">="new"</span><span style="COLOR: #ff0000"> javascript</span><span style="COLOR: #0000ff">="LogManager"</span><span style="COLOR: #ff0000"> scope</span><span style="COLOR: #0000ff">="session"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="class"</span><span style="COLOR: #ff0000"> value</span><span style="COLOR: #0000ff">="org.devside.logviewer.LogManager"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include </span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="send"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include </span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="stop"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include </span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="getLogFileNames"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include </span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="getLogFileNamesFromDir"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include </span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="addFilter"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include </span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="removeFilter"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include </span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="getFilters"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">create</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">allow</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">dwr</span><span style="COLOR: #0000ff">&gt;</span></div><br />这里的配置文件和1.x几乎没什么两样，就是scope我这里设置成了session范围的。这样就可以多个人同时监视不同的log文件了。<br /><br />web.xml文件也基本上是老样子<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml version="1.0" encoding="UTF-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">web-app </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="LogViewer"</span><span style="COLOR: #ff0000"> version</span><span style="COLOR: #0000ff">="2.4"</span><span style="COLOR: #ff0000"><br />         xmlns</span><span style="COLOR: #0000ff">="http://java.sun.com/xml/ns/j2ee"</span><span style="COLOR: #ff0000"><br />         xmlns:xsi</span><span style="COLOR: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="COLOR: #ff0000"><br />         xsi:schemaLocation</span><span style="COLOR: #0000ff">="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Web Log Viewer</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">description</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Direct Web Remoter Servlet</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">description</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">DWR Servlet</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">dwr-invoker</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">org.directwebremoting.servlet.DwrServlet</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">debug</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">true</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">pollAndCometEnabled</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">true</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">dwr-invoker</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">/dwr/*</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">welcome-file-list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">welcome-file</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">index.html</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">welcome-file</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">welcome-file-list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">web-app</span><span style="COLOR: #0000ff">&gt;</span></div>dwr的包名发生了变化，并且要开启反转ajax，就要把<span style="COLOR: #000000">pollAndCometEnabled参数设置为true。<br /><br />总结，总体来说DWR2.0中的反转ajax还是很容易使用的，这也是dwr的一贯风格，不用知道过多的细节就能容易的实现ajax。dwr绝对是Java开发者的首选ajax框架。<br />另外我这个程序其实还是为了演示用的，如果想要用户实际开发可能还需要修改，比如安全性上面，性能上面。而性能上面的主要问题是客户端浏览器，如果服务端的log文件过大，而浏览器有不能即时的回收内存，就会造成客户端浏览器内存占用过大而死掉的问题。而服务端由于java的内容回收机制已经比较成熟应该不会有什么问题。我在ie6和firefox2都试过了，firefox效果能好一些。<br /><br />源码下载：<br /><a href="/Files/mstar/LogViewer.part1.rar">http://www.blogjava.net/Files/mstar/LogViewer.part1.rar</a><br /><a href="/Files/mstar/LogViewer.part2.rar">http://www.blogjava.net/Files/mstar/LogViewer.part2.rar</a></span><img src ="http://www.blogjava.net/mstar/aggbug/91645.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mstar/" target="_blank">黑灵</a> 2007-01-03 22:21 <a href="http://www.blogjava.net/mstar/archive/2007/01/03/Ajax_DWR2_LogViewer.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>把DWR的配置写到Spring的配置文件里（Spring2 新特性-自定义schema初体验） </title><link>http://www.blogjava.net/mstar/archive/2006/11/16/81542.html</link><dc:creator>黑灵</dc:creator><author>黑灵</author><pubDate>Thu, 16 Nov 2006 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/mstar/archive/2006/11/16/81542.html</guid><wfw:comment>http://www.blogjava.net/mstar/comments/81542.html</wfw:comment><comments>http://www.blogjava.net/mstar/archive/2006/11/16/81542.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/mstar/comments/commentRss/81542.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mstar/services/trackbacks/81542.html</trackback:ping><description><![CDATA[要读懂我这篇文章估计需要一些前期知识：<br />你要知道Spring是什么，并且要知道Spring已经出了2.0的版本了。<br />你要知道DWR是什么，并且要知道DWR也要出2.0的版本了。<br /><br />呵呵，开个玩笑……。这年头在BlogJava上混的，估计没几个不知道上面这两个项了。<br /><br />好了，现在言归正传。DWR本身就提供对Spring的支持，可以直接把Spring中的Bean暴露给客户端浏览器的Javascript调用。在dwr.xml中的写法是这样的：<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">allow</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">create </span><span style="COLOR: #ff0000">creator</span><span style="COLOR: #0000ff">="spring"</span><span style="COLOR: #ff0000"> javascript</span><span style="COLOR: #0000ff">="AjaxPortalService"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="beanName"</span><span style="COLOR: #ff0000"> value</span><span style="COLOR: #0000ff">="AjaxPortalService"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include </span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="changeWondowState"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include </span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="changeWorkbenchState"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include </span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="changeWindowOrder"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">create</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">allow</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">dwr</span><span style="COLOR: #0000ff">&gt;</span></div><br />这样写到也没什么，只是把项目分模块以后，虽有的配置都写到一个dwr.xml文件里面维护起来比较麻烦，尤其再遇到版本管理中的代码合并。所以曾经我扩展了DWR，让它可以从多个文件读取配置信息。然后每个模块自己一个配置文件，跟着source一起走。这样做也有问题，就是现在Java应用程序的配置文件太多啦！Spring的配置，WebWork的配置，Hibernate的配置，DWR的配置，再加上一些杂七杂八的xml和properties。看着这些配置文件简直要疯掉了。<br /><br />正在此时，spring2横空出世，现在你可以把一些配置文件合并到一起了。正好趁此机会体验一下Spring2的自定义schema特性。<br /><br />目标：<br />把DWR的配置写成这样：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml version="1.0" encoding="GBK"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">beans </span><span style="COLOR: #ff0000">xmlns</span><span style="COLOR: #0000ff">="http://www.springframework.org/schema/beans"</span><span style="COLOR: #ff0000"><br />    xmlns:xsi</span><span style="COLOR: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="COLOR: #ff0000"><br />    xmlns:tx</span><span style="COLOR: #0000ff">="http://www.springframework.org/schema/tx"</span><span style="COLOR: #ff0000"><br />    xmlns:aop</span><span style="COLOR: #0000ff">="http://www.springframework.org/schema/aop"</span><span style="COLOR: #ff0000"><br />    xmlns:dwr</span><span style="COLOR: #0000ff">="http://www.devside.org/schema/spring/dwr"</span><span style="COLOR: #ff0000"><br />    xsi:schemaLocation</span><span style="COLOR: #0000ff">="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd<br />           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd<br />           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd<br />           http://www.devside.org/schema/spring/dwr http://www.devside.org/schema/spring/dwr.xsd"</span><span style="COLOR: #ff0000"><br />    default-autowire</span><span style="COLOR: #0000ff">="byName"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />    <br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="departmentDao"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="cn.com.legendapl.hellostruts2.dao.DepartmentDao"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="employeeDao"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="cn.com.legendapl.hellostruts2.dao.EmployeeDao"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="companyService"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="cn.com.legendapl.hellostruts2.service.CompanyService"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />    <br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">aop:config</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">aop:pointcut </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="companyServiceOperation"</span><span style="COLOR: #ff0000"> expression</span><span style="COLOR: #0000ff">="execution(* cn.com.legendapl.hellostruts2.service.ICompanyService.*(..))"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">aop:advisor </span><span style="COLOR: #ff0000">advice-ref</span><span style="COLOR: #0000ff">="txAdvice"</span><span style="COLOR: #ff0000"> pointcut-ref</span><span style="COLOR: #0000ff">="companyServiceOperation"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">aop:config</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">    <br />    <br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="ajaxCompanyProxy"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="cn.com.legendapl.hellostruts2.ajax.AjaxCompanyProxy"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />    <br />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr:allow </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="ajaxCompanyProxyAllow"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr:create </span><span style="COLOR: #ff0000">beanName</span><span style="COLOR: #0000ff">="ajaxCompanyProxy"</span><span style="COLOR: #ff0000"> javascript</span><span style="COLOR: #0000ff">="CompanyProxy"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr:include </span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="findEmployeeById"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">dwr:create</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr:convert </span><span style="COLOR: #ff0000">converter</span><span style="COLOR: #0000ff">="bean"</span><span style="COLOR: #ff0000"> match</span><span style="COLOR: #0000ff">="cn.com.legendapl.hellostruts2.entity.*"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">dwr:allow</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">beans</span><span style="COLOR: #0000ff">&gt;</span></div><p><br />重点在这里：<br />    <span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr:allow </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="ajaxCompanyProxyAllow"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr:create </span><span style="COLOR: #ff0000">beanName</span><span style="COLOR: #0000ff">="ajaxCompanyProxy"</span><span style="COLOR: #ff0000"> javascript</span><span style="COLOR: #0000ff">="CompanyProxy"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr:include </span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="findEmployeeById"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">dwr:create</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr:convert </span><span style="COLOR: #ff0000">converter</span><span style="COLOR: #0000ff">="bean"</span><span style="COLOR: #ff0000"> match</span><span style="COLOR: #0000ff">="cn.com.legendapl.hellostruts2.entity.*"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">dwr:allow</span><span style="COLOR: #0000ff">&gt;</span></p><p><span style="COLOR: #0000ff"><font color="#000000">好了现在动手开始做。<br /><br />原理其实很简单，现在看张图。画的不好，敬请原谅！<br /><br /><br /><br /><img height="362" alt="spring-dwr.png" src="http://www.blogjava.net/images/blogjava_net/mstar/pics20050930/spring-dwr.png" width="793" border="0" /><br /><br />从这样图中我们可以看出我们要做如下工作：<br />1、做一个dwr.xsd，定义spring配置文件中的dwr这部分配置的schema。<br />   要做这个需要有一定xml和xsd的知识，我也是现学现用啦！<br /></font></span></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml version="1.0" encoding="UTF-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:schema </span><span style="COLOR: #ff0000">xmlns</span><span style="COLOR: #0000ff">="http://www.devside.org/schema/spring/dwr"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    xmlns:xsd</span><span style="COLOR: #0000ff">="http://www.w3.org/2001/XMLSchema"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    xmlns:beans</span><span style="COLOR: #0000ff">="http://www.springframework.org/schema/beans"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    targetNamespace</span><span style="COLOR: #0000ff">="http://www.devside.org/schema/spring/dwr"</span><span style="COLOR: #ff0000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    elementFormDefault</span><span style="COLOR: #0000ff">="qualified"</span><span style="COLOR: #ff0000">    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    attributeFormDefault</span><span style="COLOR: #0000ff">="unqualified"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:import </span><span style="COLOR: #ff0000">namespace</span><span style="COLOR: #0000ff">="http://www.springframework.org/schema/beans"</span><span style="COLOR: #ff0000"> schemaLocation</span><span style="COLOR: #0000ff">="http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:element </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="allow"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:complexType</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:complexContent</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:extension </span><span style="COLOR: #ff0000">base</span><span style="COLOR: #0000ff">="beans:identifiedType"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:sequence</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:element </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="create"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="createType"</span><span style="COLOR: #ff0000"> minOccurs</span><span style="COLOR: #0000ff">="0"</span><span style="COLOR: #ff0000"> maxOccurs</span><span style="COLOR: #0000ff">="unbounded"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">                <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:element </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="convert"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="convertType"</span><span style="COLOR: #ff0000"> minOccurs</span><span style="COLOR: #0000ff">="0"</span><span style="COLOR: #ff0000"> maxOccurs</span><span style="COLOR: #0000ff">="unbounded"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">                <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:sequence</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:extension</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:complexContent</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:complexType</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:element</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:complexType </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="createType"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:sequence</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:element </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="auth"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="authType"</span><span style="COLOR: #ff0000"> minOccurs</span><span style="COLOR: #0000ff">="0"</span><span style="COLOR: #ff0000"> maxOccurs</span><span style="COLOR: #0000ff">="unbounded"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:element </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="include"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="includeType"</span><span style="COLOR: #ff0000"> minOccurs</span><span style="COLOR: #0000ff">="0"</span><span style="COLOR: #ff0000"> maxOccurs</span><span style="COLOR: #0000ff">="unbounded"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:element </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="exclude"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="excludeType"</span><span style="COLOR: #ff0000"> minOccurs</span><span style="COLOR: #0000ff">="0"</span><span style="COLOR: #ff0000"> maxOccurs</span><span style="COLOR: #0000ff">="unbounded"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">                            <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:sequence</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:attribute </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="beanName"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="xsd:string"</span><span style="COLOR: #ff0000"> use</span><span style="COLOR: #0000ff">="required"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:attribute </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="javascript"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="xsd:string"</span><span style="COLOR: #ff0000"> use</span><span style="COLOR: #0000ff">="required"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">                                                <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:complexType</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:complexType </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="convertType"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:attribute </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="converter"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="xsd:string"</span><span style="COLOR: #ff0000"> use</span><span style="COLOR: #0000ff">="required"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:attribute </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="match"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="xsd:string"</span><span style="COLOR: #ff0000"> use</span><span style="COLOR: #0000ff">="required"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:complexType</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:complexType </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="authType"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:attribute </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="method"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="xsd:string"</span><span style="COLOR: #ff0000"> use</span><span style="COLOR: #0000ff">="required"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:attribute </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="role"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="xsd:string"</span><span style="COLOR: #ff0000"> use</span><span style="COLOR: #0000ff">="required"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:complexType</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:complexType </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="includeType"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:attribute </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="method"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="xsd:string"</span><span style="COLOR: #ff0000"> use</span><span style="COLOR: #0000ff">="required"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:complexType</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:complexType </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="excludeType"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xsd:attribute </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="method"</span><span style="COLOR: #ff0000"> type</span><span style="COLOR: #0000ff">="xsd:string"</span><span style="COLOR: #ff0000"> use</span><span style="COLOR: #0000ff">="required"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:complexType</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xsd:schema</span><span style="COLOR: #0000ff">&gt;</span></div><p>2、我们要做一个DWRNamespaceHandler来处理DWR的配置信息，其实里面就做一件事把AllowBeanDefinitionParser注册给allow节点。因为我们dwr的配置部分根节点就一个标签allow，所以我们就做一个用于解析allow标签的AllowBeanDefinitionParser解析器就行。如果我们的根节点还有其他的标签，同样也要做相应的解析器。<br /><br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> DWRNamespaceHandler </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> NamespaceHandlerSupport {<br /><br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> init() {<br />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">把AllowBeanDefinitionParser注册到allow节点</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">        registerBeanDefinitionParser(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">allow</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> AllowBeanDefinitionParser());<br />    }<br /><br />}</span></div><br />其实难点是做AllowBeanDefinitionParser，这里你需要一些DOM模型的知识，来操作配置节点的内容。然后根据内容进行处理。在这里我们，需要做三件事：<br />   [1]  把配置节点的内容转换成对象模型，即AllowBean（其实就是一些POJO罢了）。<br />   [2]  把这个AllowBean注册给Spring的Context，这一步是可选的。因为我们主要是把这个Bean给DWR，当然顺道给Spring一份也没什么问题。<br />   [3] 把这个AllowBean注册到AllowBeanHolder。<br /><br />3、AllowBeanHolder。<br />   其实这就是个简单的singleton类，整个运行期只有一个实例。它就像一个容器，AllowBeanDefinitionParser往里放，DWR的Configuration再从这里取。<br /><br />4、扩展DWR的DefaultConfiguration，我们做一个SpringConfiguration。DWR的DefaultConfiguration是负责读取配置信息的。我们在其中加入从AllowBeanHolder读取配置信息的功能即可。<br /><br />5、扩展DWR的DWRServlet，我们做一个SpringDWRServlet，原来的DWRServlet加载的是DefaultConfiguration，我们的Serlvet加载我们自己的SpringConfiguration即可。<br /><br />6、万事俱备，只欠东风啦。就是让Spring知道我们干了这些！<br />   在META-INF目录下（如果没有在src目录下创建一个）加入spring.handlers和spring.schemas两个文件。<br />   spring.handlers中的内容：<br /><span style="COLOR: #000000">   <font color="#008000">http\:</font></span><font color="#008000"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">www.devside.org/schema/spring/dwr=org.devside.core.support.dwr.DWRNamespaceHandler</span></font><br />   spring.schemas中的内容：<br />   <font color="#008000">http\://www.devside.org/schema/spring/dwr.xsd=org/devside/core/support/dwr/dwr.xsd<br />   <br />   </font><font color="#000000">注意不要写错字哦，我一开始就写错一个字母，结果怎么调试都不能成功，还以为Spring2有问题呢。<br /><br />ok了，下面我们就可以写一个spring的配置文件来试试喽。<br /><br />下面提供两个源码包，一个是spring-dwr的源码，一个是hellosturts2，一个struts2+spring2+hibernate3.2的例子，其中有用到spring-dwr的例子。<br /><br />为了减小容量，我把jar都去掉了，lib目录下提供了一个列表，你可以自己去找相关的jar包。<br /><br /><a href="/Files/mstar/HelloStruts2.zip">http://www.blogjava.net/Files/mstar/HelloStruts2.zip</a><br /><br /><a href="/Files/mstar/spring-dwr.zip">http://www.blogjava.net/Files/mstar/spring-dwr.zip</a></font><img src ="http://www.blogjava.net/mstar/aggbug/81542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mstar/" target="_blank">黑灵</a> 2006-11-16 15:50 <a href="http://www.blogjava.net/mstar/archive/2006/11/16/81542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dwr简介--一个例子(续二) </title><link>http://www.blogjava.net/mstar/archive/2005/08/09/9674.html</link><dc:creator>黑灵</dc:creator><author>黑灵</author><pubDate>Tue, 09 Aug 2005 09:56:00 GMT</pubDate><guid>http://www.blogjava.net/mstar/archive/2005/08/09/9674.html</guid><wfw:comment>http://www.blogjava.net/mstar/comments/9674.html</wfw:comment><comments>http://www.blogjava.net/mstar/archive/2005/08/09/9674.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/mstar/comments/commentRss/9674.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mstar/services/trackbacks/9674.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 页面部分有几个重要的文件：login.jsp -- 登陆画面showtable.jsp -- 显示table的画面showtable.js -- 显示table页用到的javascript下面是login.jsp&lt;body&gt;&lt;!--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面是要用到了js，UserLogic.js是自己的，是有dwr根据你编写的dwr...&nbsp;&nbsp;<a href='http://www.blogjava.net/mstar/archive/2005/08/09/9674.html'>阅读全文</a><img src ="http://www.blogjava.net/mstar/aggbug/9674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mstar/" target="_blank">黑灵</a> 2005-08-09 17:56 <a href="http://www.blogjava.net/mstar/archive/2005/08/09/9674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dwr简介--一个例子(续)</title><link>http://www.blogjava.net/mstar/archive/2005/08/09/9673.html</link><dc:creator>黑灵</dc:creator><author>黑灵</author><pubDate>Tue, 09 Aug 2005 09:34:00 GMT</pubDate><guid>http://www.blogjava.net/mstar/archive/2005/08/09/9673.html</guid><wfw:comment>http://www.blogjava.net/mstar/comments/9673.html</wfw:comment><comments>http://www.blogjava.net/mstar/archive/2005/08/09/9673.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/mstar/comments/commentRss/9673.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mstar/services/trackbacks/9673.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 抱歉这篇才写。上班没有多少时间啊！TableModelBean.java 这是核心业务类，既要被Action使用又要被dwr使用。由于我注释写了一些，所以就不详细介绍了public&nbsp;class&nbsp;TableModelBean&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//表格的第一列&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/mstar/archive/2005/08/09/9673.html'>阅读全文</a><img src ="http://www.blogjava.net/mstar/aggbug/9673.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mstar/" target="_blank">黑灵</a> 2005-08-09 17:34 <a href="http://www.blogjava.net/mstar/archive/2005/08/09/9673.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dwr简介--一个例子</title><link>http://www.blogjava.net/mstar/archive/2005/08/08/9566.html</link><dc:creator>黑灵</dc:creator><author>黑灵</author><pubDate>Mon, 08 Aug 2005 05:58:00 GMT</pubDate><guid>http://www.blogjava.net/mstar/archive/2005/08/08/9566.html</guid><wfw:comment>http://www.blogjava.net/mstar/comments/9566.html</wfw:comment><comments>http://www.blogjava.net/mstar/archive/2005/08/08/9566.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/mstar/comments/commentRss/9566.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mstar/services/trackbacks/9566.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 上一篇我主要介绍dwr的概况。这一篇我用dwr做了个可以不刷新页面就更新的表格。运行环境：windows xp pro sp2j2sdk1.2.4_03weblogic8.1struts1.2.4开发工具eclipse3.0其实dwr和struts没有什么关系，只不过最近我们项目组在用struts作东西。我就顺便用把我的程序建立在Struts上。主要文件。dwr.jar--dwr的类库包strut...&nbsp;&nbsp;<a href='http://www.blogjava.net/mstar/archive/2005/08/08/9566.html'>阅读全文</a><img src ="http://www.blogjava.net/mstar/aggbug/9566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mstar/" target="_blank">黑灵</a> 2005-08-08 13:58 <a href="http://www.blogjava.net/mstar/archive/2005/08/08/9566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dwr简介</title><link>http://www.blogjava.net/mstar/archive/2005/08/08/9561.html</link><dc:creator>黑灵</dc:creator><author>黑灵</author><pubDate>Mon, 08 Aug 2005 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/mstar/archive/2005/08/08/9561.html</guid><wfw:comment>http://www.blogjava.net/mstar/comments/9561.html</wfw:comment><comments>http://www.blogjava.net/mstar/archive/2005/08/08/9561.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/mstar/comments/commentRss/9561.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mstar/services/trackbacks/9561.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最近</SPAN><SPAN lang=EN-US>Ajax</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比较火，全世界都在讨论。于是我也掺和掺和，直接用</SPAN><SPAN lang=EN-US>XMLHttpRequest</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">？现在的我还没有那个水平。用</SPAN><SPAN lang=EN-US>Echo2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者</SPAN><SPAN lang=EN-US>backbase</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，又感觉那些纯</SPAN><SPAN lang=EN-US>Ajax</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>framework</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">太重量级了。我要的只是一些简单的应用而已。于是寻觅的重点放在了一些对</SPAN><SPAN lang=EN-US>xmlhttpRequest</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行轻量级包装的代码库上了。于是我找到了</SPAN><SPAN lang=EN-US>DWR</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</SPAN><SPAN lang=EN-US>Direct Web Remoting</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。</SPAN><SPAN lang=EN-US>DWR</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的口号是</SPAN><SPAN lang=EN-US>AJAX and XMLHttpRequest made easy</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，并且它也基本上做到了这一点。它提供了一个友好的框架和一些很有用的</SPAN><SPAN lang=EN-US>JavaScript</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">库，可以让我用起</SPAN><SPAN lang=EN-US>Ajax</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">更容易些。详细的信息可以到他们的网站</SPAN><SPAN lang=EN-US><A href="http://www.getahead.ltd.uk/dwr/">http://www.getahead.ltd.uk/dwr/</A></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。顺便在介绍一个网站吧：</SPAN><SPAN lang=EN-US><A href="http://www.ajaxmatters.com/">http://www.ajaxmatters.com</A> </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里也有很多关于</SPAN><SPAN lang=EN-US>Ajax</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的资源。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面来简单介绍一下</SPAN><SPAN lang=EN-US>DWR</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其实在没有</SPAN><SPAN lang=EN-US>XMLHttpRequest</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">前</SPAN><SPAN lang=EN-US>DWR</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就有了，那时它用的是</SPAN><SPAN lang=EN-US>IFrame</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，效果很差，所以我看看了就没有再</SPAN><SPAN lang=EN-US>diao</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">它。现在的</SPAN><SPAN lang=EN-US>DWR</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主要用</SPAN><SPAN lang=EN-US>XMLHttpRequest</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，当然也可以选者用</SPAN><SPAN lang=EN-US>IFrame</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，但是不推荐。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>DWR</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是个</SPAN><SPAN lang=EN-US>open source software</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，授权方式是</SPAN> <SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana"><A href="http://www.apache.org/licenses/LICENSE-2.0.html"><SPAN style="COLOR: #9a1414; TEXT-DECORATION: none; text-underline: none">ASL version 2.0</SPAN></A></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的。现在网站上</SPAN><SPAN lang=EN-US>examples and tutorials</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">做的也不错。我就根据这些东西自己也做了一个应用，在本文的后面我会详细讲到。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">现在</SPAN><SPAN lang=EN-US>DWR</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的最新版本是</SPAN><SPAN lang=EN-US>1.0RC1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。在我的试用环境相还算比较稳定，没有出现什么问题。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>DWR</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本身以一个</SPAN><SPAN lang=EN-US>dwr.jar</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>jar</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包存在，它的入口时一个</SPAN><SPAN lang=EN-US>Servlet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</SPAN><SPAN lang=EN-US>uk.ltd.getahead.dwr.DWRServlet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）所以要在</SPAN><SPAN lang=EN-US>web.xml</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">里配置一下就可以了。具体配置看这里</SPAN><SPAN lang=EN-US><A href="http://www.getahead.ltd.uk/dwr/intro.html">http://www.getahead.ltd.uk/dwr/intro.html</A></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。比较简单。</SPAN><SPAN lang=EN-US>dwr</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为我们提供了一个</SPAN><SPAN lang=EN-US>framework</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">帮我们很容易的实现</SPAN><SPAN lang=EN-US>JavaScript</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US>java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之间的通信。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana"><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><v:shapetype id=_x0000_t75 coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><IMG height=281 alt=howitworks.png src="http://www.blogjava.net/images/blogjava_net/mstar/pics/howitworks.png" width=521 border=0><BR><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>我还没有看过</FONT></SPAN><FONT color=#000000><FONT style="BACKGROUND-COLOR: #ffffff"><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana">dwr</SPAN><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的源码，具体他是怎么实现的我也不太清楚。但大致上肯定是通过</SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana">xmlhttprequest</SPAN><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">来调用它的</SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana">servlet</SPAN><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">然后把数据用</SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana">xml</SPAN><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">打包解包了。其实我觉得这部分到不是</SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana">dwr</SPAN><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">给我带来的最方便的地方。最方便的地方应该是他的那些</SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana">js</SPAN><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的库。</SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana"><o:p></o:p></SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT color=#000000><FONT style="BACKGROUND-COLOR: #ffffff"><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">所以下面我要介绍一下它的两个重要</SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana">js</SPAN><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">对象。</SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana"><o:p></o:p></SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT color=#000000><FONT style="BACKGROUND-COLOR: #ffffff"><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana">DWREngine </SPAN><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">（</SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana">engine.js</SPAN><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">中），</SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana">DWRUtil (util.js</SPAN><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">中</SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana">)</SPAN><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">。</SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana"><o:p></o:p></SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT color=#000000><FONT style="BACKGROUND-COLOR: #ffffff"><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana">DWREngine</SPAN><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">中的方法是基本上是关于</SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana">XMLHttpRequest</SPAN><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的。</SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana"><o:p></o:p></SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT color=#000000><FONT style="BACKGROUND-COLOR: #ffffff"><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">下面中介绍一些</SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana"><o:p></o:p></SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana"><FONT color=#000000><FONT style="BACKGROUND-COLOR: #ffffff">DWREngine.setErrorHandler(handler)<o:p></o:p></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT color=#000000><FONT style="BACKGROUND-COLOR: #ffffff"><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">默认的错误处理时弹出一个对话框，你可以通过这个方法改变成你需要的表现形式。</SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana"><o:p></o:p></SPAN></FONT></FONT></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana"><FONT color=#000000><FONT style="BACKGROUND-COLOR: #ffffff">DWREngine.setWarningHandler(handler)<o:p></o:p></FONT></FONT></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="COLOR: #666666; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><FONT style="BACKGROUND-COLOR: #ffffff" color=#000000>改变默认的警告处理形式</FONT></SPAN><SPAN lang=EN-US style="COLOR: #666666; FONT-FAMILY: Verdana"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>DWREngine.beginBatch()</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>Some Remote Function…</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>DWREngine.endBatch()</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当你有几个远程调用要一起进行时，就要用到这两个方法。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果不用这两个方法，你就会发现你的远程调用并不以你想象的顺序进行。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>DWREngine</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中还有一些其它的方法，我没有用过。你可以通过</SPAN><SPAN lang=EN-US>dwr</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>js-doc</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来看。如果通过文档看不懂它是干什么用的，就看</SPAN><SPAN lang=EN-US>js</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">源码，源码的注释也是比较详细的。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>DWRUtil</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中也有一些很有用的方法。这些方法一般是编写</SPAN><SPAN lang=EN-US>js</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的辅助方法。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比如</SPAN><SPAN lang=EN-US>setValue</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US>getValue</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。大多数</SPAN><SPAN lang=EN-US>html</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标签有</SPAN><SPAN lang=EN-US>value</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性，这时你要获取或者设置它的值时就用</SPAN><SPAN lang=EN-US>$(“someid”).value</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就可以了。但是有些</SPAN><SPAN lang=EN-US>html</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标记是没有</SPAN><SPAN lang=EN-US>value</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性的，它的值时在标签的中间，如</SPAN><SPAN lang=EN-US>&lt;span id=”span<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><st1:chmetcnv UnitName="”" SourceValue="1" HasSpace="False" Negative="False" NumberType="1" TCSC="0" w:st="on">1”</st1:chmetcnv>&gt;some value&lt;/span&gt;</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这时你要取或设它的值的时候就用</SPAN><SPAN lang=EN-US>DWRUtil.setValue($(“span1”)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US>someValue)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。这样你就可以在客户端动态的表现一些数据了。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还有很多很好用的方法，</SPAN><SPAN lang=EN-US>dwr</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的例子中有一些说明，源码中的注释也比较详细。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>Dwr</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就介绍到这里吧。下一篇，我做了个</SPAN><SPAN lang=EN-US>table</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的例子。<BR><IMG style="WIDTH: 686px; HEIGHT: 618px" height=618 alt=screen.jpg src="http://www.blogjava.net/images/blogjava_net/mstar/pics/screen.jpg" width=802 border=0></SPAN></P><img src ="http://www.blogjava.net/mstar/aggbug/9561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mstar/" target="_blank">黑灵</a> 2005-08-08 13:26 <a href="http://www.blogjava.net/mstar/archive/2005/08/08/9561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>