﻿<?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-满店香的家-文章分类-dwr源码分析</title><link>http://www.blogjava.net/yigemaser/category/30437.html</link><description>学习+实践=进步</description><language>zh-cn</language><lastBuildDate>Sun, 25 May 2008 06:19:57 GMT</lastBuildDate><pubDate>Sun, 25 May 2008 06:19:57 GMT</pubDate><ttl>60</ttl><item><title>第六部分 DWR原理</title><link>http://www.blogjava.net/yigemaser/articles/191018.html</link><dc:creator>满店香</dc:creator><author>满店香</author><pubDate>Sun, 06 Apr 2008 04:13:00 GMT</pubDate><guid>http://www.blogjava.net/yigemaser/articles/191018.html</guid><wfw:comment>http://www.blogjava.net/yigemaser/comments/191018.html</wfw:comment><comments>http://www.blogjava.net/yigemaser/articles/191018.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/yigemaser/comments/commentRss/191018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yigemaser/services/trackbacks/191018.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 通过前面五章学习，对DWR整体有所了解，但是我仍然对核心细节不是很清楚。我最后的办法就是单步调试，调试之后将所有东西串一串，DWR的原理就清楚了，搞清楚核心生产线，其他全是辅助的，没必要再分析了。老外聪明啊，服。<br />
&nbsp;&nbsp; 我们以DWR的第一个样例为例Dynamically Text<br />
&nbsp;&nbsp; 1，在index.html里面我们嵌入<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;script type='text/javascript' src='../dwr/engine.js'&gt; &lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;script type='text/javascript' src='../dwr/util.js'&gt; &lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;script type='text/javascript' src='../dwr/interface/Demo.js'&gt; &lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前面两个都是DWR系统默认需要加载的，Demo.js是Demo.java所对应的。按理论，只要在web.xml和dwr.xml配置好，那么我们就可以在客户端操作Demo.js，类似于操作服务器端的Demo.js。<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<div id="sourceDiv" style="display: block">
<h2>HTML source:</h2>
<pre>&lt;p&gt;
Name:
&lt;input type="text" id="demoName"/&gt;
&lt;input value="Send" type="button" onclick="update()"/&gt;
&lt;br/&gt;
Reply: &lt;span id="demoReply"&gt;&lt;/span&gt;
&lt;/p&gt;
</pre>
<h2>Javascript source:</h2>
<pre>function update() {
var name = dwr.util.getValue("demoName");
Demo.sayHello(name, function(data) {
dwr.util.setValue("demoReply", data);
});
}
</pre>
<h2>Java source:</h2>
<pre>package org.getahead.dwrdemo.simpletext;
public class Demo {
public String sayHello(String name) {
return "Hello, " + name;
}
}
</pre>
<h2>dwr.xml</h2>
<pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN"
"http://getahead.org/dwr/dwr20.dtd"&gt;
&lt;dwr&gt;
&lt;allow&gt;
&lt;create creator="new" javascript="Demo"&gt;
&lt;param name="class" value="org.getahead.dwrdemo.simpletext.Demo"/&gt;
&lt;/create&gt;
&lt;/allow&gt;
&lt;/dwr&gt;
</pre>
</div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在浏览器第一次加载本页面时，浏览器第一步发现&lt;script type='text/javascript' src='../dwr/engine.js'&gt; &lt;/script&gt;，根据web.xml关于dwr的配置，系统会激发Servlet的POST方法,向客户端输出engine.js文件流，这个文件你可以在IE的缓存里面发现,当然,程序会在最后输出一刻比较客户端是否已经存在该文件，如果要输出的文件流大小和和该文件大小一致，就不输出了，同样util.js、Demo.js也是这么输出的。那么看看Demo.js文件里面的内容如下：<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"><img id="Codehighlighter1_41_183_Open_Image" onclick="this.style.display='none'; Codehighlighter1_41_183_Open_Text.style.display='none'; Codehighlighter1_41_183_Closed_Image.style.display='inline'; Codehighlighter1_41_183_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_41_183_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_41_183_Closed_Text.style.display='none'; Codehighlighter1_41_183_Open_Image.style.display='inline'; Codehighlighter1_41_183_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">typeof</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">['Person']&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;'</span><span style="color: #0000ff">function</span><span style="color: #000000">')&nbsp;</span><span id="Codehighlighter1_41_183_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_41_183_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_63_181_Open_Image" onclick="this.style.display='none'; Codehighlighter1_63_181_Open_Text.style.display='none'; Codehighlighter1_63_181_Closed_Image.style.display='inline'; Codehighlighter1_63_181_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_63_181_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_63_181_Closed_Text.style.display='none'; Codehighlighter1_63_181_Open_Image.style.display='inline'; Codehighlighter1_63_181_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;Person()&nbsp;</span><span id="Codehighlighter1_63_181_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_63_181_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.address&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.phoneNumber&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.salary&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Provide&nbsp;a&nbsp;default&nbsp;path&nbsp;to&nbsp;dwr.engine</span><span style="color: #008000"><br />
<img id="Codehighlighter1_276_277_Open_Image" onclick="this.style.display='none'; Codehighlighter1_276_277_Open_Text.style.display='none'; Codehighlighter1_276_277_Closed_Image.style.display='inline'; Codehighlighter1_276_277_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_276_277_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_276_277_Closed_Text.style.display='none'; Codehighlighter1_276_277_Open_Image.style.display='inline'; Codehighlighter1_276_277_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">typeof</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">['dwr']&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;'undefined')&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.dwr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_276_277_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_276_277_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000">;<br />
<img id="Codehighlighter1_334_335_Open_Image" onclick="this.style.display='none'; Codehighlighter1_334_335_Open_Text.style.display='none'; Codehighlighter1_334_335_Closed_Image.style.display='inline'; Codehighlighter1_334_335_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_334_335_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_334_335_Closed_Text.style.display='none'; Codehighlighter1_334_335_Open_Image.style.display='inline'; Codehighlighter1_334_335_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">typeof</span><span style="color: #000000">&nbsp;dwr['engine']&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;'undefined')&nbsp;dwr.engine&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_334_335_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_334_335_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_391_392_Open_Image" onclick="this.style.display='none'; Codehighlighter1_391_392_Open_Text.style.display='none'; Codehighlighter1_391_392_Closed_Image.style.display='inline'; Codehighlighter1_391_392_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_391_392_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_391_392_Closed_Text.style.display='none'; Codehighlighter1_391_392_Open_Image.style.display='inline'; Codehighlighter1_391_392_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">typeof</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">['Demo']&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;'undefined')&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.Demo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_391_392_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_391_392_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Demo._path&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;'</span><span style="color: #000000">/</span><span style="color: #000000">dwr</span><span style="color: #000000">/</span><span style="color: #000000">dwr';<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_461_539_Open_Image" onclick="this.style.display='none'; Codehighlighter1_461_539_Open_Text.style.display='none'; Codehighlighter1_461_539_Closed_Image.style.display='inline'; Codehighlighter1_461_539_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_461_539_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_461_539_Closed_Text.style.display='none'; Codehighlighter1_461_539_Open_Image.style.display='inline'; Codehighlighter1_461_539_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />Demo.sayHello&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">(p0,&nbsp;callback)&nbsp;</span><span id="Codehighlighter1_461_539_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_461_539_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;dwr.engine._execute(Demo._path,&nbsp;'Demo',&nbsp;'sayHello',&nbsp;p0,&nbsp;callback);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_580_656_Open_Image" onclick="this.style.display='none'; Codehighlighter1_580_656_Open_Text.style.display='none'; Codehighlighter1_580_656_Closed_Image.style.display='inline'; Codehighlighter1_580_656_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_580_656_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_580_656_Closed_Text.style.display='none'; Codehighlighter1_580_656_Open_Image.style.display='inline'; Codehighlighter1_580_656_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />Demo.getInclude&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">function</span><span style="color: #000000">(callback)&nbsp;</span><span id="Codehighlighter1_580_656_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_580_656_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;dwr.engine._execute(Demo._path,&nbsp;'Demo',&nbsp;'getInclude',&nbsp;callback);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;</span></div>
<p>&nbsp;&nbsp;&nbsp; 这样我们就知道了，实际上Demo.java类的sayHello方法已经被解释到Demo.js中了，只不过后面的调用还不是很清楚而已。<br />
继续！<br />
public String sayHello(String name) {<br />
return "Hello, " + name;<br />
}<br />
&nbsp;翻译成<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Demo._path = '/dwr/dwr';<br />
&nbsp;Demo.sayHello = function(p0, callback) {<br />
&nbsp; return dwr.engine._execute(Demo._path, 'Demo', 'sayHello', p0, callback);<br />
};<br />
&nbsp; 在调用engine.execute()方法时，最终采用无刷新访问服务器技术。<br />
&nbsp;采用该技术的关键问题是两个参数，一个是url，往什么地方发送；一个是doc，发送什么内容<br />
&nbsp;通过跟踪engine.js我们知道<br />
url=/dwr/dwr/call/plaincall/Demo.sayHello.dwr<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"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">callCount</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />windowName</span><span style="color: #000000">=</span><span style="color: #000000">DWR</span><span style="color: #000000">-</span><span style="color: #000000">442B435<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000">899</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />c0</span><span style="color: #000000">-</span><span style="color: #000000">scriptName</span><span style="color: #000000">=</span><span style="color: #000000">Demo<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />c0</span><span style="color: #000000">-</span><span style="color: #000000">methodName</span><span style="color: #000000">=</span><span style="color: #000000">sayHello<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />c0</span><span style="color: #000000">-</span><span style="color: #000000">id</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />c0</span><span style="color: #000000">-</span><span style="color: #000000">param0</span><span style="color: #000000">=</span><span style="color: #000000">string:Joe<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />batchId</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />page</span><span style="color: #000000">=/</span><span style="color: #000000">dwr</span><span style="color: #000000">/</span><span style="color: #000000">simpletext</span><span style="color: #000000">/</span><span style="color: #000000">index.html<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />httpSessionId</span><span style="color: #000000">=</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />scriptSessionId</span><span style="color: #000000">=</span><span style="color: #000000">1CC3A<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.0A3</span></div>
<p><br />
实际上url=/dwr/dwr/call/plaincall/Demo.sayHello.dwr，转向的是DwrServlet，DwrServlet实际上获取了两部分信息，一部分是url，根据这个能够解析到我们的目标java类、方法，另外一部分是发送信息包，实际上这就是SayHello所需要的参数输入信息，最后，返回数据，这些数据格式通过response返回，在engine.js中对应于return batch.reply;通过解析返回对象，采用javascirpt将数据动态刷新到页面。</p>
<p>&nbsp;&nbsp;&nbsp; 至此，dwr的核心原理，基本清晰</p>
<img src ="http://www.blogjava.net/yigemaser/aggbug/191018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yigemaser/" target="_blank">满店香</a> 2008-04-06 12:13 <a href="http://www.blogjava.net/yigemaser/articles/191018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第二部分 下载源码，做好准备</title><link>http://www.blogjava.net/yigemaser/articles/190861.html</link><dc:creator>满店香</dc:creator><author>满店香</author><pubDate>Fri, 04 Apr 2008 18:35:00 GMT</pubDate><guid>http://www.blogjava.net/yigemaser/articles/190861.html</guid><wfw:comment>http://www.blogjava.net/yigemaser/comments/190861.html</wfw:comment><comments>http://www.blogjava.net/yigemaser/articles/190861.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yigemaser/comments/commentRss/190861.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yigemaser/services/trackbacks/190861.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; DWR在<a href="http://www.java.net">www.java.net</a>开源社区中,目前是3.0版本，而且由于DWR去年刚加入Dojo基金会，而Dojo基金会力促DWR和基金会下面的另外一个comet项目结合，估计将来dwr会有很大变化。dwr是以客户端获取会主的动态技术，comet是以服务器端推为主的动态技术，这两个结合有好看的，我们拟目以待。首先要去到<a href="http://www.java.net">www.java.net</a>网站注册一个用户名，注册之后，就可以下载源码啦。【四大开源社区：&nbsp;1)www.sourceforge.net；2)www.java.net；3)<a href="http://www.eclipse.org">www.eclipse.org</a>；4)<a href="http://www.opensource.org">www.opensource.org</a>】<br />
&nbsp;&nbsp;&nbsp;我是这么下载源码的，使用的eclipse的cvs工具,按下面方式填写<br />
&nbsp;&nbsp;&nbsp; Connection type:&nbsp;&nbsp;&nbsp;&nbsp;pserver<br />
&nbsp;&nbsp;&nbsp; User:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你的注册用户名称<br />
&nbsp;&nbsp;&nbsp; Password:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你的注册用户密码<br />
&nbsp;&nbsp;&nbsp; Host:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cvs.dev.java.net<br />
&nbsp;&nbsp;&nbsp; Repository path:&nbsp;&nbsp;&nbsp;&nbsp; /cvs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Use default port<br />
&nbsp;&nbsp; 打开cvs后，你会发现好多好多开源工程，找到DWR工程,目前DWR版本是3.0，check out，在把运行环境配备好，我用的是Tomcat5.5，java虚拟机1.5版本，这三个正好配套。<br />
&nbsp;&nbsp;&nbsp;将eclipse和Tomcat5.5调试好后，我们就可以将工程发布到Tomcat中去了，这里注意，由于DWR工程组织方式是按ant习惯方式组织的，所以你不能按eclipse默认方式去发布你的DWR工程，你需要执行build.xml构建dwr.war包，该包会生成放到工程的\target\ant\目录下，在我机器上是D:\dwr_workspace\dwr\target\ant\dwr.war，然后你需要将dwr.war拷贝到D:\Tomcat 5.5\webapps目录，运行Tomcat，系统会自动将dwr.war解包，形成dwr目录，比如在我机器上会形成文件夹D:\Tomcat 5.5\webapps\dwr。<br />
&nbsp;&nbsp; 在我机器上访问<a href="http://localhost:5050/dwr">http://localhost:5050/dwr</a>，就可见到首面了，但是下半部分报错，看看tomcat后台也报错，查了查是找不到类的缘故，再查发现缺少js.jar包，上网找找，下载了一个js.jar包，再将js.jar包添加到目录D:\dwr_workspace\dwr\web\WEB-INF\lib\js.jar，然后重新发布war包就没问题啦。<br />
&nbsp;&nbsp;&nbsp; <br />
</p>
<img src ="http://www.blogjava.net/yigemaser/aggbug/190861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yigemaser/" target="_blank">满店香</a> 2008-04-05 02:35 <a href="http://www.blogjava.net/yigemaser/articles/190861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第一部分 DWR是什么，如何使用</title><link>http://www.blogjava.net/yigemaser/articles/190859.html</link><dc:creator>满店香</dc:creator><author>满店香</author><pubDate>Fri, 04 Apr 2008 17:49:00 GMT</pubDate><guid>http://www.blogjava.net/yigemaser/articles/190859.html</guid><wfw:comment>http://www.blogjava.net/yigemaser/comments/190859.html</wfw:comment><comments>http://www.blogjava.net/yigemaser/articles/190859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yigemaser/comments/commentRss/190859.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yigemaser/services/trackbacks/190859.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; DWR是一个开源的类库,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码（javascript）使用运行在WEB服务器上的JAVA函数,就像它就在浏览器里一样. 　　它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet(小应用程序)中获取数据.另外一方面一个JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动态改变网页的内容.&nbsp;<br />
&nbsp;&nbsp;&nbsp; 官方网站地址http://getahead.org/dwr<br />
<br />
关于DWR的使用 引用别人的文章。&nbsp;&nbsp;&nbsp;</p>
<h3 class="storytitle" id="post-79"><a href="http://www.javatang.com/archives/2006/10/20/254879.html" rel="bookmark">开始使用 DWR</a><br />
&nbsp;&nbsp;&nbsp; 原文出处: <a href="http://www.javatang.com/archives/2006/10/20/254879.html">http://www.javatang.com/archives/2006/10/20/254879.html</a><br />
&nbsp;&nbsp;&nbsp; 翻译: Jet Mah<br />
&nbsp;&nbsp;&nbsp; 有两种方法来开始 DWR 的学习，最简单的做法是<a href="http://getahead.org/dwr/download" target="_blank">下载</a>官方提供的 WAR 文件然后对此深入研究。不过这种方式不能使你感到将 DWR 整合到你现有的 web 程序有多么的简单，所以我们推荐你跟随下面三个步骤：</h3>
<p><strong>1. 安装 DWR JAR 包</strong><br />
<a href="http://getahead.org/dwr/download" target="_blank">下载</a> dwr.jar 文件，然后将它放在 web 程序的 WEB-INF/lib 目录下面，很可能在这个目录下已经有一些 jar 文件了。</p>
<p><strong>2. 编辑 config 文件</strong></p>
<p>将下面的代码添加到 WEB-INF/web.xml 文件中，&lt;servlet&gt;需要放在另外的&lt;servlet&gt;之后，&lt;servlet-mapping&gt;也是如此。</p>
<blockquote>
<p>&lt;servlet&gt;<br />
&nbsp;&nbsp;&lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&lt;display-name&gt;DWR&nbsp;Servlet&lt;/display-name&gt;<br />
&nbsp;&nbsp;&lt;servlet-class&gt;uk.ltd.getahead.dwr.DWRServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;debug&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;true&lt;/param-value&gt;<br />
&nbsp;&nbsp;&lt;/init-param&gt;<br />
&lt;/servlet&gt;</p>
<p>&lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&lt;servlet-name&gt;dwr-invoker&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&lt;url-pattern&gt;/dwr/*&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;</p>
</blockquote>
<p>接下来创建 dwr.xml 文件并将此放在 web.xml 所在的 WEB-INF 目录下。文件中类似下面的内容：</p>
<blockquote>
<p>&lt;!DOCTYPE&nbsp;dwr&nbsp;PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#8221;-//GetAhead&nbsp;Limited//DTD&nbsp;Direct&nbsp;Web&nbsp;Remoting&nbsp;1.0//EN&#8221;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#8221;http://www.getahead.ltd.uk/dwr/dwr10.dtd&#8221;&gt;</p>
<p>&lt;dwr&gt;<br />
&nbsp;&nbsp;&lt;allow&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;create&nbsp;creator=&#8221;new&#8221;&nbsp;javascript=&#8221;JDate&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#8221;class&#8221;&nbsp;value=&#8221;java.util.Date&#8221;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/create&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;create&nbsp;creator=&#8221;new&#8221;&nbsp;javascript=&#8221;Demo&#8221;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;name=&#8221;class&#8221;&nbsp;value=&#8221;your.java.Bean&#8221;/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/create&gt;<br />
&nbsp;&nbsp;&lt;/allow&gt;<br />
&lt;/dwr&gt;</p>
</blockquote>
<p>DWR 配置文件定义了由 DWR 创建和被 Javascript 远程使用的类。在上面的例子中我们在远程创建了2个类，并且给出了在 Javascript 中的类名。</p>
<p>上面使用的 new creator 使用了所有的 JavaBeans 必须含有的公有（public）无参（no-args）的构造函数。值得一提的是， DWR 还有一些限制：</p>
<li>避免使用 JavaScript 保留字；以保留字命名的方法将自动被排除。大多数 JavaScript 的保留字同时也是 Java 的保留字，因此无论如何你也不能使用一个名为 &#8220;try()&#8221; 的方法。但是最常用的一个词 &#8220;delete()&#8221;，在 JavaScript 中有特殊的含义而在 Java 中没有。
<li>重载方法（Overloaded methods）将会在调用的时候陷入未知的状况，因此应该避免重载方法。
<p><strong>3. 访问下面的地址</strong><br />
http://localhost:8080/[YOUR-WEBAPP]/dwr/</p>
<p>你应该会看到一个页面，上面显示了刚才你在第二步所创建的类。进入一个链接之后你会看到所有等待调用方法的列表。这些动态产生的例子你也能通过 DWR 来实现。</p>
<p>亲自尝试和体会下吧。</p>
<p><strong>怎样应用到你的 Web 程序中？</strong></p>
<p>在侧边栏有很多例子演示了怎样改变网页中的文本、更新列表、操作表单和动态修改表格。每一个例子都有详细的说明。</p>
<p>另外一个开始方法就是从页面中查看源代码，这些页面你刚刚浏览过：</p>
<li>进入 http://localhost:8080/[YOUR-WEBAPP]/dwr/ 然后点击你创建的类；
<li>查看源代码然后定位到你所感兴趣的方法的代码行；
<li>将这些文本粘贴到你 Web 程序的一个 HTML 或 JSP页面中；
<li>包含下面的 javascrip 文件：
<blockquote>
<p>&lt;script&nbsp;src=&#8217;/[YOUR-WEBAPP]/dwr/interface/[YOUR-SCRIPT].js&#8217;&gt;&lt;/script&gt;<br />
&lt;script&nbsp;src=&#8217;/[YOUR-WEBAPP]/dwr/engine.js&#8217;&gt;&lt;/script&gt;</p>
</blockquote>
<p>你可以根据实际情况修改 /[YOUR-WEBAPP]/ 部分。</p>
<p>关于怎样书写 DWR 控制的 Javascript 代码请查看 <a href="http://getahead.ltd.uk/dwr/browser/intro" target="_blank">脚本简介</a>。</p>
</li>
<img src ="http://www.blogjava.net/yigemaser/aggbug/190859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yigemaser/" target="_blank">满店香</a> 2008-04-05 01:49 <a href="http://www.blogjava.net/yigemaser/articles/190859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第三部分  DWR的技术基石-无刷新访问服务器</title><link>http://www.blogjava.net/yigemaser/articles/190845.html</link><dc:creator>满店香</dc:creator><author>满店香</author><pubDate>Fri, 04 Apr 2008 17:31:00 GMT</pubDate><guid>http://www.blogjava.net/yigemaser/articles/190845.html</guid><wfw:comment>http://www.blogjava.net/yigemaser/comments/190845.html</wfw:comment><comments>http://www.blogjava.net/yigemaser/articles/190845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yigemaser/comments/commentRss/190845.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yigemaser/services/trackbacks/190845.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp; 从2005年开始，ajax在全球渐渐掀起了一股潮流，它使浏览器可以为用户提供更为自然的浏览体验，全球几百个ajax项目中，dwr就是其中一项。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ajax采用的技术基石其实早就有了，就是&#8220;无刷新访问服务器&#8221;技术，所以有人说ajax其实就是新瓶装老酒，一点没错，就是新瓶装老酒，在...&nbsp;&nbsp;<a href='http://www.blogjava.net/yigemaser/articles/190845.html'>阅读全文</a><img src ="http://www.blogjava.net/yigemaser/aggbug/190845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yigemaser/" target="_blank">满店香</a> 2008-04-05 01:31 <a href="http://www.blogjava.net/yigemaser/articles/190845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第五部分 包拆解 4)org.directwebremoting.create包 </title><link>http://www.blogjava.net/yigemaser/articles/189560.html</link><dc:creator>满店香</dc:creator><author>满店香</author><pubDate>Sat, 29 Mar 2008 16:59:00 GMT</pubDate><guid>http://www.blogjava.net/yigemaser/articles/189560.html</guid><wfw:comment>http://www.blogjava.net/yigemaser/comments/189560.html</wfw:comment><comments>http://www.blogjava.net/yigemaser/articles/189560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yigemaser/comments/commentRss/189560.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yigemaser/services/trackbacks/189560.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;在dwr.xml中有，&lt;creator&gt;标签负责公开用于Web远程的类和类的方法，实际上最后调用的就是本包下面的script创建类。creator类型在1.1版本的时候有如下几种，现在是3.0版本了，我查了下源码，种类好像比下面要多（查XXXCreator有多少个）。&nbsp;&nbsp;&nbsp;&nbsp;new: 用Ja...&nbsp;&nbsp;<a href='http://www.blogjava.net/yigemaser/articles/189560.html'>阅读全文</a><img src ="http://www.blogjava.net/yigemaser/aggbug/189560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yigemaser/" target="_blank">满店香</a> 2008-03-30 00:59 <a href="http://www.blogjava.net/yigemaser/articles/189560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第五部分 包拆解 3)org.directwebremoting.convert包 </title><link>http://www.blogjava.net/yigemaser/articles/189400.html</link><dc:creator>满店香</dc:creator><author>满店香</author><pubDate>Fri, 28 Mar 2008 20:18:00 GMT</pubDate><guid>http://www.blogjava.net/yigemaser/articles/189400.html</guid><wfw:comment>http://www.blogjava.net/yigemaser/comments/189400.html</wfw:comment><comments>http://www.blogjava.net/yigemaser/articles/189400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yigemaser/comments/commentRss/189400.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yigemaser/services/trackbacks/189400.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;转换器包，包下面的类是各种类型的的转换器。<br />
&nbsp;&nbsp;&nbsp; 在源码工程中，有两个dwr.xml,一个是系统的，一个是客户自定义的，这两个dwr文件在DwrServlet初始化时加载。在系统dwr.xml（org\directwebremoting\dwr.xml）中，我们可以看到convert元素，convert元素的作用是告诉DWR在服务器端Java 对象表示和序列化的JavaScript之间如何转换数据类型。<br />
&nbsp;&nbsp;&nbsp; java对象被转换成字符串,或者字符串被转换为java对象，这些字符串是按json格式写的，客户端javascript可识别，在客户端接收到后转换成javascript对象。注意：字符串内容没有采用xml格式，而是采用json格式，是因为json格式技术更成熟和快捷。
<p>&nbsp;&nbsp;&nbsp; 每个convert都包含两个方法convertInbound，convertOutbound,这两个方法相反<br />
&nbsp;&nbsp;&nbsp; convertInbound&nbsp;&nbsp;&nbsp;&nbsp;进站转换 将字符串转换为java可识别的对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;针对调用方法的输入参数<br />
&nbsp;&nbsp;&nbsp;&nbsp;convertOutbound 出站转换 将java对象转换为javascript可识别的json格式的字符串&nbsp;针对调用方法的返回值</p>
 <img src ="http://www.blogjava.net/yigemaser/aggbug/189400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yigemaser/" target="_blank">满店香</a> 2008-03-29 04:18 <a href="http://www.blogjava.net/yigemaser/articles/189400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第五部分  包拆解 2)org.directwebremoting.bayeux包 </title><link>http://www.blogjava.net/yigemaser/articles/189397.html</link><dc:creator>满店香</dc:creator><author>满店香</author><pubDate>Fri, 28 Mar 2008 18:27:00 GMT</pubDate><guid>http://www.blogjava.net/yigemaser/articles/189397.html</guid><wfw:comment>http://www.blogjava.net/yigemaser/comments/189397.html</wfw:comment><comments>http://www.blogjava.net/yigemaser/articles/189397.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yigemaser/comments/commentRss/189397.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yigemaser/services/trackbacks/189397.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个包是用来支持bayeux协议的，兼容comet技术，什么是bayeux,请看如下：<br />
【<br />
<p>下面这些可以实现基于web的实时事件通知的方法：</p>
<p>&nbsp;&nbsp;&nbsp; 1.HTTP流：这种方法由存在于不间断的HTTP连接响应中或某个XMLHttpRequest连接中的服务器数据流所组成。</p>
<p>　　2.HTTP拉取方式：在这种传统的方法中，客户端以用户可定义的时间间隔去检查服务器上的最新数据。这种拉取方式的频率要足够高才能保证很高的数据精确度，<br />
但高频率可能会导致多余的检查，从而导致较高的网络流量。而另一方面，低频率则会导致错过更新的数据。理想地，拉取的时间间隔应该等于服务器状态改变的速度。</p>
<p>　　3.反转AJAX：服务流应用到AJAX，就是所谓的反转AJAX 或者COMET 。它使得服务器在某事件发生时可以发送消息给客户端，而不需要客户端显式的请求。<br />
目标在于达到状态变化的实时更新。COMET使用了HTTP/1.1中的持续连接的特性。通过HTTP/1.1，除非另作说明，服务器和浏览器之间的TCP连接会一直保持连接状态，<br />
直到其中一方发送了一条明显的&#8220;关闭连接&#8221;的消息，或者有超时以及网络错误发生。</p>
<p>　　4.长时间轮询：也就是所谓的异步轮询，这种方式是纯服务器端推送方式和客户端拉取方式的混合。它是基于BAYEUX协议的。这个协议遵循基于主题的发布——订阅机制。<br />
在订阅了某个频道后，客户端和服务器间的连接会保持打开状态，并保持一段事先定义好的时间。如果服务器端没有事件发生，而发生了超时，<br />
服务器端就会请求客户端进行异步重新连接。如果有事件发生，服务器端会发送数据到客户端，然后客户端重新连接<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;注：Comet：<a href="http://www.ibm.com/developerworks/cn/web/wa-lo-comet/">基于 HTTP 长连接的&#8220;服务器推&#8221;技术</a><br />
】<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bayeux是Dojo基金会定义的一个协议。dwr在去年的时候就开始支持该协议，随着dwr项目2008年初加入到Dojo基金会，ajax技术(dwr)和comet(cometd)技术将会融合的更加紧密(说明：dwr,cometd现在都属于dojo基金会下面的项目)，本包将来估计会作很大的变化。ajax技术和comet技术的融合，参看<a href="http://www.ibm.com/developerworks/cn/java/j-jettydwr/index.html">使用 Jetty 和 Direct Web Remoting 编写可扩展的 Comet 应用程序</a>，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个包是dwr外部支持包，并未被其他包引用。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.directwebremoting.bayeux.BayeuxClient&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bayeux协议客户端<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.directwebremoting.bayeux.BayeuxScriptConduit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bayeux协议Script管道<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.directwebremoting.bayeux.BayeuxServletContextAttributeListener&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该监听器由web.xml注册，如果要使用推的技术，那么你就必须注册，BayeuxServletContextAttributeListener，会调用BayeuxClient，按comet原理将script推送的客户端。具体细节未作研究。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
</p>
    <img src ="http://www.blogjava.net/yigemaser/aggbug/189397.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yigemaser/" target="_blank">满店香</a> 2008-03-29 02:27 <a href="http://www.blogjava.net/yigemaser/articles/189397.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第五部分 包拆解 1)org.directwebremoting包</title><link>http://www.blogjava.net/yigemaser/articles/189168.html</link><dc:creator>满店香</dc:creator><author>满店香</author><pubDate>Thu, 27 Mar 2008 17:52:00 GMT</pubDate><guid>http://www.blogjava.net/yigemaser/articles/189168.html</guid><wfw:comment>http://www.blogjava.net/yigemaser/comments/189168.html</wfw:comment><comments>http://www.blogjava.net/yigemaser/articles/189168.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yigemaser/comments/commentRss/189168.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yigemaser/services/trackbacks/189168.html</trackback:ping><description><![CDATA[<p>AjaxFilter<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2种类型接口<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1，认证，日志，安全，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2，延迟<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.directwebremoting.filter.ExtraLatencyAjaxFilter<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一般和AjaxFilterChain合作<br />
<br />
&nbsp;Container&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;容器</p>
<p>&nbsp;hub&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;集线器，提供多个ajax互相操作接口，使得一个界面中多个ajax可以互相调用，参考openajax联盟制定的规则，dwr已经是联盟的会员之一<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.directwebremoting.export包会用到，具体细节不清楚<br />
<br />
&nbsp;ScriptBuffer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;采用list储存script，功能类似于StringBuffer</p>
<p>&nbsp;ServerContext<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;服务器端上下文<br />
<br />
&nbsp;WebContext<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;浏览器上下文，<span style="color: red">好像是每个客户一个（红色表示没仔细看）<br />
</span>&nbsp;auth.js&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AuthHandler负责读取这个js文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;细节由CachingFileHandler读取<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readResource()将字节符转换为字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;继承JavaScriptHandler接口，专门处理读取js文件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JavaScriptHandler extends TemplateHandler implements CachingFileHandler implements Handler</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CachingFileHandler<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;读取数据文件，根据req的报头属性判断，如果修改过，那么重新下载，否则不用&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载读取资源文件，由不同的handle处理，这些handle都继承于JavaScriptHandler<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如：AuthHandler extends JavaScriptHandler<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实际上客户端会将js文件下载到缓存区，这种机制可以使得浏览的时候检查是否js文件内容发生变化。从而重新下载。</p>
<p>&nbsp;dwr20.dtd&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.directwebremoting.impl.DTDEntityResolve处理<br />
&nbsp;dwr20.xsd&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red">实际上没用到<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;两种xml框架类型文件，可以被parse识别。</p>
<p>engine.js&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;引擎js,在浏览器缓存中会发现这个文件已经下载到本地。EngineHandler处理,</p>
<p>&nbsp;messages.properties&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语言资源文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由org.directwebremoting.util.Messages读取<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle("org.directwebremoting.messages");</p>
    <img src ="http://www.blogjava.net/yigemaser/aggbug/189168.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yigemaser/" target="_blank">满店香</a> 2008-03-28 01:52 <a href="http://www.blogjava.net/yigemaser/articles/189168.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第四部分 DWRServlet类分析</title><link>http://www.blogjava.net/yigemaser/articles/189167.html</link><dc:creator>满店香</dc:creator><author>满店香</author><pubDate>Thu, 27 Mar 2008 17:41:00 GMT</pubDate><guid>http://www.blogjava.net/yigemaser/articles/189167.html</guid><wfw:comment>http://www.blogjava.net/yigemaser/comments/189167.html</wfw:comment><comments>http://www.blogjava.net/yigemaser/articles/189167.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yigemaser/comments/commentRss/189167.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yigemaser/services/trackbacks/189167.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;org.directwebremoting.servlet.DwrServlet主要分为三部分，也就是三个主要方法:init;doGet;doPost;<br />
&nbsp;&nbsp;&nbsp;&nbsp;1,init,初始化。&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; DWR对于Servelet容器内部设一个配置容器，该容器装载dwr映射相关信息。</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 alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init(ServletConfig&nbsp;servletConfig)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;ServletException<br />
<img id="Codehighlighter1_74_1576_Open_Image" onclick="this.style.display='none'; Codehighlighter1_74_1576_Open_Text.style.display='none'; Codehighlighter1_74_1576_Closed_Image.style.display='inline'; Codehighlighter1_74_1576_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_74_1576_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_74_1576_Closed_Text.style.display='none'; Codehighlighter1_74_1576_Open_Image.style.display='inline'; Codehighlighter1_74_1576_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_74_1576_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_74_1576_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.init(servletConfig);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletContext&nbsp;servletContext&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;servletConfig.getServletContext();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"><br />
<img id="Codehighlighter1_207_1069_Open_Image" onclick="this.style.display='none'; Codehighlighter1_207_1069_Open_Text.style.display='none'; Codehighlighter1_207_1069_Closed_Image.style.display='inline'; Codehighlighter1_207_1069_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_207_1069_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_207_1069_Closed_Text.style.display='none'; Codehighlighter1_207_1069_Open_Image.style.display='inline'; Codehighlighter1_207_1069_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_207_1069_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_207_1069_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;setupLogging()&nbsp;only&nbsp;needed&nbsp;for&nbsp;servlet&nbsp;logging&nbsp;if&nbsp;commons-logging&nbsp;is&nbsp;unavailable<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;logStartup()&nbsp;just&nbsp;outputs&nbsp;some&nbsp;version&nbsp;numbers</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;日志初始化开始<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StartupUtil.logStartup(servletConfig);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;create&nbsp;and&nbsp;setup&nbsp;a&nbsp;DefaultContainer</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWR对于Servelet容器内部设一个配置容器，该容器装载dwr隐射相关信息。<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ContainerUtil.createAndSetupDefaultContainer(servletConfig);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StartupUtil.initContainerBeans(servletConfig,&nbsp;servletContext,&nbsp;container);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webContextBuilder&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;container.getBean(WebContextBuilder.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContainerUtil.prepareForWebContextFilter(servletContext,&nbsp;servletConfig,&nbsp;container,&nbsp;webContextBuilder,&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContainerUtil.publishContainer(container,&nbsp;servletConfig);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContainerUtil.configureContainerFully(container,&nbsp;servletConfig);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(ExceptionInInitializerError&nbsp;ex)<br />
<img id="Codehighlighter1_1126_1272_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1126_1272_Open_Text.style.display='none'; Codehighlighter1_1126_1272_Closed_Image.style.display='inline'; Codehighlighter1_1126_1272_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1126_1272_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1126_1272_Closed_Text.style.display='none'; Codehighlighter1_1126_1272_Open_Image.style.display='inline'; Codehighlighter1_1126_1272_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1126_1272_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1126_1272_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.fatal(</span><span style="color: #000000">"</span><span style="color: #000000">ExceptionInInitializerError.&nbsp;Nested&nbsp;exception:</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;ex.getException());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ServletException(ex);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;ex)<br />
<img id="Codehighlighter1_1311_1420_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1311_1420_Open_Text.style.display='none'; Codehighlighter1_1311_1420_Closed_Image.style.display='inline'; Codehighlighter1_1311_1420_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1311_1420_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1311_1420_Closed_Text.style.display='none'; Codehighlighter1_1311_1420_Open_Image.style.display='inline'; Codehighlighter1_1311_1420_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1311_1420_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1311_1420_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.fatal(</span><span style="color: #000000">"</span><span style="color: #000000">DwrServlet.init()&nbsp;failed</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;ex);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ServletException(ex);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000"><br />
<img id="Codehighlighter1_1446_1570_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1446_1570_Open_Text.style.display='none'; Codehighlighter1_1446_1570_Closed_Image.style.display='inline'; Codehighlighter1_1446_1570_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1446_1570_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1446_1570_Closed_Text.style.display='none'; Codehighlighter1_1446_1570_Open_Image.style.display='inline'; Codehighlighter1_1446_1570_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1446_1570_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1446_1570_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(webContextBuilder&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_1503_1560_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1503_1560_Open_Text.style.display='none'; Codehighlighter1_1503_1560_Closed_Image.style.display='inline'; Codehighlighter1_1503_1560_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1503_1560_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1503_1560_Closed_Text.style.display='none'; Codehighlighter1_1503_1560_Open_Image.style.display='inline'; Codehighlighter1_1503_1560_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1503_1560_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1503_1560_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webContextBuilder.unset();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p><br />
比较细致的环节：<br />
&nbsp;init()调用<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createAndSetupDefaultContainer()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setupDefaultContainer(defaultContainer, servletConfig)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用如下步骤<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1)setupDefaults(container);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;包括：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;容器相关管理工具配置集，也就是要实现的一些接口。这种方式蛮好，当容器需要具备很多接口功能时，把这些接口全部做成隐射，并设置成可配置的实现<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.addImplementation(AccessControl.class, DefaultAccessControl.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Mapping handlers to URLs，路径配置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createUrlMapping(container, "/index.html", IndexHandler.class, "indexHandlerUrl");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取servlet配置属性<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2)setupFromServletConfig(container, servletConfig);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;额外处理1)中多选类型<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3)resolveMultipleImplementations(container, servletConfig);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;里面使用了通用yui型压缩器&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【使用 YUI Compressor 压缩 Javascript 和 CSS&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;工具下载： http://www.julienlecomte.net/yuicompressor/&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;英文介绍： http://com3.devnet.re3.yahoo.com/yui/compressor/ </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;YUI Compressor是使用Java编写的工具，需要Java版本大于等于1.4。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;工作原理简介：&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;主要是去掉冗余的空白，主要包括空格，换行符、制表符。&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于 Javascript，还采用缩短变量名的方法压缩文件，就是在保证代码正确性的情况下将变量名用只有1个字符的字符串代替，或者2个、3个字符，总之尽量短。&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于 CSS，还有采用优化0值属性值的表示，优化颜色值的方法压缩文件。&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CSS的优化比 CSSTidy 功能弱。CSSTidy还能支持一些相关属性的合并。】<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//工具配置集 加载，显现，检查<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4)container.setupFinished();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;容器内容bean初始化 ,包括系统默认？？？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initContainerBeans</p>
&nbsp;&nbsp;&nbsp; 2，doGet<br />
&nbsp;&nbsp;实际调用doPost,看到这里最好温习下servlet的doGet方法和doPost的区别<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"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;doGet(HttpServletRequest&nbsp;req,&nbsp;HttpServletResponse&nbsp;resp)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException,&nbsp;ServletException<br />
<img id="Codehighlighter1_112_145_Open_Image" onclick="this.style.display='none'; Codehighlighter1_112_145_Open_Text.style.display='none'; Codehighlighter1_112_145_Closed_Image.style.display='inline'; Codehighlighter1_112_145_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_112_145_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_112_145_Closed_Text.style.display='none'; Codehighlighter1_112_145_Open_Image.style.display='inline'; Codehighlighter1_112_145_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_112_145_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_112_145_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doPost(req,&nbsp;resp);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp; 3，doPost<br />
&nbsp;&nbsp; <a href="http://localhost:5050/dwr/simpletext/index.html">在工程中，有个样例Dynamically Text，地址是http://localhost:5050/dwr/simpletext/index.html</a>，当点击按钮时，实际上就是触发了org.directwebremoting.servlet.DwrServlet的下面的方法。<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"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;doPost(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException,&nbsp;ServletException<br />
<img id="Codehighlighter1_121_466_Open_Image" onclick="this.style.display='none'; Codehighlighter1_121_466_Open_Text.style.display='none'; Codehighlighter1_121_466_Closed_Image.style.display='inline'; Codehighlighter1_121_466_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_121_466_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_121_466_Closed_Text.style.display='none'; Codehighlighter1_121_466_Open_Image.style.display='inline'; Codehighlighter1_121_466_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_121_466_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_121_466_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"><br />
<img id="Codehighlighter1_143_385_Open_Image" onclick="this.style.display='none'; Codehighlighter1_143_385_Open_Text.style.display='none'; Codehighlighter1_143_385_Closed_Image.style.display='inline'; Codehighlighter1_143_385_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_143_385_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_143_385_Closed_Text.style.display='none'; Codehighlighter1_143_385_Open_Image.style.display='inline'; Codehighlighter1_143_385_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_143_385_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_143_385_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webContextBuilder.set(request,&nbsp;response,&nbsp;getServletConfig(),&nbsp;getServletContext(),&nbsp;container);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UrlProcessor&nbsp;processor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;container.getBean(UrlProcessor.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processor.handle(request,&nbsp;response);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000"><br />
<img id="Codehighlighter1_411_460_Open_Image" onclick="this.style.display='none'; Codehighlighter1_411_460_Open_Text.style.display='none'; Codehighlighter1_411_460_Closed_Image.style.display='inline'; Codehighlighter1_411_460_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_411_460_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_411_460_Closed_Text.style.display='none'; Codehighlighter1_411_460_Open_Image.style.display='inline'; Codehighlighter1_411_460_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_411_460_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_411_460_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webContextBuilder.unset();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<img src ="http://www.blogjava.net/yigemaser/aggbug/189167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yigemaser/" target="_blank">满店香</a> 2008-03-28 01:41 <a href="http://www.blogjava.net/yigemaser/articles/189167.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>