<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>fixopen</title>
    <description>dup</description>
    <link>http://fixopen.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>CSS和表格</title>
        <author>fixopen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fixopen.javaeye.com">fixopen</a>&nbsp;
          链接：<a href="http://fixopen.javaeye.com/blog/166290" style="color:red;">http://fixopen.javaeye.com/blog/166290</a>&nbsp;
          发表时间: 2008年02月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天看了<a href="http://hax.javaeye.com/" target="_blank">hax的blog</a>，不知道哪个项里面提到了CSS面对表格的col的时候的尴尬。后来深入思考了一下，发现这其实是一个本质性的困难。而且问题并不是出现在CSS上，而是出现在XML上。<br /><br />由于XML要求任何一个元素（除了根元素）都必须有且只有一个父元素，这就导致XML的table模型有些不自然，因为，一个cell显然是一个row的子，但是我们也可以说它同时也是col的子，可是由于XML（DOM）强制的树状模型，导致这个没有办法实现。这可以说是层次型数据和关系型数据的一个典型分野。在关系型数据库中，col可以认为是描述row数据的数据，也就是元数据，或者叫做关系。想要真正的解决这个问题，也就是说，想要XML能够自然的描述table，显然需要打破只有一个父这个局限性，对于table来说，需要两个父，因为table是二维的。但是，一放纵未免再放纵，能够有两个父显然就要想到为什么不能有多个父……，这显然超出了XML最初的预想，也超出了层次型数据模型的能力，什么时候能够把层次型模型和关系型模型无缝的融合起来（还有网状数据模型，跟现在的Web本身一样：），什么时候table在XML描述就没有问题了。<br /><br />上面提出的这个方案可以说有点太迂远，不适合作为真正的解决方案推荐给网页设计者们。我们考虑一个可以实现的。<br /><br />本质上CSS只是给出一个或者一些元素的外观，所以，它本身不受层次和关系模型的困扰。而就算CSS中的C是层次型生效的，也不影响我们对一个元素规定多个样式，它们会叠加起来的。<br /><br />就像很难用一个类型体系（分类体系）把知识组织起来一样，从CSS的表现角度来说，Web Page上的元素也很难分类一个特定的类，它们总是有可能隶属于不同的类，比如：它们可以归为高亮（强调）类，也可以同时归为楷体（内容）类。幸运的是，CSS从来没有限制自己的叠加，虽然它大多数情况下思考的角度是子继父样，然后叠加自己特有的样子，但是毕竟它提供了一个叠加的机制，这样我们就可以随意的叠加了。<br /><br />现在的问题是，如果规定了col的样式，如何应用到隶属于col的cell上？我们看过委员会的解释，知道不能采用子继父样这个通用的CSS Render机制，是不是就没有办法了呢？<br /><br />不是。仔细考虑col的本质，col规定了table的结构信息，也就是说，它其实规定了row中数据的元数据。规定col的样式的意义是什么？<br /><br />这不禁让我们想起了一系列相关的元素，规定head的样式的意义是什么？规定base font的意义是什么？规定title的意义是什么？这些元素归根结底都是元数据。对于它们的规定要影响到它们影响到的数据才行。所以，规定base font的样式应该影响到font的样式，而规定col的样式应该影响到row（进而影响到cell）的样式。<br /><br />焦点集中到“查找一个元素可以应用的样式”这一个步骤上，我们也只需要改变这一个步骤，能够区分出XML（XHTML）中的元数据和数据，并且能够理解元数据所描述或者关联的数据，就可以把该元数据的样式应用到其所描述的数据上。<br /><br />这个方案应该是比较完善的，并且是可以扩展的。我想，除了XML本身的层次结果以外，元数据和数据这个层次结构（显然可以层层叠加，也是一个潜在的无限层次的树）也是一个重要的考虑维度，并且潜在的对于元素的外观的影响应该比XML本身的层次结构影响更大。<br /><br />不知道W3C会不会增加这个看起来比较复杂的方案？<br /><br />它们最初的方案似乎是改进table模型，但是，其实不仅仅是table模型本身，所有的数据都潜在的有这样一个问题。尤其是那些自说明文档，它们常常是自包含的，也就是说，是数据和元数据存放在一起的。所以，必须有一套机制用来指定这个层次关系。<br /><br />之所以有这样的多个维度的层次关系，原因还是上面说的【很难用一个类型体系（分类体系）把知识组织起来】，不仅仅对于表现有影响，实际上，对数据的影响是通过对表现的影响展现出来了而已。
          <br/>
          <span style="color:red;">
            <a href="http://fixopen.javaeye.com/blog/166290#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Feb 2008 22:37:04 +0800</pubDate>
        <link>http://fixopen.javaeye.com/blog/166290</link>
        <guid>http://fixopen.javaeye.com/blog/166290</guid>
      </item>
      <item>
        <title>TimerAgent</title>
        <author>fixopen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fixopen.javaeye.com">fixopen</a>&nbsp;
          链接：<a href="http://fixopen.javaeye.com/blog/140290" style="color:red;">http://fixopen.javaeye.com/blog/140290</a>&nbsp;
          发表时间: 2007年11月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一个定时器队列<br />
实现了一个高性能的定时器队列处理系统，基本的实现思路是把所有的定时器请求按超时的前后顺序排入队列中，然后不断的查看是否开始的定时器超时已经到达，如果到达则调用回调处理函数。<br />
这个定时器队列依赖于时间处理的函数和线程，这两个都是平台相关的，不过幸运的是我把他们包装起来了，也就意味着这儿有一个简单的线程包装库。同时有一个小小的可用的可池化的线程的实现。
          <br/>
          <span style="color:red;">
            <a href="http://fixopen.javaeye.com/blog/140290#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 13 Nov 2007 16:38:01 +0800</pubDate>
        <link>http://fixopen.javaeye.com/blog/140290</link>
        <guid>http://fixopen.javaeye.com/blog/140290</guid>
      </item>
      <item>
        <title>一个简单的目录遍历器</title>
        <author>fixopen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fixopen.javaeye.com">fixopen</a>&nbsp;
          链接：<a href="http://fixopen.javaeye.com/blog/140275" style="color:red;">http://fixopen.javaeye.com/blog/140275</a>&nbsp;
          发表时间: 2007年11月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          只适合在Windows系统下[包括WinCE]使用。主要是因为依赖于Windows平台的CString和FindFirstFile、FindNextFile以及FindClose系列函数。其实对于CString的依赖并不是必要的，只是方便了Find*系列函数的调用而已。<br />
examples里面是一些使用这个简单遍历器的例子。包括删除目录中所有文件，复制到另一个目录，生成vector或者一个别的表达等等。<br />
StringOp实现了std::string和CString之间的转换。<br />
当然，我知道，boost实现了一个更漂亮的目录访问器，并且显然功能更强，适应性更好，但是由于我想到我仍然不得不在自己的平台上实现一个目录遍历器，因此我觉得它可能仍然是有用的。我就没有办法把boost的实现在WinCE上编译通过，它的代码如同天书般晦涩，我知道这是由于要适应多个平台导致的，可是这仍然阻止不了我不喜欢读它。希望你能喜欢这个简单的实现，虽然有很多限制，但是在相应平台上立即可用的一个小巧实现。
          <br/>
          <span style="color:red;">
            <a href="http://fixopen.javaeye.com/blog/140275#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 13 Nov 2007 15:46:36 +0800</pubDate>
        <link>http://fixopen.javaeye.com/blog/140275</link>
        <guid>http://fixopen.javaeye.com/blog/140275</guid>
      </item>
      <item>
        <title>一点实用代码</title>
        <author>fixopen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fixopen.javaeye.com">fixopen</a>&nbsp;
          链接：<a href="http://fixopen.javaeye.com/blog/140195" style="color:red;">http://fixopen.javaeye.com/blog/140195</a>&nbsp;
          发表时间: 2007年11月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="bvMsg" id="msgcns!54D5E6261E242B38!232">
<p>有限状态机<br />
实现了一个确定型的有限状态机，可以向它注册状态跃迁规则和动作，然后在事件发生的时候通知它，别的都由它实现了。动作的原型是一个void (*)(void* params)的函数指针。<br />
FSM的实现不依赖于任何超越标准C++的内容，也就是说，它可以使用在任何支持标准C++的环境中。顺便说一下，我在WinCE和Windows上都使用过它。  </p>
<p>HTML2TEXT<br />
一 个简单的例子使用有限状态机，它能够实现快速的把HTML文件转换为TEXT文件，具体的说，就是把标签（头尾tag）去掉，同时其属性也被去掉，把注释 内容去掉，把脚本和内嵌样式单中的内容去掉，把实体引用转换为实体代表的内容本身。该例子只是为了展现有限状态机的使用方式，没有考虑HTML中的标签的 大小写的问题，如果要考虑也不会复杂多少。<br />
HTML2TEXT的实现也完全是标准语言和库实现的，只是采用了*_s之类的安全的函数，在某些环境下不可实现，不过可以简单的替换成没有_s的相应版本。  </p>
<p>实现的基本描述：<br />
顺 次的扫描HTML文件（当作一个以零结尾的内存区域），碰到标签&lt;字符，开始忽略其内容，碰到&gt;字符，重新开始记录。碰到&lt;!--开始 忽略其内容，而到--&gt;时重新开始记录，同时，碰到&lt;script时开始忽略，碰到&lt;/script&gt;时重新开始，style也 是一样的处理方式，状态机的状态相当少，包括Normal、Tag、Comment、Style、Script、Entity、End，状态机的开始状态 是Normal，最后状态是End，中间可以在这些状态之间跳转。可能的事件包括：&nbsp;&nbsp;&nbsp; eFindScriptBegin，eFindScriptEnd，eFindStyleBegin，eFindStyleEnd， eFindCommentBegin，eFindCommentEnd，eFindTagStart，eFindTagStop， eFindEntityStart，eFindEntityStop，eFindEnd。它们都很清晰直白，尤其是参看了initFSM_的时候更是如 此。它的输出文件也是一个以零终止的内存区域，不需要由客户分配，在析构该对象时自动释放。 </p>
<p>其中比较差的一点是我对Parameter结构的使用，我是特意这样演示的，主要是想展现对于FSM灵活的使用方式，其实最常见也最实用的方式是只使用this作为参数。  </p>
<p>显然，HTML2TEXT可以非常容易得扩展成一个完整的HTML Parse【可以加上DOM支持】，再加上HTML Render【包括CSS的支持】，Javascript支持和HTTP支持，就是一个Web Browser了。</p>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://fixopen.javaeye.com/blog/140195#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 13 Nov 2007 13:33:10 +0800</pubDate>
        <link>http://fixopen.javaeye.com/blog/140195</link>
        <guid>http://fixopen.javaeye.com/blog/140195</guid>
      </item>
      <item>
        <title>合适的地方使用合适的技术</title>
        <author>fixopen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fixopen.javaeye.com">fixopen</a>&nbsp;
          链接：<a href="http://fixopen.javaeye.com/blog/87428" style="color:red;">http://fixopen.javaeye.com/blog/87428</a>&nbsp;
          发表时间: 2007年06月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在合适的地方使用合适的技术，我想这一点没有人会反对。而且大多数人都会觉得做到这一点极端简单，无需乎强调。大家可能会觉得问题倒是在于怎么断定什么是合适的技术这个问题。<br />
<br />
但其实这两个问题（1、使用合适的技术，2、判定技术是否合适）并没有明确的分界线。因为显然如果不能判定技术是否合适，我们就不能使用合适的技术。<br />
<br />
现在说一下我判断技术是否合适的基本原则。1、要经过时间的考验。2、要有比较严密的理论基础。3、技术本身的流行度高。<br />
<br />
看看软件开发过程中涉及到的问题。1、理解问题域。这个过程叫做什么业务建模也罢，叫做什么需求分析也罢，主要的目的就是理解问题域。2、设定解决方案。 这个区间承上启下，是一个关键环节。它一方面影响到问题的解决，一方面也反过来影响到问题的理解。因为解决方案是一个人对问题理解和知识结构做输入产生的 输出，而知识结构跟问题理解是一个扯不清的互相关联的参数。3、实际的解决问题。好多人认为，这个环节比较简单，其实不然，这个环节要把一个世界里的东西 投射到另一个世界里（从现实世界到计算机世界），这里面就会涉及到如何投射的问题，而如何投射显然依赖于：问题模型、计算机模型。大多数人会认为这两个中 前一个已经完成了，而后一个很简单，所以投射不会很复杂，可事实上绝对不是如此，原因是：我们一般并不会把问题模型直接投射到裸的（原始的）计算机模型， 而是投射到被各种装备大大增强了的计算机模型上，比如，我们不会直接处理硬盘的数据读写，而可能是考虑把数据放入数据库系统等等。显然，这个投射过程严重 依赖于我们对于目标机器的设想和假定。也依赖于我们个人占有的信息量或者叫做知识量。4、各种偶发事件的处理。这里面主要包括信息的翻译失真，投射的不匹 配导致的困难，经济压力和时间压力等等。<br />
<br />
所以，我们一定要在合适的地方使用合适的技术，才能满足在特定性价比的情况下制造出产品&mdash;&mdash;软件系统。<br />
<br />
关于问题与和解决方案，属于特定的领域的专业知识，有其特殊性，我大体上不涉及，我只关注实际的解决问题这个环节。我们知道，工作主要来源于投射，而投射的工作量依赖于问题域和解空间的差异性的大小。差异越小，同质化越强，投射越简单，反之亦反。<br />
<br />
这就要求我们引出一个概念叫做DSL。这个概念的引入主要是想弥补我们的翻译（投射）的巨大鸿沟，通过一个或者多个中间翻译站，我们可以比较自然和直观的在人脑复杂度承受范围之内解决复杂问题。<br />
<br />
到现在为止，我们都在说形而上的理论，现在我们从形而下的实践开始，两头逼近，搞出个结论。<br />
<br />
对于任何软件系统，都会牵扯到：输入输出、处理、状态（或数据）存储（或者叫做永久化）。处理各不相同，可重用的一些方面也已经被总结出来了，比如：事 务，身份认证和安全，冗余备份和分布，处理过程（或者运行轨迹）的记录等等，这些是处理中可以重用的部分，总体来说，处理可以重用的比输入输出和状态存储 少的多。<br />
<br />
对于输入输出，根据其对象不同，可以分为：跟人类的交互，跟机器（网络节点、别的进程等等）的交互两大类。根据其内容的不同，可以分为实体信息的交互和控 制信息的交互。我们对于实体信息，总结的和可重用的东西比较多，比如：实体信息包括数字、字符（串）、图形图像、声音、视频以及混合信息，它们的传输、存 储、解析翻译（Codec）和获取生成都是可以重用的部件。而对于控制信息，其定义就有点杂乱，投射到人类交互这个层面，会有好多称作Control的可 重用部件用来表达人和软件系统交换的控制信息，投射到机器交互这个层面，显然就是我们不同的【网络】通信协议了，它们主要是维持和管理控制实体信息交互而 采用的，一般称作信令。<br />
<br />
对于状态存储，现在比较自然和流行的包括三类，二进制内存存储， 二进制或者文本的【xml】文件存储，二进制的数据库存储。其实（文本可以认为是一种特化的二进制）。对于这些实体信息或者叫做状态，它们的操纵和处理可重用的地方非常大。<br />
<br />
上面简要分析了最低层次的（相对而言）的Domain，对于这些Domain，我们有没有对应的DSL呢？<br />
<br />
有的，显然，数据领域是SQL、XQuery，处理领域有无数种计算机编程语言，它们都比较合格，尤其是提供了OO能力和Aspect能力以后，用来描述 处理一般没有什么困难，而表现领域（输入输出领域）呢？我认为还是有的，比如：适合图形表现的SVG，适合控制表现的XForms，适合多种实体信息表现 的XHTML2（注意其中的object），适合视频表现的Flash，这些都是该领域的特定语言，可以非常自然高效的表达希望表达的信息。<br />
<br />
从这个低层次的分析我们就发现，我们现在把问题空间投射到解空间的方法并不是最好，甚至可以说是相当的差，而近来有些公司已经意识到这一点，比如 Microsoft，Adobe，Sun，它们分别推出了XAML，MXML，JavaFX，用来为输入输出层提高生产率。问题不在于它们的技术，而在 于：1、它们都期望绑定程序员，2、它们的技术都有一定的壁垒，3、现在它们还都不够流行。所以，我个人认为如果提供一个基于标准（XHTML、 XForms、SVG+Other）的表现层运行时，会有很大的竞争力。当然，我的市场敏感度极低，大家自己分辨吧。<br />
<br />
有些程序员总是固守着自己的那一块小地盘，期待着所有的事情都用一个办法搞定，这不是不行，只是不够好而已。采用多种DSL构造Application， 一个潜在的问题是这些不同的DSL定义的部件组装在一起的问题。ORM部分的解决了数据领域和业务领域的组装问题，而新出现的表现层Runtime期待着 解决业务领域和输入输出领域的组装。<br />
<br />
软件开发的前途看来还是比较光明的。
          <br/>
          <span style="color:red;">
            <a href="http://fixopen.javaeye.com/blog/87428#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 06 Jun 2007 18:24:22 +0800</pubDate>
        <link>http://fixopen.javaeye.com/blog/87428</link>
        <guid>http://fixopen.javaeye.com/blog/87428</guid>
      </item>
      <item>
        <title>依赖顺序是罪恶</title>
        <author>fixopen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fixopen.javaeye.com">fixopen</a>&nbsp;
          链接：<a href="http://fixopen.javaeye.com/blog/54690" style="color:red;">http://fixopen.javaeye.com/blog/54690</a>&nbsp;
          发表时间: 2007年02月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          C和C++语言是流行和常用的依赖于顺序的语言。C++略为有点改进，在类范围内部不依赖于顺序。依赖于顺序是一种惩罚，是一种不重视程序员感受的表现，并且在深层次要求采用采用声明和实现分开，因而也就不能维持DRY原则。违背DRY会导致维护复杂。<br />
我详细说明一下为什么依赖顺序是罪恶的。<br />
大家都知道抽象是一种强大的能力，但是，依赖于顺序强迫我们只能从低层次的细节开始，这跟现如今流行的IDE的智能完成一样。我们不得不把所有的细节描述完备，才能构造更大的构件。<br />
我还是用一个实例来说明吧。<br />
我为了练习的目的，试图写一个HTTP Client，自然，我是从阅读RFC规范开始的。通过扫描RFC的目录和快速掠过其内容，我们发现HTTP是一个请求响应模式的简单协议，其请求和响应都是所谓的Message，显然，只要我们能解析和构造这个Message，我们就大致完成任务。<br />
于是就有了：<br />
<br />
namespace Http<br />
{<br />
&nbsp;&nbsp;&nbsp; class Message<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; public:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageHeader headers;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRLF crlf;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBody body;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::string toString(void)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return headers.toString() + crlf.toString() + body.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; };<br />
<br />
&nbsp;&nbsp;&nbsp; class MessageHeader<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; public:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::vector&lt;Field&gt; fields;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::string toString(void)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::string result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; fields.size(); ++i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result += fields[i].toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; };<br />
<br />
&nbsp;&nbsp;&nbsp; class Field<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; public:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FieldName name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Colon colon;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FieldValue value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRLF crlf;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::string toString(void)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return name.toString() + colon.toString() + value.toString() + crlf.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; };<br />
<br />
&nbsp;&nbsp;&nbsp; class FieldName<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; public:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FieldNameValue name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::string toString(void)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::string result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (name)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case CacheControl:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = &quot;Cache-Control&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FieldNameValue fromString(std::string fieldName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FieldNameValue result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (fieldName == &quot;Cache-Control&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = CacheControl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (...)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; };<br />
<br />
&nbsp;&nbsp;&nbsp; enum FieldNameValue<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //generic headers<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CacheControl,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pragma,<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ......<br />
}<br />
<br />
我想，上面的代码非常的直接了当。几乎不需要解释，类似于递归下降法制作解析器，而事实上，确实是下降的，但是递归没有，因为HTTP的Message格式还没有那么强大和灵活。稍微有点奇特的是FieldName和FieldNameValue这一对，它们合作构成了我设想的枚举，这也说明了C/C++语言的枚举并不强大到可以作为一个抽象机制使用，当然，这不是我们焦点。暂且不论。<br />
<br />
由于其中的toString都是很简单的，所以我准备把它们做成内联函数，这个无可厚非，我们看看就是这个要求是怎么导致我们需要扭曲我们的代码的。<br />
<br />
首先需要说明的是：上面的代码不能通过C++编译器的编译。原因很简单：编译器看到MessageHeader被使用的时候还没有发现其定义，会给出一大堆抱怨。怎么办？我们给出一个前向声明吧。也很简单，在使用之前声明一下就行了：class MessageHeader。把它加在使用之前的任意地方，编译器就应该不说话了吧。<br />
<br />
哦，还是不行，原因是：对了，它要求必须有完整的类定义才能定义该类的对象，别忘了，C++是值语义的语言。好吧，我们改造成指针&hellip;&hellip;，类型后面加上*，一连串的.变成-&gt;，应该没有问题了吧（如果你做过实际的项目，你就知道：这个修改的代价是非常高的，不过区分指针和原始对象不是我们批判的焦点，这里不再深入）。啊&hellip;&hellip;还是不行，原因仍然很简单，就算可以定义指针而不是真正的对象，我们仍然不不能够调用该指针对象的方法，原因是：我（编译器）没有看到类型的定义，怎么知道有没有该方法可以调用呢？<br />
<br />
现在我们的选择有三个，但是都不够优雅。<br />
一、我们调整类型定义的顺序，把低层次的构件往前挪。<br />
二、我们把成员函数的实现挪到最后，这时候它已经看到所有的定义了。<br />
三、这是二的彻底化，干脆移动其实现到另一个文件。<br />
方法一的缺陷就是，我们不再能够自然的从上而下看出我们设计的脉络。这跟我看HTTP的RFC一个缺陷是一样的，HTTP的RFC就不是采用自上而下描述的，而是先描述了一些基础的构件，在描述了整体结构，看得人晕头转向，另外，协议中有大量的用途和功能分析，我不是说这不好，但是作为协议这让人分神。可以把功能或者需求放在开始诱导大家构思HTTP应该怎样设计。而不是放在HTTP协议都描述了以后才描述功能。<br />
方法二和方法三本质上是一样的，但是方法三的可维护性就更差一些了，因为所有的修改都得涉及到两个文件，而且，方法三不再能够是inline的，这个代价让我觉得非常不快。而方法二确实仍保持inline，但是，一旦修改我还是得从头到尾的查找。让我写两遍相同的函数头也让我不爽。<br />
而最本质的原因就是：我没有办法让一个决策（函数签名）在一个地方说明，必须出现在两个地方，这是对DRY或者叫做SPOT原则的公然违反，它们会导致大量的微妙的问题和产生难以维护的代码。<br />
C++在很大程度上鼓励我们采用第三种方案，这也是C++中的正统方案，只要我们坚持顺序依赖，我们就不得不倾向于这种方案。顺序依赖把维持依赖关系的责任推给了程序员而不是编译器自己去解决，这当然简化了编译器，但是却使得程序员的日子更艰难。那么，顺序依赖究竟应该是谁的责任呢？是该由程序员处理的呢，还是该由编译器处理的？<br />
我们先大而化之描述一下依赖。依赖表示一个构件（这儿的构件包括函数，类，全局变量，源文件等等任意可以用来搭建整个系统的部分）对别的构件的使用。我们很自然很直观的能感受到，只要我们使用了别的构件，编译器显然知道我们的构件依赖于那些使用的构件，所以，让程序员维持依赖是不必要的。<br />
但是还有一个问题：构件A依赖于构件B，这个编译器知道，但是构件B在哪儿？这个编译器不知道。显然，我们需要而且也只需要在某个地方描述一下这个构件跟位置的映射，我们的编译器就可以工作了。如果我们把这种映射放在任何构件里面，这样势必会导致这种映射关系描述上的重复，导致大量的维护问题。显然，最适合描述构件跟位置的映射关系的地方是工程的配置文件。它是整个工程级别的属性。<br />
那么顺序依赖是什么呢？顺序依赖本质上是希望把构件和位置的映射关系消除。它要求所有依赖的东西必须在它之前出现，这样，被依赖方也就自然不需要指定位置了，它就在前面。这个有利于分块编译（不知道大家注意没有，分块编译的用处似乎并不是很大，无论是大工程还是小工程，因为：毕竟编译只是一个阶段，而且维持构件是否是最新编译版本似乎也一点都不难），但是实现分块编译导致需要大量的重复编译，毕竟任何被多次依赖的组件都必须多次被编译。并且分块编译要求类似于Makefile之类的支持环境，现代的语言及其开发环境都完全不支持分块编译了，它们都采用运行时动态装载这个更灵活的模式。
          <br/>
          <span style="color:red;">
            <a href="http://fixopen.javaeye.com/blog/54690#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 Feb 2007 19:23:30 +0800</pubDate>
        <link>http://fixopen.javaeye.com/blog/54690</link>
        <guid>http://fixopen.javaeye.com/blog/54690</guid>
      </item>
      <item>
        <title>软件开发的本质</title>
        <author>fixopen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fixopen.javaeye.com">fixopen</a>&nbsp;
          链接：<a href="http://fixopen.javaeye.com/blog/37123" style="color:red;">http://fixopen.javaeye.com/blog/37123</a>&nbsp;
          发表时间: 2006年12月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          关于这个话题，我似乎说过好多次了。软件系统其实就是现实系统的抽象，就是现实系统的模型。最近，看到一个论点，是这样说的：软件建模（架构）的过程其实就是一个定理证明的过程。我得说，在我看来，这有一定的真理性。但是事实有一定的差异。基本原因是：我们碰到问题的时候，并不总是对问题的解决方案一无所知的，或者更确切的说，对问题的解决方案几乎总是有一定的了解得。这时候，证明的过程其实并不是很明显，反而是表达的过程成了重头戏。<br />
这儿，我在阐述一遍我的观点，软件就是模型，就是抽象。基于上面的描述，软件开发过程也就是构思模型和表达模型的过程。由于表达和构思互相影响，密不可分（大家可以参照语言和思维的关系来理解这一点），所以我只说表达这个方面。我们的模型如何表达现实？<br />
必须解释一下数据的概念了。数据就是表达关系的，关系紧密到一定程度就叫做属性了。一个客体，或者常常被称作对象，物件，就是用其属性描述的。我们描述了客体，也就反映了现实。而客体是数据的集合，所以我们操作数据也就是反映了现实的行为了。对于数据的操作我们有CRUD（Create Read Update Destory）四个，对应于数据库系统的INSERT、SELECT、UPDATE、DELETE四个基本的数据操纵原语。所有的客体的行为，最终都是用CRUD来表达的。所以，只要我们正确地表达了数据，我们就能够正确地表达软件系统。
          <br/>
          <span style="color:red;">
            <a href="http://fixopen.javaeye.com/blog/37123#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 04 Dec 2006 13:46:36 +0800</pubDate>
        <link>http://fixopen.javaeye.com/blog/37123</link>
        <guid>http://fixopen.javaeye.com/blog/37123</guid>
      </item>
      <item>
        <title>Event系统相关接口</title>
        <author>fixopen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fixopen.javaeye.com">fixopen</a>&nbsp;
          链接：<a href="http://fixopen.javaeye.com/blog/27883" style="color:red;">http://fixopen.javaeye.com/blog/27883</a>&nbsp;
          发表时间: 2006年10月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          interface EventTarget {<br />  void               addEventListener(in DOMString type, in EventListener listener, in boolean useCapture);<br />  void               removeEventListener(in DOMString type, in EventListener listener, in boolean useCapture);<br />  boolean            dispatchEvent(in Event evt) raises(EventException);<br />};<br /><br />interface EventListener {<br />  void               handleEvent(in Event evt);<br />};<br /><br />interface Event {<br />  // PhaseType<br />  const unsigned short      CAPTURING_PHASE                = 1;<br />  const unsigned short      AT_TARGET                      = 2;<br />  const unsigned short      BUBBLING_PHASE                 = 3;<br /><br />  readonly attribute DOMString        type;<br />  readonly attribute EventTarget      target;<br />  readonly attribute EventTarget      currentTarget;<br />  readonly attribute unsigned short   eventPhase;<br />  readonly attribute boolean          bubbles;<br />  readonly attribute boolean          cancelable;<br />  readonly attribute DOMTimeStamp     timeStamp;<br />  void               stopPropagation();<br />  void               preventDefault();<br />  void               initEvent(in DOMString eventTypeArg, in boolean canBubbleArg, in boolean cancelableArg);<br />};<br /><br />exception EventException {<br />  unsigned short   code;<br />};<br />// EventExceptionCode<br />const unsigned short      UNSPECIFIED_EVENT_TYPE_ERR     = 0;<br /><br />interface DocumentEvent {<br />  Event              createEvent(in DOMString eventType) raises(DOMException);<br />};<br /><br />interface UIEvent : Event {<br />  readonly attribute views::AbstractView  view;<br />  readonly attribute long             detail;<br />  void               initUIEvent(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in views::AbstractView viewArg, in long detailArg);<br />};<br /><br />interface MouseEvent : UIEvent {<br />  readonly attribute long             screenX;<br />  readonly attribute long             screenY;<br />  readonly attribute long             clientX;<br />  readonly attribute long             clientY;<br />  readonly attribute boolean          ctrlKey;<br />  readonly attribute boolean          shiftKey;<br />  readonly attribute boolean          altKey;<br />  readonly attribute boolean          metaKey;<br />  readonly attribute unsigned short   button;<br />  readonly attribute EventTarget      relatedTarget;<br />  void               initMouseEvent(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in views::AbstractView viewArg, in long detailArg, in long screenXArg, in long screenYArg, in long clientXArg, in long clientYArg, in boolean ctrlKeyArg, in boolean altKeyArg, in boolean shiftKeyArg, in boolean metaKeyArg, in unsigned short buttonArg, in EventTarget relatedTargetArg);<br />};<br /><br />interface MutationEvent : Event {<br />  // attrChangeType<br />  const unsigned short      MODIFICATION                   = 1;<br />  const unsigned short      ADDITION                       = 2;<br />  const unsigned short      REMOVAL                        = 3;<br /><br />  readonly attribute Node             relatedNode;<br />  readonly attribute DOMString        prevValue;<br />  readonly attribute DOMString        newValue;<br />  readonly attribute DOMString        attrName;<br />  readonly attribute unsigned short   attrChange;<br />  void               initMutationEvent(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in Node relatedNodeArg, in DOMString prevValueArg, in DOMString newValueArg, in DOMString attrNameArg, in unsigned short attrChangeArg);<br />};<br /><br />具体的事件名称和类型如下：<br />UIEvent:<br />DOMFocusIn<br />DOMFocusOut<br />DOMActivate<br /><br />MouseEvent:<br />click<br />mousedown<br />mouseup<br />mouseover<br />mousemove<br />mouseout<br /><br />MutationEvent:<br />DOMSubtreeModified<br />DOMNodeInserted<br />DOMNodeRemoved<br />DOMNodeRemovedFromDocument<br />DOMNodeInsertedIntoDocument<br />DOMAttrModified<br />DOMCharacterDataModified<br /><br />HTMLEvents(DocumentEvent):<br />load<br />unload<br />abort<br />error<br />select<br />change<br />submit<br />reset<br />focus<br />blur<br />resize<br />scroll
          <br/>
          <span style="color:red;">
            <a href="http://fixopen.javaeye.com/blog/27883#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 15 Oct 2006 18:43:40 +0800</pubDate>
        <link>http://fixopen.javaeye.com/blog/27883</link>
        <guid>http://fixopen.javaeye.com/blog/27883</guid>
      </item>
      <item>
        <title>Style&amp;CSS的编程接口</title>
        <author>fixopen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fixopen.javaeye.com">fixopen</a>&nbsp;
          链接：<a href="http://fixopen.javaeye.com/blog/27882" style="color:red;">http://fixopen.javaeye.com/blog/27882</a>&nbsp;
          发表时间: 2006年10月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          interface StyleSheet {<br />  readonly attribute DOMString        type;<br />           attribute boolean          disabled;<br />  readonly attribute Node             ownerNode;<br />  readonly attribute StyleSheet       parentStyleSheet;<br />  readonly attribute DOMString        href;<br />  readonly attribute DOMString        title;<br />  readonly attribute MediaList        media;<br />};<br /><br />interface StyleSheetList {<br />  readonly attribute unsigned long    length;<br />  StyleSheet         item(in unsigned long index);<br />};<br /><br />interface MediaList {<br />           attribute DOMString        mediaText;<br />                                        // raises(DOMException) on setting<br /><br />  readonly attribute unsigned long    length;<br />  DOMString          item(in unsigned long index);<br />  void               deleteMedium(in DOMString oldMedium) raises(DOMException);<br />  void               appendMedium(in DOMString newMedium) raises(DOMException);<br />};<br /><br />interface LinkStyle {<br />  readonly attribute StyleSheet       sheet;<br />};<br /><br />interface DocumentStyle {<br />  readonly attribute StyleSheetList   styleSheets;<br />};<br /><br />interface CSSStyleSheet : stylesheets::StyleSheet {<br />  readonly attribute CSSRule          ownerRule;<br />  readonly attribute CSSRuleList      cssRules;<br />  unsigned long      insertRule(in DOMString rule, in unsigned long index) raises(DOMException);<br />  void               deleteRule(in unsigned long index) raises(DOMException);<br />};<br /><br />interface CSSRuleList {<br />  readonly attribute unsigned long    length;<br />  CSSRule            item(in unsigned long index);<br />};<br /><br />interface CSSRule {<br />  // RuleType<br />  const unsigned short      UNKNOWN_RULE                   = 0;<br />  const unsigned short      STYLE_RULE                     = 1;<br />  const unsigned short      CHARSET_RULE                   = 2;<br />  const unsigned short      IMPORT_RULE                    = 3;<br />  const unsigned short      MEDIA_RULE                     = 4;<br />  const unsigned short      FONT_FACE_RULE                 = 5;<br />  const unsigned short      PAGE_RULE                      = 6;<br /><br />  readonly attribute unsigned short   type;<br />           attribute DOMString        cssText;<br />                                        // raises(DOMException) on setting<br />  readonly attribute CSSStyleSheet    parentStyleSheet;<br />  readonly attribute CSSRule          parentRule;<br />};<br /><br />interface CSSStyleRule : CSSRule {<br />           attribute DOMString        selectorText;<br />                                        // raises(DOMException) on setting<br />  readonly attribute CSSStyleDeclaration  style;<br />};<br /><br />interface CSSMediaRule : CSSRule {<br />  readonly attribute stylesheets::MediaList  media;<br />  readonly attribute CSSRuleList      cssRules;<br />  unsigned long      insertRule(in DOMString rule, in unsigned long index) raises(DOMException);<br />  void               deleteRule(in unsigned long index) raises(DOMException);<br />};<br /><br />interface CSSFontFaceRule : CSSRule {<br />  readonly attribute CSSStyleDeclaration  style;<br />};<br /><br />interface CSSPageRule : CSSRule {<br />           attribute DOMString        selectorText;<br />                                        // raises(DOMException) on setting<br />  readonly attribute CSSStyleDeclaration  style;<br />};<br /><br />interface CSSImportRule : CSSRule {<br />  readonly attribute DOMString        href;<br />  readonly attribute stylesheets::MediaList  media;<br />  readonly attribute CSSStyleSheet    styleSheet;<br />};<br /><br />interface CSSCharsetRule : CSSRule {<br />           attribute DOMString        encoding;<br />                                        // raises(DOMException) on setting<br />};<br /><br />interface CSSUnknownRule : CSSRule {<br />};<br /><br />interface CSSStyleDeclaration {<br />           attribute DOMString        cssText;<br />                                        // raises(DOMException) on setting<br />  DOMString          getPropertyValue(in DOMString propertyName);<br />  CSSValue           getPropertyCSSValue(in DOMString propertyName);<br />  DOMString          removeProperty(in DOMString propertyName) raises(DOMException);<br />  DOMString          getPropertyPriority(in DOMString propertyName);<br />  void               setProperty(in DOMString propertyName, in DOMString value, in DOMString priority) raises(DOMException);<br />  readonly attribute unsigned long    length;<br />  DOMString          item(in unsigned long index);<br />  readonly attribute CSSRule          parentRule;<br />};<br /><br />interface CSSValue {<br />  // UnitTypes<br />  const unsigned short      CSS_INHERIT                    = 0;<br />  const unsigned short      CSS_PRIMITIVE_VALUE            = 1;<br />  const unsigned short      CSS_VALUE_LIST                 = 2;<br />  const unsigned short      CSS_CUSTOM                     = 3;<br />           attribute DOMString        cssText;<br />                                        // raises(DOMException) on setting<br /><br />  readonly attribute unsigned short   cssValueType;<br />};<br /><br />interface CSSPrimitiveValue : CSSValue {<br />  // UnitTypes<br />  const unsigned short      CSS_UNKNOWN                    = 0;<br />  const unsigned short      CSS_NUMBER                     = 1;<br />  const unsigned short      CSS_PERCENTAGE                 = 2;<br />  const unsigned short      CSS_EMS                        = 3;<br />  const unsigned short      CSS_EXS                        = 4;<br />  const unsigned short      CSS_PX                         = 5;<br />  const unsigned short      CSS_CM                         = 6;<br />  const unsigned short      CSS_MM                         = 7;<br />  const unsigned short      CSS_IN                         = 8;<br />  const unsigned short      CSS_PT                         = 9;<br />  const unsigned short      CSS_PC                         = 10;<br />  const unsigned short      CSS_DEG                        = 11;<br />  const unsigned short      CSS_RAD                        = 12;<br />  const unsigned short      CSS_GRAD                       = 13;<br />  const unsigned short      CSS_MS                         = 14;<br />  const unsigned short      CSS_S                          = 15;<br />  const unsigned short      CSS_HZ                         = 16;<br />  const unsigned short      CSS_KHZ                        = 17;<br />  const unsigned short      CSS_DIMENSION                  = 18;<br />  const unsigned short      CSS_STRING                     = 19;<br />  const unsigned short      CSS_URI                        = 20;<br />  const unsigned short      CSS_IDENT                      = 21;<br />  const unsigned short      CSS_ATTR                       = 22;<br />  const unsigned short      CSS_COUNTER                    = 23;<br />  const unsigned short      CSS_RECT                       = 24;<br />  const unsigned short      CSS_RGBCOLOR                   = 25;<br /><br />  readonly attribute unsigned short   primitiveType;<br />  void               setFloatValue(in unsigned short unitType, in float floatValue) raises(DOMException);<br />  float              getFloatValue(in unsigned short unitType) raises(DOMException);<br />  void               setStringValue(in unsigned short stringType, in DOMString stringValue) raises(DOMException);<br />  DOMString          getStringValue() raises(DOMException);<br />  Counter            getCounterValue() raises(DOMException);<br />  Rect               getRectValue() raises(DOMException);<br />  RGBColor           getRGBColorValue() raises(DOMException);<br />};<br /><br />interface CSSValueList : CSSValue {<br />  readonly attribute unsigned long    length;<br />  CSSValue           item(in unsigned long index);<br />};<br /><br />interface RGBColor {<br />  readonly attribute CSSPrimitiveValue  red;<br />  readonly attribute CSSPrimitiveValue  green;<br />  readonly attribute CSSPrimitiveValue  blue;<br />};<br /><br />interface Rect {<br />  readonly attribute CSSPrimitiveValue  top;<br />  readonly attribute CSSPrimitiveValue  right;<br />  readonly attribute CSSPrimitiveValue  bottom;<br />  readonly attribute CSSPrimitiveValue  left;<br />};<br /><br />interface Counter {<br />  readonly attribute DOMString        identifier;<br />  readonly attribute DOMString        listStyle;<br />  readonly attribute DOMString        separator;<br />};<br /><br />interface ViewCSS : views::AbstractView {<br />  CSSStyleDeclaration getComputedStyle(in Element elt, in DOMString pseudoElt);<br />};<br /><br />interface DocumentCSS : stylesheets::DocumentStyle {<br />  CSSStyleDeclaration getOverrideStyle(in Element elt, in DOMString pseudoElt);<br />};<br /><br />interface DOMImplementationCSS : DOMImplementation {<br />  CSSStyleSheet      createCSSStyleSheet(in DOMString title, in DOMString media) raises(DOMException);<br />};<br /><br />interface ElementCSSInlineStyle {<br />  readonly attribute CSSStyleDeclaration  style;<br />};<br /><br />interface CSS2Properties {<br />           attribute DOMString        azimuth;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        background;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        backgroundAttachment;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        backgroundColor;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        backgroundImage;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        backgroundPosition;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        backgroundRepeat;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        border;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderCollapse;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderColor;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderSpacing;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderStyle;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderTop;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderRight;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderBottom;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderLeft;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderTopColor;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderRightColor;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderBottomColor;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderLeftColor;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderTopStyle;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderRightStyle;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderBottomStyle;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderLeftStyle;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderTopWidth;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderRightWidth;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderBottomWidth;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderLeftWidth;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        borderWidth;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        bottom;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        captionSide;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        clear;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        clip;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        color;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        content;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        counterIncrement;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        counterReset;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        cue;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        cueAfter;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        cueBefore;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        cursor;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        direction;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        display;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        elevation;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        emptyCells;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        cssFloat;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        font;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        fontFamily;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        fontSize;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        fontSizeAdjust;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        fontStretch;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        fontStyle;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        fontVariant;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        fontWeight;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        height;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        left;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        letterSpacing;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        lineHeight;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        listStyle;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        listStyleImage;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        listStylePosition;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        listStyleType;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        margin;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        marginTop;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        marginRight;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        marginBottom;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        marginLeft;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        markerOffset;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        marks;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        maxHeight;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        maxWidth;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        minHeight;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        minWidth;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        orphans;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        outline;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        outlineColor;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        outlineStyle;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        outlineWidth;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        overflow;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        padding;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        paddingTop;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        paddingRight;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        paddingBottom;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        paddingLeft;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        page;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        pageBreakAfter;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        pageBreakBefore;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        pageBreakInside;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        pause;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        pauseAfter;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        pauseBefore;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        pitch;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        pitchRange;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        playDuring;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        position;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        quotes;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        richness;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        right;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        size;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        speak;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        speakHeader;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        speakNumeral;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        speakPunctuation;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        speechRate;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        stress;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        tableLayout;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        textAlign;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        textDecoration;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        textIndent;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        textShadow;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        textTransform;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        top;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        unicodeBidi;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        verticalAlign;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        visibility;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        voiceFamily;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        volume;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        whiteSpace;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        widows;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        width;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        wordSpacing;<br />                                        // raises(DOMException) on setting<br />           attribute DOMString        zIndex;<br />                                        // raises(DOMException) on setting<br />};
          <br/>
          <span style="color:red;">
            <a href="http://fixopen.javaeye.com/blog/27882#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 15 Oct 2006 18:43:06 +0800</pubDate>
        <link>http://fixopen.javaeye.com/blog/27882</link>
        <guid>http://fixopen.javaeye.com/blog/27882</guid>
      </item>
      <item>
        <title>Web Application API</title>
        <author>fixopen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fixopen.javaeye.com">fixopen</a>&nbsp;
          链接：<a href="http://fixopen.javaeye.com/blog/27880" style="color:red;">http://fixopen.javaeye.com/blog/27880</a>&nbsp;
          发表时间: 2006年10月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          由于Ajax的火爆，所以我会重点介绍与它相关的一些技术。下面的文档已经写了很久了，由于上一篇的尖括号搞的我非常之烦，现在才贴出来，见谅。<br /><br />我将从Window，XMLHttpRequest等这几个主要接口出发（Document前面已经描述了），描述客户端Javascript编程的主要轮廓。另外，值得注意的是，这个领域的变化仍然非常剧烈，我不保证我描述的东西都可用。无论是现在（我描述的东西还太新）还是以后（而且还没有定型）。<br /><br />interface XMLHttpRequest {<br />           attribute EventListener   onreadystatechange;<br />  readonly attribute unsigned short  readyState;<br />  void               open(in DOMString method, in DOMString uri);<br />  void               open(in DOMString method, in DOMString uri, in boolean async);<br />  void               open(in DOMString method, in DOMString uri, in boolean async, in DOMString user);<br />  void               open(in DOMString method, in DOMString uri, in boolean async, in DOMString user, in DOMString password);<br />  void               setRequestHeader(in DOMString header, in DOMString value) raises(DOMException);<br />  void               send(in DOMString data) raises(DOMException);<br />  void               send(in Document data) raises(DOMException);<br />  void               abort();<br />  DOMString          getAllResponseHeaders();<br />  DOMString          getResponseHeader(in DOMString header);<br />           attribute DOMString       responseText;<br />           attribute Document        responseXML;<br />           attribute unsigned short  status;<br />                                        // raises(DOMException) on retrieval<br />           attribute DOMString       statusText;<br />                                        // raises(DOMException) on retrieval<br />};<br /><br />interface Item {<br />  readonly attribute boolean         exists;<br />  readonly attribute DOMString       name;<br />};<br /><br />interface IntegerItem : Item {<br />  readonly attribute long            value;<br />};<br /><br />interface BooleanItem : Item {<br />           attribute boolean         value;<br />};<br /><br />interface StringItem : Item {<br />  readonly attribute DOMString       value;<br />};<br /><br />interface ContentItem : Item {<br />           attribute Node            nodeArg;<br />           attribute unsigned long   offset;<br />};<br /><br />interface Match {<br />  // MatchTestGroup<br />  const unsigned short      IS_EQUAL                       = 0;<br />  const unsigned short      IS_NOT_EQUAL                   = 1;<br />  const unsigned short      INT_PRECEDES                   = 2;<br />  const unsigned short      INT_PRECEDES_OR_EQUALS         = 3;<br />  const unsigned short      INT_FOLLOWS                    = 4;<br />  const unsigned short      INT_FOLLOWS_OR_EQUALS          = 5;<br />  const unsigned short      STR_STARTS_WITH                = 6;<br />  const unsigned short      STR_ENDS_WITH                  = 7;<br />  const unsigned short      STR_CONTAINS                   = 8;<br />  const unsigned short      SET_ANY                        = 9;<br />  const unsigned short      SET_ALL                        = 10;<br />  const unsigned short      SET_NOT_ANY                    = 11;<br />  const unsigned short      SET_NOT_ALL                    = 12;<br /><br />  readonly attribute unsigned short  test;<br />};<br /><br />interface MatchInteger : Match {<br />  readonly attribute DOMString       name;<br />  readonly attribute long            value;<br />};<br /><br />interface MatchBoolean : Match {<br />  readonly attribute DOMString       name;<br />  readonly attribute boolean         value;<br />};<br /><br />interface MatchString : Match {<br />  readonly attribute DOMString       name;<br />  readonly attribute DOMString       value;<br />};<br /><br />interface MatchContent : Match {<br />  readonly attribute DOMString       name;<br />  readonly attribute Node            nodeArg;<br />  readonly attribute unsigned long   offset;<br />};<br /><br />interface MatchSet : Match {<br />  readonly attribute Node            nodeArg;<br />  void               addMatch(in Match add);<br />  Match              getMatch(in unsigned long index);<br />};<br /><br />interface Segment : Match {<br />           attribute Match           criteria;<br />           attribute DOMString       order;<br />  void               addItem(in Item add);<br />  MatchString        createMatchString(in unsigned short test, in DOMString name,  in DOMString value);<br />  MatchInteger       createMatchInteger(in unsigned short test, in DOMString name, in long value);<br />  MatchBoolean       createMatchBoolean(in unsigned short test, in DOMString name, in boolean value);<br />  MatchContent       createMatchContent(in unsigned short test, in DOMString name, in unsigned long offset, in Node nodeArg);<br />  MatchSet           createMatchSet(in unsigned short test);<br />  StringItem         createStringItem(in DOMString name);<br />  IntegerItem        createIntegerItem(in DOMString name);<br />  BooleanItem        createBooleanItem(in DOMString name);<br />  ContentItem        createContentItem(in DOMString name);<br />  void               getItem(in unsigned long index);<br />  boolean            getNext();<br />};<br /><br />interface View {<br />  void               select(in Node boundary, in unsigned long offset, in boolean extend, in boolean add);<br />  Segment            createSegment();<br />  boolean            matchFirstSegment(inout Segment todo) raises(DOMException);<br />  long               getIntegerProperty(in DOMString name) raises(DOMException);<br />  DOMString          getStringProperty(in DOMString name) raises(DOMException);<br />  boolean            getBooleanProperty(in boolean name) raises(DOMException);<br />  Node               getContentPropertyNode(in DOMString name) raises(DOMException);<br />  unsigned long      getContentPropertyOffset(in DOMString name) raises(DOMException);<br />};<br /><br />interface VisualView {<br />  readonly attribute DOMString       fontScheme;<br />  readonly attribute unsigned long   width;<br />  readonly attribute unsigned long   height;<br />  readonly attribute unsigned long   horizontalDPI;<br />  readonly attribute unsigned long   verticalDPI;<br />  VisualCharacter    createVisualCharacter();<br />  VisualCharacterRun createVisualCharacterRun();<br />  VisualFrame        createVisualFrame();<br />  VisualImage        createVisualImage();<br />  VisualFormButton   createVisualFormButton();<br />  VisualFormField    createVisualFormField();<br />  void               select(in Node boundary, n unsigned long offset, in boolean extend, in boolean add);<br />  void               matchSegment(in VisualResource segment);<br />};<br /><br />interface VisualResource {<br />};<br /><br />interface VisualFont : VisualResource {<br />           attribute DOMString       matchFontName;<br />  readonly attribute boolean         exists;<br />  readonly attribute DOMString       fontName;<br />  boolean            getNext();<br />};<br /><br />interface VisualSegment : VisualResource {<br />           attribute boolean         matchPosition;<br />           attribute boolean         matchInside;<br />           attribute boolean         matchContaining;<br />           attribute long            matchX;<br />           attribute long            matchY;<br />           attribute long            matchXR;<br />           attribute long            matchYR;<br />           attribute boolean         matchContent;<br />           attribute boolean         matchRange;<br />           attribute Node            matchNode;<br />           attribute unsigned long   matchOffset;<br />           attribute Node            matchNodeR;<br />           attribute unsigned long   matchOffsetR;<br />           attribute boolean         matchContainsSelected;<br />           attribute boolean         matchContainsVisible;<br />  readonly attribute boolean         exists;<br />  readonly attribute Node            startNode;<br />  readonly attribute unsigned long   startOffset;<br />  readonly attribute Node            endNode;<br />  readonly attribute unsigned long   endOffset;<br />  readonly attribute long            topOffset;<br />  readonly attribute long            bottomOffset;<br />  readonly attribute long            leftOffset;<br />  readonly attribute long            rightOffset;<br />  readonly attribute unsigned long   width;<br />  readonly attribute unsigned long   height;<br />  readonly attribute boolean         selected;<br />  readonly attribute boolean         visible;<br />  readonly attribute unsigned long   foregroundColor;<br />  readonly attribute unsigned long   backgroundColor;<br />  readonly attribute DOMString       fontName;<br />  readonly attribute DOMString       fontHeight;<br />  boolean            getNext();<br />};<br /><br />interface VisualCharacter : VisualSegment {<br />};<br /><br />interface VisualCharacterRun : VisualSegment {<br />};<br /><br />interface VisualFrame : VisualSegment {<br />  readonly attribute VisualSegment   embedded;<br />};<br /><br />interface VisualImage : VisualSegment {<br />  readonly attribute DOMString       imageURL;<br />  readonly attribute boolean         isLoaded;<br />};<br /><br />interface VisualFormButton : VisualSegment {<br />  readonly attribute boolean         isPressed;<br />};<br /><br />interface VisualFormField : VisualSegment {<br />  readonly attribute DOMString       formValue;<br />};<br /><br />interface EmbeddingElement {<br />    readonly attribute dom::Document contentDocument;<br />    readonly attribute Window contentWindow;<br />};<br /><br />// behavior is always special in ECMAScript, this is defined only for the benefit<br />// of other languages<br />interface TimerListener {<br />    // what to put here?<br />};<br /><br />interface AbstractView {<br />  readonly attribute DocumentView     document;<br />};<br /><br />interface DocumentView {<br />  readonly attribute AbstractView     defaultView;<br />};<br /><br />interface Window : views::AbstractView {<br />    // self-references<br />    readonly attribute Window window;<br />    readonly attribute Window self;<br /><br />    // assigning this has special behavior in ECMAScript, but it is otherwise<br />    // read only. specifically, in ES a string URI can be assigned to location,<br />    // having the same effect as location.assign(URI)<br />    readonly attribute Location location;<br /><br />    // name attribute of referencing frame/iframe/object, or name passed to<br />    // window.open<br />    attribute dom::DOMString name;<br /><br />    // global object of containing document<br />    readonly attribute Window parent;<br /><br />    // global object of outermost containing document<br />    readonly attribute Window top;<br /><br />    // referencing &lt;html:frame>, &lt;html:iframe>, &lt;html:object>, &lt;svg:foreignObject>,<br />    // &lt;svg:animation> or other embedding point, or null if none<br />    readonly attribute dom::Element frameElement;<br /><br />    // one-shot timer<br />    long setTimeout(in TimerListener listener, in long milliseconds);<br />    void clearTimeout(in long timerID);<br /><br />    // repeating timer<br />    long setInterval(in TimerListener listener, in long milliseconds);<br />    void clearInterval(in long timerID);<br />};<br /><br />interface DocumentWindow : views::DocumentView {<br />    readonly attribute Location location;<br />};<br /><br />interface Location {<br />    attribute dom::DOMString href;<br /><br />    // pieces of the URI, per the generic URI syntax<br />    attribute dom::DOMString hash;<br />    attribute dom::DOMString host;<br />    attribute dom::DOMString hostname;<br />    attribute dom::DOMString pathname;<br />    attribute dom::DOMString port;<br />    attribute dom::DOMString protocol;<br />    attribute dom::DOMString search;<br /><br />    void assign(in dom::DOMString url);<br />    void replace(in dom::DOMString url);<br />    void reload();<br /><br />    dom::DOMString toString();<br />};
          <br/>
          <span style="color:red;">
            <a href="http://fixopen.javaeye.com/blog/27880#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 15 Oct 2006 18:29:55 +0800</pubDate>
        <link>http://fixopen.javaeye.com/blog/27880</link>
        <guid>http://fixopen.javaeye.com/blog/27880</guid>
      </item>
      <item>
        <title>XML基础</title>
        <author>fixopen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fixopen.javaeye.com">fixopen</a>&nbsp;
          链接：<a href="http://fixopen.javaeye.com/blog/27878" style="color:red;">http://fixopen.javaeye.com/blog/27878</a>&nbsp;
          发表时间: 2006年10月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          虽说我认为上面的东西基本上不言自明，但我也意识到，很多人并不是很清楚XML的基本概念。所以，我准备把上面的东西解释一遍，只解释那些我认为确实有必要解释的东西。<br />一个XML文档就是一个文本文档。跟普通文本文档完全相同。只不过，它可能会比别的文本文档多了一些限制而已。一般来说，我们对于XML文档的直观认识就是：里面有大量的尖括号：）。是的，确实如此。XML文档被要求是Unicode字符集的文本文档。当然，它可能有多种编码方式（比如：utf7、utf8、utf16le、utf16ge等等），但这不是我们关注的焦点。顺便说一句，xml文档一般不需要bom字符，当然如果你加上了bom，你的xml必须没有prolog。后面我会讲到prolog是啥。<br />xml的基本思想就是对文本数据打上标记，用以更精确的表达这些文本数据的含义。举个例子1977/2/19 5:55:00这个文本数据，我们直觉它应该是一个timestamp，但是实际上它可能是任意东西，比如一种食品的名称：），虽然显得有些怪异。而如果我们用&lt;birthday>1977/2/19 5:55:00&lt;/birthday>来表达这个数据，我们就有把握的说，这个数据是一个生日。注意：尖括号中的数据是用来说明原始数据的，它们被称作标签。前面的那个叫做前标签，后面的那个叫做后标签。tag。注意它们的特征。前后相同，后面多了一个/，都是用&lt;>括起来的。这就是XML，也就是一种给数据打标签的方式。数据加上标签作为一个整体被称为一个元素。Element。<br /><br />XML中的X表达的是可扩展性，其基本意思就是说：XML本身没有定义任何tag，你可以用你觉得舒服的任何tag对数据作标记，设想一下我们比较熟悉的HTML，会发觉其实它就是规定了tag集合的一种标记语言。<br /><br />&lt;深入><br />有时候我们也会迷惑，如果没有任何预定义的tag，我们对数据进行标记岂不是成了自己逗自己玩？是啊，我自己用了一个标记，想用来表达某些含义，可是谁知道是什么含义呢？除了我自己？如果大家都不知道，我这个标记还有更大的意义么？<br />可以说，上面这个问题是一个本质问题。如果我们找不到XML存在的意义，我们就不值得去学习它，不是么？<br />我要提到的一个概念叫做XML Application。什么是XML Application？它就是：规定了一系列tag的含义的一个XML规范。我们可以而且也只能用这些被规定好的tag来标记数据了。又有人不明白了，这……这跟HTML还有区别么？我们说，现在看来暂时没有：）。不过马上我就告诉你其中的区别了。<br />一、HTML是一个全世界统一的标准，而我们的XML Application可以是在一个范围内有效的标准。<br />这提供了什么好处呢？最大的好处就是，我可以只需要试图说服一部分人而不是所有人都遵守，这样，我的这个约定就比较容易实施。<br />二、可以有多个约定，也就是说，可以有多个XML Application。<br />这个的用处大家就比较清楚了，我可以约定一套用于数学公式的标签集合，也可以约定一套用于音乐的标签集合，两者互不干扰。而HTML只有一套tag集合。却试图表达整个世界。<br />三、这多个XML Application可以互相混合。<br />哇，太好了，我真的可以描述整个世界了。可是这又会引发一个问题——这些标签冲突怎么办？<br />这儿，XML引入了一个namespace的概念。简单的说，不是同一个namespace中的标签，就算其名字相同，我们也知道它们是两码事，不会冲突。可是怎么保证namespace的名字不冲突呢？毕竟，我说我的标签都是dup这个namespace里面的，而这并不能阻止你让你的标签也是dup这个namespace。我们的W3C委员会非常聪明的解决了这个问题：它们规定namespace必须是一个URI，通俗的说，就是一个网址。我们知道，网址是保证全球唯一的。但是，由于网址的书写不过方便——毕竟太长了（更深层次的原因是：它们有些字符是不允许出现的），我们被允许可以起一个别名。当然，这个方案对于故意捣乱者也是无能为力……，不过，这就是另一回事情了。<br />备注：其实，现在已经定义了好多XML Appliction了。有很多已经被公认了，大家都在用：）。当然，这并不阻止你自己定义自己的Application。顺便说一句，定义Application需要使用Schema，有各种Schema可以用，包括DTD，XML Schema（schemaLocation），Schematron，RELAX NG等等。其中，很多都是一个具体的XML Application。哦，我要晕了。<br />关于名字空间，我给大家一个直观的感受，看例子：<br />&lt;music:goal xmlns:music = "http://www.music.com/schemas/music"><br />	&lt;music:time music:duration = "3d"/><br />	&lt;math:item xmlns:math = "http://www.math.com.cn/"><br />		&lt;math:line path = "12, 38, 42, 77"/><br />		&lt;music:timeStamp math:value = "20082324234" /><br />	&lt;/math:item><br />&lt;/music:goal><br />上面的例子中，涉及到两个名字空间，http://www.music.com/schemas/music和http://www.math.com.cn/，对于这俩名字空间，我们起的别名分别是music和math，这样，我们的元素的tag就可以用namespaceName:前缀来区分了。如果我们不理会名字空间，我们完全可以把namespaceName:tagName看成一个整体。另外，强调一下，名字空间的别名是可以随便起的，只要在同一个文档中不重复就行了。<br />&lt;/深入><br /><br />一个XML文档要求最多一个元素。不过，需要提醒大家的是，元素可以嵌套，嵌套的层次（深度）没有任何限制。我举个例子大家就会很明白了：<br />&lt;person><br />	&lt;name>dup&lt;/name><br />	&lt;birthday>1977/2/19 5:55:00&lt;/birthday><br />	&lt;description><br />		&lt;strongPoint id = "first">smalltalk&lt;/strongPoint><br />		&lt;strongPoint id = "second">eat&lt;/strongPoint><br />		&lt;interest>play pingpang&lt;/interest><br />	&lt;/description><br />&lt;/person><br />上面就是一个元素嵌套的例子。我想大家应该觉得非常简单。形式是不重要的（比如缩进换行什么的）。只要保证正常的嵌套关系没有搞混乱就行。<br /><br />元素可以直接或者间接递归。比如：x元素可以有叫做x的子元素，或者其子孙中有叫做x的元素。<br /><br />顺便我把子，子孙，父，祖先这个几个概念说一下。还是上面的例子，name，birthday，description是person的子。所有的子以及子的所有的子，依次递推下去，这些元素的总和叫做子孙。也就是说，直接的子和间接的子。父相对于子。一个元素只能有一个父。比如：strongPoint的父是description。祖先是父以及其父，依次递推直至最上层元素的那个集合，比如：strongPoint的祖先是description，person。<br /><br />XML文档中，除了Element以外，还有一些别的东西，我一一道来：）。<br /><br />其实，上面那个嵌套的元素就已经有一些新鲜的玩艺儿了，比如：如果你仔细注意了的话，有几个（确切的说是两个）元素的前标签里面有一些我们以前没有提及的东西，我们把那东西叫属性。Attribute。Attribute的形式是：n = “v”，其中n是任意的字符串。v也是。一个元素可以有任意多个Attribute，它们的n不能重复。n被称作属性名，v被称作属性值。元素的属性一定是放在前标签里面的。<br /><br />我们把前标签和后标签之间的文本称作Text。这些Text被称作元素的内容。一个元素的内容可以是Text，也可以是其它元素或者其他元素们，甚至可以是空白。当然，还可以是这些东西的组合。<br /><br />如果一个Text是以&lt;![CDATA[开头，并且以]]&gt;结尾，那么这个Text就被称做是CDATASection，CDATA段。CDATA段一个显著的用意就是禁止被解释。也就是说，CDATA段中的内容，一律按照其原始的形式存在。甚至里面的标签什么的也不会被认为是标签了。只是普通字符而已。<br /><br />注释是另一种东西，跟元素没有什么关系，它可以出现在在除了标签以外的任何地方，用来进行一个人可以理解的说明。注释的形式如下：&lt;!-- ... -->其中...可以是任何东西，除了--。<br /><br />DocumentType。文档类型，其实就是用来指定该XML文档所遵循的XML Application的Schema标准的那种东西。到现在为止，我只知道怎么使用它搞定用DTD定义的Schema，对于别的Schema，我不会使用这种方式，而是采用schemaLocation这个属性的方式来引用相关的文档类型定义。说实话，我不知道用schemaLocation这种方式引用Schema算不算文档类型。需要注意的是，如果一个XML没有引用相关的文档类型定义，也就是用于规定标签集合的Schema，那么这个文档就是普通的格式良好的。如果引用了，那么，XML文档的解释器会使用Schema规定的标签集及其结构验证该XML文档是否满足Schema的规定，故此，这时候的XML文档称作可验证的。DocumentType基本上是这样的语法： &lt;!DOCTYPE schemaName PUBLIC "publicId" SYSTEM "systemId">，或许还有一些别的东西，比如规定实体（Entity）和记号（Notation）的，以及规定内部子集的。但是遗憾的是：这些语法我不明白，所以就不描述它们了。深入的东西可以看看inline DTD。<br />我举个例子说明一个DocumentType是什么样子的：<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><br />这就是一个特别常见和特别有用的DocumentType，其实说到这儿，我似乎应该深入的描述一下publicId的语法结构，但是，巾短话多，我就不烦你了，如果你有兴趣，参见W3C的规范。<br /><br />Notation就是记号。这个东西说起来也很绕，原因是：我没有搞明白。所以略而不说。不过，可以告诉大家，在XML文档中碰到这个东西的时候非常好，而且就算碰到你也不会有感觉。所以不说也没有什么问题。<br />&lt;高级><br />记号是一个比较高级的主题，涉及到关于不可解析实体的处理问题。由于XML文档是一个纯文本文档，其中需要用tag作一些标记，用来规定数据的一些意义。这样，XML文档只能用来描述那些文本性质的数据。这些数据被称作可解析数据。也就是说，它们能够被XML解释器解析。但是，我们能用XML描述非文本性质的数据么？比如：二进制的数据，更具体的说，比如一个图片，一段音频什么的？我们说：我们的愿望是无穷的，不能这样就屈服了。我们就是要用XML描述二进制文件！可是我们XML的铁律就是不想让它去处理二进制数据啊。这时候，我们就需要Notation了，其实，Notation只是一个名字，一个记号，一个媒体类型，一个指示XML解析器用什么解释器来解释这种媒体。比如：我们定义了一种叫做PNG的Notation，我们就可以这样使用它了，首先，我们要在Schema中定义元素的某个属性，比如：image元素的src属性，然后，我们在XML文档中这样使用了，这样&lt;image src="hello.png" style="width:20px; height:80px" show="embed" />，看看，我们能够描述二进制数据了吧。<br />在这个过程中，我们的XML解释器就很清楚的知道，image的src属性是一个PNG，它需要用PNG的解释器来帮助它解释这个数据。<br />也就是说，Notation这样的设施就给了XML部分的表达二进制数据的方式，这种数据从本质上讲是XML解析器不可解析的数据。前面的CDATASection就是一种XML解析器不会去解析的数据，是文本形式的。后面还会讲到的ProcessingInstruction也是一种描述不可解析的数据的手段，也是文本形式的。<br />&lt;/高级><br /><br />Entity，实体。最常见的也是必须的几个实体定义是：lt，gt，amp，quot，apos，分别表示&lt;，>，&，"，'，它们本身是标签和属性需要使用的元字符，所以必须用实体引用来引用它们。<br /><br />EntityReference就是那种&name;的那种东西，name是实体的名字，实体引用会被在引用处替换为实体本身。<br /><br />ProcessingInstruction，处理指令。其基本语法如下：&lt;?target content?>target是一个外部程序，content是一个字符串，这个字符串是将会被交给target这个外部程序去解释和处理的。我举个例子来说明：&lt;?php print "hello"?>，这就是一个处理指令，content可以任意复杂，都会交给target取处理。另一个用法是：&lt;?xml-stylesheet href="trans.xsl" type="text/xsl"?>它是一种类似于HTML Link的东西，表示引用trans.xsl这个样式单。这种PI的content的组成方式跟Element前标签的Attributes很像，我们一般称它们为伪属性。<br /><br />一个比较奇特的符合处理指令语法的但是不是处理指令的东西是：&lt;?xml version="1.0" encoding="UTF-8"?>它跟上面的那个xml-stylesheet PI很像，但用途市绝对不一样的。这个语法要素要么不出现，要么只出现一次，而且必须出现在开头，绝对的开头，它前面不能有任何空白字符。它在某种程度上完成了BOM的作用。<br /><br />上面所有的东西都被称为节点。所有的这些节点组合以来就是XML文档。Document。<br /><br />PS：XML规范中对于字符的处理是非常复杂的，但是，我没有描述这些东西，因为，这些东西不太重要（对于普通用户来说），而且，XML规范中对于字符的处理也有点太复杂了。达到了夸张的地步。<br /><br />好了，这就是XML文档，其实是非常简单的。但是，这个我们上一篇文章中给出的XML Core DOM有什么关系呢？<br /><br />XML文档是一个普通的文本字节流，而XML Core DOM是一个XML文档解析器根据这个XML文档构造的一颗树，一棵结点组成的树，其根就是称作Document的东西。ok，这就是XML基础的全部。我们可以通过XML Core DOM提供的接口，遍历这一棵树，访问和修改各个节点，凭空生成和插入新的节点，删除某些节点。处理各种用户自定义的数据等等。现在，你能够看明白上一篇文章 的那些接口及其含义了么？
          <br/>
          <span style="color:red;">
            <a href="http://fixopen.javaeye.com/blog/27878#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 15 Oct 2006 18:16:37 +0800</pubDate>
        <link>http://fixopen.javaeye.com/blog/27878</link>
        <guid>http://fixopen.javaeye.com/blog/27878</guid>
      </item>
      <item>
        <title>JavaScript in Browser</title>
        <author>fixopen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fixopen.javaeye.com">fixopen</a>&nbsp;
          链接：<a href="http://fixopen.javaeye.com/blog/27877" style="color:red;">http://fixopen.javaeye.com/blog/27877</a>&nbsp;
          发表时间: 2006年10月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          介绍host概念<br />与普通的语言不同的是，JavaScript一开始就被设计为一个嵌入式的语言。这意味着，它是寄生在某个环境中而不是自足的。当然，这也意味着其运行环境的边境就是JavaScript的能力边境。JavaScript所寄居的那个运行环境叫做JavaScript的Host。JavaScript跟Host环境之间可以进行非常方便的交流和沟通，并且，以其寄宿的Host作为自己的世界。JavaScript的Host多种多样，包括Browser，Web Server，Flash player，Photoshop，……以及所有支持以JavaScript为其接口脚本语言的各种环境。这儿，我们的重点就是Brower。<br /><br />window就是Global<br />我们知道，JavaScript语言规范本身定义了一系列的对象。这些对象被称作built-in对象，它要求JavaScript无论在任何Host中都拥有，或者说Built-in对象就是一个约定。也就是说，JavaScript期望这些built-in对象在任何Host中都是一致的。当然， Host可以增添一些对象，或者修改一些对象的property，毕竟，我们知道修改JavaScript对象是很方便的。在Browser这个 JavaScript最流行的Host里面，增加了很多Host定义的对象，这些对象全是被一个标准体系规定的，这个体系叫做DOM。下面我会详细的介绍 DOM标准的。不过需要明确指出的是：Browser对于DOM标准总是半遮半掩，也就是说：它们实现了部分的DOM标准，同时又扩展了部分DOM没有规定的东西。<br />无论如何，我们首先需要明确的是：window就是Global。Global是JavaScript的内建对象，window是 Brower提供的Global对象，不过，名字叫window。实现基本上类似于var window = Global; window.newProperty = content; window.oldProperty = updateContent;……。window也像Global一样，可以省略"window."来直接引用其属性。<br /><br />附加的对象有哪些？<br />Brower 向JavaScript中附加的对象是非常多的。而且对于不同的Browser，其附加的对象也各不相同。不过大致都会有window（作为Global 存在，提供一些基本的实用功能），document（作为Brower中展现的文档的入口存在），styleSheet（作为样式单操作入口）， event（作为事件），xmlHttpRequest（作为异步http通信通道）等等。后面我们自然要一一深究这些对象，不过现在我们可以暂且放过它们。<br /><br />DOM是什么<br />DOM是Document Object Model的缩写，它是一个标准族。它规定了Browser相关的对象扩展应该有哪些properties，它们各是什么意义和作用等等。由于DOM是一个独立标准，并不依赖于JavaScript（也就是说，它规定了Browser应该提供的对象以及接口，可是这些对象是用JavaScript引用还是用C++引用它并没有规定），所以它是用了语言独立的IDL来描述这些对象的外貌和功用。关于DOM跟JavaScript的关联，他们把它叫做 binding。<br />再一次明确一下，DOM是一个标准族，它描述了Browser应该提供的对象的接口。<br /><br />DOM标准族包括哪些？<br />DOM 标准族包括XML DOM，HTML DOM，CSS DOM……，其中每一个都有可能是好几个相关的部分组成的。其中最为主要的标准系列就是XMLDOM了。我准备把它们的规范用IDL描述出来，在我认为必要的地方加上简短的说明。关于IDL，其实完全是不言自明的，所以我就不介绍IDL的语法了。<br /><br />注意：我描述的DOM规范，比较新，有很多特性还没有被Browser支持，而且有些可能还会改动，但改动的幅度不会很大。但是我宁愿描述一个新的合理的规范，也不愿意描述一个老的不完全的规范。<br /><br />现在开始XML DOM的描述，这是整个DOM标准的核心和基础。DOM标准的基本思想是把一个用标签（tag）标记（mark）的文本文档看作一棵树，文本文档中的任何一段文本都属于这个树的某个节点，每个节点都有一个唯一的父结点，都有若干子节点和属性。<br />下面是XML DOM的core部分，基础中的基础。<br /><br />valuetype DOMString sequence&lt;unsigned short><br />typedef unsigned long long DOMTimeStamp;<br />typedef any DOMUserData;<br />typedef Object DOMObject;<br /><br />interface DOMImplementation;<br />interface DocumentType;<br />interface Document;<br />interface NodeList;<br />interface NamedNodeMap;<br />interface UserDataHandler;<br />interface Element;<br />interface TypeInfo;<br /><br />interface DOMLocator;<br /><br />exception DOMException<br />{<br />unsigned short code;<br />};<br />// ExceptionCode<br />const unsigned short INDEX_SIZE_ERR = 1;<br />const unsigned short DOMSTRING_SIZE_ERR = 2;<br />const unsigned short HIERARCHY_REQUEST_ERR = 3;<br />const unsigned short WRONG_DOCUMENT_ERR = 4;<br />const unsigned short INVALID_CHARACTER_ERR = 5;<br />const unsigned short NO_DATA_ALLOWED_ERR = 6;<br />const unsigned short NO_MODIFICATION_ALLOWED_ERR = 7;<br />const unsigned short NOT_FOUND_ERR = 8;<br />const unsigned short NOT_SUPPORTED_ERR = 9;<br />const unsigned short INUSE_ATTRIBUTE_ERR = 10;<br />const unsigned short INVALID_STATE_ERR = 11;<br />const unsigned short SYNTAX_ERR = 12;<br />const unsigned short INVALID_MODIFICATION_ERR = 13;<br />const unsigned short NAMESPACE_ERR = 14;<br />const unsigned short INVALID_ACCESS_ERR = 15;<br />const unsigned short VALIDATION_ERR = 16;<br />const unsigned short TYPE_MISMATCH_ERR = 17;<br /><br />interface DOMStringList<br />{<br />DOMString item(in unsigned long index);<br />readonly attribute unsigned long length;<br />boolean contains(in DOMString str);<br />};<br /><br />interface NameList<br />{<br />DOMString getName(in unsigned long index);<br />DOMString getNamespaceURI(in unsigned long index);<br />readonly attribute unsigned long length;<br />boolean contains(in DOMString str);<br />boolean containsNS(in DOMString namespaceURI, in DOMString name);<br />};<br /><br />interface DOMImplementationList<br />{<br />DOMImplementation item(in unsigned long index);<br />readonly attribute unsigned long length;<br />};<br /><br />interface DOMImplementationSource<br />{<br />DOMImplementation getDOMImplementation(in DOMString features);<br />DOMImplementationList getDOMImplementationList(in DOMString features);<br />};<br /><br />interface DOMImplementation<br />{<br />boolean hasFeature(in DOMString feature, in DOMString version);<br />DocumentType createDocumentType(in DOMString qualifiedName, in DOMString publicId, in DOMString systemId) raises(DOMException);<br />Document createDocument(in DOMString namespaceURI, in DOMString qualifiedName, in DocumentType doctype) raises(DOMException);<br />DOMObject getFeature(in DOMString feature, in DOMString version);<br />};<br /><br />interface Node<br />{<br />// NodeType<br />const unsigned short ELEMENT_NODE = 1;<br />const unsigned short ATTRIBUTE_NODE = 2;<br />const unsigned short TEXT_NODE = 3;<br />const unsigned short CDATA_SECTION_NODE = 4;<br />const unsigned short ENTITY_REFERENCE_NODE = 5;<br />const unsigned short ENTITY_NODE = 6;<br />const unsigned short PROCESSING_INSTRUCTION_NODE = 7;<br />const unsigned short COMMENT_NODE = 8;<br />const unsigned short DOCUMENT_NODE = 9;<br />const unsigned short DOCUMENT_TYPE_NODE = 10;<br />const unsigned short DOCUMENT_FRAGMENT_NODE = 11;<br />const unsigned short NOTATION_NODE = 12;<br /><br />readonly attribute DOMString nodeName;<br />attribute DOMString nodeValue;<br />// raises(DOMException) on setting<br />// raises(DOMException) on retrieval<br /><br />readonly attribute unsigned short nodeType;<br />readonly attribute Node parentNode;<br />readonly attribute NodeList childNodes;<br />readonly attribute Node firstChild;<br />readonly attribute Node lastChild;<br />readonly attribute Node previousSibling;<br />readonly attribute Node nextSibling;<br />readonly attribute NamedNodeMap attributes;<br />readonly attribute Document ownerDocument;<br />Node insertBefore(in Node newChild, in Node refChild) raises(DOMException);<br />Node replaceChild(in Node newChild, in Node oldChild) raises(DOMException);<br />Node removeChild(in Node oldChild) raises(DOMException);<br />Node appendChild(in Node newChild) raises(DOMException);<br />boolean hasChildNodes();<br />Node cloneNode(in boolean deep);<br />void normalize();<br />boolean isSupported(in DOMString feature, in DOMString version);<br />readonly attribute DOMString namespaceURI;<br />attribute DOMString prefix;<br />// raises(DOMException) on setting<br />readonly attribute DOMString localName;<br />boolean hasAttributes();<br />readonly attribute DOMString baseURI;<br /><br />// DocumentPosition<br />const unsigned short DOCUMENT_POSITION_DISCONNECTED = 0x01;<br />const unsigned short DOCUMENT_POSITION_PRECEDING = 0x02;<br />const unsigned short DOCUMENT_POSITION_FOLLOWING = 0x04;<br />const unsigned short DOCUMENT_POSITION_CONTAINS = 0x08;<br />const unsigned short DOCUMENT_POSITION_CONTAINED_BY = 0x10;<br />const unsigned short DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC = 0x20;<br /><br />unsigned short compareDocumentPosition(in Node other) raises(DOMException);<br />attribute DOMString textContent;<br />// raises(DOMException) on setting<br />// raises(DOMException) on retrieval<br />boolean isSameNode(in Node other);<br />DOMString lookupPrefix(in DOMString namespaceURI);<br />boolean isDefaultNamespace(in DOMString namespaceURI);<br />DOMString lookupNamespaceURI(in DOMString prefix);<br />boolean isEqualNode(in Node arg);<br />DOMObject getFeature(in DOMString feature, in DOMString version);<br />DOMUserData setUserData(in DOMString key, in DOMUserData data, in UserDataHandler handler);<br />DOMUserData getUserData(in DOMString key);<br />};<br /><br />interface NodeList<br />{<br />Node item(in unsigned long index);<br />readonly attribute unsigned long length;<br />};<br /><br />interface NamedNodeMap<br />{<br />Node getNamedItem(in DOMString name);<br />Node setNamedItem(in Node arg) raises(DOMException);<br />Node removeNamedItem(in DOMString name) raises(DOMException);<br />Node item(in unsigned long index);<br />readonly attribute unsigned long length;<br />Node getNamedItemNS(in DOMString namespaceURI, in DOMString localName) raises(DOMException);<br />Node setNamedItemNS(in Node arg) raises(DOMException);<br />Node removeNamedItemNS(in DOMString namespaceURI, in DOMString localName) raises(DOMException);<br />};<br /><br />interface CharacterData : Node<br />{<br />attribute DOMString data;<br />// raises(DOMException) on setting<br />// raises(DOMException) on retrieval<br /><br />readonly attribute unsigned long length;<br />DOMString substringData(in unsigned long offset, in unsigned long count) raises(DOMException);<br />void appendData(in DOMString arg) raises(DOMException);<br />void insertData(in unsigned long offset, in DOMString arg) raises(DOMException);<br />void deleteData(in unsigned long offset, in unsigned long count) raises(DOMException);<br />void replaceData(in unsigned long offset, in unsigned long count, in DOMString arg) raises(DOMException);<br />};<br /><br />interface Attr : Node<br />{<br />readonly attribute DOMString name;<br />readonly attribute boolean specified;<br />attribute DOMString value;<br />// raises(DOMException) on setting<br />readonly attribute Element ownerElement;<br />readonly attribute TypeInfo schemaTypeInfo;<br />readonly attribute boolean isId;<br />};<br /><br />interface Element : Node<br />{<br />readonly attribute DOMString tagName;<br />DOMString getAttribute(in DOMString name);<br />void setAttribute(in DOMString name, in DOMString value) raises(DOMException);<br />void removeAttribute(in DOMString name) raises(DOMException);<br />Attr getAttributeNode(in DOMString name);<br />Attr setAttributeNode(in Attr newAttr) raises(DOMException);<br />Attr removeAttributeNode(in Attr oldAttr) raises(DOMException);<br />NodeList getElementsByTagName(in DOMString name);<br />DOMString getAttributeNS(in DOMString namespaceURI, in DOMString localName) raises(DOMException);<br />void setAttributeNS(in DOMString namespaceURI, in DOMString qualifiedName, in DOMString value) raises(DOMException);<br />void removeAttributeNS(in DOMString namespaceURI, in DOMString localName) raises(DOMException);<br />Attr getAttributeNodeNS(in DOMString namespaceURI, in DOMString localName) raises(DOMException);<br />Attr setAttributeNodeNS(in Attr newAttr) raises(DOMException);<br />NodeList getElementsByTagNameNS(in DOMString namespaceURI, in DOMString localName) raises(DOMException);<br />boolean hasAttribute(in DOMString name);<br />boolean hasAttributeNS(in DOMString namespaceURI, in DOMString localName) raises(DOMException);<br />readonly attribute TypeInfo schemaTypeInfo;<br />void setIdAttribute(in DOMString name, in boolean isId) raises(DOMException);<br />void setIdAttributeNS(in DOMString namespaceURI, in DOMString localName, in boolean isId) raises(DOMException);<br />void setIdAttributeNode(in Attr idAttr, in boolean isId) raises(DOMException);<br />};<br /><br />interface Text : CharacterData<br />{<br />Text splitText(in unsigned long offset) raises(DOMException);<br />readonly attribute boolean isElementContentWhitespace;<br />readonly attribute DOMString wholeText;<br />Text replaceWholeText(in DOMString content) raises(DOMException);<br />};<br /><br />interface Comment : CharacterData<br />{<br />};<br /><br />interface TypeInfo<br />{<br />readonly attribute DOMString typeName;<br />readonly attribute DOMString typeNamespace;<br /><br />// DerivationMethods<br />const unsigned long DERIVATION_RESTRICTION = 0x00000001;<br />const unsigned long DERIVATION_EXTENSION = 0x00000002;<br />const unsigned long DERIVATION_UNION = 0x00000004;<br />const unsigned long DERIVATION_LIST = 0x00000008;<br /><br />boolean isDerivedFrom(in DOMString typeNamespaceArg, in DOMString typeNameArg, in unsigned long derivationMethod);<br />};<br /><br />interface UserDataHandler<br />{<br />// OperationType<br />const unsigned short NODE_CLONED = 1;<br />const unsigned short NODE_IMPORTED = 2;<br />const unsigned short NODE_DELETED = 3;<br />const unsigned short NODE_RENAMED = 4;<br />const unsigned short NODE_ADOPTED = 5;<br /><br />void handle(in unsigned short operation, in DOMString key, in DOMUserData data, in Node src, in Node dst);<br />};<br /><br />interface DOMError<br />{<br />// ErrorSeverity<br />const unsigned short SEVERITY_WARNING = 1;<br />const unsigned short SEVERITY_ERROR = 2;<br />const unsigned short SEVERITY_FATAL_ERROR = 3;<br /><br />readonly attribute unsigned short severity;<br />readonly attribute DOMString message;<br />readonly attribute DOMString type;<br />readonly attribute DOMObject relatedException;<br />readonly attribute DOMObject relatedData;<br />readonly attribute DOMLocator location;<br />};<br /><br />interface DOMErrorHandler<br />{<br />boolean handleError(in DOMError error);<br />};<br /><br />interface DOMLocator<br />{<br />readonly attribute long lineNumber;<br />readonly attribute long columnNumber;<br />readonly attribute long byteOffset;<br />readonly attribute long utf16Offset;<br />readonly attribute Node relatedNode;<br />readonly attribute DOMString uri;<br />};<br /><br />interface DOMConfiguration<br />{<br />void setParameter(in DOMString name, in DOMUserData value) raises(DOMException);<br />DOMUserData getParameter(in DOMString name) raises(DOMException);<br />boolean canSetParameter(in DOMString name, in DOMUserData value);<br />readonly attribute DOMStringList parameterNames;<br />};<br /><br />interface CDATASection : Text<br />{<br />};<br /><br />interface DocumentType : Node<br />{<br />readonly attribute DOMString name;<br />readonly attribute NamedNodeMap entities;<br />readonly attribute NamedNodeMap notations;<br />readonly attribute DOMString publicId;<br />readonly attribute DOMString systemId;<br />readonly attribute DOMString internalSubset;<br />};<br /><br />interface Notation : Node<br />{<br />readonly attribute DOMString publicId;<br />readonly attribute DOMString systemId;<br />};<br /><br />interface Entity : Node<br />{<br />readonly attribute DOMString publicId;<br />readonly attribute DOMString systemId;<br />readonly attribute DOMString notationName;<br />readonly attribute DOMString inputEncoding;<br />readonly attribute DOMString xmlEncoding;<br />readonly attribute DOMString xmlVersion;<br />};<br /><br />interface EntityReference : Node<br />{<br />};<br /><br />interface ProcessingInstruction : Node<br />{<br />readonly attribute DOMString target;<br />attribute DOMString data;<br />// raises(DOMException) on setting<br />};<br /><br />interface DocumentFragment : Node<br />{<br />};<br /><br />interface Document : Node<br />{<br />readonly attribute DocumentType doctype;<br />readonly attribute DOMImplementation implementation;<br />readonly attribute Element documentElement;<br />Element createElement(in DOMString tagName) raises(DOMException);<br />DocumentFragment createDocumentFragment();<br />Text createTextNode(in DOMString data);<br />Comment createComment(in DOMString data);<br />CDATASection createCDATASection(in DOMString data) raises(DOMException);<br />ProcessingInstruction createProcessingInstruction(in DOMString target, in DOMString data) raises(DOMException);<br />Attr createAttribute(in DOMString name) raises(DOMException);<br />EntityReference createEntityReference(in DOMString name) raises(DOMException);<br />NodeList getElementsByTagName(in DOMString tagname);<br />Node importNode(in Node importedNode, in boolean deep) raises(DOMException);<br />Element createElementNS(in DOMString namespaceURI, in DOMString qualifiedName) raises(DOMException);<br />Attr createAttributeNS(in DOMString namespaceURI, in DOMString qualifiedName) raises(DOMException);<br />NodeList getElementsByTagNameNS(in DOMString namespaceURI, in DOMString localName);<br />Element getElementById(in DOMString elementId);<br />readonly attribute DOMString inputEncoding;<br />readonly attribute DOMString xmlEncoding;<br />attribute boolean xmlStandalone;<br />// raises(DOMException) on setting<br />attribute DOMString xmlVersion;<br />// raises(DOMException) on setting<br />attribute boolean strictErrorChecking;<br />attribute DOMString documentURI;<br />Node adoptNode(in Node source) raises(DOMException);<br />readonly attribute DOMConfiguration domConfig;<br />void normalizeDocument();<br />Node renameNode(in Node n, in DOMString namespaceURI, in DOMString qualifiedName) raises(DOMException);<br />};<br /><br />上面说了，这是标准中的基础部分，而且，也是标准中最重要的部分，实际上，如果你知道了这些接口（再加上这些标准接口跟JavaScript在Browser这个Host中的对象的binging），你就可以进行几乎所有的Browser端编程了。
          <br/>
          <span style="color:red;">
            <a href="http://fixopen.javaeye.com/blog/27877#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 15 Oct 2006 18:10:00 +0800</pubDate>
        <link>http://fixopen.javaeye.com/blog/27877</link>
        <guid>http://fixopen.javaeye.com/blog/27877</guid>
      </item>
      <item>
        <title>JavaScript RegExp</title>
        <author>fixopen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fixopen.javaeye.com">fixopen</a>&nbsp;
          链接：<a href="http://fixopen.javaeye.com/blog/27876" style="color:red;">http://fixopen.javaeye.com/blog/27876</a>&nbsp;
          发表时间: 2006年10月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          上面的描述中，我特意的省略掉了RegExp的具体描述。RegExp就是大名鼎鼎的规则表达式，我准备用一章描述之。<br />规则表达式是用来在文本中进行高效查找和替换的一种语言体系。按照分类，它是正则文法。<br />按照惯例，先说RegExp的literal。<br />/.../...，这就是RegExp的literal，两个斜线中间夹着RegExp的主体内容，后面是可有可无的一些选项。<br />我会先试图描述JavaScript的RegExp的内容和模式，然后描述它的接口和用法。<br />JavaScript的RegExp是经典RegExp的扩充，但完全兼容经典的RegExp，同时，也几乎完全兼容Perl的RegExp。<br />Pattern概述<br />Pattern 就是一系列字符，或者简单的说就是字符串。其中有一些字符是由特殊含义的，另外的是字符本身的原始含义。我举个例子/good/这个pattern其实就是good这个字符序列。而/good./代表的则是good后跟任意一个字符。我们说"."是一个特殊含义的字符，显然，"."代表任意字符，我们需要搞懂的就是所有的这些特殊含义的字符。<br />pattern后面的（也就是第二个/后面）那些叫做pattern的选项，或者叫做pattern的 attribute。attribute有三个：i g m，其含义分别是，不区