﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-dinghao</title><link>http://www.cnblogs.com/bluewater/</link><description>记录成长点滴</description><language>zh-cn</language><lastBuildDate>Mon, 06 Jul 2009 01:50:09 GMT</lastBuildDate><pubDate>Mon, 06 Jul 2009 01:50:09 GMT</pubDate><ttl>60</ttl><item><title>新建立一个类似于CuteEditor的项目，希望有人参加。发布一个测试版本的dll</title><link>http://www.cnblogs.com/bluewater/archive/2007/09/11/889981.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Tue, 11 Sep 2007 09:50:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2007/09/11/889981.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/889981.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2007/09/11/889981.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/889981.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/889981.html</trackback:ping><description><![CDATA[&nbsp;<span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">决定完成一个开源项目，暂时命名为</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">WordEditor</span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。<br />
</span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分三步完成，<strong style="mso-bidi-font-weight: normal">第一步以某个现有的</strong></span><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Editor</span></strong><strong style="mso-bidi-font-weight: normal"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为蓝本，完成一个类似的实现</span></strong><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。目前，参考</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Cuteeditor</span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的一个实现已经完成，大概有</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">CE</span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">百分之八十以上的功能。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span>
<p class="MsoNormal"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之所以仿照</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">CE</span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，一是因为他的界面最酷，二是因为它的源代码用了混淆，做类似的实现比较有意思。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不过，现在想来选择</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">CE</span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">做蓝本是一个错误。因为除了界面比较酷之外，他的服务器端代码很烂，一方面为了达到更好的混淆，用了大量的内部类，另一方面用了很多奇怪的方式实现控件。把许多简单问题，弄的很复杂。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">RadEditor</span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是这两天我刚看到的另一个编辑器，它的界面很酷，服务器端代码也很好。他的服务器端实现和我的想法很相似，比较符合正常人的思路。可以说是，把复杂问题简单化了。只是看到这个实现时，第一阶段已经完成。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">今天看到一个报道说&#8220;从公布的录像来看，日本隐形战斗机实际上是</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">F-22</span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的翻版，整个外形几乎一模一样，配备两台具有矢量推力的发动机，虽然看不到武器，但所有武器似乎也是内置的。如此看来，日本隐形战斗机为了&#8220;少走弯路&#8221;，几乎&#8220;全盘借鉴&#8221;了</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">F-22</span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的设计思路。&#8221;</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">同样，为了完成</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">WordEditor</span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，从头空想，一点点的实现，远不如以现在某个比较成熟的项目为蓝本，先仿照他的实现，然后再按照自己的思路重构。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样可以：</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">1、<span style="font: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">弥补自己的不足，如此项目中的</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Javascript</span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">2、<span style="font: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一开始项目就达到了比较高的水平。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt; mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">3、<span style="font: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">吸取他的优点，并避免它的缺陷。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第二步，重构服务器端代码（估计两到三周时间）</span></strong><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由于</span><span lang="EN-US">CE</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的服务器端实现，很不符合正常的思路，只是说和我的想法差别很大。这一阶段会按照我的思路改写上一阶段的部分实现，如改写资源管理、</span><span lang="EN-US">Gzip</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">重构完成后会发布源代码。</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第三步，把控件移到</span><span lang="EN-US">Ajax</span></strong><strong style="mso-bidi-font-weight: normal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">平台。</span><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这一步是最关键的一个步骤，这一步完成后，这个控件才算真正的开始。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先，把服务器端代码移到</span><span lang="EN-US">Ajax</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，可以利用</span><span lang="EN-US">asp.net ajax</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的基类，会省去服务器属性和脚本的映射代码。依靠</span><span lang="EN-US">Ajax</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">平台，也使这个控件的扩展性和稳定性增强。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其次是，客户端脚本的重写。由于我</span><span lang="EN-US">js</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不好，这一步是比较头疼的问题。不过，有许多现成的脚步参考，应该也不会太难。</span></p>
<p class="MsoNormal"><strong style="mso-bidi-font-weight: normal"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有想加入的可以和我联系，一起学习</span></strong><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Ajax</span></strong><strong style="mso-bidi-font-weight: normal"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，我觉得以开发控件的方式学习，也是不错的途径，边学边写。要求熟悉</span></strong><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">Ajax</span></strong><strong style="mso-bidi-font-weight: normal"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></strong><strong style="mso-bidi-font-weight: normal"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">msn:hao_ding@eyou.com</span></strong><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal">
<p class="MsoNormal"></p>
<span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">部署方式，由于采用了</span><span lang="EN-US">CuteEditor</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的配置文件，只需要下面两步就可以应运这个库：</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">1、<span style="font: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用</span><span lang="EN-US">WordEditor.dll</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">替换掉</span><span lang="EN-US">CuteEditor.dll</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"><span lang="EN-US" style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">2、<span style="font: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把</span><span lang="EN-US">Dialog</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件夹替换为附件中新的</span><span lang="EN-US">Dialog<br />
</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用方法，参考cuteeditor的文档<br />
代码下载：<br />
<a href="http://www.cnblogs.com/files/bluewater/cuteeditor.rar">http://www.cnblogs.com/files/bluewater/<font color="#000000">cuteeditor</font>.rar</a><br />
效果图：<br />
<img height="1088" alt="" src="http://www.cnblogs.com/images/cnblogs_com/bluewater/a.PNG" width="1276" border="0" /><br />
关于</span><span lang="EN-US">Cuteeditor</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">他的服务器端实现很诡异就不多说了，他的客户端也是如此，以简单的</span><span lang="EN-US">toolbarbutton</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为例子：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&lt;</span><span style="color: #000000">img&nbsp;command</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">Save</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;postback</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">True</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;alt</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">保存</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;themeindex</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />下面是Freetextbox<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">img&nbsp;src</span><span style="color: #000000">=</span><span style="color: #000000">&#8221;bold.gif</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;border=</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;title=</span><span style="color: #000000">"</span><span style="color: #000000">Bold</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;unselectable=</span><span style="color: #000000">"</span><span style="color: #000000">on</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;width=</span><span style="color: #000000">"</span><span style="color: #000000">21</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;height=</span><span style="color: #000000">"</span><span style="color: #000000">20</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;tabindex=</span><span style="color: #000000">"</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;style=</span><span style="color: #000000">"</span><span style="color: #000000">margin:0px;padding:0px;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;align=</span><span style="color: #000000">"</span><span style="color: #000000">center</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;/&gt;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />下面是RadEditor<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&lt;img&nbsp;src=</span><span style="color: #000000">"</span><span style="color: #000000">/</span><span style="color: #000000">DEMOS</span><span style="color: #000000">/</span><span style="color: #000000">ASPNET</span><span style="color: #000000">/</span><span style="color: #000000">RadControls</span><span style="color: #000000">/</span><span style="color: #000000">Editor</span><span style="color: #000000">/</span><span style="color: #000000">Skins</span><span style="color: #000000">/</span><span style="color: #000000">Default</span><span style="color: #000000">/</span><span style="color: #000000">buttons</span><span style="color: #000000">/</span><span style="color: #000000">Bold.gif</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;alt=</span><span style="color: #000000">"</span><span style="color: #000000">Bold</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;title=</span><span style="color: #000000">"</span><span style="color: #000000">Bold</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;/&gt;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p class="MsoNormal">当然，</span><span lang="EN-US">CuteEditor</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优点也不少，如事件处理方式。总之</span><span lang="EN-US">CE</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实现方式和独特。<br />
这个项目总览<br />
http://www.cnblogs.com/bluewater/archive/2007/09/06/884990.html</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">几个Editor比较<br />
http://www.cnblogs.com/bluewater/archive/2007/09/06/885001.html<br />
cuteeditor6破解<br />
http://www.cnblogs.com/bluewater/archive/2007/09/06/885006.html<br />
</span></p>
<img src ="http://www.cnblogs.com/bluewater/aggbug/889981.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47995/" target="_blank">Google Voice 上手</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>想做一个关于word解析和HtmlEditor的项目，希望有人加入</title><link>http://www.cnblogs.com/bluewater/archive/2007/09/06/884990.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Thu, 06 Sep 2007 15:49:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2007/09/06/884990.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/884990.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2007/09/06/884990.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/884990.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/884990.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;<span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">从解析</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><a href="http://www.cnblogs.com/bluewater/archive/2007/03/02/662040.html"><span style="mso-field-code: ' HYPERLINK 'http://www.cnblogs.com/bluewater/archive/2007/03/02/662040.html''"><span style="font-size: 8.5pt; color: black; text-decoration: none; text-underline: none">WordprocessingML</span></span></a></span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">开始，就想写一个基于</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">xml</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">的类库，我总觉得</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">MS</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">以</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">xml</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">描述</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Office</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">文档，是一个机会。但是这个类库，应用范围比较窄，我对他的前途有些怀疑。我希望，这个类库配合一个基于</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">html</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">的编辑器，这个编辑器和流行的一些</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Editor</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">的不同之处是，它能更好的和</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">word</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">格式之间互操作。如，对</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">html</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">的修改可以反映到</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">word</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">上。</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoHeading8"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 黑体; mso-ascii-font-family: Arial">编辑器项目</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">由于我对</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Javascript</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">了解很少，编辑器只能想想，并没有能力去实现。后来又有机会学习了</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Ajax</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">，系统的学习了一次</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Javascript</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">。这时我觉得可以有实力去做这个编辑器了。</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">不过，我对自己的</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Js</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">缺乏信心，想到一个捷径，利用一个现有</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Editor</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">的脚本文件。我只重写服务器端的代码，这样一来可以省去</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Js</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">的麻烦，二来也可以在第一个版本就尽可能的做到比较实用的效果。这个版本出来后，可以再考虑，自己写脚本，我希望这个脚本是基于</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Ajax.net</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">的脚本库。</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoHeading8"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Word</span><span style="font-family: 黑体; mso-ascii-font-family: Arial">解析项目</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">最初解析</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">word</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">是因为公司一个项目的需要，这个项目需要把</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">word</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">转换成</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">html</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">，编辑</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">html</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">后能把修改再写入到</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">word</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">。以及把一些自定以表记转换为</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">html</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">标记。</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">当时听说了</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">wordprocessingMl</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">，就以他为基础解析，。为了简便，当时只解析了部分</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">word</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">标记。</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">由于当时的解析是基于</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">word2003</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">，第一次做，对那次解析也不满意。我有时间的时候，开始基于</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">word2007</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">解析</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">word</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">。这次做的很彻底，完成了</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">word</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">中</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">90%</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">以上标记的解析。</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">有一天，我忽然想到这些解析一开始，就走错了方向。主要是被</span><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt">WarstarDev.Office2k7</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'Arial Unicode MS'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">项目误导了。我是在用链表描述树结构，这才造成对</span><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt">xsd</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'Arial Unicode MS'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的一些元素如组，</span><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt">sequence,choice</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'Arial Unicode MS'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">等很难用</span><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt">List</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'Arial Unicode MS'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">描述出来。在</span><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt">word2007</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'Arial Unicode MS'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的解析中，我主要的时间都花在了如何简单准确的描述树结构，但不论怎么努力，结果都是差强人意。正确的做法应该是，解析的核心，仍然用树描述</span><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt">word</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'Arial Unicode MS'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，在暴露给客户的接口上，才需要基于这些树，做些</span><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt">fa</span><span lang="EN-US" style="color: black; font-family: 'Arial Unicode MS'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体">&#231;</span><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt">ade</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'Arial Unicode MS'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">。</span><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt">Asposeword</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'Arial Unicode MS'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">好像就如此做的，我当时看他源码的时候，还对他用树描述</span><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt">word</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'Arial Unicode MS'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">有些嘲讽，其实这才是正确的做法。</span><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'Arial Unicode MS'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">这些解析的优点是，可以脱离</span><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt">word</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'Arial Unicode MS'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">来操作</span><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt">word</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'Arial Unicode MS'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">文件。至少从效率上，比调用</span><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt">vba</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'Arial Unicode MS'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">或者</span><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt">vstc</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'Arial Unicode MS'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">（？）快很多，因为它没有必要调用</span><span lang="EN-US" style="color: black; mso-hansi-font-family: 'Arial Unicode MS'; mso-bidi-font-size: 10.5pt">word</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'Arial Unicode MS'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">内核。</span></p>
<p class="MsoHeading8"><span style="font-family: 黑体; mso-ascii-font-family: Arial">目前的一些进展：</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Word</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">解析方面：</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">这是转换的一些截图，版本是最初项目用到的</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">2003</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">版本。</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">包含标记的</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">word<img height="538" alt="" src="http://www.cnblogs.com/images/cnblogs_com/bluewater/tbwj.GIF" width="992" border="0" /><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">对应的</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">html</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">，把</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">word</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">重的</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">textbox</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">标记转换成了文本框，保留标记替换成了文本。（注，由于忘记考</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">xsd</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">，这些标记显示不出来）<img height="514" alt="" src="http://www.cnblogs.com/images/cnblogs_com/bluewater/tbwjhtml.GIF" width="1198" border="0" /><br />
</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">包含表格的</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">word<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p>&nbsp;<img height="531" alt="" src="http://www.cnblogs.com/images/cnblogs_com/bluewater/bg.GIF" width="1001" border="0" /></o:p></span></p>
<p class="MsoNormal"><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">对应的</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">html<img height="560" alt="" src="http://www.cnblogs.com/images/cnblogs_com/bluewater/bghtml.GIF" width="1015" border="0" /><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Editor</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">的进展：<br />
</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">这个刚开始做，不过到今天总算完成了服务器端的大部分工作，如果有时间，再过两周就会有一个实用的版本出来。</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">截图。<img height="559" alt="" src="http://www.cnblogs.com/images/cnblogs_com/bluewater/cuteeditor.GIF" width="796" border="0" /></span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoHeading8"><span style="font-family: 黑体; mso-ascii-font-family: Arial">后续的想法：</span></p>
<p class="MsoNormal"><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Word</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">的解析部分，整个从新开始。目前先不做这部分，不过因为又以前的基础，这部分比较有把握完成。</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Editor</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">部分，控件开发和</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Js</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">以前都没有做过，一直对他没有底。不过，由于现在服务器端以经完成了一半多，也算稍微有把握了。<br />
</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">在这个项目的目标是，Editor方面，首先赶上Cuteeditor，word方面，赶上asposeword。然后再在Editor上加操作word的功能。<br />
<br />
整体的结构图，比较粗略</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p>&nbsp;<img height="544" alt="" src="http://www.cnblogs.com/images/cnblogs_com/bluewater/wj.PNG" width="1031" border="0" /></o:p></span></p>
<p class="MsoNormal"><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">这个图不详细，依赖都应该是关联，由于这个软件表示有方向的关联比较麻烦，我一般都用依赖了。<br />
</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></p>
<p class="MsoHeading8"><span style="font-size: 24pt; font-family: 黑体; mso-ascii-font-family: Arial">写这篇文章有两目的：</span></p>
<p class="MsoNormal"><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">一是，不想一个人做了，凭我一个人的力量，恐怕到明年这个时候才能完成。</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">二是，提醒自己，不要放弃，把这个项目完成。</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">目前，想找个熟悉</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">JS</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">的，我们可以一起完成</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Editor</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">的脚本部分。新的脚本会基于</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Ms</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">的</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Ajax</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">脚本库。我负责把服务器端迁移为</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Ajax</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">控件（是否这点有必要？）。</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">如果想一起做，可以和我联系：</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">msn</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">：</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#104;&#97;&#111;&#95;&#100;&#105;&#110;&#103;&#64;&#101;&#121;&#111;&#117;&#46;&#99;&#111;&#109;">hao_ding@eyou.com</a>,</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">联系之前首先考虑下自己</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">Js</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">的水平，因为我</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'">js</span><span style="color: black; font-family: 宋体; mso-hansi-font-family: 'MS Shell Dlg'; mso-ascii-font-family: 'MS Shell Dlg'; mso-bidi-font-family: 'MS Shell Dlg'">不行，想找个高手。<br />
</span><span lang="EN-US" style="color: black; font-family: 'MS Shell Dlg'"><o:p><br />
附录一：<br />
Hibernate成功的原因　　<br />
　　<strong>1、飞快的版本发布</strong><br />
　　<br />
　　保持活跃的开发速度，经常进行版本发布，甚至几天 之内就从前一个版本开发到下一个版本。这样是保证软件远离Bug的最好的办法，也可以让用户感到很放心，确信Hibernate的开发十分活跃，另外这样做也有一大好处，就是可以发现哪些功能是用户真正需要的。<br />
　　<br />
　　<strong>2、回归测试</strong><br />
　　<br />
　　我想现在整个Java社区一定都很重视自动回归测试。如果软件的功能和设计有比较大的修改，那么一个综合性的test suite对于软件可维护性和稳定性来说实在是太重要了。我们应该有这样的意识：如果对软件的一个新功能没有进行回归测试，我们根本就不该去做它。<br />
　　<br />
　　<strong>3、把一个功能做到最好</strong><br />
　　<br />
　　要么不做，要做，就一定做到最好。那些我们做不到最好的功能，我们根本不去做，扔给其他软件去做吧。<br />
　　<br />
　　<strong>4、避免过度设计</strong><br />
　　<br />
　 　浪费大量的时间和精力进行软件功能的抽象和扩充软件的灵活性，还不如多花点时间来解决你的用户面临的实际问题呢！简单一点，软件最重要是运行起来，不要 尝试去解决你的用户根本不关心的问题。就算你的软件设计的不够优雅也没有关系，反正还是initial阶段。以后还可以再refactor，你应该关注的 问题是及时的把有用的功能给做出来。 </p>
<p class="Hry728"></p>
<p class="MsoNormal"><br />
　　<br />
　　<strong>5、集权</strong><br />
　　<br />
　　在你需要由民主投票来下决定之前，至少你已 经把软件轮廓做好了。软件开发需要由一两个开明的人来领导，这样可以保证软件开发的连贯性而不至于产生太大的分歧，可以保证开发团队集中火力把要实现的功 能做到最好。我觉得，OSS软件最大的风险就是意见不统一，摊子铺的太大，结果最后搞的什么都没有做好。<br />
　　<br />
　　（译者按：非常赞同，凡是成功的OSS软件，都是在某个人已经把软件做好了之后，发布出来，然后由大家往里面添加功能的，并且在这个人的领导下不断进步。缺乏此人的OSS软件都不算很成功，比如Mozilla）<br />
　　<br />
　　<strong>6、文档</strong><br />
　　<br />
　　没有什么比文档更重要的了。如果你的用户不知道你的软件有这么一个功能，就等于没有这个功能，干脆把它去掉得了，省得给源代码增加复杂度。<br />
　　<br />
　　<strong>7、避免标准化</strong><br />
　　<br />
　　好的标准可以带来软件的互用性和可移植性，坏的标准能够窒息软件创新。最好的软件是在不断的尝试，不断的出错，不断的经验积累的过程中产生的。事实上的标准往往更加贴近用户需求。<br />
　　<br />
　　<strong>8、10分钟之内把Hibernate跑起来</strong> </p>
<p class="Hry728"></p>
<p class="MsoNormal"><br />
　　<br />
　　潜在的Hibernate的用户在他们下载了Hibernate，第一次使用的时候根本就不可能花半个小时那么多时间来安装、配置和 troubleshooting，他们早就丧失了对Hibernate的兴趣了。<br />
　　<br />
　　我们的口号就是新用户（假设有足够的JDBC知识）5分钟之内把 Hibernate的Demo跑起来，而他们能够在1个小时之内写出&#8220;Hello World&#8221;式的最简单的Hibernate程序并且正常运行。<br />
　　<br />
　　<strong>9、开发人员的责任感</strong><br />
　　<br />
　　用户总是不可避免的碰到问题，开发团队有责任有义务提供帮助。用户让我们知道了文档的漏洞，用户让我们知道了测试用例的小bug。此外，没有用户来用我们的Hibernate，我们还开发它做什么，不是浪费时间吗！<br />
　　<br />
　 　有个关于bug的笑话：用户根本不介意发现新功能的bug（译者按：Windows的用户好像都是如此），只要你能迅速的改掉bug。&#8220;责任感&#8221;意味着 bug修复应该在1周之内。从收到bug报告到bug修复代码提交到CVS上要做到平均在24小时左右，这才是一个理想的目标。<br />
　　<br />
　　<strong>10、易用的、可更新的wiki网页</strong><br />
附录二：<br />
目前两个商业项目：<br />
cuteeditor，http://cutesoft.net/<br />
他的价格：从129到7999<br />
<a href="http://cutesoft.net/ASP.NET+WYSIWYG+Editor/Purchase+CuteEditor+for+.NET/default.aspx">http://cutesoft.net/ASP.NET+WYSIWYG+Editor/Purchase+CuteEditor+for+.NET/default.aspx</a><br />
aspose word，http://www.aspose.com/Products/Aspose.Word/<br />
价格：从899到10788<br />
<a href="http://www.aspose.com/Purchase/Aspose.Words/Default.aspx">http://www.aspose.com/Purchase/Aspose.Words/Default.aspx</a><br />
<br />
</o:p></span></p>
</o:p></span>
   <img src ="http://www.cnblogs.com/bluewater/aggbug/884990.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47994/" target="_blank">Google号召社区力量为互联网加速</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>从控件开发的角度看几个editor控件,Freetextbox,radtoolbar,abouteditor,cuteeditor</title><link>http://www.cnblogs.com/bluewater/archive/2007/09/06/885001.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Thu, 06 Sep 2007 15:49:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2007/09/06/885001.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/885001.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2007/09/06/885001.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/885001.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/885001.html</trackback:ping><description><![CDATA[&nbsp; <span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">今天控件的开发有了很大进展，写些东西。在开发之前，我看了几个控件的源代码，如</span><span lang="EN-US">Freetextbox,radtoolbr,abouteditor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">以及</span><span lang="EN-US">cuteeditor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">。今天凭会议总结一下他们的特点，能记下来的都是他们很独特的地方。</span>
<p class="MsoHeading7"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">首先是</span><span lang="EN-US">FreeTextbox</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">此控件是生成的控件（相对于复合控件），不论是</span><span lang="EN-US">toolbar</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">还是</span><span lang="EN-US">toolbaritem</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，都不是以子控件的形式存在，因此有更好的性能。这种方式的缺点是，不能很好的利用现有的</span><span lang="EN-US">Asp</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">控件，降低了用户自定义控件的方便性。如，我想在</span><span lang="EN-US">toolbari</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">上加上</span><span lang="EN-US">combox</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，必须自己实现。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">视图状态，视图状态的管理是令人头疼的问题，弄不好就会加大视图状态的大小。从</span><span lang="EN-US">Freetextbox</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">对视图状态的实现来看，它的实现中规中矩，完全符合</span><span lang="EN-US">ms</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">推荐的实现方式。但是，是否每个</span><span lang="EN-US">toolbaritem</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">都有必要实行视图状态？其实从</span><span lang="EN-US">Freetextbox</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的实现分析，大部分的实现是不必要的，因为他们都不会改变。如果把这些实现剔除，</span><span lang="EN-US">Freetextbox</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的代码会简单很多。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">子控件的实现方式，此控件不存在子控件，</span><span lang="EN-US">toolbaritem</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">被定义为实现了</span><span lang="EN-US">IstateMananger</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的类，每个</span><span lang="EN-US">Item</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">都是一个类，如</span><span lang="EN-US">Bold</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，</span><span lang="EN-US">Italic</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">等。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">总之，这个控件的服务器段代码，十分符合</span><span lang="EN-US">MS</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">推荐的控件实现方式，它的内部实现，类似于</span><span lang="EN-US">ASP</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的服务器控件实现。也符合常人的思路，代码比较容易理解。结构也不错可以给</span><span lang="EN-US">80</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">分。</span></p>
<p class="MsoHeading7"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">其次，</span><span lang="EN-US">Radtoolbar</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">此控件用的是复合控件。每个</span><span lang="EN-US" style="mso-bidi-font-weight: bold">toolbaritem</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">都被实现为子控件，并且暴露给客户。从用法来看比较像</span><span lang="EN-US" style="mso-bidi-font-weight: bold">asp</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">的一些复合控件，即子控件要在</span><span lang="EN-US" style="mso-bidi-font-weight: bold">aspx</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">中声明。但这种方式对客户来说，用起来很不方便，因为要写许多声明代码。</span><span lang="EN-US" style="mso-bidi-font-weight: bold"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">视图状态，此控件对视图状态的管理，可以说坏到了极点。它竟然通过把控件的属性序列化为</span><span lang="EN-US" style="mso-bidi-font-weight: bold">xml</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">，然后把</span><span lang="EN-US" style="mso-bidi-font-weight: bold">xml</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">作为视图状态。这就造成，任何一个细微的改变，都会把视图状态项记为</span><span lang="EN-US" style="mso-bidi-font-weight: bold">dirty</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">，造成整个</span><span lang="EN-US" style="mso-bidi-font-weight: bold">xml</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">序列被序列化的客户端。再者</span><span lang="EN-US" style="mso-bidi-font-weight: bold">xml</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">本身就包含许多不必要的文本，如</span><span lang="EN-US" style="mso-bidi-font-weight: bold">&lt;sdds&gt;ss&lt;/sdds&gt;</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">。可以看到元素名称是很浪费空间的。这就造成此控件的视图状态，会比标准的</span><span lang="EN-US" style="mso-bidi-font-weight: bold">asp</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">实现大十倍左右。</span><span lang="EN-US" style="mso-bidi-font-weight: bold"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">子控件的实现方式，子控件是通过序列化的方式从配置文件读取。子控件没有细分，如没有类似于</span><span lang="EN-US" style="mso-bidi-font-weight: bold">Bold</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">，</span><span lang="EN-US" style="mso-bidi-font-weight: bold">Italic</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">的项。只被粗略分成了</span><span lang="EN-US" style="mso-bidi-font-weight: bold">Toolbarbutton</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">，</span><span lang="EN-US" style="mso-bidi-font-weight: bold">toolbarseprator</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">等。</span><span lang="EN-US" style="mso-bidi-font-weight: bold"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">总之，这个控件实现没有细看，因为不论从哪方面来说，它都算不上优秀。</span><span lang="EN-US" style="mso-bidi-font-weight: bold">50</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">分。</span><span lang="EN-US" style="mso-bidi-font-weight: bold"><o:p></o:p></span></p>
<p class="MsoHeading7"><span lang="EN-US">AboutEditor</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">这个控件的实现类似于</span><span lang="EN-US" style="mso-bidi-font-weight: bold">Freetextbox</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">，也不是复合控件。</span><span lang="EN-US" style="mso-bidi-font-weight: bold"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">视图状态，他没有为</span><span lang="EN-US" style="mso-bidi-font-weight: bold">toolbarItem</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">实现视图状态，因为这几乎没必要。</span><span lang="EN-US" style="mso-bidi-font-weight: bold"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">子控件，他同样不存在子控件，与</span><span lang="EN-US" style="mso-bidi-font-weight: bold">freetextbox</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">的不同在于，他没有细化每个</span><span lang="EN-US" style="mso-bidi-font-weight: bold">toolbaritem</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">。</span><span lang="EN-US" style="mso-bidi-font-weight: bold"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">总之，此控件和</span><span lang="EN-US" style="mso-bidi-font-weight: bold">freetextbox</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">很相似，我没有细看。</span><span lang="EN-US" style="mso-bidi-font-weight: bold"><o:p></o:p></span></p>
<p class="MsoHeading7"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">最后是</span><span lang="EN-US">Cuteeditor</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">看了他的</span><span lang="EN-US" style="mso-bidi-font-weight: bold">demo</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">，很震撼，应该是所有</span><span lang="EN-US" style="mso-bidi-font-weight: bold">editor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">中效果最好的。</span><span lang="EN-US" style="mso-bidi-font-weight: bold"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-bidi-font-weight: bold">Cuteeditor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">用复合控件实现，缺点是增加了控件树的开销，效率没有生成控件高。优点就是，客户实现自定义功能较方便。</span><span lang="EN-US" style="mso-bidi-font-weight: bold"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">由于用子控件，大部分视图状态都可以交给</span><span lang="EN-US" style="mso-bidi-font-weight: bold">webcontrol</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">管理。</span><span lang="EN-US" style="mso-bidi-font-weight: bold"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">他对子控件的实现我认为不算太好，简单的控件都从一个基类派生，这点如果还算不上缺点，那么他对</span><span lang="EN-US" style="mso-bidi-font-weight: bold">Forecolor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">等的实现方式，确实不算好。</span><span lang="EN-US" style="mso-bidi-font-weight: bold"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">总之</span><span lang="EN-US" style="mso-bidi-font-weight: bold">cuteeditor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">是功能里面最强大的。但是他的实现，很难让人理解。不像</span><span lang="EN-US" style="mso-bidi-font-weight: bold">Freetextbox,</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">有中规中矩的实现。</span><span lang="EN-US" style="mso-bidi-font-weight: bold">60</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-weight: bold">分。</span><span lang="EN-US" style="mso-bidi-font-weight: bold"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-bidi-font-weight: bold"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">看了几个实现，可以说实现方式五花八门，除去视图状态不谈，只要把</span><span lang="EN-US">htmlrender</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">到客户端，控件就算完成了。这就造成实现控件的方式很多。应该怎么写，确实值得思考。</span></p>
<p class="MsoNormal"><span lang="EN-US">Freetexbox</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，占去了大概一周的时间，这段时间我仔细看了他最新版本，以及更早版本的代码，它的实现和符合正常人的思路，很容易理解。对他的实现了解太多，以至于不想参考他的实现了。主要是怕写完代码和他特别像。从结构上来看，它的缺点我认为主要在于，把子控件的生成操作，都延迟到了父控件，造成父控件逻辑负杂。我最初的想法是，在</span><span lang="EN-US">Init</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的时候，构造一个</span><span lang="EN-US">xmldocument</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，然后每个子控件通过</span><span lang="EN-US">xml</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的方式，增加</span><span lang="EN-US">xmldoc</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的节点，最后再返回</span><span lang="EN-US">xmldoc</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">给父控件。</span></p>
<p class="MsoNormal"><span lang="EN-US">Cuteeditor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">用了两三天的时间，他的代码很乱，几乎不符合常人的思路。尤其他为了防止破解，故意调整了几个类的顺序，如</span><span lang="EN-US">Editor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，嵌套了四五层的内部类，让人看起来很头痛。从他的</span><span lang="EN-US">html</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">看，也不像其他控件一样，能得到许多有用信息。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">由于他的效果最好，并且我看了好久都没有头绪，觉定从他下手，写一个类似的</span><span lang="EN-US">editor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">其他的几个控件，和这两个相比都差很远，忽略。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">经过近一个月的努力，控件开发终于过半，对</span><span lang="EN-US">cuteeditor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的研究也更深入了，觉得他的许多实现确实很诡异，也让人眼前一亮。增加到</span><span lang="EN-US">80</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">分。</span></p>
<p class="MsoHeading8"><span lang="EN-US">Cuteeditor</span><span style="font-family: 黑体; mso-ascii-font-family: Arial">特点</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">首先，它对资源文件的处理方式来看，他没有采用</span><span lang="EN-US">.net</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的资源文件，也不是通过自己定义资源管理类来在用到资源时本地化。而是通过重写</span><span lang="EN-US">Textwriter</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的</span><span lang="EN-US">innerwriter</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">和</span><span lang="EN-US">response</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的</span><span lang="EN-US">filter</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">实现。细节上，他用到了</span><span lang="EN-US">Idispose</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">接口和</span><span lang="EN-US">using</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">语句，这样在缓冲去满，或者</span><span lang="EN-US">dispose</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">时，自动实现资源的本地化。简直是绝了，我一直没有想过能这样用</span><span lang="EN-US">dispose</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">和这样实现资源。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">其次，对事件的处理，这也是</span><span lang="EN-US">cuteeditor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">做的很好的地方，它把所有的</span><span lang="EN-US">postbackdate</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">和</span><span lang="EN-US">postbackevent</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，封装到了两个隐藏域中，这两个隐藏域是两个</span><span lang="EN-US">webcontrol</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，他的值为</span><span lang="EN-US">post</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的数据和事件。这就使新增事件及其简便。只要加上</span><span lang="EN-US">postback=ture</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，就可以处理回发。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">其次，对脚本的管理，他的脚本都是动态加载的，因此不能调试。又是一个防止破解的招数。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">通过</span><span lang="EN-US">httphandler</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，他托管了</span><span lang="EN-US">*.js</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的加载。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">再次，配置文件的管理，他在运行时，会把几个配置文件加载到一个</span><span lang="EN-US">xmldoc</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">中，实现统一管理。</span><span lang="EN-US">Js</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">也实现了类似功能。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">还有，</span><span lang="EN-US">Gizip</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，以及缓存的管理方式，都和一般人的不同，感兴趣的自己去看源码。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">类似的诡异实现还有很多。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">我写的</span><span lang="EN-US">editor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，主要在下面几点做了改进：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">首先是，子控件的管理上，他的管理方式不算好。我把类似</span><span lang="EN-US">ForeColor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的控件都抽出了基类。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">其次，我认为应该让客户更简单的自定义控件。因此在这点上也有改进。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">再次，</span><span lang="EN-US">net2.0</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">已有的功能不再自己实现，如</span><span lang="EN-US">Gizp</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，在</span><span lang="EN-US">2.o</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">已经有了</span><span lang="EN-US">Gizpstream</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">我希望用</span><span lang="EN-US">Ma.js</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">重写他的客户端脚本，因此在服务器端尽量做些支持。<br />
</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>看了回复才知道还有个RadEditor，看了他的代码和效果。发现它才是最好的。90分吧<br />
其中，界面满分20。cuteeditor和Radeditor都是20分。freetextbox10分<br />
服务器端代码部分，ce60，freetextbox70，radeditore70。满分80<br />
&nbsp;</o:p></span></p>
<img src ="http://www.cnblogs.com/bluewater/aggbug/885001.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47994/" target="_blank">Google号召社区力量为互联网加速</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>cuteEditor6.0的破解方式与Cuteeditor6.0的脚本调试</title><link>http://www.cnblogs.com/bluewater/archive/2007/09/06/885006.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Thu, 06 Sep 2007 15:49:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2007/09/06/885006.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/885006.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2007/09/06/885006.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/885006.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/885006.html</trackback:ping><description><![CDATA[&nbsp; <span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">昨天遇到一个</span><span lang="EN-US">Js</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">问题，想调试</span><span lang="EN-US">Cuteeditor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">脚本。没想到还要许可证，在网上找到个免费的，可是由于</span><span lang="EN-US">loader.js</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">是动态的，仍然没有办法调试。</span>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">终于决定破解，以前从没有想过要破解，总感觉这样做很不道德，但是实在是被这个bug折磨烦了，只能破解后看看他的执行流程。没想到第一次破解竟然用了近一天时间，不过最终还是搞定了。</span></p>
<p class="MsoHeading8"><span style="font-family: 黑体; mso-ascii-font-family: Arial">服务端代码破解：</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">首先反编译为</span><span lang="EN-US">IL</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，找到动态生成</span><span lang="EN-US">js</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的代码，让他加载指定的文档。修改完后，编译为</span><span lang="EN-US">dll</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">。原以为搞定了，可是，编译时出现了，签名错误。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">去掉强命名，不成功，让</span><span lang="EN-US">clr</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">跳过强命明检测，仍然不成功。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">因为私钥是不可能获得的，这就没有办法生成新的</span><span lang="EN-US">hash</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">值，只能走最后一步了，重新生成私钥和公钥。重新对程序集进行签名。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">这次终于没有了编译错误，可是跑出了</span><span lang="EN-US">null</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">引用异常。一般人到这一步基本就很难再进行下去了，因为从异常看不到什么有用信息。因为我对</span><span lang="EN-US">cuteeditor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的代码比较熟悉，才能继续进行下去。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">下面是另一个</span><span lang="EN-US">cuteeditor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">诡异之处，他在初始化</span><span lang="EN-US">Editor</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">类时，要用到</span><span lang="EN-US">token</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">。以此来防止代码被修改。但是要找到这些信息比较难，一是他用了混淆，二是，这些信息被封的层次很深。</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">还有这个</span><span lang="EN-US">token</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">被以类似随机数的机制编码：</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp; </span>string str2 = new string(new char[] { </span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(char) ((length + 0x2f) + 4), (char) ((length + 0x27) + 0x11), (char) ((length + 0x24) + 9), (char) ((length + 0x18) + 0x1d), (char) ((length + 0x35) + 3), (char) ((length + 0x20) + 13), (char) ((length + 50) + 15), (char) ((length + 8) + 0x39), (char) ((length + 0x27) + 6), (char) ((length + 10) + 0x2c), (char) ((length + 0x17) + 0x21), (char) ((length + 10) + 0x23), (char) ((length + 0x2d) + 3), (char) ((length + 8) + 0x2a), (char) ((length + 0x23) + 10), (char) ((length + 0x26) + 0x1c), (char) ((length + 3) + 0x2e), (char) ((length + 0x29) + 4), (char) ((length + 8) + 0x2a), (char) ((length + 0x25) + 13), (char) ((length + 0x23) + 10), (char) ((length + 0x25) + 14), (char) ((length + 14) + 0x33)</span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>});</span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">上面的</span><span lang="EN-US">str2</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">就是</span><span lang="EN-US">token</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">值</span><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">38-58-AA-68-02-B1-22-3A</span><span style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">。是不是很难找到？<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">到此，破解基本结束，只要用新的<span lang="EN-US">token</span>替换掉<span lang="EN-US">str2</span>即可。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">用新的程序集替换后，终于可以调试<span lang="EN-US">Js</span>了。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">网上还没有<span lang="EN-US">6.0</span>的破解版，我估计都在<span lang="EN-US">token</span>上卡住了，因为他的<span lang="EN-US">licence</span>控制程序并不难找到，感兴趣的可以自己做破解，破解完后用我的私钥做强命名。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoHeading9"><span style="font-family: 黑体; mso-ascii-font-family: Arial; mso-no-proof: yes; mso-font-kerning: 0pt">另一种破解方式：</span><span lang="EN-US" style="mso-no-proof: yes; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">对于一些简单的修改，如改变方法名，更改常量。有另一种简单的方式，我没有式过，不过理论上可行。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">首先以二进制格式读取，<span lang="EN-US">dll</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">其次，根据<span lang="EN-US">pe</span>头，运行环境头找到<span lang="EN-US">strings</span>和<span lang="EN-US">US</span>流的地址。根据<span lang="EN-US">Token</span>值计算初偏移量。计算方法可以看我以前写的一个文章http://www.cnblogs.com/bluewater/archive/2006/10/17/531639.html或者何宗键的<span lang="EN-US">blog</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">最后一步是，修改<span lang="EN-US">strings</span>和<span lang="EN-US">Us</span>流的信息。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoHeading9"><span style="font-family: 黑体; mso-ascii-font-family: Arial; mso-no-proof: yes; mso-font-kerning: 0pt">怎么读混淆后的代码</span><span lang="EN-US" style="mso-no-proof: yes; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">混淆对我们来说，是不可逆过程。破解是不可能了，但是可以找到一个突破口，一点点的读取。如<span lang="EN-US">.net</span>类不能被混淆，我们可以通过这些信息去分析源代码。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">不过总体来说，这些基于元数据的语言，是不可能阻止破解的。原数据表必须把信息暴露出拉，以便让<span lang="EN-US">clr</span>加载。除非<span lang="EN-US">MS</span>，在加载器和<span lang="EN-US">dll</span>间，另加一个解释层。但是这么做效率会很低，原数据的存在也变成没有意义了。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoHeading8"><span lang="EN-US" style="mso-no-proof: yes; mso-font-kerning: 0pt">JS</span><span style="font-family: 黑体; mso-ascii-font-family: Arial; mso-no-proof: yes; mso-font-kerning: 0pt">破解：</span><span lang="EN-US" style="mso-no-proof: yes; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">Js</span><span style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">也用到了混淆，这是没有办法破解的。不过，可以做一些简单的替换来使他易于阅读。如：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">function CreateXMLHttpRequest()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>if( typeof (XMLHttpRequest) != OxO7c60[0x0])<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return<span style="mso-spacerun: yes">&nbsp; </span>new XMLHttpRequest();<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>if( typeof (ActiveXObject) != OxO7c60[0x0])<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>try<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return<span style="mso-spacerun: yes">&nbsp; </span>new ActiveXObject(OxO7c60[0x1]);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>catch(e)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return false;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>return false;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">function LoadXMLAsync(Ox878, Ox26a, Ox19e, Ox879)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>var Ox12e = CreateXMLHttpRequest();<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>function Ox87a()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(Ox12e[OxO7c60[0x2]] != 0x4)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return ;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Ox12e[OxO7c60[0x3]] = new Function() ;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>var Ox75b = Ox12e;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Ox12e = null ;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Ox19e(Ox75b) ;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>Ox12e[OxO7c60[0x3]] = Ox87a ;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>Ox12e.open(Ox878, Ox26a, true) ;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>Ox12e.send(Ox879 || OxO7c60[0x4]) ;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">格式化后为：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">function CreateXMLHttpRequest()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>if( typeof (XMLHttpRequest) != undefined)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return<span style="mso-spacerun: yes">&nbsp; </span>new XMLHttpRequest();<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>if( typeof (ActiveXObject) != undefined)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>try<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return<span style="mso-spacerun: yes">&nbsp; </span>new ActiveXObject('Microsoft.XMLHTTP');<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>catch(e)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return false;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>return false;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">function LoadXMLAsync(Ox878, Ox26a, Ox19e, Ox879)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>var Ox12e = CreateXMLHttpRequest();<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>function Ox87a()<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(Ox12e['readyState'] != 0x4)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return ;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Ox12e['onreadystatechange'] = new Function() ;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>var Ox75b = Ox12e;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Ox12e = null ;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Ox19e(Ox75b) ;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>Ox12e['onreadystatechange'] = Ox87a ;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>Ox12e.open(Ox878, Ox26a, true) ;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>Ox12e.send(Ox879 || '') ;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">破解后的文件：<br />
<a href="http://www.cnblogs.com/files/bluewater/cuteeditor.rar">http://www.cnblogs.com/files/bluewater/<font color="#000000">cuteeditor</font>.rar</a><br />
<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt">私钥：<br />
</span><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-no-proof: yes; mso-font-kerning: 0pt"><o:p>&nbsp;http://www.cnblogs.com/files/bluewater/t.rar<br />
</o:p></span></p>
  <img src ="http://www.cnblogs.com/bluewater/aggbug/885006.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47994/" target="_blank">Google号召社区力量为互联网加速</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Nhibernate入门</title><link>http://www.cnblogs.com/bluewater/archive/2007/08/14/855547.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Tue, 14 Aug 2007 08:35:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2007/08/14/855547.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/855547.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2007/08/14/855547.html#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/855547.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/855547.html</trackback:ping><description><![CDATA[摘要: 对大部分Nhibernte操作，都写了一个Demo，映射文件全部手写（手疼），看完后会对Nhibernte有个全面的了解。不想看文字的，可以看看附件中的代码。什么是NhibernateNhibernate会把数据库中的表用对象图的形式表现出来，对开发人员来说，他们面对的不是底层的ADO，DateSet等结构，而是包含业务逻辑的对象。Nhibernate足够聪明，它能做到自动、透明的持久化对象图，这&nbsp;&nbsp;<a href='http://www.cnblogs.com/bluewater/archive/2007/08/14/855547.html'>阅读全文</a><img src ="http://www.cnblogs.com/bluewater/aggbug/855547.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47989/" target="_blank">Twitter无处不在 魔兽世界Twitter发送器插件发布</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>为啥不用ActiveRecord</title><link>http://www.cnblogs.com/bluewater/archive/2007/08/14/855557.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Tue, 14 Aug 2007 08:33:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2007/08/14/855557.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/855557.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2007/08/14/855557.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/855557.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/855557.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先，</span><span lang=EN-US style="FONT-SIZE: 12pt">AR</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的改进之一是用特性来替换映射文件。</span><span lang=EN-US style="FONT-SIZE: 12pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">称这样能减少代码，提高开发效率，但是用</span><span lang=EN-US style="FONT-SIZE: 12pt">Nhibernte</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">大部分人也不会手写代码，而是通过工具生成，这样这点其实优势不大。</span><span lang=EN-US style="FONT-SIZE: 12pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不可否认这样做在修改时更方便，不用修改两个文件（</span><span lang=EN-US style="FONT-SIZE: 12pt">DRY</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。</span><span lang=EN-US style="FONT-SIZE: 12pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是缺点也很明显，特性不可能完全映射配置文件，否则特性会把类弄的很乱，这也使</span><span lang=EN-US style="FONT-SIZE: 12pt">AR</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只能是</span><span lang=EN-US style="FONT-SIZE: 12pt">Nhibernte</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的子集。另一个缺点是，特性使域对象变的不单纯，移植性差。再一个，特性效率也比不是解析</span><span lang=EN-US style="FONT-SIZE: 12pt">xml</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang=EN-US style="FONT-SIZE: 12pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其次，</span><span lang=EN-US style="FONT-SIZE: 12pt">AR</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">给每个域对象增加了基类，这点同样是域对象难以移植，恰巧移植性是</span><span lang=EN-US style="FONT-SIZE: 12pt">Nhibernte</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的优势。</span><span lang=EN-US style="FONT-SIZE: 12pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还有，</span><span lang=EN-US style="FONT-SIZE: 12pt">AR</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对</span><span lang=EN-US style="FONT-SIZE: 12pt">Session</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的管理，是他的一大优势。一些项目如</span><span lang=EN-US style="FONT-SIZE: 12pt">Cuyahoga</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，只用到了</span><span lang=EN-US style="FONT-SIZE: 12pt">AR</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US style="FONT-SIZE: 12pt">Session</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">管理，而没有用其他的封装。但是最新的</span><span lang=EN-US style="FONT-SIZE: 12pt">Nh</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang=EN-US style="FONT-SIZE: 12pt">1.2</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）也逐渐提供了内置的</span><span lang=EN-US style="FONT-SIZE: 12pt">Session</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">管理，这也变的不很必要。</span><span lang=EN-US style="FONT-SIZE: 12pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">再一点，如果不懂</span><span lang=EN-US style="FONT-SIZE: 12pt">Nhibernate</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，我相信只看</span><span lang=EN-US style="FONT-SIZE: 12pt">AR</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US style="FONT-SIZE: 12pt">API</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也很难实现些复杂的应用。</span><span lang=EN-US style="FONT-SIZE: 12pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因此对于新手来说，最好从</span><span lang=EN-US style="FONT-SIZE: 12pt">Nhibernte</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开始，然后过渡到</span><span lang=EN-US style="FONT-SIZE: 12pt">AR</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang=EN-US style="FONT-SIZE: 12pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 12pt">AR</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应该在其他方面多做些工作，而不是单纯的去封装</span><span lang=EN-US style="FONT-SIZE: 12pt">Nh</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US style="FONT-SIZE: 12pt">API</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如提供些好的业务层模式的封装，可以使更好的分离业务逻辑，就像现在的</span><span lang=EN-US style="FONT-SIZE: 12pt">Customquery</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，实现可以把复杂业务规则封装为一个类。</span><span lang=EN-US style="FONT-SIZE: 12pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还有，发挥</span><span lang=EN-US style="FONT-SIZE: 12pt">Castle</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的优势，在动态的生成些可以改进</span><span lang=EN-US style="FONT-SIZE: 12pt">NhSession</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缓存的</span><span lang=EN-US style="FONT-SIZE: 12pt">IL</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang=EN-US style="FONT-SIZE: 12pt"><o:p></o:p></span></p>
<img src ="http://www.cnblogs.com/bluewater/aggbug/855557.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47989/" target="_blank">Twitter无处不在 魔兽世界Twitter发送器插件发布</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>ajax-javascript-范围链、call对象与闭包</title><link>http://www.cnblogs.com/bluewater/archive/2007/07/20/825825.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Fri, 20 Jul 2007 09:39:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2007/07/20/825825.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/825825.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2007/07/20/825825.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/825825.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/825825.html</trackback:ping><description><![CDATA[摘要: 闭包基础都知道，局部变量隐藏全局变量，为什么会隐藏？因为函数对象的［［ｓｃｏｐｅ］］内部属性，闭包能实现也因为有这个对象。Excution Context&amp;Scope&amp;Call Object当函数被调用时，解释器为其创建一个上下文，当函数返回时，解释器回到最初的上下文。解释器形成一个上下文栈。上下文包含：全局上下文和局部上下文。创建上下文会伴随一系列对象的创建，包含：Call Ob&nbsp;&nbsp;<a href='http://www.cnblogs.com/bluewater/archive/2007/07/20/825825.html'>阅读全文</a><img src ="http://www.cnblogs.com/bluewater/aggbug/825825.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47988/" target="_blank">Firefox 3.5匆忙推出漏洞多 Mozilla本月将更新</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Ajax-Javascript-继承</title><link>http://www.cnblogs.com/bluewater/archive/2007/07/19/823815.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Thu, 19 Jul 2007 05:36:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2007/07/19/823815.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/823815.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2007/07/19/823815.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/823815.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/823815.html</trackback:ping><description><![CDATA[摘要: Prototype-based继承继承只是在用OO的术语描述Js，不能用OO继承来理解Js的继承。Js的继承根据实现方式不同，结果也不同。如Ma的继承打破了prototype chain,和常用的继承实现方式不同。这里只谈基于prototype的继承。Prototype链由于继承，prototype会形成链。链从当前的prototype开始，到Object结束。Prototypechain是许多J&nbsp;&nbsp;<a href='http://www.cnblogs.com/bluewater/archive/2007/07/19/823815.html'>阅读全文</a><img src ="http://www.cnblogs.com/bluewater/aggbug/823815.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47987/" target="_blank">预测：Twitter最可能收购的十家公司</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Ajax-JavaScript-namespace</title><link>http://www.cnblogs.com/bluewater/archive/2007/07/18/822485.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Wed, 18 Jul 2007 06:01:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2007/07/18/822485.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/822485.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2007/07/18/822485.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/822485.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/822485.html</trackback:ping><description><![CDATA[摘要: 引入Namespace的目的JavaScript中引入Namespace和C#一样，都是为了避免命名冲突。但是Js又有些特殊：js解释执行，如果后面定义了同名的变量会覆盖前面变量，并用应用新定义变量的语义。这在Js中合法，没有错误提示，因此bug很难找。可以想象，我调用了一个第三方模块，如果这个模块没有定义在Namespace中，我定义的变量和函数很可能就覆盖了第三方的同名符号。模块原则a mod&nbsp;&nbsp;<a href='http://www.cnblogs.com/bluewater/archive/2007/07/18/822485.html'>阅读全文</a><img src ="http://www.cnblogs.com/bluewater/aggbug/822485.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47986/" target="_blank">网易澄清:与暴雪合资公司仅提供技术支持</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>以前的东西-Mvp2</title><link>http://www.cnblogs.com/bluewater/archive/2007/07/17/821549.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Tue, 17 Jul 2007 11:27:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2007/07/17/821549.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/821549.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2007/07/17/821549.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/821549.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/821549.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>看了回复发现有些人对</span><span>MVP</span><span>的理解和我的理解有些差别，写了下面的东西。</span></p>
<p><span>主要参考了下面几篇文章</span></p>
<p><span>http://codebetter.com/blogs/jeremy.miller/articles/129542.aspx</span></p>
<p><span><a href="http://codebetter.com/blogs/jeremy.miller/archive/2006/02/01/137457.aspx">http://codebetter.com/blogs/jeremy.miller/archive/2006/02/01/137457.aspx</a></span></p>
<p><span><a href="http://haacked.com/archive/2006/08/09/ASP.NETSupervisingControllerModelViewPresenterFromSchematicToUnitTestsToCode.aspx">http://haacked.com/archive/2006/08/09/ASP.NETSupervisingControllerModelViewPresenterFromSchematicToUnitTestsToCode.aspx</a></span></p>
<p><span><a href="http://www.martinfowler.com/eaaDev/SupervisingPresenter.html">http://www.martinfowler.com/eaaDev/SupervisingPresenter.html</a></span></p>
<p><span><a href="http://www.martinfowler.com/eaaDev/PassiveScreen.html">http://www.martinfowler.com/eaaDev/PassiveScreen.html</a></span></p>
<p><span>在</span><span>asp.net</span><span>中用</span><span>MVP</span><span>的原因：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>在软件设计中最重要的一条原则是&#8220;分离关注点&#8221;，每一段代码有且仅有一个职责，才那能使程序有良好的可维护性。即使在编码的起点，也应该明确一次只解决一个问题，如，我希望只关注业务逻辑而不管数据库结构、</span><span>html</span><span>等。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>构建可维护的用户界面代码的传统做法是</span><span>MVC</span><span>模式。可惜，</span><span>asp.net</span><span>为</span><span>RAD</span><span>做了优化而没有关注创建可维护性的代码，</span><span>asp.net</span><span>模型本身就没有对</span><span>MVC</span><span>提供很好的支持，许多</span><span>asp.net</span><span>程序把数据访问、</span><span>html</span><span>标记、业务逻辑混合在了一起，</span><span>code</span><span>－</span><span>behind</span><span>模型也没有很好的分离关注点，再加上</span><span>code</span><span>－</span><span>behind</span><span>很难做单元测试，这些都是要引入</span><span>MVP</span><span>的原因。</span></p>
<p><span>MVP</span><span>和</span><span>MVC</span><span>问题：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Code</span><span>－</span><span>behind</span><span>的作用？</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Code</span><span>—</span><span>Behind</span><span>不能作为</span><span>MVC</span><span>的控制器，他只能作为单纯的</span><span>View</span><span>，许多维护问题都是由把</span><span>Code-Behind</span><span>作为控制器引起的。在</span><span>MVP</span><span>中</span><span>Presenter</span><span>不能引用</span><span>System.Web</span><span>名称空间，是</span><span>P</span><span>依赖于</span><span>V</span><span>。即使其他的模式也应该尽可能的使</span><span>Code</span><span>－</span><span>behind</span><span>的只作为界面（</span><span>View</span><span>）的辅助，而不包含业务逻辑、控制代码。</span></p>
<p><span><span>&nbsp;&nbsp; </span>MVP</span><span>中</span><span>V</span><span>和</span><span>MVC</span><span>中</span><span>V</span><span>的区别？</span></p>
<p><span><span>&nbsp;&nbsp; </span>V</span><span>在</span><span>MVP</span><span>中是界面的非常简单的包装（一定要简单到不涉及逻辑问题），</span><span>MVC</span><span>中</span><span>V</span><span>是指完全被动的。</span></p>
<p><span>MVC</span><span>的类结构</span></p>
<p align=left><span><span>&nbsp;&nbsp; </span></span><span>目的是要把尽可能多的功能从</span><span>asp.net</span><span>运行时分离出来，也就是说把</span><span>Page</span><span>的职责分解到几个类中：</span></p>
<p align=left><span>View</span><span>：显示数据、<strong>把用户输入和触发的事件推迟到</strong></span><strong><span>Presenter</span></strong><strong><span>。</span></strong><strong></strong></p>
<p align=left><strong><span><span>&nbsp;&nbsp; </span></span></strong><strong><span>通常需要一个接口（</span></strong><strong><span>Interface</span></strong><strong><span>），代表所有的</span></strong><strong><span>View</span></strong><strong><span>，后台代码把此接口当作界面，而不需要</span></strong><strong><span>Page</span></strong><strong><span>、</span></strong><strong><span>system.web</span></strong><strong><span>中的类，此接口封装了与</span></strong><strong><span>asp runtime</span></strong><strong><span>的交互。</span></strong><strong></strong></p>
<p align=left><strong><span>界面和后台的逻辑都通过此接口传递信息。</span></strong><strong></strong></p>
<p align=left><strong><span>Presenter</span></strong><strong><span>：协调</span></strong><strong><span>View</span></strong><strong><span>和后台服务、业务逻辑，负责页面逻辑。</span></strong><strong><span>P</span></strong><strong><span>只能依赖于</span></strong><strong><span>IView</span></strong><strong><span>、</span></strong><strong><span>Modle</span></strong><strong><span>（最好用</span></strong><strong><span>Facade</span></strong><strong><span>模式，提供一个中间层，隔离</span></strong><strong><span>Model</span></strong><strong><span>）。</span></strong><strong><span>P</span></strong><strong><span>的功能不能太多，</span></strong><strong><span>MVP</span></strong><strong><span>中</span></strong><strong><span>P</span></strong><strong><span>负责的一般比</span></strong><strong><span>MVC</span></strong><strong><span>的</span></strong><strong><span>C</span></strong><strong><span>多，但是从功能上细分</span></strong><strong><span>P</span></strong><strong><span>到几个类有时是必要的，如验证、分页、排序等，使</span></strong><strong><span>P</span></strong><strong><span>不至于便的很大，并且有内聚性。</span></strong><strong></strong></p>
<p align=left><strong><span>V</span></strong><strong><span>的要点：</span></strong><strong></strong></p>
<p align=left><strong><span><span>1、</span></span></strong><strong><span>V</span></strong><strong><span>必须依赖于接口</span></strong><strong><span>Iview</span></strong></p>
<p align=left><strong><span><span>2、<span> </span></span></span></strong><strong><span>IView</span></strong><strong><span>，尽量减少简单的</span></strong><strong><span>POCO</span></strong><strong><span>似的属性，而要把这些封装成类或者暴露</span></strong><strong><span>DTO</span></strong><strong><span>，甚至</span></strong><strong><span>MOdle</span></strong><strong><span>，如</span></strong></p>
<pre><span>public interface IWorkItemView</span></pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// Packs the user input into a new WorkItem class</span></pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>WorkItem WorkItem{get;}</span></pre>
<pre>&nbsp;</pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// Sets the values in the dropdown list for the WorkItem assigned to user</span></pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>string[] AssignmentList {set;}</span></pre>
<pre>&nbsp;</pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// Sets the values in the dropdown list for the WorkItem categories</span></pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>string[] CategoryList {set;}</span></pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></pre>
<pre><span>public interface IWorkItemView</span></pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>string AssignedTo {get; set;}</span></pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>string Category {get; set;}</span></pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>string Description {get; set;}</span></pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>string Priority {get; set;}</span></pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>string Comments {get; set;}</span></pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>/* More properties */</span></pre>
<pre><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></pre>
<p align=left><strong>&nbsp;</strong></p>
<p align=left><strong><span>P</span></strong><strong><span>的要点：</span></strong></p>
<p align=left><strong><span>1</span></strong><strong><span>、</span><span>View</span></strong><strong><span>可以有多个</span><span>Presenter</span></strong><strong><span>，如一个负责低层次的</span><span>View</span></strong><strong><span>和</span><span>Model</span></strong><strong><span>映射和验证。另一个</span><span>Presenter</span></strong><strong><span>负责业务逻辑和后台服务</span></strong></p>
<p align=left><strong>后面的找不到了&nbsp;</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cnblogs.com/bluewater/aggbug/821549.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47985/" target="_blank">杰克逊悼念仪式或成史上最大规模Web活动</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>以前写的东西——支付宝</title><link>http://www.cnblogs.com/bluewater/archive/2007/07/17/821540.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Tue, 17 Jul 2007 11:05:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2007/07/17/821540.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/821540.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2007/07/17/821540.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/821540.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/821540.html</trackback:ping><description><![CDATA[由于现在来博客园少了，blog也不常更新，其实有时候还在写东西，大部分懒的传。今天想更新，才发现写的东西也不知道扔哪里了，也许被误删除了，尤其有两篇自己比较满意的也找不见了。明天去公司找找，把能找到的都传上来。<br>把以前写的最终版本支付宝接口放上来。<br>&nbsp;
<p><span>库的改变：</span></p>
<p><span><span>1、<span> </span></span></span><span>增加了一个接口，</span></p>
<p><span>public</span><span> <span>void</span> CommonProcessNotify(Page page, <span>string</span> verifyUrl, <span>string</span> key, Verify verify, <span>string</span> encode)</span></p>
<p><span>这个接口触发<span>NotifyEvent</span>事件，此事件通过<span>NotifyEventArgs</span><span>类型</span>暴露了支付宝<span>Notify</span>通知的所有参数，并且不给支付宝回发&#8220;<span>success</span>&#8221;或者&#8220;<span>fail</span>&#8221;，回发由调用者实现。这个方法提供了支付宝<span>Notify</span>通知的所有功能。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>如果仅仅需要处理下面几个事件，可以参考：<span>http://www.cnblogs.com/bluewater/archive/<st1:chsdate IsROCDate="False" IsLunarDate="False" Day="16" Month="10" Year="2006" w:st="on">2006/10/16</st1:chsdate>/530630.aspx</span></span></p>
<p><span>WaitBuyerPay</span></p>
<p><span>WaitSellerConfirmTrade</span></p>
<p><span>WaitSysConfirmPay</span></p>
<p><span>WaitSellerSendGoods</span></p>
<p><span>WwaitBuyerConfirmGoods</span></p>
<p><span>WaitSysPaySeller</span></p>
<p><span>TradeFinished</span></p>
<p><span>TradeClosed</span></p>
<p><span>这几个事件细化了支付宝的<span>Notify</span>通知，定义了最常用的几个事件，调用起来要方便些。</span></p>
<p><span><span>2、<span> </span></span></span><span>记录了日志记录功能。</span></p>
<p><span>用</span><span>Log4net</span><span>记录了</span><span>Request.Form</span><span>集合，可以看到支付宝</span><span>Notify</span><span>发过来的整个参数，便于调试。日志默认是</span><span>Error</span><span>级别，并且只有在</span><span>debug</span><span>版本有日志输出，实际使用时应该用</span><span>release</span><span>版本的库（或者修改</span><span>Log4net</span><span>的日志级别），以免记录下许多无用的日志。</span></p>
<p><span>调用方式的改变：</span></p>
<p><span>用</span><span>Notify</span><span>接口模拟出了</span><span>Return</span><span>方式。支付宝的</span><span>Return</span><span>接口虽然方便调用，但是安全可靠性差，很难在实际中应用。通过下面的方式，可以用</span><span>Notify</span><span>模拟</span><span>return</span><span>，如果支付宝的</span><span>Notify</span><span>发送的及时还可以完全替代</span><span>Return</span><span>方式。</span></p>
<p><span>解决方法是：让提交给支付宝信息的页面一直等待，直到收到</span><span>Notify</span><span>通知。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>AutoResetEvent</span><span> ansyCard=<span>new</span> <span>AutoResetEvent</span>(<span>false</span>);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&nbsp;ansyCard.WaitOne();<span>&nbsp;&nbsp; </span>//</span><span>阻塞当前线程，直到<span>Notify</span>完成。<span>displaycard.aspx</span></span></p>
<p><span>ansyCard.Set();//</span><span>在<span>Notify</span>页面发解除阻塞通知<span>,displaycard</span>页面继续执行。<span>Notify.aspx</span></span></p>
<p align=left><span>思路就是上面那么简单，但实际上还有几个问题：<span>1</span>、支付宝服务器发<span>Notify</span>页面和其他的页面不在一个线程，不属于用一个<span>Session</span>。<span>2</span>、支付宝会一直发<span>Notify</span>，必须要保证，解锁的是设置锁的那个线程，而不能把其他的线程锁解开。</span></p>
<p align=left><span>详细的实现方式可以看源代码，此方法可为解决这种类型的问题提供了一个思路。</span></p>
<p><span>调试：</span></p>
<p><span>调试支付宝必须满足两个条件：</span></p>
<p><span><span>1、<span> </span></span></span><span>有个公网</span><span>IP</span><span>，如果是</span><span>ADSL</span><span>每次拨号也会分配一个，可以通过</span><span>ipconfig</span><span>命令查到此次拨号分配的</span><span>IP</span><span>，这样支付宝就能访问到你。</span></p>
<p><span><span>2、<span> </span></span></span><span>必须附加到</span><span>IIS</span><span>，一是通过手动附加到</span><span>aspnet_wp</span><span>进程，二是把启动选项的服务器改称虚拟目录的地址。</span></p>
<p><span>满足上面两个条件就可以调试支付宝了。</span></p>
<p><span>源代码的使用方法：</span></p>
<p><span>修改</span><span>web.config</span><span>中的下面几项后，就可以直接运行实例程序。</span><span>Temp.aspx</span><span>是测试</span><span>AutoResetEvent</span><span>的页面。</span></p>
<p align=left><span>&lt;</span><span>add</span><span> </span><span>key</span><span>=</span><span>"<span>key</span>"<span> </span><span>value</span><span>=</span>" "<span>/&gt;</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>&lt;</span><span>add</span><span> </span><span>key</span><span>=</span><span>"<span>partner</span>"<span> </span><span>value</span><span>=</span>""<span>/&gt;</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>&lt;</span><span>add</span><span> </span><span>key</span><span>=</span><span>"<span>sellerEmail</span>"<span> </span><span>value</span><span>=</span>" "<span>/&gt;</span></span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>&lt;</span><span>add</span><span> </span><span>key</span><span>=</span><span>"<span>sellerId</span>"<span> </span><span>value</span><span>=</span>" "<span>/&gt;</span></span></p>
<p><span>&lt;</span><span>add</span><span> </span><span>key</span><span>=</span><span>"<span>notifyUrl</span>"<span> </span><span>value</span><span>=</span>" "<span>/&gt;</span></span></p>
<p><span>关于</span><span>AutoResetEvent</span><span>可以看下面的文章</span></p>
<p><span>http://www.cnblogs.com/bluewater/archive/<st1:chsdate IsROCDate="False" IsLunarDate="False" Day="14" Month="8" Year="2006" w:st="on">2006/08/14</st1:chsdate>/476720.html</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;key&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ConfigurationManager.AppSettings[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">key</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">];<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;partner&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ConfigurationManager.AppSettings[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">partner</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">];<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;sellerEmail&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ConfigurationManager.AppSettings[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sellerEmail</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">];<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;sellerId&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ConfigurationManager.AppSettings[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sellerId</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">];<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;outTradeNo&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Guid.NewGuid().ToString();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;url&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ConfigurationManager.AppSettings[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">notifyUrl</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">].ToString();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;gatewayUrl&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">https://www.alipay.com/cooperate/gateway.do</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AliPay&nbsp;ap&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;AliPay();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DigitalGoods&nbsp;dg&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;DigitalGoods(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">create_digital_goods_trade_p</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;partner,&nbsp;key,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MD5</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;subject,&nbsp;outTradeNo,&nbsp;(</span><span style="COLOR: #0000ff">decimal</span><span style="COLOR: #000000">)money,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;sellerEmail,&nbsp;sellerId);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dg.Buyer_Id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">temp</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dg.Notify_Url&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;url;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">outtradeNo</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;outTradeNo;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ap.CreateDigitalTrade(gatewayUrl,&nbsp;dg,&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;myScript&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">@"</span><span style="COLOR: #000000">document.all['discard'].src='displayCard.aspx'</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Page.ClientScript.RegisterStartupScript(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.GetType(),&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">myScript</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;myScript,&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);</span></div>
<br>display.aspx<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Page_Load(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br><img id=Codehighlighter1_63_637_Open_Image onclick="this.style.display='none'; Codehighlighter1_63_637_Open_Text.style.display='none'; Codehighlighter1_63_637_Closed_Image.style.display='inline'; Codehighlighter1_63_637_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_63_637_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_63_637_Closed_Text.style.display='none'; Codehighlighter1_63_637_Open_Image.style.display='inline'; Codehighlighter1_63_637_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_63_637_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_63_637_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Session["outtradeNo"]&nbsp;=&nbsp;Request.QueryString["a"];</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AutoResetEvent&nbsp;ansyCard</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;AutoResetEvent(</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Application[Session[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">outtradeNo</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">].ToString()&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Event</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ansyCard;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ansyCard.WaitOne();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(Application[Session[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">outtradeNo</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">].ToString()]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_408_627_Open_Image onclick="this.style.display='none'; Codehighlighter1_408_627_Open_Text.style.display='none'; Codehighlighter1_408_627_Closed_Image.style.display='inline'; Codehighlighter1_408_627_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_408_627_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_408_627_Closed_Text.style.display='none'; Codehighlighter1_408_627_Open_Image.style.display='inline'; Codehighlighter1_408_627_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_408_627_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_408_627_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;s&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.Format(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;script&nbsp;language='javascript'&gt;alert('你的充值卡密码是：{0}')&lt;/script&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;Application[Session[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">outtradeNo</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">].ToString()]);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.Write(s);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
</span><br>notify.aspx
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;ap_WaitBuyerPay(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;sender,&nbsp;NotifyEventArgs&nbsp;e)<br><img id=Codehighlighter1_60_1041_Open_Image onclick="this.style.display='none'; Codehighlighter1_60_1041_Open_Text.style.display='none'; Codehighlighter1_60_1041_Closed_Image.style.display='inline'; Codehighlighter1_60_1041_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_60_1041_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_60_1041_Closed_Text.style.display='none'; Codehighlighter1_60_1041_Open_Image.style.display='inline'; Codehighlighter1_60_1041_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_60_1041_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_60_1041_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Card&nbsp;card&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Card();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AutoResetEvent&nbsp;ansyCard&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(AutoResetEvent)Application[e.Out_Trade_No&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Event</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">];&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TradeLog&nbsp;tradeLog&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_239_559_Open_Image onclick="this.style.display='none'; Codehighlighter1_239_559_Open_Text.style.display='none'; Codehighlighter1_239_559_Closed_Image.style.display='inline'; Codehighlighter1_239_559_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_239_559_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_239_559_Closed_Text.style.display='none'; Codehighlighter1_239_559_Open_Image.style.display='inline'; Codehighlighter1_239_559_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_239_559_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_239_559_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tradeLog&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;TradeLog(e.Buyer_Id,&nbsp;e.Trade_Status,&nbsp;e.Trade_No,&nbsp;e.Buyer_Id,&nbsp;e.Subject,&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)e.Price,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SNInfo&nbsp;snInfo&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;card.GetSn((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)e.Price);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;card.WriteLog(tradeLog);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Application[e.Out_Trade_No]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;snInfo.Password;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ansyCard.Set();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(Exception&nbsp;ex)<br><img id=Codehighlighter1_598_1034_Open_Image onclick="this.style.display='none'; Codehighlighter1_598_1034_Open_Text.style.display='none'; Codehighlighter1_598_1034_Closed_Image.style.display='inline'; Codehighlighter1_598_1034_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_598_1034_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_598_1034_Closed_Text.style.display='none'; Codehighlighter1_598_1034_Open_Image.style.display='inline'; Codehighlighter1_598_1034_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_598_1034_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_598_1034_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">日志<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(tradeLog&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_678_858_Open_Image onclick="this.style.display='none'; Codehighlighter1_678_858_Open_Text.style.display='none'; Codehighlighter1_678_858_Closed_Image.style.display='inline'; Codehighlighter1_678_858_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_678_858_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_678_858_Closed_Text.style.display='none'; Codehighlighter1_678_858_Open_Image.style.display='inline'; Codehighlighter1_678_858_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_678_858_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_678_858_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;t&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;e.Buyer_Id&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;e.Trade_Status&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;e.Trade_No&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;e.Buyer_Id&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;e.Subject&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)e.Price&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sendgoods</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log4net.log.Error(t,&nbsp;ex);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_889_985_Open_Image onclick="this.style.display='none'; Codehighlighter1_889_985_Open_Text.style.display='none'; Codehighlighter1_889_985_Closed_Image.style.display='inline'; Codehighlighter1_889_985_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_889_985_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_889_985_Closed_Text.style.display='none'; Codehighlighter1_889_985_Open_Image.style.display='inline'; Codehighlighter1_889_985_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_889_985_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_889_985_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log4net.log.Error(GetForms(Request.Form),&nbsp;ex);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ansyCard.Set();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br>代码：<br><a href="http://www.cnblogs.com/files/bluewater/commonalipay2.rar">http://www.cnblogs.com/files/bluewater/commonalipay2.rar</a><br><img height=350 alt="" src="http://www.cnblogs.com/images/cnblogs_com/bluewater/notify.PNG" width=551 border=0> 
<img src ="http://www.cnblogs.com/bluewater/aggbug/821540.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47985/" target="_blank">杰克逊悼念仪式或成史上最大规模Web活动</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Ajax.net-Javascript</title><link>http://www.cnblogs.com/bluewater/archive/2007/07/17/821471.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Tue, 17 Jul 2007 09:35:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2007/07/17/821471.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/821471.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2007/07/17/821471.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/821471.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/821471.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<h4 style="MARGIN: 14pt 0cm 14.5pt; TEXT-ALIGN: center" align=center><span lang=EN-US><font face=Arial size=5></font></span></h4>
<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上个月开始看</span><span lang=EN-US><font face="Times New Roman">Ajax ToolKit</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码，到Ａｎｉｍａｔｉｏｎｓ</span><span lang=EN-US><font face="Times New Roman">.js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时发现，根据从Ｊｓ高级程序设计学到的Ｊｓ语法没有办法解释Ａｎｉｍａｔｉｏｎｓ的实现，细看ＭｉｃｒｏｓｏｆｔＡＪａｘ</span><span lang=EN-US><font face="Times New Roman">.js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也是不懂地方很多。经过近一个月的Ｊｓ学习，把一些体会记录下来，使其他人可以尽快的从ＯＯ观念转到Ｊｓ。</span>
<p>&nbsp;</p>
<h5 style="MARGIN: 14pt 0cm 14.5pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size=5>态度</font></span></h5>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以前以为</span><span lang=EN-US><font face="Times New Roman">Js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是很弱的语言，这次深入的学习发现</span><span lang=EN-US><font face="Times New Roman">Js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的功能出乎意料的强大。</span></p>
<h5 style="MARGIN: 14pt 0cm 14.5pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size=5>工具</font></span></h5>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Vs </font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">带的编辑器：不专业，用它写代码验证自己的一些想法会被气死，太慢。</span><span lang=EN-US><font face="Times New Roman">Orcas</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">据说增加了智能感知，从</span><span lang=EN-US><font face="Times New Roman">MicrosoftAjax.js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的语法也可以看出对</span><span lang=EN-US><font face="Times New Roman">Linq</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的支持，支持智能感知也顺理成章，只是不知道对自己定义的函数有没有此功能。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1<sup>st</sup> Javascript Editor</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：我试用发现不支持</span><span lang=EN-US><font face="Times New Roman">Json</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，某些语句和</span><span lang=EN-US><font face="Times New Roman">IE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行结果不同，对</span><span lang=EN-US><font face="Times New Roman">Closure</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的支持也有问题。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Antechinus JavaScript Editor</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：支持</span><span lang=EN-US><font face="Times New Roman">Jaon</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，智能感知，</span><span lang=EN-US><font face="Times New Roman">9.0</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还增加了调试器，感觉不错。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Google.com</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（百度越来越烂）</span></p>
<h5 style="MARGIN: 14pt 0cm 14.5pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size=5>资料</font></span></h5>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">推荐唯一一本书，</span><span lang=EN-US><font face="Times New Roman"> Js The Definitive Guid 5<sup>th</sup> edtion</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">买了本</span><span lang=EN-US><font face="Times New Roman">Js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高级程序设计，读完后看</span><span lang=EN-US><font face="Times New Roman">Ajax</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">源码才知道，这本书写的太不严密，许多地方让人误解（根本就是错误），因为根据此书的解释，根本就看不懂源码。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US><font face="Times New Roman">Ecma-262</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，写的也很晦涩，但是可以看看他的定义如：</span><span lang=EN-US><font face="Times New Roman">objects,Object,Function</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等。以免看到书中的对象函数都用</span><span lang=EN-US><font face="Times New Roman">OO</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的概念去理解。还可以看看那些概念是</span><span lang=EN-US><font face="Times New Roman">Behave</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US><font face="Times New Roman">,</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以免被不同的实现困扰。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注：我至少看到三篇</span><span lang=EN-US><font face="Times New Roman">blog</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">说，</span><span lang=EN-US><font face="Times New Roman">Js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的书唯一能看的就是</span><span lang=EN-US><font face="Times New Roman"> Definitive Guid</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，看其它的书基本都会让初学者走人歧途（我就是</span><span lang=EN-US><font face="Times New Roman">Js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">高级程序设计的受害者），部分原因是</span><span lang=EN-US><font face="Times New Roman">Ecma</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">太过粗糙，不能给作者以指导。</span></p>
<h5 style="MARGIN: 14pt 0cm 14.5pt"><span lang=EN-US><font face="Times New Roman" size=5>OOJavascript</font></span></h5>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不能陷入用</span><span lang=EN-US><font face="Times New Roman">OO</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">理解</span><span lang=EN-US><font face="Times New Roman">Js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的陷阱，分析JS设计时例外。</span></p>
<h6><span lang=EN-US><font face=Arial size=3>Object&amp;Function</font></span></h6>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内置的对象是</span><span lang=EN-US><font face="Times New Roman">Function</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者是</span><span lang=EN-US><font face="Times New Roman">constructor Function</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang=EN-US><font face="Times New Roman">Function</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反过来又继承自</span><span lang=EN-US><font face="Times New Roman">Object</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。这就形成了很怪的一种关系，这是</span><span lang=EN-US><font face="Times New Roman">MicrosoftAjax.js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中扩展</span><span lang=EN-US><font face="Times New Roman">Function</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang=EN-US><font face="Times New Roman">Type</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的基础。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Array-Like</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，被用来形容对象。对象被定义为命名的值的集合，这些值可以引用另外的对象，可以用哈西表实现（</span><span lang=EN-US><font face="Times New Roman">ecma</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">没有规定实现方式）。可以通过类似数组的语法引用对象的值：如</span><span lang=EN-US><font face="Times New Roman">object[&#8216;s&#8217;][&#8216;s&#8217;][&#8216;s&#8217;],</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以连续引用，</span><span lang=EN-US><font face="Times New Roman">MA.js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US><font face="Times New Roman">registerNamespace</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实现应用了这个特性。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Function</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">定义了</span><span lang=EN-US><font face="Times New Roman">prototype</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang=EN-US><font face="Times New Roman">Object</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">定义了</span><span lang=EN-US><font face="Times New Roman">constructor</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。要区分用</span><span lang=EN-US><font face="Times New Roman">Function</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时使用的是</span><span lang=EN-US><font face="Times New Roman">Function</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作为</span><span lang=EN-US><font face="Times New Roman">Object</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的特性还是作为</span><span lang=EN-US><font face="Times New Roman">Function</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的特性。如把函数付给一个变量时，</span><span lang=EN-US><font face="Times New Roman">Functon</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是作为</span><span lang=EN-US><font face="Times New Roman">Object</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">存在。ｉ</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">正因为</span><span lang=EN-US><font face="Times New Roman">Function</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也是</span><span lang=EN-US><font face="Times New Roman">Object</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US><font face="Times New Roman">Function</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">才能模拟出类似</span><span lang=EN-US><font face="Times New Roman">OO</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span><span lang=EN-US><font face="Times New Roman">class</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US><font face="Times New Roman">interface,inheritence</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face="Times New Roman">Function</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">远比</span><span lang=EN-US><font face="Times New Roman">OO</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的类灵活，再加上</span><span lang=EN-US><font face="Times New Roman">scop chain,</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">闭包特性。从语言特性说</span><span lang=EN-US><font face="Times New Roman">Js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比基于</span><span lang=EN-US><font face="Times New Roman">OO</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言灵活的多。可以想象一下，一种东西可以如指针来回游走，又如可以动态增加功能的类。这就是</span><span lang=EN-US><font face="Times New Roman">Function</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如果加上闭包，还可以切换</span><span lang=EN-US><font face="Times New Roman">scop</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<h5 style="MARGIN: 14pt 0cm 14.5pt"><span lang=EN-US><font face="Times New Roman" size=5>Reference Type</font></span></h5>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象是引用类型，引用类型对象参数也是引用传递。</span></p>
<h5 style="MARGIN: 14pt 0cm 14.5pt"><span lang=EN-US><font face="Times New Roman" size=5>Scop</font></span></h5>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文本范围，定义函数时范围就被定义，可以说是静态的。但是</span><span lang=EN-US><font face="Times New Roman">call</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang=EN-US><font face="Times New Roman">ecma </font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为</span><span lang=EN-US><font face="Times New Roman">Activition</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span><span lang=EN-US><font face="Times New Roman"> Object</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是动态的，这就是闭包的基础，理解了这点</span><span lang=EN-US><font face="Times New Roman">js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中最难的闭包和</span><span lang=EN-US><font face="Times New Roman">Scop chain</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就都简单了。</span></p>
<h5 style="MARGIN: 14pt 0cm 14.5pt"><span lang=EN-US><font face="Times New Roman" size=5>chain</font></span></h5>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我发现有三种</span><span lang=EN-US><font face="Times New Roman">chain</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，也许有别的链还没有发现，每种链对理解</span><span lang=EN-US><font face="Times New Roman">Js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都很关键。</span></p>
<h6><span lang=EN-US><font face=Arial size=3>scop chain</font></span></h6>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最难的一种，又涉及到闭包。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在函数创建时，</span><span lang=EN-US><font face="Times New Roman">scop</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就被定死在他的文本范围，但是在调用函数时会创建</span><span lang=EN-US><font face="Times New Roman">call Object</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US><font face="Times New Roman">call Object</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">作为</span><span lang=EN-US><font face="Times New Roman">scop</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的头，</span><span lang=EN-US><font face="Times New Roman">call Ojcet</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包含当前的参数，当前</span><span lang=EN-US><font face="Times New Roman">scop</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的变量，最后引用到</span><span lang=EN-US><font face="Times New Roman">globle scop</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。每次搜索变量时，都是从当前</span><span lang=EN-US><font face="Times New Roman">call object</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US><font face="Times New Roman">scop</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中查找，找到就不在向更下层的链遍历。有了</span><span lang=EN-US><font face="Times New Roman">callObject</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，只要保持内部</span><span lang=EN-US><font face="Times New Roman">Function</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的引用，就拥有了整条</span><span lang=EN-US><font face="Times New Roman">scop chain</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，闭包才能够实现。</span></p>
<h6><span lang=EN-US><font face=Arial size=3>prototype chain</font></span></h6>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有了这条链，通过</span><span lang=EN-US><font face="Times New Roman">prototype</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现继承成为可能。用不好也会导致些问题，如暴露</span><span lang=EN-US><font face="Times New Roman">obj.constructor.protype,function.prototype.constrctor</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。如高级编程好像例子就有这种问题。可以看看</span><span lang=EN-US><font face="Times New Roman">MA.js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US><font face="Times New Roman">registerclass</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是怎么通过绕过这个问题的（</span><span lang=EN-US><font face="Times New Roman">MA.js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把这个问题绕了过去，不同于</span><span lang=EN-US><font face="Times New Roman">Definitive Guid</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。</span></p>
<h6><span lang=EN-US><font face=Arial size=3>constructor chain</font></span></h6>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样继承才能有多个层次。</span></p>
<h5 style="MARGIN: 14pt 0cm 14.5pt"><span lang=EN-US><font face="Times New Roman" size=5>Static</font></span></h5>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只是看起来像ＯＯ中的ｓｔａｔｉｃ，可以通过扩展Ｏｂｊｅｃｔ的Ｍｅｔｈｏｄ</span><span lang=EN-US><font face="Times New Roman">(</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不是ｐｒｏｔｏｔｙｐｅ</span><span lang=EN-US><font face="Times New Roman">)</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现。如：Ｔｙｐｅ</span><span lang=EN-US><font face="Times New Roman">.RegisterNamespace</font></span></p>
<h5 style="MARGIN: 14pt 0cm 14.5pt"><span lang=EN-US><font face="Times New Roman" size=5>Private</font></span></h5>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果在</span><span lang=EN-US><font face="Times New Roman">function</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中没有用</span><span lang=EN-US><font face="Times New Roman">var</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属于</span><span lang=EN-US><font face="Times New Roman">globle Object</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face="Times New Roman">http://www.crockford.com/javascript/private.html</font></span></p>
<h5 style="MARGIN: 14pt 0cm 14.5pt"><font size=5><span lang=EN-US><font face="Times New Roman">Globle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　</span><span lang=EN-US><font face="Times New Roman">Object</font></span></font></h5>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">每种环境的Ｇｌｏｂｌｅ　Ｏｂｊｅｃｔ都可能不同，如Ｉｅ是ｗｉｎｄｏｗ，Ａｎｔｅｃｈｉｎｕｓ的Ｇｌｏｂｌｅ　Ｏｂｊｅｃｔ不知道是哪个对象，但是这造成不能在</span><span lang=EN-US><font face="Times New Roman">antechinus</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中运行ＭＡ，因为ＭＡ的Ｇｌｏｂｌｅ已经定死在ｗｉｎｄｏｗ上了。</span></p>
<h5 style="MARGIN: 14pt 0cm 14.5pt"><span lang=EN-US><font face="Times New Roman" size=5>Literal&amp;Json</font></span></h5>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face="Times New Roman">Js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">支持对象和数字的</span><span lang=EN-US><font face="Times New Roman">Literal</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">格式定义如：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face="Times New Roman">Array</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><span lang=EN-US><font face="Times New Roman">var b = [[1,{x:1, y:2}], [2, {x:3, y:4}]];</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象：</span><span lang=EN-US><font face="Times New Roman">var circle = { x:point.x, y:point.y+1, radius:2 };</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上面的定义也是基于</span><span lang=EN-US><font face="Times New Roman">Json</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的。</span></p>
<h5 style="MARGIN: 14pt 0cm 14.5pt"><span lang=EN-US><font face="Times New Roman" size=5>Inheritance</font></span></h5>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">除了类似</span><span lang=EN-US><font face="Times New Roman">OO</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的继承，对象和函数的</span><span lang=EN-US><font face="Times New Roman">Prototype</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">间也称为继承，因为初始化构造函数时</span><span lang=EN-US><font face="Times New Roman">Prototype</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的值好像是被继承下来的，并且是被其他实例共享，修改会影响到其他对象，这也产生了后面的</span><span lang=EN-US><font face="Times New Roman">Write&amp;Read</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<h5 style="MARGIN: 14pt 0cm 14.5pt"><span lang=EN-US><font face="Times New Roman" size=5>Read&amp;Write</font></span></h5>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">访问变量时先查找构造函数中的变量，然后才搜索</span><span lang=EN-US><font face="Times New Roman">prototype</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span><span lang=EN-US><font face="Times New Roman">Prototype</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第一个值指向了</span><span lang=EN-US><font face="Times New Roman">constructor</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，实现继承时必须注意。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是写入是时不能修改对象的</span><span lang=EN-US><font face="Times New Roman">prototype</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，否则会影响整个继承链。因此通常在</span><span lang=EN-US><font face="Times New Roman">prototype</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中放入</span><span lang=EN-US><font face="Times New Roman">method</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和只读变量。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">没有声明的变量不能读，但可以赋值，这时</span><span lang=EN-US><font face="Times New Roman">Js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会自动声明。</span></p>
<h5 style="MARGIN: 14pt 0cm 14.5pt"><span lang=EN-US><font face="Times New Roman" size=5>Call&nbsp;&amp;Apply</font></span></h5>
<p class=doctext style="MARGIN: auto 0cm"><font face=宋体><tt><em><span lang=EN-US>function</span></em></tt><span lang=EN-US>.call(<tt><em>thisobj</em></tt>, <tt><em>args...</em></tt>)</span></font></p>
<p><tt><em><span lang=EN-US><font face=宋体>thisobj</font></span></em></tt></p>
<p class=doclist style="MARGIN: auto 0cm auto 36pt"><span lang=EN-US>The object on which <font face=宋体><tt><em>function</em></tt> is to be invoked. In the body of the function, <tt><em>thisobj</em></tt> becomes the value of the <tt>this</tt> keyword. If this argument is <tt>null</tt>, the global object is used.</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face="Times New Roman">Call&amp;Apply</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span><span lang=EN-US><font face="Times New Roman">Function</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最神奇的方法，他可以调用其他上下文的方法做为自己上下文的方法，因为如此继承用</span><span lang=EN-US><font face="Times New Roman">Apply</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现才会少些很多代码。结合闭包实现了</span><span lang=EN-US><font face="Times New Roman">MA.js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span><span lang=EN-US><font face="Times New Roman">createDelegate,createCallback</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。上面是</span><span lang=EN-US><font face="Times New Roman">Definitive Guid</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的定义。</span></p>
<h5 style="MARGIN: 14pt 0cm 14.5pt"><span lang=EN-US><font face="Times New Roman" size=5>Variables&amp;Propertys</font></span></h5>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性和变量相同，全局变量是</span><span lang=EN-US><font face="Times New Roman">globle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象的属性，局部变量是</span><span lang=EN-US><font face="Times New Roman">call</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象的属性。</span></p>
<h5 style="MARGIN: 14pt 0cm 14.5pt"><span lang=EN-US><font size=5><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Namespace</font></font></span></h5>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">本质是文本范围的实现，见</span><span lang=EN-US><font face="Times New Roman">Scope</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。不过</span><span lang=EN-US><font face="Times New Roman">MA.js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实现很强大。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上面粗略的分析了Ｊｓ，一时就想起这么多，比较基本的如</span><span lang=EN-US><font face="Times New Roman">prototype</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">没有提及。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下一篇分析</span><span lang=EN-US><font face="Times New Roman">MicrosoftAjax.js</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中</span><span lang=EN-US><font face="Times New Roman">registerNamespace,registerClass</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"></span></p>
<img src ="http://www.cnblogs.com/bluewater/aggbug/821471.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47985/" target="_blank">杰克逊悼念仪式或成史上最大规模Web活动</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>实现等待窗体的几种方式</title><link>http://www.cnblogs.com/bluewater/archive/2007/06/13/781708.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Wed, 13 Jun 2007 05:03:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2007/06/13/781708.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/781708.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2007/06/13/781708.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/781708.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/781708.html</trackback:ping><description><![CDATA[摘要: 实现等待窗体的几种方式：下面说明了五种可以实现等待窗体的方式，其中三种给出了代码。准备资料安全访问控件成员为了保证在创建控件的线程上调用控件成员，用下面的方式封装控件的属性、方法、其他自定义成员的访问。如: winWordControl.LoadDocument()封装为：delegate void VoidDelegate(); private void LoadDocument() { if &nbsp;&nbsp;<a href='http://www.cnblogs.com/bluewater/archive/2007/06/13/781708.html'>阅读全文</a><img src ="http://www.cnblogs.com/bluewater/aggbug/781708.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47984/" target="_blank">《商业周刊》:Mozilla的志愿者开发模式被复制</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>GetHashCode、Equals、IComparable的重载方式</title><link>http://www.cnblogs.com/bluewater/archive/2007/04/13/712336.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Fri, 13 Apr 2007 12:43:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2007/04/13/712336.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/712336.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2007/04/13/712336.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/712336.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/712336.html</trackback:ping><description><![CDATA[摘要: 第一个 GetHashCode 这个方法争议最多，主要原因是MSDN的每个版本对他的说明都不同。 只要看一下MSDN，就会发现它对这个方法的说明至少有三个版本：最早的：&#8220;Derived classes must override GetHashCode with an implementation that returns a unique hash code&#8221;.net1.&nbsp;&nbsp;<a href='http://www.cnblogs.com/bluewater/archive/2007/04/13/712336.html'>阅读全文</a><img src ="http://www.cnblogs.com/bluewater/aggbug/712336.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47977/" target="_blank">Mono 的Virtual PC 虚拟机</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>来自.netFrameWork的一种异常处理方式</title><link>http://www.cnblogs.com/bluewater/archive/2007/01/23/627665.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Tue, 23 Jan 2007 02:37:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2007/01/23/627665.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/627665.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2007/01/23/627665.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/627665.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/627665.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; tab-stops: 62.25pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes">异常处理是个很烦人的问题，经常破坏程序结构。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; tab-stops: 62.25pt"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes">.netFrameWork</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes">中的异常处理：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; tab-stops: 62.25pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes">一般有个内部辅助类，此类包含的都是返回值是异常的静态方法，此方法根据传入的参数从资源文件中找到异常信息，然后返回给调用者。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; tab-stops: 62.25pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes">调用者不会<span lang=EN-US>new</span>新的异常。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; tab-stops: 62.25pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes">不错的处理机制。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; tab-stops: 62.25pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-no-proof: yes">如<span lang=EN-US>:<br>下面两个是辅助类中的方法<br><o:p></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">internal</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;Exception&nbsp;InvalidConnectionOptionValue(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;key)<br><img id=Codehighlighter1_67_127_Open_Image onclick="this.style.display='none'; Codehighlighter1_67_127_Open_Text.style.display='none'; Codehighlighter1_67_127_Closed_Image.style.display='inline'; Codehighlighter1_67_127_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_67_127_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_127_Closed_Text.style.display='none'; Codehighlighter1_67_127_Open_Image.style.display='inline'; Codehighlighter1_67_127_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_67_127_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_67_127_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;ADP.InvalidConnectionOptionValue(key,&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">internal</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;Exception&nbsp;InvalidConnectionOptionValue(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;key,&nbsp;Exception&nbsp;inner)<br><img id=Codehighlighter1_213_322_Open_Image onclick="this.style.display='none'; Codehighlighter1_213_322_Open_Text.style.display='none'; Codehighlighter1_213_322_Closed_Image.style.display='inline'; Codehighlighter1_213_322_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_213_322_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_213_322_Closed_Text.style.display='none'; Codehighlighter1_213_322_Open_Image.style.display='inline'; Codehighlighter1_213_322_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_213_322_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_213_322_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_304_310_Open_Image onclick="this.style.display='none'; Codehighlighter1_304_310_Open_Text.style.display='none'; Codehighlighter1_304_310_Closed_Image.style.display='inline'; Codehighlighter1_304_310_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_304_310_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_304_310_Closed_Text.style.display='none'; Codehighlighter1_304_310_Open_Image.style.display='inline'; Codehighlighter1_304_310_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;ADP.Argument(Res.GetString(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ADP_InvalidConnectionOptionValue</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">[]&nbsp;</span><span id=Codehighlighter1_304_310_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_304_310_Open_Text><span style="COLOR: #000000">{&nbsp;key&nbsp;}</span></span><span style="COLOR: #000000">),&nbsp;inner);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</o:p></span></span>
<pre><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: Tahoma; mso-ascii-font-family: Tahoma"><font size=2>调用者的调用方式：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">Public&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Demo()<br><img id=Codehighlighter1_19_75_Open_Image onclick="this.style.display='none'; Codehighlighter1_19_75_Open_Text.style.display='none'; Codehighlighter1_19_75_Closed_Image.style.display='inline'; Codehighlighter1_19_75_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_19_75_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_19_75_Closed_Text.style.display='none'; Codehighlighter1_19_75_Open_Image.style.display='inline'; Codehighlighter1_19_75_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_19_75_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_19_75_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;InvalidConnectionOptionValue(&#8220;demoException&#8221;)<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</font></span></pre>
这样就把异常信息封装到了辅助类，提供了统一管理，异常修改变得方便起来。
<img src ="http://www.cnblogs.com/bluewater/aggbug/627665.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47970/" target="_blank">19岁天才黑客发布首个iPhone 3GS破解软件</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>我们仍然需要贫血的域模型</title><link>http://www.cnblogs.com/bluewater/archive/2007/01/09/615876.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Tue, 09 Jan 2007 07:58:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2007/01/09/615876.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/615876.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2007/01/09/615876.html#Feedback</comments><slash:comments>32</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/615876.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/615876.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">几种域模型的争论持续很久了，尤其在</span><span lang=EN-US>Martin Fowler</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">批判贫血的域模型后，争论更加激烈，</span><span lang=EN-US>Martin</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的文章我刚看到，他对贫血域模型的观点我基本都同意，但是我得出的结论确和他不同。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我同意只含有属性（甚至加上</span><span lang=EN-US>CRUD</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）的</span><span lang=EN-US>Domain Object</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是不符合</span><span lang=EN-US>OO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的，这样做很类似于使用事务脚本和表模块方式，只是把取出的数据再封装到类中。在这种模型下</span><span lang=EN-US>Domain object</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">更像一个</span><span lang=EN-US>DTO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和值对象。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">同意域模型只包含属性和</span><span lang=EN-US>CRUD</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">没有体现出域模型的本意，域模型实现域逻辑才能称为域模型。从这两点上说</span><span lang=EN-US>Martin</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的观点也是正确的。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是总感觉有些不对的地方，毕竟自己和好多人一样用这种模式很久了，能存在这么久也是有原因的，有些人把这归结于</span><span lang=EN-US>ORM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span><span lang=EN-US>Nhibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）和</span><span lang=EN-US>DAO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式的广泛使用，确实这两种工具促使了这种模型的发挥范围，但是从本质上说，这种模式是有其优点的，至少我认为他和含有业务逻辑的域模型（充血）比较起来是半斤八两，贫血模型没有比充血域模型差。<br></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;贫血模型的层次结构：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img height=493 alt="" src="http://www.cnblogs.com/images/cnblogs_com/bluewater/p.jpg" width=539 border=0><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注：domain object实现一些易于绑定控件的接口也可以当做DTO使用，但是一般DTO还是不能省的。图中的ICompare只是一个特例，可能还要实现IList等。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先，贫血模型虽然不</span><span lang=EN-US>OO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，但是毕竟把数据封装到类里面了，这样就为</span><span lang=EN-US>Service</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">层实现</span><span lang=EN-US>OO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">打下了一个基础，要比表模块和事务脚本好很多，从这点上看他也不等同于事务脚本和表模块。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其次，把业务逻辑和域模型（贫血）分开是有优点的，至少把业务逻辑和业务数据分离了，虽然在理论上这种分离是没有意思的也是非</span><span lang=EN-US>OO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的，但在实践中这样做至少分离了变化，实现难度也没有增加，为什么是不可以接受呢？难道只是因为他不</span><span lang=EN-US>OO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">？</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">再次，特别简单是这种模型流行的基础。如果使用</span><span lang=EN-US>nhibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等</span><span lang=EN-US>ORM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具，很容易再第三方工具的配合下生成代码，如果把</span><span lang=EN-US>CRUD</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从域中提取出来可以更方便的使用代码生成。如果自己些映射可以很容易的在数基层实现</span><span lang=EN-US>Mapper</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者用</span><span lang=EN-US>ActiveRecord</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">再加上在简单的应用中</span><span lang=EN-US>Domain object</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以当作</span><span lang=EN-US>DTO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用，这些都是贫血模型存在的理由。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">他的缺点是导致服务层太庞大了，这一点可以把服务层拆分，然后再在这些细粒度的服务层上面封装一个</span><span lang=EN-US>thinService</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">层来解决。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另一个缺点是，我直觉上认为在领域对象中不包含领域逻辑是很不合理的，但是又找不到他不合理的证据。<br></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">充血结构：<br><img height=512 alt="" src="http://www.cnblogs.com/images/cnblogs_com/bluewater/c.jpg" width=609 border=0><br>&nbsp;&nbsp;&nbsp;包含域逻辑的域对象（充血）没有上面说的两个缺点，他符合</span><span lang=EN-US>OO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，很容易实现一个</span><span lang=EN-US>thinService</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，感觉上这种模型很好。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先，</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">域对象包含了操作，是真正的域对象，域对象可以重用了,只是听起来很美。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其次，服务层很薄（只包含跨多个域对象或者第三方逻辑的封装），把域逻辑分离了一部分给域对象，变化容易控制，修改也容易。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是这些优点，很多都是直觉上的，因为业务逻辑太复杂了也太容易变化了，这就造成让域对象包含操作也不是一个很合理的方式。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缺点是实现很难，即使用</span><span lang=EN-US>ORM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具也很复杂，更不要说自己写映射层了。<br></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">总结：业务逻辑和业务数据耦合在一起是合理的，但是业务逻辑相较于业务数据是更易变的，从分离变化的角度来看是有必要把他们分开的，也就是贫血模式。同样把DAO从域对象剥离出来也没有什么必要，因为两者都是相对稳定的。<br>所以我认为贫血的模型是比较实用的。</span></p>
<img src ="http://www.cnblogs.com/bluewater/aggbug/615876.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47969/" target="_blank">新浪邮箱大本营粉墨登场！Sina.cn开放注册</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>MVP,终于把界面分离出来了</title><link>http://www.cnblogs.com/bluewater/archive/2006/12/11/589214.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Mon, 11 Dec 2006 12:28:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2006/12/11/589214.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/589214.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2006/12/11/589214.html#Feedback</comments><slash:comments>25</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/589214.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/589214.html</trackback:ping><description><![CDATA[摘要:  目前web开发中面临的一个问题是,很难分清楚哪些是程序员负责的，哪些是美工负责的。在同一个公司还好办，沟通容易，协调也简单。如果是多方合作的项目，一方负责界面一方负责程序，这样分工就很难，由于界面是和一些控制逻辑邦定在一起的，这部分工作很难说是属于哪方，并且涉及界面的部分也难以并行进行。如现在的一个项目，A方：负责页面（html，aspx）B方：负责程序。今天A方把几个页面调整了一下关系，明天又&nbsp;&nbsp;<a href='http://www.cnblogs.com/bluewater/archive/2006/12/11/589214.html'>阅读全文</a><img src ="http://www.cnblogs.com/bluewater/aggbug/589214.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47968/" target="_blank">IE市场份额首次跌破60%</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>asp.net的一个bug的发现和解决</title><link>http://www.cnblogs.com/bluewater/archive/2006/11/21/567871.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Tue, 21 Nov 2006 14:18:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2006/11/21/567871.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/567871.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2006/11/21/567871.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/567871.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/567871.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;gridview中的按钮类型用如果用image，触发rowcommand事件时会被执行两次，据说只出现在IE6，IE5、firefox等没有问题，我的IE7也存在同样问题，似乎和IIS版本也有关系，期待微软的补丁。<br>&nbsp;&nbsp;&nbsp;今天下午一遇到一个问题，gridview 的rowcommand事件会被执行两次，postback也会执行两次，最初还怀疑是调试器的问题，经过察看日志，确定真的被执行了两次。<br>&nbsp;&nbsp;&nbsp;代码检查了n遍，逐句排除，仍没有找到问题，已经开始怀疑是鼠标了，抓包发现确实是发了两次请求，并且第一次请求没有被处理。偶尔一次把buttontype从image换到button，意外的好了，只被执行了一次，看来问题只出在Imagebutton。<br>&nbsp;&nbsp;&nbsp;通过google搜索发现有不少人遇到了此问题，确定是asp.net的bug。点击按钮会向iis发两次请求，第一次比第二次少八个字节，导致第一次请求不成功，接着会重新发一次，因此最容易想到的就是忽略第一次请求，下面的第一种解决方式就是如此。<br>&nbsp;&nbsp;&nbsp;目前有两个解决方案，都不完善，第一个是在rowcommand事件中加入下面的语句：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(Request[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">x</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;Request[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">y</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Response.End();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
通过这条语句，判断图片的坐标，如果其坐标是null，则是第一次请求，因为第一次请求无效，结束他。<br>&nbsp;&nbsp;&nbsp;第二个是微软推荐的：尽量不在gridview里面用imagebutton，而用link或者button，如果必须用可以用类似的代码：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">asp:GridView&nbsp;ID</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">GridView1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;runat</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">server</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Columns</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">asp:TemplateField</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ItemTemplate</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">asp:ImageButton&nbsp;runat</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">server&nbsp;id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ImageButton1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;CommandName</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Delete</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>ImageUrl</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;commandargument</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">&lt;%#&nbsp;DataBinder.Eval(Container,</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>"</span><span style="COLOR: #000000">RowIndex</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">&nbsp;OnCommand="ImageButton1_Command"&nbsp;/&gt;&nbsp;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">ItemTemplate</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">asp:TemplateField</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">Columns</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">asp:GridView</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_419_486_Open_Image onclick="this.style.display='none'; Codehighlighter1_419_486_Open_Text.style.display='none'; Codehighlighter1_419_486_Closed_Image.style.display='inline'; Codehighlighter1_419_486_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_419_486_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_419_486_Closed_Text.style.display='none'; Codehighlighter1_419_486_Open_Image.style.display='inline'; Codehighlighter1_419_486_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;ImageButton1_Command(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;sender,&nbsp;CommandEventArgs&nbsp;e)&nbsp;</span><span id=Codehighlighter1_419_486_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_419_486_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>GridView1.DeleteRow(Int32.Parse(e.CommandArgument.ToString()));&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
把imagebuttong加入到TemplateField中，并且在事件中调用deleterow。<br>&nbsp;&nbsp;&nbsp;不知道还有没有更好的解决方案，下面的论坛详细的讨论了这个问题：<br><a href="http://www.developersdex.com/asp/message.asp?p=1116&amp;r=4641456&amp;page=2">http://www.developersdex.com/asp/message.asp?p=1116&amp;r=4641456&amp;page=2</a>第一页讨论的结果是：只有在button的类型是image的情况下才会有此问题，可以略过不看，后面两页有详细的讨论和解决方式。<br>&nbsp;&nbsp;&nbsp;今天一天一直在遇到奇怪问题，头大了，相同的代码经常一会可以执行，一会儿不可以，vs2005也一直出怪事。刚才把下午不能运行的几个问题在家模拟了一下竟然运行良好！！明天又要头痛了<br><br>
<img src ="http://www.cnblogs.com/bluewater/aggbug/567871.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47965/" target="_blank">Google App Engine宕机6小时——云的安全在哪里？</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>瞎说设计模式</title><link>http://www.cnblogs.com/bluewater/archive/2006/11/11/557882.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Sat, 11 Nov 2006 13:18:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2006/11/11/557882.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/557882.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2006/11/11/557882.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/557882.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/557882.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">水平有限只能瞎说，独孤九剑有破剑式、破掌式等针对敌人招式的破解之道，设计模式也是针对某一类问题的解决方案，独孤九剑到最后就是无招胜有招，设计模式到最后呢，是不是也是心中没有任何模式，但总能找到针对具体问题的合适方案呢？</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计模式是为了解决某一类通用问题而总结出的比较合适的解决方案，整个解决方案都是基于</span><font face=宋体><span lang=EN-US>OO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，每一种语言的特性不同，解决方式也有区别。说是合适的解决方案是因为，他们提供了灵活性、可重用性、可维护性，这一切又是建立在低耦合的基础上，模式能在需求变化时，灵活的适应新的需求，耦合度低，修改某个类时，不会牵连到不相关的类，这样就产生了易维护的代码</span></font></p>
<h2 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size=3>学习设计模式的方法：</font></span></h2>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><font face=宋体><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">要认识到，设计模式并不是治百病的灵药，他们就是前人总结的解决某些问题的比较普遍适用的方法，因为他们的通用性，遇到具体的问题，你能得到比设计模式更好的解决方案，而不用管它是不是模式，是什么模式。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><font face=宋体><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一类问题通常有多个适用的模式，用哪个要自己考虑，从实际问题出发，结合现有的模式和语言的特性（如</span><span lang=EN-US>.net</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">反射），找到新解决方案也是好的办法。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">要想想那些解决方案为什么会成为模式，用模式为什么会比不用模式好</span><font face=宋体><span lang=EN-US>,</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">好在哪里，只有经过这些思考才能更深的了解设计模式，而不去套用模式而是从实际问题出发，去寻找合适的解决方案。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计模式不是什么高深的东西，不应该去仰视他，而应该俯视，把他踩到脚下，他就是前人的总结，我们完全有可能比前人做的更好，因为我们面对的是具体的问题。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">学习设计模式是为了解决问题，而不是为了学习而学习，我觉得学习过程是：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face=宋体>1、</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">看书，看实际例子，虚拟的那些没有太大帮助，道理谁都懂。设计模式就像画笔，只有到了画家的手里才能画出好的作品，而虚拟的例子就像是拙劣的作品，任何人都会画。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face=宋体>2、</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">体会，体会为什么要用模式，不用又如何。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face=宋体>3、</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运用，一开始就套用，也不用管是否合适，这样就会发现问题，通过解决问题，才能加深理解。这时候不用去想&#8220;重构得到模式&#8221;之类，还没有到那一步。如果精通了，重构时也没有必要去得到什么模式，那样不是画蛇添足吗？本来问题已经完善的解决了，还要模式做什么呢？</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face=宋体>4、</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">体会，体会设计模式的本质，他们共性的东西，为什么会产生设计模式，改进设计模式。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore"><font face=宋体>5、</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">融合，融合你知道的模式，遇到问题想解决方案，而去理会它是否是模式。（无招胜有招，哈哈）</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">整个是曲线上升的过程，要反复的体会、运用。不要掩盖自己的缺点，要暴露出来，这样才能提高。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果说设计模式都体现了几条设计原则（</span><font face=宋体><span lang=EN-US>OCP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>DIP</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等），那么设计原则又是什么的体现呢？因此要思考些本质的东西，而不要只看表现，设计中没有任何东西是死的，如果要把这些看死了，认死理，就没有必要在看设计模式了。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><font face=宋体><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只是有些公司很短视，经常看到要求精通某项新技术之类的招聘信息，其实只要不是脑子有问题，给一个月的时间，基本上都会掌握那些所谓新技术（当然水平也一般，但又有多少用到更深的东西了？），但是要些出好的代码却不这么容易。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><font face=宋体><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">据说，有干了几年的程序员还在写垃圾代码，这些人可能一直在追新技术，出来一个学一个，可是好多重要的东西都丢下了。我以前也一直紧跟</span><span lang=EN-US>MS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">脚步，现在已经觉得那样没有什么意义了，好多东西需要沉淀。前一段时间想去一家公司，我同学正好负责另一个部门的招聘说不要三十岁以上的，对这家公司的印象大大折扣。</span></font></p>
<h2 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size=3>为什么要用设计模式：</font></span></h2>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我认为是为了写好的代码，好是指：能灵活适用需求，易于维护，最后是重用。设计模式不是为了解决技术细节上的难题，如修改一个语句的</span><font face=宋体><span lang=EN-US>bug</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，模式对这些没有帮助。发展到今天，做应用开发的，已经很少有细节上的难题了，遇到问题可以去</span><span lang=EN-US>MSDN</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US>google</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，去看相关的开源项目，再不行，请教某个高手。这样一来，培训几个月，谁都可以去写程序了。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是要想写好，就必须要学习设计模式，学习设计，这需要自己用心体会，实践。不能通过</span><font face=宋体><span lang=EN-US>MSDN</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</span><span lang=EN-US>google</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，请教高手得到提高。必须经过自己的努力。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">做开发，可以不用设计模式，但你要知道设计模式所带来的好处。这些好处在维护旧代码，需求改变时最能体现，见到垃圾代码真有去砸机子的想法，而设计好的代码就好多了。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计模式主要是解决设计中的僵化性，脆弱性，粘滞性。这些特性都是在变化中体现的如果没有变化，也就没有了运用设计模式的基础，也没有必要用</span><font face=宋体><span lang=EN-US>OO</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">了。</span></font></p>
<h2 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size=3>设计模式的语言相关性：</font></span></h2>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计模式主要用到的是抽象、多态，抽象和多态可以用继承实现，也可以用函数指针实现（</span><font face=宋体><span lang=EN-US>.net</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">委托），所以有些模式既有继承的实现方式也有委托的实现方式，哪种实现合适和语言特点、问题相关。还可以用配置文件、反射（</span><span lang=EN-US>.net</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）机制实现设计模式和设计的灵活性。</span></font></p>
<h2 style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size=3>设计中的几个问题：</font></span></h2>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设计模式更注重于可复用的结构设计方案，而框架更注重具体问题的设计和实现。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">针对接口编程，而不是针对实现，这就要求在类层次的顶端是接口或者抽象类。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">让类的调用者去时刻记着去检查错误码是愚蠢的想法，因此要尽可能的使用异常。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 20pt; TEXT-ALIGN: left; mso-char-indent-count: 2.0; mso-line-height-rule: exactly" align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我一直觉得设计模式，设计，一直在解决耦合性的问题。如果达到了合适的耦合就是很好的设计。（不知道对不对）</span></p>
<img src ="http://www.cnblogs.com/bluewater/aggbug/557882.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47961/" target="_blank">微软新推社交网站Windows Live Planet</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>从一个失败的项目说起——需求和设计</title><link>http://www.cnblogs.com/bluewater/archive/2006/11/11/557868.html</link><dc:creator>思无邪</dc:creator><author>思无邪</author><pubDate>Sat, 11 Nov 2006 12:59:00 GMT</pubDate><guid>http://www.cnblogs.com/bluewater/archive/2006/11/11/557868.html</guid><wfw:comment>http://www.cnblogs.com/bluewater/comments/557868.html</wfw:comment><comments>http://www.cnblogs.com/bluewater/archive/2006/11/11/557868.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/bluewater/comments/commentRss/557868.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/bluewater/services/trackbacks/557868.html</trackback:ping><description><![CDATA[摘要: 小项目是否需要设计？什么是好需求？基于我现在水平的理解，可能有误&nbsp;&nbsp;<a href='http://www.cnblogs.com/bluewater/archive/2006/11/11/557868.html'>阅读全文</a><img src ="http://www.cnblogs.com/bluewater/aggbug/557868.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47961/" target="_blank">微软新推社交网站Windows Live Planet</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item></channel></rss>