<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
 <channel>
  <title>冰咖啡</title>
  <link>http://icedcoffee.blogbus.com</link>
  <description><![CDATA[]]></description>
  <generator> by blogbus.com </generator>
  <lastBuildDate>Thu, 01 Jan 1970 07:00:00 +0700</lastBuildDate>
  <image>
									<url>http://public.blogbus.com/profile/9/9/3/1252399/avatar_1252399_96.jpg</url>
									<title>冰咖啡</title>
									<link>http://icedcoffee.blogbus.com</link>
								</image>  <item>
   <title>Flex杀手是kugoo -___-</title>
   <description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 谁会想到，因为kugoo 2007，Flex应用不能正常浏览了......</p><p>&nbsp;&nbsp;&nbsp;&nbsp;原因很简单，kugoo把windows的注册表改了（改了哪里就无从得知了），让IE6晕得找不到系统信息，连它的&ldquo;关于Internet Explorer&rdquo;对话框也抛出了&ldquo;错误53:空间不足&rdquo;。&nbsp;而Flex2的官方JS中，刚刚好用到系统信息来判断Flash的版本，它也就这么地挂了。&nbsp;&nbsp; </p><p>&nbsp;&nbsp;&nbsp; 真是恼火，我为了这个问题白白忙活了一个晚上，360卫士、雅虎助手都在kugoo面前倒下了。&nbsp;&nbsp;&nbsp;&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;虽然不知道kugoo到底改了注册表哪些键值，但我还是找到了一个修复的办法，虽然比较麻烦，不过还是有效的。解决办法如下：<br />&nbsp;&nbsp;&nbsp; （1）下载并安装Windows&nbsp;xp版本的IE7；<br />&nbsp;&nbsp;&nbsp; （2）安装完毕，并重启系统后运行IE7；<br />&nbsp;&nbsp;&nbsp; （3）开启&nbsp;工具－&gt;Internet选项-&gt;高级-&gt;还原设置，完成最彻底的还原。<br />&nbsp;&nbsp;&nbsp;&nbsp; 执行完毕上述操作后，卸载IE7并重新启动系统，IE6恢复正常。</p><p>&nbsp;&nbsp;&nbsp;&nbsp; 这个办法我写在kugoo的在线客户留言版上了，但愿其他受害者能暂时用这个自救。算是做了件好事，挺开心<img src="http://www.blogbus.com/public/smiles/01-11.gif" border="0" alt="" /></p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://doruyeye.blogbus.com/logs/50236587.html">21：39</a> 2009-11-05</div><div><a href="/logs/5596622.html">气质测试结果</a> 2007-05-31</div><div><a href="/logs/5546126.html">不理想的设计</a> 2007-05-27</div><div><a href="/logs/5538140.html">在JQuery中使用JSON</a> 2007-05-27</div><div><a href="/logs/5494708.html">Tapestry4单元测试</a> 2007-05-24</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Ficedcoffee.blogbus.com%2Flogs%2F10548095.html&title=Flex%E6%9D%80%E6%89%8B%E6%98%AFkugoo+-___-">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://tuijian.blogbus.com/" target="_blank">推荐：让我们寻找最优秀的Blogger！</a></b></div><br /><br />]]></description>
   <link>http://icedcoffee.blogbus.com/logs/10548095.html</link>
   <author>Robin</author>
   <pubDate>Tue, 30 Oct 2007 00:23:01 +0800</pubDate>
  </item>
  <item>
   <title>求两条直线交点坐标</title>
   <description><![CDATA[<p>关键字：AS3 ActionScript3&nbsp;图形&nbsp;两条直线交点&nbsp;</p><p>今天在做数据关系图表时，需要求两条直线相交的交点坐标，代码整理如下：</p><p>package org.hadronforce.charts.utils.math{<br />&nbsp;import flash.geom.Point;<br />&nbsp;import org.hadronforce.charts.baseobjects.Line;<br />&nbsp;<br />&nbsp;/**<br />&nbsp; * 点计算类<br />&nbsp; * @Author:Robin <br />&nbsp; */<br />&nbsp;public class PointCalculator{<br />&nbsp;&nbsp;<br />/**<br />&nbsp;&nbsp; * 求两条直线交点.<br />&nbsp;&nbsp; * 如果两直线无交点，则返回null。<br />&nbsp;&nbsp; */ <br />&nbsp;&nbsp;public static function getIntersection(line1:Line, line2:Line):Point{<br />&nbsp;&nbsp;&nbsp;var x:Number;//被求交点的x轴坐标<br />&nbsp;&nbsp;&nbsp;var y:Number;//被求交点的y轴坐标<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;var k1:Number;//line1的斜率<br />&nbsp;&nbsp;&nbsp;var b1:Number;//line1的纵截距<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;var k2:Number;//line2的斜率<br />&nbsp;&nbsp;&nbsp;var b2:Number;//line2的纵截距<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;/*<br />&nbsp;&nbsp;&nbsp;&nbsp; 分别求出line1和line2的斜率<br />&nbsp;&nbsp;&nbsp;&nbsp; 公式：斜率k＝ tan(a) = y/x<br />&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;k1 = (line1.startPoint.y - line1.endPoint.y) / (line1.startPoint.x - line1.endPoint.x);<br />&nbsp;&nbsp;&nbsp;k2 = (line2.startPoint.y - line2.endPoint.y) / (line2.startPoint.x - line2.endPoint.x);<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;/*<br />&nbsp;&nbsp;&nbsp; 根据斜截式 y = kx + b<br />&nbsp;&nbsp;&nbsp; 可得推导式：b = y - kx<br />&nbsp;&nbsp;&nbsp; 将k1，k2代入推导式，分别求b1，b2<br />&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b1 = line1.startPoint.y - k1 * line1.startPoint.x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b2 = line2.startPoint.y - k2 * line2.startPoint.x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;if (k1 == k2){//当两条直线平行时返回null；<br />&nbsp;&nbsp;&nbsp;&nbsp;return null;<br />&nbsp;&nbsp;&nbsp;}else if ((k1 == Number.POSITIVE_INFINITY || k1 == Number.NEGATIVE_INFINITY) &amp;&amp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (k2 == Number.NEGATIVE_INFINITY || k2 == Number.POSITIVE_INFINITY)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//当两条直线平行时（特例，均垂直于y轴）返回null；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br />&nbsp;&nbsp;&nbsp;}else if (k1 == Number.POSITIVE_INFINITY || k1 == Number.NEGATIVE_INFINITY){<br />&nbsp;&nbsp;&nbsp;&nbsp;//当line1垂直于y轴时（斜率为正无穷或负无穷），进行如下计算<br />&nbsp;&nbsp;&nbsp;&nbsp;x = line1.startPoint.x;<br />&nbsp;&nbsp;&nbsp;&nbsp;y = k2 * x + b2;<br />&nbsp;&nbsp;&nbsp;}else if (k2 == Number.POSITIVE_INFINITY || k2 == Number.NEGATIVE_INFINITY){<br />&nbsp;&nbsp;&nbsp;&nbsp;//当line2垂直于y轴时（斜率为正/负无穷），进行如下计算<br />&nbsp;&nbsp;&nbsp;&nbsp;x = line2.startPoint.x;<br />&nbsp;&nbsp;&nbsp;&nbsp;y = k1 * x + b1;<br />&nbsp;&nbsp;&nbsp;}else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 连例 y ＝ k1 * x + b1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y = k2 * x + b2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 得到推导式：x = (b1 - b2)/(k2 - k1)<br />&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = (b1 - b2) / (k2 - k1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; /*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将x值带入斜截式方程，可求y值<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y = k1 * x + b1;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;return new Point(x,y);<br />&nbsp;&nbsp;}<br />&nbsp;}</p><p>}</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="/logs/10548095.html">Flex杀手是kugoo -___-</a> 2007-10-30</div><div><a href="/logs/6489320.html">Ext.TabPanelItem中使用Iframe引起的内存泄露</a> 2007-07-07</div><div><a href="/logs/5596622.html">气质测试结果</a> 2007-05-31</div><div><a href="/logs/5538140.html">在JQuery中使用JSON</a> 2007-05-27</div><div><a href="/logs/5534346.html">AJAX请求并发问题</a> 2007-05-26</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Ficedcoffee.blogbus.com%2Flogs%2F10455648.html&title=%E6%B1%82%E4%B8%A4%E6%9D%A1%E7%9B%B4%E7%BA%BF%E4%BA%A4%E7%82%B9%E5%9D%90%E6%A0%87">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://icity.cn" target="_blank">《城客》：第一本中文互动杂志！</a></b></div><br /><br />]]></description>
   <link>http://icedcoffee.blogbus.com/logs/10455648.html</link>
   <author>Robin</author>
   <pubDate>Wed, 24 Oct 2007 20:15:31 +0800</pubDate>
  </item>
  <item>
   <title>Ext.TabPanelItem中使用Iframe引起的内存泄露</title>
   <description><![CDATA[<strong><font size="4">选择风险</font></strong> <p style="font-size: 10pt; margin: 0in"><span style="font-family: Calibri"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: SimSun">近期我们在产品前台重构中引入了</span><span style="font-family: Calibri">RIA</span><span style="font-family: SimSun">特性。虽然</span><span style="font-family: Calibri">Ajax</span><span style="font-family: SimSun">比其他</span><span style="font-family: Calibri">RIA</span><span style="font-family: SimSun">技术对于开发人员技术水平的要求较高，开发代价更大，但由于产品特性需要我们仍然采用了</span><span style="font-family: Calibri">Ajax</span><span style="font-family: SimSun">技术，并在众多框架中选择了</span><span style="font-family: Calibri">Prototype(1.5.1)</span><span style="font-family: SimSun">和</span><span style="font-family: Calibri">Ext(1.0.1a)</span><span style="font-family: SimSun">组合。在企业级应用开发中做出这样的抉择是需要承担一定的风险的。</span></p><p style="font-size: 10pt; margin: 0in; font-family: SimSun">&nbsp;</p><p style="font-weight: bold; font-size: 14pt; margin: 0in; font-family: SimSun">如期而至的问题</p><p style="font-size: 10pt; margin: 0in"><span style="font-family: Calibri"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: SimSun">不出所料，重构工作开展不过两个星期，客户端浏览器的性能问题便凸现出来，使重构进程陷入僵持状态。暂时撇开客户端代码运行速度不说，</span><span style="font-family: Calibri">IE(6 sp2)</span><span style="font-family: SimSun">和</span><span style="font-family: Calibri">Fx(2.0.0.4)</span><span style="font-family: SimSun">浏览器出现了不同程度的</span><span style="font-family: Calibri">JavaScript</span><span style="font-family: SimSun">内存泄露，使得客户端浏览器在浏览系统页面一段时间后会消耗大量客户端资源以至浏览器的浏览速度低下甚至瘫痪。使框架问题还是我们编写的客户端代码存在问题呢？我们首先带着这个问题展开了一系列的测试。</span></p><p style="font-size: 10pt; margin: 0in"><span style="font-family: Calibri"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: SimSun">经过初步观察，在系统主界面中每打开一个包含了</span><span style="font-family: Calibri">Ext.Grid</span><span style="font-family: SimSun">（以下简称</span><span style="font-family: Calibri">grid</span><span style="font-family: SimSun">）控件的</span><span style="font-family: Calibri">Ext.TabPanelItem</span><span style="font-family: SimSun">（以下简称</span><span style="font-family: Calibri">tab</span><span style="font-family: SimSun">），浏览器（</span><span style="font-family: Calibri">IE</span><span style="font-family: SimSun">、</span><span style="font-family: Calibri">Fx</span><span style="font-family: SimSun">）占用的内存资源就会飙升</span><span style="font-family: Calibri">1</span><span style="font-family: SimSun">－</span><span style="font-family: Calibri">4M</span><span style="font-family: SimSun">，且关闭</span><span style="font-family: Calibri">Ext.TabPanelItem</span><span style="font-family: SimSun">后内存并不会被回收。如此，每次开启</span><span style="font-family: Calibri">10</span><span style="font-family: SimSun">个</span><span style="font-family: Calibri">Ext.TabPanleItem</span><span style="font-family: SimSun">再将之关闭，反复数次之后，浏览器所占用的资源已经高达数百兆。浏览器内存占用提高的问题暂不考虑，因为</span><span style="font-family: Calibri">tab</span><span style="font-family: SimSun">中嵌入了</span><span style="font-family: Calibri">iframe</span><span style="font-family: SimSun">（由于系统页面结构的特殊性和接口问题，没有利用</span><span style="font-family: Calibri">ajax</span><span style="font-family: SimSun">请求向</span><span style="font-family: Calibri">tab</span><span style="font-family: SimSun">中装载页面内容），而</span><span style="font-family: Calibri">iframe</span><span style="font-family: SimSun">中的页面加载了</span><span style="font-family: Calibri">Prototype</span><span style="font-family: SimSun">和</span><span style="font-family: Calibri">Ext</span><span style="font-family: SimSun">的</span><span style="font-family: Calibri">js</span><span style="font-family: SimSun">文件（总共大约</span><span style="font-family: Calibri">600K</span><span style="font-family: SimSun">），假设框架加载需要分配</span><span style="font-family: Calibri">1</span><span style="font-family: SimSun">－</span><span style="font-family: Calibri">4M</span><span style="font-family: SimSun">的内存空间也是合理的。但关闭</span><span style="font-family: Calibri">tab</span><span style="font-family: SimSun">后内存不被回收，且开启新</span><span style="font-family: Calibri">tab</span><span style="font-family: SimSun">时浏览器内存占用继续增长，则可以肯定地判断为内存泄露。是何种原因导致了内存泄露呢？</span></p><p style="font-size: 10pt; margin: 0in; font-family: SimSun">&nbsp;</p><p style="font-weight: bold; font-size: 14pt; margin: 0in"><span style="font-family: Calibri">IE/Fx</span><span style="font-family: SimSun">的</span><span style="font-family: Calibri">bug</span><span style="font-family: SimSun">，</span><span style="font-family: Calibri">iframe</span><span style="font-family: SimSun">惹祸</span></p><p style="font-size: 10pt; margin: 0in"><span style="font-weight: bold; font-family: Calibri"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: SimSun">经过进一步的观察，我们发现</span><span style="font-family: Calibri">IE</span><span style="font-family: SimSun">和</span><span style="font-family: Calibri">Fx</span><span style="font-family: SimSun">的内存泄露现象存在着差异，而浏览器瘫痪的时机也有着很大不同。</span></p><p style="font-size: 10pt; margin: 0in"><span style="font-family: Calibri"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: SimSun">具体表现如下：</span></p><p style="font-size: 10pt; margin: 0in"><span style="font-family: Calibri"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>IE</span><span style="font-family: SimSun">：每开启一个</span><span style="font-family: Calibri">tab</span><span style="font-family: SimSun">，</span><span style="font-family: Calibri">IE</span><span style="font-family: SimSun">的内存占用量即提高</span><span style="font-family: Calibri">1</span><span style="font-family: SimSun">－</span><span style="font-family: Calibri">4M</span><span style="font-family: SimSun">。关闭</span><span style="font-family: Calibri">tab</span><span style="font-family: SimSun">，内存占用量不会下降。继续操作，直至浏览器瘫痪，内存占用量仍不下降。</span></p><p style="font-size: 10pt; margin: 0in"><span style="font-family: Calibri"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Fx</span><span style="font-family: SimSun">：每开启一个</span><span style="font-family: Calibri">tab</span><span style="font-family: SimSun">，</span><span style="font-family: Calibri">Fx</span><span style="font-family: SimSun">的内存占用量提高</span><span style="font-family: Calibri">1</span><span style="font-family: SimSun">－</span><span style="font-family: Calibri">4M</span><span style="font-family: SimSun">。关闭</span><span style="font-family: Calibri">tab</span><span style="font-family: SimSun">，内存占用量不会下降。但连续关闭几个</span><span style="font-family: Calibri">tab</span><span style="font-family: SimSun">后，浏览器陷入假死状态，</span><span style="font-family: Calibri">cpu</span><span style="font-family: SimSun">占用率达到</span><span style="font-family: Calibri">50%</span><span style="font-family: SimSun">，数秒后恢复正常。</span><span style="font-family: Calibri">tab</span><span style="font-family: SimSun">全部关闭后，继续操作，随着</span><span style="font-family: Calibri">tab</span><span style="font-family: SimSun">的添加</span><span style="font-family: Calibri">Fx</span><span style="font-family: SimSun">的内存占用量又逐渐增加。</span></p><p style="font-size: 10pt; margin: 0in; font-family: SimSun">&nbsp;</p><p style="font-weight: bold; font-size: 14pt; margin: 0in; font-family: SimSun">解决办法</p><p style="font-size: 10pt; margin: 0in"><span style="font-family: Calibri"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: SimSun">综上，可以得到这样的结论，</span><span style="font-family: Calibri">IE</span><span style="font-family: SimSun">下确实存在着内存泄露问题，而</span><span style="font-family: Calibri">Fx</span><span style="font-family: SimSun">下并非内存泄露导致浏览器假死。</span></p><p style="font-size: 10pt; margin: 0in"><span style="font-family: Calibri"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: SimSun">随后，我在</span><span style="font-family: Calibri">Ext</span><span style="font-family: SimSun">的官方网站论坛上找到了关于</span><span style="font-family: Calibri">iframe</span><span style="font-family: SimSun">与</span><span style="font-family: Calibri">tab</span><span style="font-family: SimSun">混用时会发生</span><span style="font-family: Calibri">Memory leak</span><span style="font-family: SimSun">的帖子。</span><span style="font-family: Calibri">Ext</span><span style="font-family: SimSun">核心开发人员</span><span style="font-family: Calibri">Jack</span><span style="font-family: SimSun">的回答是，</span><span style="font-family: Calibri">TabPanelItem</span><span style="font-family: SimSun">在关闭时并不会对自定义到</span><span style="font-family: Calibri">tab</span><span style="font-family: SimSun">中的元素做特殊处理，这部分工作必须在控件外来完成。另一方面，相关资料称</span><span style="font-family: Calibri">IE</span><span style="font-family: SimSun">在</span><span style="font-family: Calibri">iframe</span><span style="font-family: SimSun">元素的回收方面存在着</span><span style="font-family: Calibri">bug</span><span style="font-family: SimSun">，在通常情况下应该将该元素的</span><span style="font-family: Calibri">src</span><span style="font-family: SimSun">属性值修改为</span><span style="font-family: Calibri">&quot;abort:blank&quot;</span><span style="font-family: SimSun">，并手工将其从</span><span style="font-family: Calibri">DOM</span><span style="font-family: SimSun">树上移除，然后把脚本中引用它的变量置空并调用</span><span style="font-family: Calibri">CollectGarbage()</span><span style="font-family: SimSun">就可以避免</span><span style="font-family: Calibri">iframe</span><span style="font-family: SimSun">不能正常回收所造成的内存泄露。</span></p><p style="font-size: 10pt; margin: 0in"><span style="font-family: Calibri"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: SimSun">按照上述方法，在</span><span style="font-family: Calibri">tab</span><span style="font-family: SimSun">的</span><span style="font-family: Calibri">close</span><span style="font-family: SimSun">事件中添加了</span><span style="font-family: Calibri">iframe</span><span style="font-family: SimSun">的销毁代码，</span><span style="font-family: Calibri">IE</span><span style="font-family: SimSun">的内存泄露问题得以解决。</span></p><p style="font-size: 10pt; margin: 0in"><span style="font-family: Calibri"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: SimSun">但是，</span><span style="font-family: Calibri">Fx</span><span style="font-family: SimSun">的问题仍然无法得到解决，即关闭</span><span style="font-family: Calibri">tab</span><span style="font-family: SimSun">后</span><span style="font-family: Calibri">CPU</span><span style="font-family: SimSun">占用率激增并持续数秒。无奈之下我测试了</span><span style="font-family: Calibri">Linux</span><span style="font-family: SimSun">下的</span><span style="font-family: Calibri">Firefox</span><span style="font-family: SimSun">以及</span><span style="font-family: Calibri">Windows</span><span style="font-family: SimSun">版本的</span><span style="font-family: Calibri">Firefox</span><span style="font-family: SimSun"> </span><span style="font-family: Calibri">3 alpha</span><span style="font-family: SimSun">，并未出现此问题。初步断定，着个问题应该是</span><span style="font-family: Calibri">Firefox</span><span style="font-family: SimSun"> 2.0.0.4</span><span style="font-family: SimSun">在</span><span style="font-family: SimSun">DOM</span><span style="font-family: SimSun">元素回收性能方面的</span><span style="font-family: SimSun">BUG</span><span style="font-family: SimSun">。至于在</span><span style="font-family: SimSun">Fx</span><span style="font-family: SimSun">下关闭</span><span style="font-family: SimSun">tab</span><span style="font-family: SimSun">并不会立即释放内存也得到了官方解释，</span><span style="font-family: SimSun">Fx</span><span style="font-family: SimSun">会缓存一部分页面数据在内存中，以得到较好的性能。</span></p><p style="font-size: 10pt; margin: 0in; font-family: SimSun">&nbsp;</p><p style="font-weight: bold; font-size: 14pt; margin: 0in"><span style="font-family: SimSun">&ldquo;至尊&rdquo;级浏览器，</span><span style="font-family: Calibri">Safari</span></p><p style="margin: 0in"><span style="font-size: 14pt; font-family: Calibri"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体">此前我对苹果发布的</span><span style="font-size: 10pt; font-family: Calibri">windows</span><span style="font-size: 10pt; font-family: 宋体">版本</span><span style="font-size: 10pt; font-family: Calibri">Safai</span><span style="font-size: 10pt; font-family: 宋体">3</span><span style="font-size: 10pt; font-family: 宋体">还持有不屑一顾的态度，因为他们的发言人实在太过狂妄的发言，自称</span><span style="font-size: 10pt; font-family: 宋体">Safari</span><span style="font-size: 10pt; font-family: 宋体">是世界上最好的浏览器，未把任何浏览器放在眼里。我一向不喜欢自吹的人，却又对他们发言人的狂言感觉好奇，另一方面希望测试一下产品的跨浏览器能力，便索性下载了</span><span style="font-size: 10pt; font-family: 宋体">Safari 3 for windows</span><span style="font-size: 10pt; font-family: 宋体">。结果令我瞠目结舌，</span><span style="font-size: 10pt; font-family: 宋体">Safari</span><span style="font-size: 10pt; font-family: 宋体">处理</span><span style="font-size: 10pt; font-family: 宋体">JavaScript</span><span style="font-size: 10pt; font-family: 宋体">的速度绝非</span><span style="font-size: 10pt; font-family: 宋体">IE</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: 宋体">Fx</span><span style="font-size: 10pt; font-family: 宋体">（包括他们的最新版本</span><span style="font-size: 10pt; font-family: 宋体">IE7</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: 宋体">Fx3 alpha</span><span style="font-size: 10pt; font-family: 宋体">）所能及，绝对可以堪称一流的页面渲染能力。为程序员说句心里话，如果所有浏览器的页面渲染速度能达到</span><span style="font-size: 10pt; font-family: 宋体">Safari</span><span style="font-size: 10pt; font-family: 宋体">的水准，我们在</span><span style="font-size: 10pt; font-family: 宋体">AJAX RIA</span><span style="font-size: 10pt; font-family: 宋体">应用构建上将有更大的发挥空间。我着实为</span><span style="font-size: 10pt; font-family: 宋体">Safari</span><span style="font-size: 10pt; font-family: 宋体">带来的</span><span style="font-size: 10pt; font-family: 宋体">RIA</span><span style="font-size: 10pt; font-family: 宋体">极速浏览体验快感兴奋了一把。不夸张地说，</span><span style="font-size: 10pt; font-family: 宋体">Safari</span><span style="font-size: 10pt; font-family: 宋体">至少可以算个浏览器的准至尊吧。</span></p><p style="font-size: 10pt; margin: 0in; font-family: 宋体">&nbsp;</p><p style="font-weight: bold; font-size: 14pt; margin: 0in"><span style="font-family: Calibri">Ext</span><span style="font-family: 宋体">的</span><span style="font-family: Calibri">js</span><span style="font-family: 宋体">包使用注意事项</span></p><p style="margin: 0in"><span style="font-weight: bold; font-size: 14pt; font-family: Calibri"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体">在通常情况下，使用</span><span style="font-size: 10pt; font-family: Calibri">ext-all.js</span><span style="font-size: 10pt; font-family: 宋体">就可以了，但是当一个页面需要包含多个</span><span style="font-size: 10pt; font-family: Calibri">iframe</span><span style="font-size: 10pt; font-family: 宋体">，且</span><span style="font-size: 10pt; font-family: Calibri">iframe</span><span style="font-size: 10pt; font-family: 宋体">的资源指向需要使用</span><span style="font-size: 10pt; font-family: Calibri">Ext</span><span style="font-size: 10pt; font-family: 宋体">的页面时，被嵌入的页面尽量不要使用</span><span style="font-size: 10pt; font-family: Calibri">Ext-all.js</span><span style="font-size: 10pt; font-family: 宋体">了，而是使用</span><span style="font-size: 10pt; font-family: Calibri">ext-core.js</span><span style="font-size: 10pt; font-family: 宋体">并从</span><span style="font-size: 10pt; font-family: Calibri">Ext</span><span style="font-size: 10pt; font-family: 宋体">的</span><span style="font-size: 10pt; font-family: Calibri">package</span><span style="font-size: 10pt; font-family: 宋体">目录中加载你所需要的</span><span style="font-size: 10pt; font-family: Calibri">js</span><span style="font-size: 10pt; font-family: 宋体">包。除非你确定你的客户使用</span><span style="font-size: 10pt; font-family: Calibri">Safari</span><span style="font-size: 10pt; font-family: 宋体">或者</span><span style="font-size: 10pt; font-family: Calibri">Fx</span><span style="font-size: 10pt; font-family: 宋体">3</span><span style="font-size: 10pt; font-family: 宋体">来浏览，否则性能会大打折扣。</span></p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://icedcoffee.blogbus.com/logs/5494708.html">Tapestry4单元测试</a> 2007-05-24</div><div><a href="http://doruyeye.blogbus.com/logs/50236587.html">21：39</a> 2009-11-05</div><div><a href="http://doruyeye.blogbus.com/logs/50236550.html">笔记</a> 2009-11-05</div><div><a href="/logs/5538140.html">在JQuery中使用JSON</a> 2007-05-27</div><div><a href="/logs/5534346.html">AJAX请求并发问题</a> 2007-05-26</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Ficedcoffee.blogbus.com%2Flogs%2F6489320.html&title=Ext.TabPanelItem%E4%B8%AD%E4%BD%BF%E7%94%A8Iframe%E5%BC%95%E8%B5%B7%E7%9A%84%E5%86%85%E5%AD%98%E6%B3%84%E9%9C%B2">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://icity.cn" target="_blank">《城客》：第一本中文互动杂志！</a></b></div><br /><br />]]></description>
   <link>http://icedcoffee.blogbus.com/logs/6489320.html</link>
   <author>Robin</author>
   <pubDate>Sat, 07 Jul 2007 20:53:13 +0800</pubDate>
  </item>
  <item>
   <title>气质测试结果</title>
   <description><![CDATA[<p>&nbsp;&nbsp;&nbsp; IPIS就爱搞这些无聊的东西，更让我吃惊的是我竟然把70道测试题都答完了，看来我蜕化了<img src="http://www.blogbus.com/public/smiles/01-17.gif" border="0" alt="" width="19" height="19" />。<br />&nbsp;&nbsp;&nbsp;&nbsp; 今天很忙，没时间细看测试结果，改天来看吧，粘上先。</p><p>你的气质类型，更接近于<a href="http://tg.chouti.com/answer.jsp?type=ESTP">创业者</a>和<a href="http://tg.chouti.com/answer.jsp?type=ISTP">手艺者</a>，是艺术创造者的一个分支。你在拥有艺术创造者类型共性的同时还兼具创业者的特性。&nbsp;<br />&nbsp; ......</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://doruyeye.blogbus.com/logs/50236587.html">21：39</a> 2009-11-05</div><div><a href="/logs/10548095.html">Flex杀手是kugoo -___-</a> 2007-10-30</div><div><a href="/logs/5546126.html">不理想的设计</a> 2007-05-27</div><div><a href="/logs/5534346.html">AJAX请求并发问题</a> 2007-05-26</div><div><a href="/logs/5494708.html">Tapestry4单元测试</a> 2007-05-24</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Ficedcoffee.blogbus.com%2Flogs%2F5596622.html&title=%E6%B0%94%E8%B4%A8%E6%B5%8B%E8%AF%95%E7%BB%93%E6%9E%9C">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://tuijian.blogbus.com/" target="_blank">推荐：让我们寻找最优秀的Blogger！</a></b></div><br /><br />]]></description>
   <link>http://icedcoffee.blogbus.com/logs/5596622.html</link>
   <author>Robin</author>
   <pubDate>Thu, 31 May 2007 22:21:42 +0800</pubDate>
  </item>
  <item>
   <title>不理想的设计</title>
   <description><![CDATA[<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近做发财梦真的有些发疯了，把FCat Studio（森猫工作室）改名为HadronForce Software Studio（海创力量工作室），延续大学时代的创业梦想。设计了新的Logo还有主页草图。我不得不承认自己确实是个急性子，还没开始做什么就把域名申请了，<a href="http://www.hadronforce.com/">http://www.hadronforce.com/</a>，是有一点浮躁吧。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logo还算可以，主页就很难让自己满意，背景太过杂乱了。不过也没有时间再投入到这方面了，暂时如此吧。</p><p align="center">&nbsp; <img style="width: 200px; height: 200px" src="http://icedcoffee.blogbus.com/files/11802789320.jpg" alt="HadronForce Logo" title="HadronForce Logo" width="200" height="200" align="middle" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em> 海创LOGO</em></p><p align="center"><img style="width: 500px; height: 356px" src="http://icedcoffee.blogbus.com/files/11802789321.jpg" alt="HadronForce Home Page" title="HadronForce Home Page" width="500" height="356" align="middle" /></p><p align="center"><em>海创Home Page</em></p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="/logs/10548095.html">Flex杀手是kugoo -___-</a> 2007-10-30</div><div><a href="/logs/10455648.html">求两条直线交点坐标</a> 2007-10-24</div><div><a href="/logs/6489320.html">Ext.TabPanelItem中使用Iframe引起的内存泄露</a> 2007-07-07</div><div><a href="/logs/5596622.html">气质测试结果</a> 2007-05-31</div><div><a href="/logs/5534346.html">AJAX请求并发问题</a> 2007-05-26</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Ficedcoffee.blogbus.com%2Flogs%2F5546126.html&title=%E4%B8%8D%E7%90%86%E6%83%B3%E7%9A%84%E8%AE%BE%E8%AE%A1">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://pindao.blogbus.com/fengshang?utm_source=blogbus&utm_medium=rss&utm_campaign=fengshang" target="_blank">风尚频道——国内顶尖的时尚族群汇聚于此，未必是流行，但一定要有品位。</a></b></div><br /><br />]]></description>
   <link>http://icedcoffee.blogbus.com/logs/5546126.html</link>
   <author>Robin</author>
   <pubDate>Sun, 27 May 2007 23:16:24 +0800</pubDate>
  </item>
  <item>
   <title>在JQuery中使用JSON</title>
   <description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp; 我今天在豆瓣上看到JSON讨论群中有人提问$.getJSON的使用方法，他不明白回调函数中json参数的用法。我对此做了简单的回答。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实，这个json对象其实我们都非常熟悉。 <br />　　不说那些难以理解的概念了，先简单说一下它的结构。 <br />　　 －以左大括号（{）开始 <br />　　 －一个或多个属性，属性名和值之间用冒号隔开，属性之间使用逗号间隔 <br />　　 －以右大括号（}）结束 <br />　　对象中每个属性的值可以为任何JavaScript中允许的类型的数据，例如字符串、数组、数字、对象等。 <br />　　 举一个简单的例子： <br />　　 { <br />　　 companyname:&quot;SUN CO.&quot;, <br />　　 addresses：[&quot;address1&quot;,&quot;address2&quot;], <br />　　 country:&quot;USA&quot;， <br />　　 } <br />　　 很明显，其实JSON结构也就是一个哈希表结构。 <br />　　 OK,了解了JSON的结构，我们就可以回来看一下JQuery中的$.getJSON()方法了。该方法有三个参数，$.getJSON(String url, Hash params, Function callback)。其中，url是获取JSON结构数据的请求地址，即访问该地址会得到一段JSON结构的文本（这里被JQuery封装了，这一段文本是通过请求对象的responseText属性得到的）。params是向url地址的服务发送的参数，服务器可以根据这些参数做出响应。参数的结构跟JSON的结构类似，都是形似&ldquo;{key1:value1，key2：value2}&rdquo;的结构。callback为回调函数，即function(json){//code...}，在这个函数中做客户端处理。在callback函数中，参数json就是通过向url请求得来的JSON结构文本构造出来的对象。json参数的使用很简单，它是一个哈希表对象，可以通过json.key的方式来使用其中定义的属性。例如，如果我们传入的是前面所述例子的JSON结构，我们可以通过json.addresses[0]来获取addresses的第一个值。 <br />　　 JSON不神秘，说白了其实就是个哈希表结构，在JavaScript中可以直接使用，非常方便。</p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://icedcoffee.blogbus.com/logs/5494708.html">Tapestry4单元测试</a> 2007-05-24</div><div><a href="http://doruyeye.blogbus.com/logs/50236587.html">21：39</a> 2009-11-05</div><div><a href="/logs/10455648.html">求两条直线交点坐标</a> 2007-10-24</div><div><a href="/logs/6489320.html">Ext.TabPanelItem中使用Iframe引起的内存泄露</a> 2007-07-07</div><div><a href="/logs/5534346.html">AJAX请求并发问题</a> 2007-05-26</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Ficedcoffee.blogbus.com%2Flogs%2F5538140.html&title=%E5%9C%A8JQuery%E4%B8%AD%E4%BD%BF%E7%94%A8JSON">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://pindao.blogbus.com/shenghuo?utm_source=blogbus&utm_medium=rss&utm_campaign=shenghuo" target="_blank">生活频道——笑谈生活，坐看人生，这里有着小人物的健康生活。</a></b></div><br /><br />]]></description>
   <link>http://icedcoffee.blogbus.com/logs/5538140.html</link>
   <author>Robin</author>
   <pubDate>Sun, 27 May 2007 02:59:42 +0800</pubDate>
  </item>
  <item>
   <title>AJAX请求并发问题</title>
   <description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关键字：AJAX 请求 并发 Firefox IE <p style="font-size: 10pt; margin: 0in 0in 0in 0.375in"><span style="font-family: Calibri"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: SimSun">最近在开发中遇到一个棘手的问题，在</span><span style="font-family: Calibri">FireFox</span><span style="font-family: SimSun">浏览器中连续展开</span><span style="font-family: Calibri">AJAX</span><span style="font-family: SimSun">树（</span><span style="font-family: Calibri">XTREE+XLoadTree)</span><span style="font-family: SimSun">的多个节点会导致</span><span style="font-family: Calibri">Hibernate</span><span style="font-family: SimSun">抛</span><span style="color: #cc0033; font-family: arial">org.hibernate.exception.GenericJDBCException</span><span style="color: #cc0033; font-family: SimSun">：</span><span style="color: #cc0033; font-family: arial">can&#39;t</span><span style="color: #cc0033; font-family: SimSun"> load entry</span><span style="color: #cc0033; font-family: SimSun">（</span><span style="color: #cc0033; font-family: SimSun">&hellip;</span><span style="color: #cc0033; font-family: SimSun">）</span><span style="font-family: SimSun">异常（我们的系统用</span><span style="font-family: arial">Ajax</span><span style="font-family: SimSun">树控制数据节点，数据持久层采用</span><span style="font-family: arial">Hibernate</span><span style="font-family: SimSun">），但是在</span><span style="font-family: arial">IE</span><span style="font-family: SimSun">浏览器下进行同样的操作则不会抛任何异常。</span></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in"><span style="font-family: Calibri"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: SimSun">通过异常日志和代码分析发现，在这个异常后面隐藏着</span><span style="font-family: Calibri">Hibernate Session</span><span style="font-family: SimSun">的线程安全问题。当去掉引起该异常的代码时，线程安全的异常警告便会被显示出来。也就是说这个异常只是表象，其实真正导致系统异常的原因是</span><span style="font-family: Calibri">Hibernate</span><span style="font-family: SimSun"> Session</span><span style="font-family: SimSun">线程安全。当然，这个不能怪</span><span style="font-family: Calibri">Hibernate</span><span style="font-family: SimSun">，确实是我们的代码在存在并发时重写</span><span style="font-family: Calibri">Hibernate</span><span style="font-family: SimSun"> </span><span style="font-family: Calibri">Session</span><span style="font-family: SimSun">导致冲突的可能。修正代码后问题得以解决。但令人费解的是，为什么在</span><span style="font-family: Calibri">FireFox</span><span style="font-family: SimSun">会导致</span><span style="font-family: Calibri">Hibernate</span><span style="font-family: SimSun">抛异常，在</span><span style="font-family: Calibri">IE</span><span style="font-family: SimSun">下却完全正常呢？</span></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in"><span style="font-family: Calibri"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: SimSun">两种浏览器都是发送</span><span style="font-family: Calibri">Ajax</span><span style="font-family: SimSun">请求到服务器，结果却大相径庭。虽说是服务器端的响应导致了该异常，但不难发现，只有当两个请求同时进行时才可能引起上述的</span><span style="font-family: Calibri">Hibernate</span><span style="font-family: SimSun">的线程安全问题，那么我们就必须假设这样的情况，当使用</span><span style="font-family: Calibri">Firefox</span><span style="font-family: SimSun">浏览器进行</span><span style="font-family: Calibri">AJAX</span><span style="font-family: SimSun">请求时同时发送两个甚至多个相同</span><span style="font-family: Calibri">session</span><span style="font-family: SimSun"> id</span><span style="font-family: SimSun">的请求线程到服务器，而</span><span style="font-family: SimSun">IE</span><span style="font-family: SimSun">仅发送一个。</span></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in"><span style="font-family: Calibri"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: SimSun">在网上找到一个非常有意思的测试，最终得出这样的结论：</span><span style="font-family: Calibri">IE</span><span style="font-family: SimSun">每次执行一个请求，</span><span style="font-family: Calibri">Firefox</span><span style="font-family: SimSun">一次执行两个请求。这一测试通过验证，结果属实。</span></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun">三个文件，一个客户端（其中包含 prototype.js 文件）：</p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun">&nbsp;</p><p style="font-size: 9pt; margin: 0in 0in 0in 0.375in; font-family: SimSun">下载: <a href="http://www.phzzy.org/wp-content/plugins/coolcode/coolcode.php?p=5&amp;download=client.html">client.html</a></p><span style="font-size: 10pt; color: olive; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="font-size: 10pt; color: green; font-family: SimSun">script</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> </span><span style="font-size: 10pt; color: darkblue; font-family: SimSun">type</span><span style="font-size: 10pt; color: gray; font-family: SimSun">=</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun">text/javascript</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> </span><span style="font-size: 10pt; color: darkblue; font-family: SimSun">src</span><span style="font-size: 10pt; color: gray; font-family: SimSun">=</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun">prototype.js</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: olive; font-family: SimSun">&gt;<span style="font-size: 10pt; color: green; font-family: SimSun">script</span><span style="font-size: 10pt; color: olive; font-family: SimSun">&gt;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></span><span style="font-size: 10pt; color: olive; font-family: SimSun"><span style="font-size: 10pt; color: olive; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10pt; color: olive; font-family: SimSun">&lt;</span><span style="font-size: 10pt; color: green; font-family: SimSun">script</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: darkblue; font-family: SimSun">type</span><span style="font-size: 10pt; color: gray; font-family: SimSun">=</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun">text/javascript</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> </span><span style="font-size: 10pt; color: darkblue; font-family: SimSun">src</span><span style="font-size: 10pt; color: gray; font-family: SimSun">=</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun">func.js</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: olive; font-family: SimSun">&gt;<span style="font-size: 10pt; color: green; font-family: SimSun">script</span><span style="font-size: 10pt; color: olive; font-family: SimSun">&gt;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun">&nbsp;</span></span><span style="font-size: 10pt; color: olive; font-family: SimSun"> <p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: olive">&nbsp;</p><span style="font-size: 10pt; color: olive; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="font-size: 10pt; color: green; font-family: SimSun">a</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: darkblue; font-family: SimSun">href</span><span style="font-size: 10pt; color: gray; font-family: SimSun">=</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun">javascript:ajax_get(&#39;A&#39;)</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: olive; font-family: SimSun">&gt;</span><span style="font-size: 10pt; color: gray; font-family: SimSun">Click A</span><span style="font-size: 10pt; color: olive; font-family: SimSun"><span style="font-size: 10pt; color: green; font-family: SimSun">a</span><span style="font-size: 10pt; color: olive; font-family: SimSun">&gt;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></span><span style="font-size: 10pt; color: olive; font-family: SimSun"><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: olive"><span style="font-size: 10pt; color: olive; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="font-size: 10pt; color: green; font-family: SimSun">hr</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: olive; font-family: SimSun">/&gt;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><span style="font-size: 10pt; color: olive; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="font-size: 10pt; color: green; font-family: SimSun">a</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: darkblue; font-family: SimSun">href</span><span style="font-size: 10pt; color: gray; font-family: SimSun">=</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun">javascript:ajax_get(&#39;B&#39;)</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: olive; font-family: SimSun">&gt;</span><span style="font-size: 10pt; color: gray; font-family: SimSun">Click B</span><span style="font-size: 10pt; color: olive; font-family: SimSun"><span style="font-size: 10pt; color: green; font-family: SimSun">a</span><span style="font-size: 10pt; color: olive; font-family: SimSun">&gt;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></span><span style="font-size: 10pt; color: olive; font-family: SimSun"><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: olive"><span style="font-size: 10pt; color: olive; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="font-size: 10pt; color: green; font-family: SimSun">hr</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: olive; font-family: SimSun">/&gt;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun">&nbsp; </span></p><span style="font-size: 10pt; color: #000000; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: olive; font-family: SimSun">&lt;</span><span style="font-size: 10pt; color: green; font-family: SimSun">a</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: darkblue; font-family: SimSun">href</span><span style="font-size: 10pt; color: gray; font-family: SimSun">=</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun">javascript:ajax_get(&#39;C&#39;)</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: olive; font-family: SimSun">&gt;</span><span style="font-size: 10pt; color: gray; font-family: SimSun">Click C</span><span style="font-size: 10pt; color: olive; font-family: SimSun"><span style="font-size: 10pt; color: green; font-family: SimSun">a</span><span style="font-size: 10pt; color: olive; font-family: SimSun">&gt;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></span><span style="font-size: 10pt; color: olive; font-family: SimSun"><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: olive"><span style="font-size: 10pt; color: olive; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="font-size: 10pt; color: green; font-family: SimSun">hr</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: olive; font-family: SimSun">/&gt;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><span style="font-size: 10pt; color: olive; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;</span><span style="font-size: 10pt; color: green; font-family: SimSun">div</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: darkblue; font-family: SimSun">id</span><span style="font-size: 10pt; color: gray; font-family: SimSun">=</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun">result</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: olive; font-family: SimSun">&gt;</span><span style="font-size: 10pt; color: gray; font-family: SimSun">Result:</span><span style="font-size: 10pt; color: olive; font-family: SimSun">&lt;</span><span style="font-size: 10pt; color: green; font-family: SimSun">br</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> </span><span style="font-size: 10pt; color: olive; font-family: SimSun">/&gt;<span style="font-size: 10pt; color: green; font-family: SimSun">div</span><span style="font-size: 10pt; color: olive; font-family: SimSun">&gt;</span></span><span style="font-size: 10pt; color: olive; font-family: SimSun"> <p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; color: olive; font-family: SimSun">&nbsp;</p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun">一个 JS：</p><p style="font-size: 9pt; margin: 0in 0in 0in 0.375in; font-family: SimSun">下载: <a href="http://www.phzzy.org/wp-content/plugins/coolcode/coolcode.php?p=5&amp;download=func.js">func.js</a></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: green"><span style="font-size: 10pt; color: green; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; var</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> </span><span style="font-size: 10pt; color: blue; font-family: SimSun">i</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> = </span><span style="font-size: 10pt; color: maroon; font-family: SimSun">0</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: green"><span style="font-size: 10pt; color: green; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; function</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: blue; font-family: SimSun">ajax_get</span><span style="font-size: 10pt; color: olive; font-family: SimSun">(</span><span style="font-size: 10pt; color: blue; font-family: SimSun">action</span><span style="font-size: 10pt; color: olive; font-family: SimSun">){</span><span style="font-size: 10pt; color: #000000; font-family: SimSun">&nbsp;&nbsp;</span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: green"><span style="font-size: 10pt; color: #000000; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: blue; font-family: SimSun">i</span><span style="font-size: 10pt; color: gray; font-family: SimSun">++;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: gray"><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; </span><span style="font-size: 10pt; color: green; font-family: SimSun">var</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: blue; font-family: SimSun">rand_num</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> = </span><span style="font-size: 10pt; color: teal; font-family: SimSun">Math</span><span style="font-size: 10pt; color: gray; font-family: SimSun">.</span><span style="font-size: 10pt; color: blue; font-family: SimSun">random</span><span style="font-size: 10pt; color: olive; font-family: SimSun">()</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: gray"><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; </span><span style="font-size: 10pt; color: green; font-family: SimSun">var</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: blue; font-family: SimSun">myajax</span><span style="font-size: 10pt; color: gray; font-family: SimSun">=</span><span style="font-size: 10pt; color: green; font-family: SimSun">new</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> </span><span style="font-size: 10pt; color: blue; font-family: SimSun">Ajax</span><span style="font-size: 10pt; color: gray; font-family: SimSun">.</span><span style="font-size: 10pt; color: blue; font-family: SimSun">Request</span><span style="font-size: 10pt; color: olive; font-family: SimSun">(</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun">server.php?action=</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> + </span><span style="font-size: 10pt; color: blue; font-family: SimSun">action</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> + </span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun">&amp;order=</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> + </span><span style="font-size: 10pt; color: blue; font-family: SimSun">i</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> +</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun">&amp;rand=</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> + </span><span style="font-size: 10pt; color: blue; font-family: SimSun">rand_num</span><span style="font-size: 10pt; color: gray; font-family: SimSun">,</span><span style="font-size: 10pt; color: olive; font-family: SimSun">{</span><span style="font-size: 10pt; color: blue; font-family: SimSun">method</span><span style="font-size: 10pt; color: gray; font-family: SimSun">:</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&#39;</span><span style="font-size: 10pt; color: red; font-family: SimSun">get</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&#39;</span><span style="font-size: 10pt; color: gray; font-family: SimSun">,</span><span style="font-size: 10pt; color: blue; font-family: SimSun">onComplete</span><span style="font-size: 10pt; color: gray; font-family: SimSun">:</span><span style="font-size: 10pt; color: blue; font-family: SimSun">show_result</span><span style="font-size: 10pt; color: olive; font-family: SimSun">})</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: gray"><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; $</span><span style="font-size: 10pt; color: olive; font-family: SimSun">(</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&#39;</span><span style="font-size: 10pt; color: red; font-family: SimSun">result</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&#39;</span><span style="font-size: 10pt; color: olive; font-family: SimSun">)</span><span style="font-size: 10pt; color: gray; font-family: SimSun">.</span><span style="font-size: 10pt; color: blue; font-family: SimSun">innerHTML</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> += </span><span style="font-size: 10pt; color: blue; font-family: SimSun">get_date</span><span style="font-size: 10pt; color: olive; font-family: SimSun">()</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> + </span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun"> , </span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> + </span><span style="font-size: 10pt; color: blue; font-family: SimSun">action</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> + </span><span style="font-size: 10pt; color: blue; font-family: SimSun">i</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> + </span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun"> : client post.<br /></span><span style="font-size: 10pt; color: navy; font-family: SimSun">\n</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: olive"><span style="font-size: 10pt; color: olive; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: green"><span style="font-size: 10pt; color: green; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; function</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: blue; font-family: SimSun">show_result</span><span style="font-size: 10pt; color: olive; font-family: SimSun">(</span><span style="font-size: 10pt; color: blue; font-family: SimSun">response</span><span style="font-size: 10pt; color: olive; font-family: SimSun">){</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: gray"><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; </span><span style="font-size: 10pt; color: green; font-family: SimSun">var</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: blue; font-family: SimSun">r_text</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> = </span><span style="font-size: 10pt; color: blue; font-family: SimSun">response</span><span style="font-size: 10pt; color: gray; font-family: SimSun">.</span><span style="font-size: 10pt; color: blue; font-family: SimSun">responseText</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: gray"><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; $</span><span style="font-size: 10pt; color: olive; font-family: SimSun">(</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&#39;</span><span style="font-size: 10pt; color: red; font-family: SimSun">result</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&#39;</span><span style="font-size: 10pt; color: olive; font-family: SimSun">)</span><span style="font-size: 10pt; color: gray; font-family: SimSun">.</span><span style="font-size: 10pt; color: blue; font-family: SimSun">innerHTML</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> += </span><span style="font-size: 10pt; color: blue; font-family: SimSun">r_text</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: olive"><span style="font-size: 10pt; color: olive; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; }</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: green"><span style="font-size: 10pt; color: green; font-family: SimSun">&nbsp;&nbsp;&nbsp; function</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: blue; font-family: SimSun">get_date</span><span style="font-size: 10pt; color: olive; font-family: SimSun">(){</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: gray"><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;&nbsp; &nbsp; &nbsp; </span><span style="font-size: 10pt; color: green; font-family: SimSun">var</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: blue; font-family: SimSun">date</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> = </span><span style="font-size: 10pt; color: green; font-family: SimSun">new</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> </span><span style="font-size: 10pt; color: teal; font-family: SimSun">Date</span><span style="font-size: 10pt; color: olive; font-family: SimSun">()</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: gray"><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp; &nbsp; &nbsp; </span><span style="font-size: 10pt; color: green; font-family: SimSun">return</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: blue; font-family: SimSun">date</span><span style="font-size: 10pt; color: gray; font-family: SimSun">.</span><span style="font-size: 10pt; color: blue; font-family: SimSun">getMinutes</span><span style="font-size: 10pt; color: olive; font-family: SimSun">()</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> + </span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun">m</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> + </span><span style="font-size: 10pt; color: blue; font-family: SimSun">date</span><span style="font-size: 10pt; color: gray; font-family: SimSun">.</span><span style="font-size: 10pt; color: blue; font-family: SimSun">getSeconds</span><span style="font-size: 10pt; color: olive; font-family: SimSun">()</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: olive"><span style="font-size: 10pt; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; }</span></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun">一个服务器端，PHP 文件：</p><p style="font-size: 9pt; margin: 0in 0in 0in 0.375in; font-family: SimSun">下载: <a href="http://www.phzzy.org/wp-content/plugins/coolcode/coolcode.php?p=5&amp;download=server.php">server.php</a></p><span style="font-size: 10pt; color: blue; font-family: SimSun">&nbsp;&nbsp;&nbsp; <!--p</sp--></span><span style="font-size: 10pt; color: blue; font-family: SimSun"><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: orange"><span style="font-size: 10pt; color: orange; font-family: SimSun">&nbsp;&nbsp;&nbsp; //session_start();</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: darkblue"><span style="font-size: 10pt; color: darkblue; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; $action</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> = </span><span style="font-size: 10pt; color: darkblue; font-family: SimSun">$_GET</span><span style="font-size: 10pt; color: olive; font-family: SimSun">[</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&#39;</span><span style="font-size: 10pt; color: red; font-family: SimSun">action</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&#39;</span><span style="font-size: 10pt; color: olive; font-family: SimSun">]</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: darkblue"><span style="font-size: 10pt; color: darkblue; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; $order</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> = </span><span style="font-size: 10pt; color: darkblue; font-family: SimSun">$_GET</span><span style="font-size: 10pt; color: olive; font-family: SimSun">[</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&#39;</span><span style="font-size: 10pt; color: red; font-family: SimSun">order</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&#39;</span><span style="font-size: 10pt; color: olive; font-family: SimSun">]</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: gray"><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: green"><span style="font-size: 10pt; color: green; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; echo</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: blue; font-family: SimSun">date</span><span style="font-size: 10pt; color: olive; font-family: SimSun">(</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun">i\ms</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: olive; font-family: SimSun">)</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> . </span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun"> , </span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> . </span><span style="font-size: 10pt; color: darkblue; font-family: SimSun">$action</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> . </span><span style="font-size: 10pt; color: darkblue; font-family: SimSun">$order</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> . </span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun"> : server is start.<br /></span><span style="font-size: 10pt; color: navy; font-family: SimSun">\n</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: green"><span style="font-size: 10pt; color: green; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; switch</span><span style="font-size: 10pt; color: olive; font-family: SimSun">(</span><span style="font-size: 10pt; color: darkblue; font-family: SimSun">$action</span><span style="font-size: 10pt; color: olive; font-family: SimSun">){</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: gray"><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; </span><span style="font-size: 10pt; color: green; font-family: SimSun">case</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&#39;</span><span style="font-size: 10pt; color: red; font-family: SimSun">A</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&#39;</span><span style="font-size: 10pt; color: gray; font-family: SimSun">:</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: gray"><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="font-size: 10pt; color: blue; font-family: SimSun">sleep</span><span style="font-size: 10pt; color: olive; font-family: SimSun">(</span><span style="font-size: 10pt; color: maroon; font-family: SimSun">5</span><span style="font-size: 10pt; color: olive; font-family: SimSun">)</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: gray"><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; </span><span style="font-size: 10pt; color: green; font-family: SimSun">break</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: gray"><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: green; font-family: SimSun">case</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&#39;</span><span style="font-size: 10pt; color: red; font-family: SimSun">B</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&#39;</span><span style="font-size: 10pt; color: gray; font-family: SimSun">:</span><span style="font-size: 10pt; color: #000000; font-family: SimSun">&nbsp;</span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: gray"><span style="font-size: 10pt; color: #000000; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: blue; font-family: SimSun">sleep</span><span style="font-size: 10pt; color: olive; font-family: SimSun">(</span><span style="font-size: 10pt; color: maroon; font-family: SimSun">2</span><span style="font-size: 10pt; color: olive; font-family: SimSun">)</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: gray"><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; </span><span style="font-size: 10pt; color: green; font-family: SimSun">break</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun">&nbsp;</span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: gray"><span style="font-size: 10pt; color: #000000; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp; </span><span style="font-size: 10pt; color: green; font-family: SimSun">case</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&#39;</span><span style="font-size: 10pt; color: red; font-family: SimSun">C</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&#39;</span><span style="font-size: 10pt; color: gray; font-family: SimSun">:</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: gray"><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; </span><span style="font-size: 10pt; color: green; font-family: SimSun">break</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: olive"><span style="font-size: 10pt; color: olive; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; }</span><span style="font-size: 10pt; color: #000000; font-family: SimSun"> </span></p><p style="margin-top: 0px; margin-bottom: 0px; vertical-align: middle; color: green"><span style="font-size: 10pt; color: green; font-family: SimSun">&nbsp;&nbsp;&nbsp;&nbsp; echo</span><span style="font-size: 10pt; color: gray; font-family: SimSun">&nbsp;</span><span style="font-size: 10pt; color: blue; font-family: SimSun">date</span><span style="font-size: 10pt; color: olive; font-family: SimSun">(</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun">i\ms</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: olive; font-family: SimSun">)</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> . </span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun"> , </span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> . </span><span style="font-size: 10pt; color: darkblue; font-family: SimSun">$action</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> . </span><span style="font-size: 10pt; color: darkblue; font-family: SimSun">$order</span><span style="font-size: 10pt; color: gray; font-family: SimSun"> . </span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: red; font-family: SimSun"> : server is end.<br /></span><span style="font-size: 10pt; color: navy; font-family: SimSun">\n</span><span style="font-size: 10pt; color: darkred; font-family: SimSun">&quot;</span><span style="font-size: 10pt; color: gray; font-family: SimSun">;</span></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">第一段代码是点 A，B，C 三个链接，分别发送不同的 action 的请求到服务器端。</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">第二段代码是接收到请求后，A 是等 5 秒后结束，B 是等 2 秒，C 是马上结束，用来模拟 PHP 执行代码的时间。</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">测试环境：IE6，FireFox，Opera，Windows XP，Apache 2，PHP 5.2.0</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun">&nbsp;</p><p style="font-weight: bold; font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">测试方法 1：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">分别点 A，B，C，慢点点，等前一个回来后再点下一个：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">结果：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">IE6，FireFox 以及 Opera 结果都类似：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">42m52 , A1 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">42m52 , A1 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">42m57 , A1 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">42m57 , B1 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">42m57 , B1 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">42m59 , B1 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">43m01 , C1 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">43m01 , C1 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">43m01 , C1 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">结论：没啥惊讶的，点一个返回一个嘛。</font></p><p style="font-weight: bold; font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">测试方法 2：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">分别点 A，C，快点点，不能前一个回来就点后面的，模拟并发：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">结果和上面一样，恩，处理两个并发木问题。</font></p><p style="font-weight: bold; font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">测试方法 3：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">分别点 A，B，C，快点点，不能前一个回来就点后面的，模拟并发：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">结果：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">IE6 和 Opera 结果类似：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">51m30 , A1 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">51m30 , B2 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">51m30 , C3 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">51m30 , C3 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">51m30 , C3 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">51m30 , B2 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">51m32 , B2 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">51m30 , A1 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">51m35 , A1 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">FireFox：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">52m20 , A1 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">52m20 , B2 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">52m20 , C3 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">52m20 , B2 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">52m22 , B2 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">52m22 , C3 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">52m22 , C3 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">52m20 , A1 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">52m25 , A1 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">结论：嘎嘎，有意思了吧，IE6 和 Opera 似乎不受影响，但 FireFox 的结果确是 C 要等 B 执行执行完毕后才开始(看时间，A 和 B 在服务器端都是 52m20 秒开始的，而 C 确是在 B 结束后的时间 5m22 开始执行的)，这样可以排除服务器端 PHP 的影响，因为 IE，FireFox 以及 Opera 并没有改变服务器端什么，而返回的结果是不同的，所以 PHP 端顺序执行代码的结论应该是不成立的。</font></p><p style="font-weight: bold; font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">测试方法 4：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">分别点 A，A，A，A，C 快点点，不能前一个回来就点后面的，模拟并发：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">结果：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">IE6：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m06 , A1 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m06 , A2 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m06 , A3 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m07 , A4 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m07 , B5 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m07 , B5 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m09 , B5 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m06 , A1 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m11 , A1 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m06 , A2 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m11 , A2 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m06 , A3 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m11 , A3 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m07 , A4 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m12 , A4 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">FireFox：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m33 , A1 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m33 , A2 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m33 , A3 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m34 , A4 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m34 , B5 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m33 , A1 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m38 , A1 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m33 , A2 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m38 , A2 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m38 , A3 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m43 , A3 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m38 , A4 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m43 , A4 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m43 , B5 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">56m45 , B5 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">Opera：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">57m18 , A1 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">57m19 , A2 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">57m19 , A3 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">57m19 , A4 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">57m20 , B5 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">57m18 , A1 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">57m23 , A1 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">57m19 , A2 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">57m24 , A2 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">57m19 , A3 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">57m24 , A3 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">57m19 , A4 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">57m24 , A4 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">57m23 , B5 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">57m25 , B5 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">结论：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">从上面可以看出，IE6 似乎还是不受影响，而 FireFox 同时发送请求，但执行却是要两个两个执行， Opera 是四个四个执行。所以得到结论是 IE 可以同时发送无数个请求，FireFox 同时发送 2 个，Opera 是 4 个。</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">从网上查了一下，貌似是和浏览器的进程并发数有关。</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">更有趣的一个测试：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">把上面的 PHP 文件的第 2 行的 session_start 的注释去掉，每次请求都打开一次 session，然后进行上面的测试。</font></p><p style="font-weight: bold; font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">测试方法 2：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">IE6，FireFox 以及 Opera 结果类似：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">15m03 , A1 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">15m03 , C2 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">15m08 , C2 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">15m08 , C2 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">15m03 , A1 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">15m08 , A1 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">结论：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">貌似 session_start 也占了一个进程，A 和 C 同时发出去，但 C 要等 A 执行完后才开始执行。</font></p><p style="font-weight: bold; font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">测试方法 3：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">分别点 A，B，C，快点点，不能前一个回来就点后面的，模拟并发：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">IE6 和 FireFox 结果类似：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">01m59 , A1 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">01m59 , B2 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">01m59 , C3 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">01m59 , A1 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">02m04 , A1 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">02m04 , B2 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">02m06 , B2 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">02m06 , C3 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">02m06 , C3 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">Opera：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">05m07 , A1 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">05m08 , B2 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">05m08 , C3 : client post.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">05m07 , A1 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">05m12 , A1 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">05m14 , C3 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">05m14 , C3 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">05m12 , B2 : server is start.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">05m14 , B2 : server is end.</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">结论：</font></p><p style="font-size: 10pt; margin: 0in 0in 0in 0.375in; font-family: SimSun"><font color="#000000">从上面感觉 session 也占了浏览器的一个进程。从网上找了一下，说是 session 是发送一个 session ID 放到客户端，但我感觉既然是这么发送，应该不可能老占着一个进程啊。</font></p></span></span></span></span></span></span></span><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://icedcoffee.blogbus.com/logs/5538140.html">在JQuery中使用JSON</a> 2007-05-27</div><div><a href="http://icedcoffee.blogbus.com/logs/5494708.html">Tapestry4单元测试</a> 2007-05-24</div><div><a href="/logs/10548095.html">Flex杀手是kugoo -___-</a> 2007-10-30</div><div><a href="/logs/6489320.html">Ext.TabPanelItem中使用Iframe引起的内存泄露</a> 2007-07-07</div><div><a href="/logs/5546126.html">不理想的设计</a> 2007-05-27</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Ficedcoffee.blogbus.com%2Flogs%2F5534346.html&title=AJAX%E8%AF%B7%E6%B1%82%E5%B9%B6%E5%8F%91%E9%97%AE%E9%A2%98">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://pindao.blogbus.com/sejie?utm_source=blogbus&utm_medium=rss&utm_campaign=sejie" target="_blank">色界频道——这里有顶尖的摄影大师，也有摄影爱好者，他们用相机收纳大千世界。</a></b></div><br /><br />]]></description>
   <link>http://icedcoffee.blogbus.com/logs/5534346.html</link>
   <author>Robin</author>
   <pubDate>Sat, 26 May 2007 22:56:25 +0800</pubDate>
  </item>
  <item>
   <title>Tapestry4单元测试</title>
   <description><![CDATA[<p>关键字：Tapestry4&nbsp; 单元测试&nbsp; EasyMock&nbsp; SpringMock</p><p style="margin: 0cm 0cm 0pt 21.6pt" class="a"><span><span><font face="Times New Roman"><font size="5">1</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><span style="font-family: 宋体"><font size="5">序<br /></font></span></p><p style="margin: 0cm 0cm 0pt; text-indent: 24pt" class="a2"><font size="3"><span style="font-family: 宋体">在</span><span><font face="Times New Roman">Tapestry4</font></span><span style="font-family: 宋体">中进行单元测试不是一件容易的事情。我们知道，一个完整的</span><span><font face="Times New Roman">MVC</font></span><span style="font-family: 宋体">框架内的单元测试，仅仅像纯粹简单</span><span><font face="Times New Roman">java</font></span><span style="font-family: 宋体">类那样测试是不够的。除了需要模拟出被测试类所依赖的类或接口实现以外，还要模拟必须的</span><span><font face="Times New Roman">Servlet</font></span><span style="font-family: 宋体">组件对象，以及</span><span><font face="Times New Roman">Session</font></span><span style="font-family: 宋体">等，较为繁琐。此外，由于</span><span><font face="Times New Roman">Tapestry4</font></span><span style="font-family: 宋体">采用了抽象类和抽象方法来实现页面，又给它的单元测试带来了不便。更糟糕的是，</span><span><font face="Times New Roman">Tapestry4</font></span><span style="font-family: 宋体">自身并未提供完整的单元测试解决方案，同时又欠缺第三方测试框架的支持，因此在互联网上有人抨击</span><span><font face="Times New Roman">Tapestry4</font></span><span style="font-family: 宋体">，&ldquo;它的单元测试简直不可能&rdquo;。</span></font></p><p style="margin: 0cm 0cm 0pt; text-indent: 24pt" class="a2"><font size="3"><span style="font-family: 宋体">其实，如果我们对</span><span><font face="Times New Roman">Tapestry</font></span><span style="font-family: 宋体">的框架内部结构足够熟悉，如果对</span><span><font face="Times New Roman">Servlet</font></span><span style="font-family: 宋体">容器的内部机制足够了解，实现在</span><span><font face="Times New Roman">Tapestry4</font></span><span style="font-family: 宋体">上的单元测试不会太难，但是太多条件对于大多数Tapestry Programmer尚不具备，依我们目前对</span><span><font face="Times New Roman">Tapestry4</font></span><span style="font-family: 宋体">框架结构的了解程度，仍然无法实现像</span><span><font face="Times New Roman">Struts</font></span><span style="font-family: 宋体">和</span><span><font face="Times New Roman">Tapestry5</font></span><span style="font-family: 宋体">那样完整的单元测试，但应该基本能够满足我们的测试需要。当然，随着对框架研究的逐步深入，这一情况应该会逐步得到改善。</span></font></p><p style="margin: 0cm 0cm 0pt; text-indent: 24pt" class="a2"><font size="3"><span style="font-family: 宋体">接下来，本文将针对Tapestry4 + Hibernate + Spring框架组合中，Tapestry4的单元测试做简要说明。</span></font></p><p style="margin: 0cm 0cm 0pt; text-indent: 24pt" class="a2">&nbsp;</p><p style="margin: 0cm 0cm 0pt; text-indent: 24pt" class="a2"><font size="3"><span style="font-family: 宋体"><br /></span></font><span><span><font face="Times New Roman"><font size="5">2</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><span style="font-family: 宋体"><font size="5">工具介绍<br /></font></span><font face="Times New Roman"><span><span><font size="5">2.1</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span><font size="5">EasyMock</font></span></font><span><span style="font-family: 宋体"><font size="5">简介</font></span></span></p><p><span style="font-size: 12pt; font-family: 宋体">EasyMock</span><span style="font-size: 12pt; font-family: 宋体">是一个<span>Mock</span>对象的类库。最新的<span>EasyMock</span>版本是<span>2.2</span>，可在<span><a href="http://sourceforge.net/projects/">http://sourceforge.net/projects/</a></span>下载到。<span>Mock </span>对象能够模拟领域对象的部分行为，并且能够检验运行结果是否和预期的一致。领域类将通过与<span>Mock </span>对象的交互，来获得一个独立的测试环境。<span>EasyMock</span>可以动态地生成<span>Mock </span>对象而不需要编写它们，因为也不会产生多余代码。</span><span style="font-size: 12pt; font-family: 宋体">说明：默认情况下，<span>EasyMock</span>只支持为接口生成<span>Mock</span>。如果还需要为类生成<span>Mock</span>，可在上述网址下载<span>EasyMock</span>的扩展包以完成此功能。<span>EasyMock 2.2</span>只能在<span>Java 5.0</span>以上的版本中运行。</span><span><font face="Times New Roman" size="3">&nbsp;</font></span> </p><p>&nbsp;</p><p><span><span><font face="Times New Roman"><font size="5">3</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><span style="font-family: 宋体"><font size="5">单元测试方法<br /></font></span><span><span><font face="Times New Roman"><font size="5">3.1</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><font size="5"><span style="font-family: 宋体">方法一：</span><span><font face="Times New Roman">EasyMock</font></span></font><font size="5"><span><span style="font-family: 宋体">辅助方式</span></span><span><font face="Times New Roman">&nbsp;</font></span></font></p><p style="margin: 0cm 0cm 0pt; text-indent: 24pt" class="a2"><font size="3"><span style="font-family: 宋体">大多数情况下，前端的单元测试需要与后端分离。而且为了测试方便，又会希望摆脱对</span><span><font face="Times New Roman">Servlet</font></span><span style="font-family: 宋体">容器的依赖。在这种情况下，以往的实现手段是手工编写所需的</span><span><font face="Times New Roman">Mock</font></span><span style="font-family: 宋体">对象来辅助完成测试，但这样会大幅增加测试代码编写量。幸运的是，这部分工作现在可以通过</span><span><font face="Times New Roman">EasyMock</font></span><span style="font-family: 宋体">来帮助我们完成，从而提高单元测试效率。</span></font></p><p style="margin: 0cm 0cm 0pt; text-indent: 24pt" class="a2"><font size="3"><span style="font-family: 宋体">这种测试方式下，使用</span><span><font face="Times New Roman">JUnit</font></span><span style="font-family: 宋体">或</span><span><font face="Times New Roman">TestNG</font></span><span style="font-family: 宋体">均可。</span></font></p><p style="margin: 0cm 0cm 0pt; text-indent: 24pt" class="a2"><font size="3"><span style="font-family: 宋体">下面，以</span><span><font face="Times New Roman">Metaone</font></span><span style="font-family: 宋体">前端的登陆页面类（</span><span><font face="Times New Roman">Login.java</font></span><span style="font-family: 宋体">，为了增加例子可读性，代码已删减）的单元测试为例，讲解</span><span><font face="Times New Roman">EasyMock</font></span><span style="font-family: 宋体">辅助</span><span><font face="Times New Roman">Tapestry4</font></span><span style="font-family: 宋体">单元测试的方法。</span></font></p><p style="margin: 0cm 0cm 0pt; text-indent: 24pt" class="a2"><font size="3"><span style="font-family: 宋体">被测试类</span><span><font face="Times New Roman">Login.java</font></span><span style="font-family: 宋体">的被测方法代码如下：</span></font></p><p style="margin: 0cm 0cm 0pt" class="a2"><span><font face="Times New Roman" size="3">//Login.java</font></span></p><p><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">package</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> com.carnation.metaone.page;</span><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;<br /></span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">import</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> &hellip;&hellip;</span><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;<br /></span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">abstract</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> Login </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">extends</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> BasePage </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">implements</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> PageBeginRenderListener {</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; <br /></span></span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">&nbsp; &nbsp;// </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">用户名</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; <br /></span></span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">&nbsp; &nbsp;public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">abstract</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> String getUsername();</span><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">// </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">密码</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">abstract</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> String getPassword();</span><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">abstract</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> UserService getUserService();</span><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">abstract</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> HttpServletRequest getHttpServletRequest();</span><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;<br />&nbsp; &nbsp;</span></span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">abstract</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> User getUser();</span><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">abstract</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> setUser(User user);</span><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">abstract</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> setApplication(Application app);</span><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">abstract</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> Application getApplication();</span><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">// </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">登陆表单的监听方法</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> IPage loginSubmit(IRequestCycle cycle)&nbsp;{</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>User user = </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> User();<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>user.setUsername(getUsername());<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>user.setPassword(getPassword());<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Application application = getApplication();<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>user.setApplication(application);<br /></span><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">try</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> {<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>user = getUserService().authenticate(user);<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>user.setLocale(</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">this</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.getLocale());<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>user.setApplication(application);<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>setUser(user);<br /></span><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>Date myDate = </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> Date();<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String ip = getHttpServletRequest().getRemoteAddr().trim();<br /></span><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">/*<br /></span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span>* </span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">跳转页面</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">,</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">其中空</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">URL</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">代表当前应用的根目录<br /></span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span>*/<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String url = </span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">&quot;Home.html&quot;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">if</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> (application.getId().intValue()&gt;1) {<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>url = </span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">&quot;application/Home.html&quot;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">return</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> cycle.getPage(url);<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>} </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">catch</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> (AuthenticationException e) {<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>IValidationDelegate delegate = getDelegate();<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>delegate.setFormComponent(</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">null</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">);<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>delegate.record(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">&quot;</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体">认证失败，请重新登录！</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">&quot;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">, </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">null</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">);<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">return</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">null</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<br /></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}<br /></span><span style="font-size: 12pt; font-family: 宋体">测试代码编写步骤：<br /></span><span style="font-size: 12pt"><span><font face="Times New Roman">（1）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><span style="font-size: 12pt; font-family: 宋体">把</span><span style="font-size: 12pt"><font face="Times New Roman">EasyMock</font></span><span style="font-size: 12pt; font-family: 宋体">包引入测试类，当然如果使用</span><span style="font-size: 12pt"><font face="Times New Roman">JDK1.5</font></span><span style="font-size: 12pt; font-family: 宋体">，可以使用静态引入，使用更加方便。<br /></span><span style="font-size: 12pt"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="font-size: 12pt"><font face="Times New Roman">import static org.easymock.EasyMock;</font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;</font></span><span style="font-size: 12pt"><font face="Times New Roman">//JDK1.5</font></span><span style="font-size: 12pt; font-family: 宋体">环境下可以静态引入<br /></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import static org.easymock.EasyMock.createMock;<br /></font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; import static org.easymock.EasyMock.expect;<br /></font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import static org.easymock.EasyMock.replay;<br /></font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import static org.easymock.EasyMock.verify;</font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;</font></span></p><p><span style="font-size: 12pt"><span><font face="Times New Roman">（2）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><span style="font-size: 12pt; font-family: 宋体">模拟后端</span><span style="font-size: 12pt"><font face="Times New Roman">Service</font></span><span style="font-size: 12pt; font-family: 宋体">接口和</span><span style="font-size: 12pt"><font face="Times New Roman">Servlet</font></span><span style="font-size: 12pt; font-family: 宋体">接口。<br /></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UserService userService = createMock(UserService.class);</font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;<br /></font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest httpServletRequest = </font></span><span style="font-size: 12pt"><font face="Times New Roman">create(HttpServletRequest);</font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;<br /></font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IRequestCycle cycle = create(IRequestCycle.class);<br /></font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Home home = create(Home.class);</font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;</font></span></p><p><span style="font-size: 12pt"><span><font face="Times New Roman">（3）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><span style="font-size: 12pt; font-family: 宋体">将</span><span style="font-size: 12pt"><font face="Times New Roman">Login</font></span><span style="font-size: 12pt; font-family: 宋体">类实例化，并将需要初始化的变量进行初始化。</span><span style="font-size: 12pt"><font face="Times New Roman">Tapestry</font></span><span style="font-size: 12pt; font-family: 宋体">框架提供了一个</span><span style="font-size: 12pt"><font face="Times New Roman">org.apache.tapestry.test.Creator</font></span><span style="font-size: 12pt; font-family: 宋体">类，可以创建页面和组件抽象类的实例。<br /></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Creator creator = new Creator();</font></span><span style="font-size: 12pt"><font face="Times New Roman">Map propertyMap =</font></span><span style="font-size: 12pt"><font face="Times New Roman"><span>&nbsp;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>new HashMap();</font></span><span style="font-size: 12pt"><font face="Times New Roman">propertyMap.add(&ldquo;username&rdquo;,&rdquo;admin&rdquo;);<br /></font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; propertyMap.add(&ldquo;password&rdquo;,&rdquo;admin&rdquo;);<br /></font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; propertyMap.add(&ldquo;userService&rdquo;,userService);<br /></font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application application = new Application();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 12pt"><font face="Times New Roman">application.setId(new Long(&ldquo;1&rdquo;));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="font-size: 12pt"><font face="Times New Roman">propertyMap.add(&ldquo;application&rdquo;,application);</font></span><span style="font-size: 12pt"><font face="Times New Roman">creator.newInstance(Login.class, propertyMap);</font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;<br /></font></span><span style="font-size: 12pt"><span><font face="Times New Roman">（4）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><span style="font-size: 12pt; font-family: 宋体">编写</span><span style="font-size: 12pt"><font face="Times New Roman">Mock</font></span><span style="font-size: 12pt; font-family: 宋体">行为逻辑。</span><span style="font-size: 12pt"><font face="Times New Roman">EasyMock</font></span><span style="font-size: 12pt; font-family: 宋体">测试注重行为，即通过类似于录制、回放的过程来进行测试。在&ldquo;录制&rdquo;过程中，我们编写期望</span><span style="font-size: 12pt"><font face="Times New Roman">Mock</font></span><span style="font-size: 12pt; font-family: 宋体">对象发生的行为，例如返回值、被调用次数等。在回放过程中，</span><span style="font-size: 12pt"><font face="Times New Roman">EasyMock</font></span><span style="font-size: 12pt; font-family: 宋体">将自动检查实际发生行为与预期是否相符。那么，对应本例而言，代码如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 12pt"><font face="Times New Roman">expect(httpServletReques.getRemoteAddr()).andReturn(&ldquo;192.168.0.1&rdquo;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 12pt"><font face="Times New Roman">try{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 12pt"><font face="Times New Roman">expect(userService.authenticate(not(eq(user)))).andReturn(getMockUser());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="font-size: 12pt"><font face="Times New Roman">}catch(AuthenticationException e){</font></span><span style="font-size: 12pt"><font face="Times New Roman"><span>&nbsp;&nbsp; </span>&hellip;&hellip;</font></span><span style="font-size: 12pt"><font face="Times New Roman">}</font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 12pt"><font face="Times New Roman">expect(cycle.getPage(&ldquo;application/Home.html&rdquo;)).andReturn(home).anyTimes();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 12pt"><font face="Times New Roman">expect(cycle.getPage(&ldquo;Home.html&rdquo;)).andReturn(home).anyTimes();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;</font></span><span style="font-size: 12pt"><font face="Times New Roman">replay(httpServletReques);</font></span><span style="font-size: 12pt"><font face="Times New Roman">replay(userService);</font></span><span style="font-size: 12pt"><font face="Times New Roman">replay(cycle);</font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 12pt"><font face="Times New Roman">Creator creator = new Creator();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 12pt"><font face="Times New Roman">Login loginPage = </font></span><span style="font-size: 12pt"><font face="Times New Roman">(Login) creator.newInstance(Login.class, propertyMap);</font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;<br /></font></span><span style="font-size: 12pt"><span><font face="Times New Roman">（5）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><span style="font-size: 12pt; font-family: 宋体">断言<br />&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 12pt"><font face="Times New Roman">assert loginPage.loginSubmit(cycle).equals(home);</font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;</font></span> </p><p><span><span><font face="Times New Roman"><font size="5">3.2</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span></span><font size="5"><span style="font-family: 宋体">方法二：</span><span><font face="Times New Roman">SpringMock</font></span></font><font size="5"><span><span style="font-family: 宋体">辅助方式（前后端集成）</span></span><font face="Times New Roman"> </font></font></p><p style="margin: 0cm 0cm 0pt; text-indent: 24pt" class="a2"><font size="3"><span style="font-family: 宋体">在一些实际情况中，后端的一些方法内部对</span><span><font face="Times New Roman">Hibernate Session</font></span><span style="font-family: 宋体">进行操作，在这种情况下，对于那些无返回值的方法调用，在前端使用</span><span><font face="Times New Roman">EasyMock</font></span><span style="font-family: 宋体">是无法模拟的。</span></font></p><p style="margin: 0cm 0cm 0pt; text-indent: 24pt" class="a2"><font size="3"><span style="font-family: 宋体">幸运的是，利用</span><span><font face="Times New Roman">Spring Mock</font></span><span style="font-family: 宋体">可以辅助这类测试。但需要注意，这并不意味这不再需要</span><span><font face="Times New Roman">EasyMock</font></span><span style="font-family: 宋体">，</span><font face="Times New Roman"> <span>Servlet</span></font><span style="font-family: 宋体">接口的模拟仍然需要使用</span><span><font face="Times New Roman">EasyMock</font></span><span style="font-family: 宋体">来实现。</span></font></p><p style="margin: 0cm 0cm 0pt; text-indent: 24pt" class="a2"><font size="3"><span style="font-family: 宋体">若采用这种方式进行测试，对测试工具的选择会有局限，仅支持</span><span><font face="Times New Roman">JUnit</font></span><span style="font-family: 宋体">，因为</span><span><font face="Times New Roman">Spring Mock</font></span><span style="font-family: 宋体">提供的基类继承自</span><span><font face="Times New Roman">JUnit</font></span><span style="font-family: 宋体">中的测试类。</span></font></p><p style="margin: 0cm 0cm 0pt; text-indent: 24pt" class="a2"><span style="font-family: 宋体"><font size="3">该方式的实现步骤如下：</font></span></p><p style="margin: 0cm 0cm 0pt 60pt; text-indent: -36pt; tab-stops: list 60.0pt" class="a2"><span><span><font face="Times New Roman"><font size="3">（1）</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></font></span></span><font size="3"><span style="font-family: 宋体">使测试类继承</span><span><font face="Times New Roman">AbstractDependencyInjectionSpringContextTests</font></span><span style="font-family: 宋体">。</span></font></p><p style="margin: 0cm 0cm 0pt 60pt; text-indent: -36pt; tab-stops: list 60.0pt" class="a2"><span><span><font face="Times New Roman"><font size="3">（2）</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></font></span></span><font size="3"><span style="font-family: 宋体">覆写</span><span><font face="Times New Roman">getConfigLocations</font></span><span style="font-family: 宋体">方法。以读取</span><span><font face="Times New Roman">Spring</font></span><span style="font-family: 宋体">上下文。</span></font></p><p style="margin: 0cm 0cm 0pt 60pt" class="a2"><span><font face="Times New Roman" size="3">@Override</font></span></p><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protected String[] getConfigLocations() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 12pt"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String[] str = new String[]{&quot;applicationContext.xml&quot;};</font></span><span style="font-size: 12pt"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&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;&nbsp;&nbsp;&nbsp;&nbsp; </span>return str;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 12pt"><font face="Times New Roman">}</font></span> <p style="margin: 0cm 0cm 0pt 60pt; text-indent: -36pt; tab-stops: list 60.0pt" class="a2"><span><span><font face="Times New Roman"><font size="3">（3）</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></font></span></span><font size="3"><span style="font-family: 宋体">分别在</span><span><font face="Times New Roman">onSetUp()</font></span><span style="font-family: 宋体">和</span><span><font face="Times New Roman">onTearUp()</font></span><span style="font-family: 宋体">方法中开启和关闭</span><span><font face="Times New Roman">Hibernate</font></span><span style="font-family: 宋体">的</span><span><font face="Times New Roman">Session</font></span><span style="font-family: 宋体">，这样延迟加载（</span><span><font face="Times New Roman">Lazy Initialization</font></span><span style="font-family: 宋体">）的集合也可以被正常调用。</span></font></p><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span></span><span style="font-size: 12pt"><span>&nbsp;</span></span><span style="font-size: 12pt">private SessionFactory sf;</span></font> <p style="margin: 0cm 0cm 0pt 60pt" class="a2"><span><font face="Times New Roman" size="3">@Override<br /></font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;protected void onSetUp() throws Exception {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</font></span><span style="font-size: 12pt"><font face="Times New Roman">super.onSetUp();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</font></span><span style="font-size: 12pt"><font face="Times New Roman">SessionFactory sessionFactory = </font></span><span style="font-size: 12pt"><font face="Times New Roman">(SessionFactory) applicationContext.getBean(&quot;sessionFactory&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 12pt"><font face="Times New Roman">sf = sessionFactory;</font></span><span style="font-size: 12pt"><font face="Times New Roman">Session s = sessionFactory.openSession();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 12pt"><font face="Times New Roman">TransactionSynchronizationManager.bindResource(sessionFactory, </font></span><span style="font-size: 12pt"><font face="Times New Roman">new SessionHolder(s));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 12pt"><font face="Times New Roman">}<br /></font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;<br /></font></span><span style="font-size: 12pt"><font face="Times New Roman">@Override<br /></font></span><span style="font-size: 12pt"><font face="Times New Roman">protected void onTearDown() throws Exception {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 12pt"><font face="Times New Roman">super.onTearDown();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="font-size: 12pt"><font face="Times New Roman">SessionHolder holder = </font></span><span style="font-size: 12pt"><font face="Times New Roman">(SessionHolder)TransactionSynchronizationManager.getResource(sf);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 12pt"><font face="Times New Roman">Session s = holder.getSession(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 12pt"><font face="Times New Roman">s.flush();</font></span><span style="font-size: 12pt"><font face="Times New Roman">TransactionSynchronizationManager.unbindResource(sf);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="font-size: 12pt"><font face="Times New Roman">SessionFactoryUtils.closeSessionIfNecessary(s, sf);</font></span><span style="font-size: 12pt"><font face="Times New Roman">}</font></span><span style="font-size: 12pt"><font face="Times New Roman">&nbsp;</font></span> </p><p style="margin: 0cm 0cm 0pt 60pt; text-indent: -36pt; tab-stops: list 60.0pt" class="a2"><span><span><font face="Times New Roman"><font size="3">（4）</font><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></font></span></span><font size="3"><span style="font-family: 宋体">编写测试方法。与使用</span><span><font face="Times New Roman">EasyMock</font></span><span style="font-family: 宋体">不同，此时通过</span><span><font face="Times New Roman">application</font></span><span style="font-family: 宋体">对象的</span><span><font face="Times New Roman">getBean()</font></span><span style="font-family: 宋体">方法来获取</span><span><font face="Times New Roman">Spring</font></span><span style="font-family: 宋体">上下文中装配的</span><span><font face="Times New Roman">Bean</font></span><span style="font-family: 宋体">。例如</span></font></p><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt">UserService userService =</span></font><span style="font-size: 12pt"><font face="Times New Roman"><span>&nbsp;</span><span> </span>(UserService)applicationContext.getBean(&quot;userService&quot;);</font></span> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font size="3">通过上述两种方法，可以满足大部分单元测试需要，但仍然无法覆盖到界面操作方面的测试。这样的做法在理论上是可行的，但从实际角度出发，对于Web层质量的提升意义并不大，不如用Selenium做集成测试来的实在。：）<br /></font></p><!--sp--><div class="relpost"><br/><h3>随机文章：</h3><div><a href="http://icedcoffee.blogbus.com/logs/6489320.html">Ext.TabPanelItem中使用Iframe引起的内存泄露</a> 2007-07-07</div><div><a href="http://doruyeye.blogbus.com/logs/50236587.html">21：39</a> 2009-11-05</div><div><a href="/logs/5596622.html">气质测试结果</a> 2007-05-31</div><div><a href="/logs/5538140.html">在JQuery中使用JSON</a> 2007-05-27</div><div><a href="/logs/5534346.html">AJAX请求并发问题</a> 2007-05-26</div></div><div class="addfav"><br />收藏到：<span class= "delicious"><a href="http://delicious.com/save?url=http%3A%2F%2Ficedcoffee.blogbus.com%2Flogs%2F5494708.html&title=Tapestry4%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95">Del.icio.us</a></span></div><br /><br /><div class="sysmsg"><b><a href="http://tuijian.blogbus.com/" target="_blank">推荐：让我们寻找最优秀的Blogger！</a></b></div><br /><br />]]></description>
   <link>http://icedcoffee.blogbus.com/logs/5494708.html</link>
   <author>Robin</author>
   <pubDate>Thu, 24 May 2007 11:32:54 +0800</pubDate>
  </item>
 </channel>
</rss>
