<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Mys</title>
    <description>精益求精，开拓创新！</description>
    <link>http://dangzhao.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>对象数据库</title>
        <author>dangzhao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dangzhao.javaeye.com">dangzhao</a>&nbsp;
          链接：<a href="http://dangzhao.javaeye.com/blog/210618" style="color:red;">http://dangzhao.javaeye.com/blog/210618</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-family: Arial;">在20世纪60年代后期引入的面向对象技术引起了一场革命。到20世纪80年代后，面向对象的技术已经成为了行业的主流，其原因多种多样：面向对象不仅简化了界面的开发，而且也提供了一种更加灵活、简单数据处理方法，这种方法从根本上改变了应用程序的构建方法。不再像关系型数据库一样用死板的二维表格来表示数据，对象技术使用类对数据进行描述。一个对象是一个类的实例，就像一颗特定的橡树是橡树类的实例一样。</span></p>
<p><span style="font-family: Arial;">对象技术使用继承方案，使得类是按等级设计的。&ldquo;橡树&rdquo;类能够从更加普遍的类&ldquo;树&rdquo;继承数据结构和数据行为。</span></p>
<p><span style="font-family: Arial;">对象技术能够更好地描述我们所见的世界，面向对象的语言已经被证实在大多数编程领域更加通用。他们使得编程语言更加接近自然语言和多数软件开发领域的主流思想。面向对象是一个新的典范，它的影响将持久而深远。</span></p>
<p><span style="font-family: Arial;">面向对象的特性很快被添加到各种成熟的语言中，并因此成就了一些语言，如C++。新的面向对象的开发环境出现了，包括Visual Basic，Visual C++，PowerBuilder，Delphi，以及Cach&eacute;。尽管面向对象的技术在高级开发环境下受到了广泛支持，它还是需要花一定的时间形成正规的课程。而且还需要花更长的时间来构建一个真正的基于对象的世界&mdash;&mdash;我们目前还没有到达这样一个阶段。</span></p>
<p><span style="font-family: Arial;">万维网上对象技术的发展</span></p>
<p><span style="font-family: Arial;">随着万维网（World Wide Web）转变为交换各种信息的手段，面向对象的编程语言Java成为Web开发者的最爱。基于C++，Java能够用来创建可以在浏览器执行的小程序（Java applets）。</span></p>
<p><span style="font-family: Arial;">Sun为了促进Java的发展免费提供Java环境。在短短几年内，成百上万的Java环境被复制下载，Java渗透到世界的每一个角落。同时Java引发了更多的面向对象语言，如JavaScript，C＃以及Jscript。Internet的发展也培育了一些新的面向对象语言像Perl和PHP。现在的开发者使用面向对象的技术已经是理所当然的了。</span></p>
<p><span style="font-family: Arial;">对象的崛起 </span></p>
<p><span style="font-family: Arial;">对象技术影响了软件开发的各个方面。对象建模已经占领了应用建模的市场，标准UML建模方法独占鳌头。 </span></p>
<p><span style="font-family: Arial;">20世纪90年代，面向对象中间件产品的出现为面向对象的应用提供了安全交流服务。当1998年JMS（Java Messaging Serivce）的出现，使得中间件市场向前跨越了一大步。JMS定义了一整套消息传递的应用编程接口（APIs），使得经认证的J2EE应用必须引入JMS服务器。这进一步强化了标准化进程，大大降低了中间件的费用，提供了编写企业范围基于对象的应用程序平台。</span></p>
<p><span style="font-family: Arial;">XML和Web服务 </span></p>
<p><span style="font-family: Arial;">1998年，HTML，专门用于网页设计的标识语言，经过进一步发展并标准化，创造出了XML（扩展的标识语言）。XML提供了一整套语法，能够用于创建与存储在数据库中定义相似的自定义数据格式，可以。有了XML，程序能够把定义附加在数据上，能够交换数据和数据含义。XML能够使得有特定标准的数据模型（如发票或者购买订单）的定义能够在公司内部或者公司之间进行数据交换。XML引发了Web服务的兴起&mdash;&mdash;在不需要客户定制的情况下，程序能够与其他程序立即交互。现在出现了两种Web服务环境&mdash;&mdash;J2EE和.NET。像SQL一样，XML为程序员提供了获取数据的标准，但XML同时还提供了一种在对象层定义数据的标准语言。XML和对象技术一样迅速成长。结果，数据对象的新标准和基于XML的新的开发产品出现了。 </span></p>
<p><span style="font-family: Arial;">对象数据库&mdash;&mdash;缺失的一环 <br />与软件开发各个环节中对象技术的快速应用形成鲜明对比，对象数据库直到现在才开始逐渐被人们所接受。对象数据的迟缓行动原因有很多。</span></p>
<p><span style="font-family: Arial;">早期的对象语言没有考虑数据存储。程序在内存数据上工作，数据作为文件存储，当程序下次运行时数据也作为文件被读取。这种方法使得应用程序之间不可能共享数据，数据的恢复、管理、扩展几乎不可能。</span></p>
<p><span style="font-family: Arial;">目前在市场上已经有大量的面向对象数据库产品：Versant，Objectivity，ObjectStore，GemStone等等。他们为面向对象的开发环境提供了相应的数据存储。这些产品满足了最初的热情，甚至这些产品被期望能够打造一个新的数据库市场&mdash;&mdash;甚至可能成为市场的领袖。 </span></p>
<p><span style="font-family: Arial;">但不幸的是，这些对象数据库出现时，关系型数据库供应商已经积聚了巨大的动力，并占领了大量市场份额。在标准的SQL接口下，访问关系型数据库的面向对象程序很容易写。相反，多数早期的对象数据完全不提供SQL接口，不适合任何查询应用程序。结果，对象数据库在商业上没有建立坚实的基础。他们在应用领域只创建了一个小市场来管理和存储复杂对象如CAD/CAM，电信业、多媒体、人工智能，模拟金融设备、病人诊治跟踪系统以及科学应用。</span></p>
<p><span style="font-family: Arial;">数据库市场从未特别关注过对象数据库，直到对象定义语言XML出现，这种情况才有所改变，促进了对象数据库的再次呈现，因为他们管理XML定义的数据是最合适的。使用XML，必然会提高存储复杂数据的需求，将进一步引发对象数据库的复苏。</span></p>
<p><span style="font-family: Arial;">03年9月份InfoWorld公布了一项开发员调查，其中有一个惊奇的结果，89.2％的被调查者说他们使用关系型数据库，52％的被调查者说他们使用面向对象或者XML数据库。当问及有关存储数据的类型时，40.2％的人说他们存储持久的对象，58.9％的人说他们存储XML数据，89％的人说他们存储关系型数据。Baroudi Bloor相信对象数据库比我们想象的用的更加广泛，随着需求的激增，将进一步扩大市场份额。 </span></p>
<p><span style="font-family: Arial;">InfoWorld的调查还显示了面向对象的语言是新应用开发的主流选择。我们相信这些统计数字反映了当今开发员面临的困境。他们需要与他们一直使用的面向对象语言有更好协调性的数据库，但他们有需要关系型数据库所提供的查询能力。</span></p>
<p><span style="font-family: Arial;">关系型数据库&mdash;&mdash;另一半是如何存在的<br />只要有程序，就会有数据。IT行业最早具有商业价值之一的就是数据管理。自动的数据管理意味着业务能够扩展、具有竞争力，没有它就不可能。所以毫无疑问机智的商业技术员很早把目光聚集在数据管理市场。在对象数据库产生之前的20年，E.F Codd博士提出的关系型理论找到了出路，开发出商业的关系型数据库产品。在80年中期，在IT领域有一个宗教式的信仰，认为数据的所有理论问题都已经解决，实践的问题也会随之解决。然而，很明显，事实并不是这样。</span></p>
<p><span style="font-family: Arial;">关系型数据库把数据存储在简单的两维表中，这是一种表达大量数据的有效方法，而且程序员也易于理解。关系型数据库使用SQL建立了一种标准的数据访问语言。关系型数据库有一个逻辑和物理形式清楚的结构，这种结构使得应用程序对数据结构是透明的，而且在很多商业应用程序中工作的很好。</span></p>
<p><span style="font-family: Arial;">然而，关系理论的基础之一是数据和使用数据的程序能够而且应该是相互独立的。这与对象技术的整个理念是不一致的。对象技术鼓励设计者使用对象而不是表来思考数据。对象和使用对象的方法是不可能彼此分开的。</span></p>
<p><span style="font-family: Arial;">如果把汽车作为一个复杂的对象来考虑。当你使用汽车时，你使用一辆完整的汽车，作为一个东西&mdash;&mdash;一个对象来使用。与汽车相联系的有很多动作（也就是面向对象术语中的方法）。你驾驶汽车，进行换档，发信号，开车灯，等等。如果汽车是一个对象，这些动作就是对象的方法，他们对汽车而言是基础性的。这些动作独立于汽车的想法是荒唐的。当你把你的车停在车库，你把它作为一个东西来存储。而不是分别在车库中的某些地方存放方向盘，转换器，信号器，车灯。数据和它相对应的处理过程也不能而且也不应该被隔离开来。在对象数据库中他们是不分开的。</span></p>
<p><span style="font-family: Arial;">事实上，这两种观点各有优缺点。有些处理过程确实是独立于数据的。尤其是访问大量数据的查询操作。简单的查询就是根据一些标准来选取数据，而不关心数据是什么，也不用关心数据是如何被组织的，只要它能快速的被取出就可以了。查询是独立于数据的，但对象方法则不是。 </span></p>
<p><span style="font-family: Arial;">关系型数据库的局限性</span></p>
<p><span style="font-family: Arial;">关系型数据库有比我们想的更多的局限性。存储和表示一些相当普通的数据结构也是非常困难的。试想一条公交线路&mdash;&mdash;简单，有序的一组站点。关系型数据库以无序的方式存放表，只有创建一个特殊的索引，才能提取有序的数据。对象数据库就没有这个问题，它有有序的数组，不需要索引&mdash;&mdash;这种索引是因为关系数据结构的局限性而要求创建的人工索引。</span></p>
<p><span style="font-family: Arial;">另一个简单的例子是产品用料单&mdash;&mdash;在制造系统中记录一个产品和它的组件。组件自身也许还有组件，组件的组件还有组件，以此类推。一个关系型数据表不能表达这种部件与部件的部件之间的关系。而这些关系却是重要的数据。查询一个产品数据库，它的所有组件应该是一目了然的。关系型数据库结构使得开发员花费很多的工作来回答这种简单的查询，非常的复杂、困难。与这个例子类似的例子：地图和它的路、河、路标；网站和它的页面、链接以及图像。实际上，搜集的信息越复杂，等级层次和交叉层次就越多，在简单二维表的关系型数据库就越不可能表达清楚。对象数据库没有这样的限制，事实上，他们就是为了解决这个问题而设计的。 </span></p>
<p><span style="font-family: Arial;">虽然关系型数据库发展成熟，在这十年中发展也非常迅猛，但我们还听到一些项目因为所使用的关系数据的性能不是很好而导致失败。通常，是因为关系型数据库物理上存储数据的方法导致的。对开发员而言，为了集合他们所需的数据，他们常常不得不进行这个表与另一个表联接，再与另外的表联接，然后再与另一个表联接。为了提取数据，数据库运行优化程序来判断提取数据的最好方法，然后再提取数据。这样的处理常常要花费很长的时间，结果就大大影响了性能。尽管关系型数据库优化器已经改善了运行时间，但他们还需要比对象数据库更多的处理时间。 </span></p>
<p><span style="font-family: Arial;">关系型数据库和&ldquo;阻抗不匹配&rdquo;障碍</span></p>
<p><span style="font-family: Arial;">关系型数据的一个问题是他们所使用的基本数据结构是一种二维形式的表。在关系理论中，数据应该被组织成规范的表&mdash;&mdash;也就是数据应该按唯一的方式组织，使得程序员能够消除冗余，确保数据变化的一致性。这种设计技术的引入确保了关系表中的数据是一组独立的、通过键相关的数据。这种技术来自集合论的数学理论，但问题是集合论不能表达数据之间所有的关系和结构。</span></p>
<p><span style="font-family: Arial;">以规范的方式存储数据常常要求程序员在存入数据库之前分解对象，并且重新组织数据，但要使用它是，在使用SQL查询（多重连接）。就像在车库中存储车时，你把它的门、椅子、轮子等等分别卸下来存放。这是非常耗时的，而是也是没有任何意义的。</span></p>
<p><span style="font-family: Arial;">但面向对象的语言占主导地位时，问题就越发明显了。这个问题通常被称为对象－关系不匹配障碍。这个问题是由于面向对象语言和关系型数据库使用语言的方法不同导致的，结果这个问题只能有程序员自己来解决。事实上，大多数关系型数据库在使用的时候并不是完全规范的，但即使是这样，不匹配问题还是发生，对编程人员的工作造成了很大的困难。我们可以估计使用关系型数据库的面向对象开发员25％到40％的时间用于编写代码来解决对象与关系表的匹配问题。</span></p>
<p><span style="font-family: Arial;">也许这个根本性困难产生了对对象数据的强烈需求，但多数对象数据库也有一个很大的问题：他们对SQL的支持很少。而许多软件工具需要SQL接口，尤其是商业智能应用。甚至有SQL接口的对象数据库也不能创建用于管理商业智能应用所产生的这类查询机制。 </span></p>
<p><span style="font-family: Arial;">对象－关系数据库</span></p>
<p><span style="font-family: Arial;">关系型数据库的供应商并没有忽视对象的出现。显然，规范复杂数据是没有意义的。举个极端的例子，如果你要规范一个位图形式的图像&mdash;&mdash;是一系列的象素表示的&mdash;&mdash;你最终要得出一个表，这个表的行是象素，并且主键的属性反映他们的顺序。很明显最好是把这个数据作为一个对象来存储。</span></p>
<p><span style="font-family: Arial;">他们提出了&ldquo;对象－关系&rdquo;数据库的创意，这个创意中保留了关系型数据库的结构，但允许关系表中的列含有一个复杂的对象。这些对象能够捆绑处理复杂数据的处理过程（一种存储过程）。并且SQL能够允许调用与关系型等同的&ldquo;对象方法&rdquo;。</span></p>
<p><span style="font-family: Arial;">这种方法是对数据关系理论的一种嘲弄，事实上，它完全忽略了这个理论，但又允许复杂数据（地图，矢量图，图表，甚至整个表格）被定义为一个项目存放在关系结构中。因此，这些功能被实现并商品化。Informix称它的嵌入过程为DateBlades，Oracle称之为Cartridges。 </span></p>
<p><span style="font-family: Arial;">对象－关系数据库成为存储数据时对象数据库的一种替代方案，但根本的问题它并没有解决。对象－关系数据库还是受不匹配障碍的困扰。</span></p>
<p><span style="font-family: Arial;">对象数据库与关系型数据库<br />实践中，对象数据库相对于关系数据库有显著的优势。</span></p>
<p><span style="font-family: Arial;">他们能更快的运行事务处理程序 <br />他们能够更有效的处理对象 <br />他们能够提供更好的开发效率 <br />他们能够管理更容易 <br />在一些例子中，因为是性能方面的原因，用对象数据库能够替代关系型数据库。在不能存储复杂对象的大规模的业务处理程序中确实是这样的&mdash;&mdash;也许有些人会认为这个必然是关系型数据库的领地。 </span></p>
<p><span style="font-family: Arial;">对象数据库最大的性能优势是他们不必像关系型数据库一样在数据使用之前先连接数据。他们就以使用数据的方式存储数据，这就大大提高了性能。对象数据库能够使用缓存技术，这样就使得在请求数据时数据就已经存放在内存中了。对象数据库在抽取数据时几乎不需要进行优化。 </span></p>
<p><span style="font-family: Arial;">但开发一个新的系统，处理复杂数据如文档、复杂图表、网页、多媒体等的需求不断增长时，这些需求对象数据库可以很好的满足。 </span></p>
<p><span style="font-family: Arial;">当今面向对象的前景 <br />在软件开发的各个方面使用对象技术的人群都在不停地增长。甚至在最后一个领域&mdash;&mdash;数据库&mdash;&mdash;尽管对象数据库还没有取代关系型数据库，这种增长也是十分显著的。InfoWorld报告说52%的开发员在使用对象数据库或者XML数据库（通常也是一种对象数据库）。还有一些选择混合形式的数据库，这种数据库能比较容易地使用对象结构。随着新应用程序开发过程中Web接口成为一个必不可少地部分，Web服务成为应用系统交互地一种可行的机制，构建一个面向对象的世界似乎是当今的现实。</span></p>
<p><span style="font-family: Arial;">03年9月的InfoWorld调查也显示了使用面向对象语言的程序员几乎无处不在。事实上，尽管有些人宣称使用C语言，但是面向对象的语言还是成为当今90％的程序员的选择。调查也显示了程序员比较喜欢基于Web的应用，易用的对象编程和脚本语言。随着越来越多的有着正规培训的软件工程师进入市场，面向对象技术将成为新应用开发的唯一选择。 </span></p>
<p><span style="font-family: Arial;">结论 <br />也许关系型数据库将继续领导数据库市场，而对象数据库在市场上只占有一席之地。也许对象数据库将进一步提升市场份额，因为他们能够处理当今使用的复杂的数据。然而，我们认为还有其他的可能：数据库技术可能发展出一种真正的混合型产品，这种产品能提供关系接口和对象接口双重优势。我们知道这是有可能的。事实上，至少有一种产品，来自InterSystems的Cach&eacute;，就是这样一个产品。（Cach&eacute;数据库，描述他自己时，既不是说是关系型的，也不是说是对象的，而是后关系型数据库）。数据库供应商&mdash;&mdash;不管他们的产品是属于关系型还是对象型&mdash;&mdash;都会朝着这个方向前进的。</span></p>
<p><span style="font-family: Arial;">这种混合产品的方法包括给数据库提供一个映射层，程序员通过映射层访问数据库。映射层应该基于开发的标准以解决不匹配障碍问题。数据库的调用能够用SQL完成，也可以直接请求对象类或者类的集合。映射层能够把这些调用转换为对数据库的物理数据请求以抽取数据。这种方法将消除不匹配的障碍。</span></p>
<p><span style="font-family: Arial;">改变任何一种数据类型都是非常大的挑战。对象数据库需要快速索引能力，以从庞大的数据集中抽取数据。在这方面做得比较好的关系型数据库使用位图索引技术，但数据一旦更新，这些索引就需要重新建立。因为这个原因，很少有对象数据有这个功能。对关系数据库而言，他们需要提供更加灵活的物理数据结构。在发展过程中，关系型数据库倾向于在物理层使用表。他们需要放弃这种不灵活的限制，允许存储多种数据结构。数据库使用者将获得最大的收益。试想把对象数据库的优势和关系型数据库的优势整合在一起：</span></p>
<p><span style="font-family: Arial;">好的处理性能 <br />复杂数据管理 <br />管理简便 <br />快速开发 <br />灵活的查询功能 <br />标准的数据访问接口 <br />更好地适用于商业智能应用 <br />这种混合产品使使用一个数据库引擎成为可能，并且所有应用只有一个数据定义集。Baroudi Bloor相信企业界需要混合式的数据库产品。供应商们必须放弃他们对关系数据库宗教式的倾向，转向更具优势的混合式的数据库，否则的话他们将陷于COBOL以及打孔卡片的深渊而不能自拨。</span></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://dangzhao.javaeye.com/blog/210618#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jul 2008 14:54:11 +0800</pubDate>
        <link>http://dangzhao.javaeye.com/blog/210618</link>
        <guid>http://dangzhao.javaeye.com/blog/210618</guid>
      </item>
      <item>
        <title>内存数据库</title>
        <author>dangzhao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dangzhao.javaeye.com">dangzhao</a>&nbsp;
          链接：<a href="http://dangzhao.javaeye.com/blog/210617" style="color:red;">http://dangzhao.javaeye.com/blog/210617</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="a14"><strong>由于把大多数数据都放在内存中进行操作，使得内存数据库有着比磁盘数据库高得多的性能表现，这一特点非常契合电信企业运营支撑系统对实时性的要求。</strong> </p>
<p class="a14">电信业的竞争正在全方位地展开，这种竞争必然带来新的价值链模式以及新的计费方式，这些变化对目前的电信运营支撑系统是一个挑战。比如，多种业务的计费环节将不再是单一的按照时长或通信距离收取费用，而可能是根据时长、内容、使用量等多种参数的组合计费。为了应对这些挑战，电信企业先后引入了内存数据库，以提高后台数据管理的实时性、精确性和灵活性。 </p>
<p class="a14">内存数据库 </p>
<p class="a14">内存数据库，顾名思义就是将数据放在内存中直接操作的数据库。相对于磁盘，内存的数据读写速度要高出几个数量级，将数据保存在内存中相比从磁盘上访问能够极大地提高应用的性能。同时，内存数据库抛弃了磁盘数据管理的传统方式，基于全部数据都在内存中重新设计了体系结构，并且在数据缓存、快速算法、并行操作方面也进行了相应的改进，所以数据处理速度比传统数据库的数据处理速度要快很多，一般都在10倍以上。内存数据库的最大特点是其&ldquo;主拷贝&rdquo;或&ldquo;工作版本&rdquo;常驻内存，即活动事务只与实时内存数据库的内存拷贝打交道。显然，它要求较大的内存量，但并非任何时刻整个数据库都存放在内存，即内存数据库系统还是要处理I/O。 </p>
<p class="a14">尽管内存数据库已不是传统磁盘数据库的概念，但是内存数据库本质上还是数据库，它也具有一般数据库的基本功能: </p>
<p class="a14">■ 永久数据的管理，包括数据库的定义、存储、维护等; </p>
<p class="a14">■ 完成各种数据操作，如查询处理、存取、完整性检查; </p>
<p class="a14">■ 事务管理，包括调度与并发控制等; </p>
<p class="a14">■ 对存取的控制和安全性检验; </p>
<p class="a14">■ 具有数据库的可靠性恢复机制。 </p>
<p class="a14">相对于利用程序开发手段调用内存处理来说，内存数据库自有其优势。首先，内存数据库是产品化的数据库管理软件，极大缩短了开发周期; 其次，内存数据库有着开放的平台和接口，程序开发和移植更加灵活便捷，也便于维护和二次开发; 第三，可以通过使用统一的SQL语言方便地查询内存中的数据; 最后，能在数据库中保障数据的安全性和完整性。这些优势，对于快速部署和简化维护都是有利的。 </p>
<img src="http://dangzhao.javaeye.com/admin/blogs/pic/b06_3t2.jpg" alt="" />
<p class="a14">但内存数据库也有其不可避免的缺点，比如: 不容易恢复，内存数据库中的数据不总是永久的，为了保证实时，也不一定是一致和绝对正确的，有的是短暂的，有的是暂时不一致或非绝对正确的。 </p>
<p class="a14">电信企业一直是内存数据库的主要用户，近几年来，随着计算机硬件技术的飞速发展、内存容量的提高、价格下跌以及计算机进入64位时代操作系统后可以支持更大的地址，为内存数据库的实现提供了可能。目前内存数据库在电信行业的应用也日趋成熟，已有超过90G的电信系统案例，能自动扩展内存空间，不需要重启数据库，提供ESOL自定义存储过程，支持多线程，开发效率高，程序移植容易等等。下面以两个例子来介绍内存数据库的应用。 </p>
<p class="a14">电信计费数据的加载 </p>
<p class="a14">电信的二次批价和实时累账是计费系统中的两个必备功能。所谓二次批价是相对于一次批价来说的。一次批价是按照国家标准资费来进行价格计算，比如: 全球通每分钟本地通话为0.4元，在一次批价完成后，会根据这个用户的套餐进行再一次的计算。以北京全球通用户接听4分钟的电话为例，一次批价完成后，这条话单的价格是1.6元，如果这个用户参加了10元包月接听套餐，那么在二次批价后，这次通话的费用就为0元。一次批价是用于各大运营商之间结算的，而二次批价是针对用户个人的。 </p>
<p class="a14">实时累账是将用户从每月1号到目前为止的所有费用累加起来，也就是用户目前可以通过10086查到截止到前一天的实时话费。累账值可以帮助用户控制高额话费或是供用户即时查询消费信息。 </p>
<p class="a14">二次批价和实时累账过程涉及用户资料、用户套餐等与用户相关的信息，电信支撑系统在开始批价时必须加载这些数据。稍大一点的省级运营商的这些数据就会超过1000万条，计费处理模型也由于套餐的组合、产品的组合以及不同的优惠规则变得相当复杂，加载这部分数据对系统而言是一笔不小的开销，这就使得现在的计费处理速度比较慢，而且很难做到对数据的实时更新。内存数据库的引入在一定程度上解决了这个问题。 </p>
<p class="a14">在计费二次批价过程中数据量最大的是详单数据，这部分数据不用放在内存数据库中，每处理完一个话单文件或达到设定的提交记录数时直接操作磁盘数据库，不会影响系统性能。最急切的是将用户资料、套餐、营业套餐和计费套餐对应关系数据、计费套餐模型数据及用户累计数据放到内存数据库中，这部分数据查询操作远比数据新增和更新操作要频繁。除了这些数据外，当然还有应用需要的其他数据也都可以加载到内存数据库。 </p>
<p class="a14">在采用内存数据库后，用户通过营业部或客户查询实时话费的时候完全可以做到实时，比目前只能提供查询到前一天的实时话费在业务上有了质的飞跃。因为系统在处理这部分数据时查询流程和以前的完全一样，但系统省去了以往内存中的数据和磁盘数据库数据同步的环节，所以就能做到了实时查询。对于信控来说也同样，以往系统在累完账后要按照一定周期刷新信控数据，这就存在一个时间差，不能够完全做到实时。 </p>
<p class="a14">而采用内存数据库后，信控可以直接取得内存数据库中的实时话费累计表中的数据，完全实现实时预警、停机。二次批价和累账中采用内存数据库后，对防欺诈、收入保障系统也有相当大的好处，这样能够充分保证运营商的切身利益。 </p>
<p class="a14">另外，在采用内存数据库后，整体提高了系统批价、累账的处理速度，大大缓解访问磁盘数据库的压力，提高数据查询、修改、删除的效率，也为后付费和预付费的融合提供了可能。 </p>
<p class="a14">电信计费数据的同步 </p>
<p class="a14">电信营业数据和计费系统中的数据总是在不断的变化中，这就涉及内存数据库中的数据和磁盘数据库数据的同步问题（为了描述清楚，这里的磁盘数据库以Oracle DB为例来说明）。数据同步包括两部分: 从内存数据库到Oracle DB数据同步和从Oracle DB到内存数据库的同步。 </p>
<p class="a14">1. Oracle DB到内存数据库同步 </p>
<p class="a14">这部分数据同步采用增量表的方式，营业系统或CRM新增或更新的数据将生成到Oracle的增量表中，计费后台程序先到这些增量表中查询数据。如果能在这些增量表中查到数据就把这些数据更新到内存数据库对应表中，如果查不到，就直接从内存数据库中直接查询，从而保证了数据的完整性和实时性。由于增量表的数据量一般会很小，所以这部分操作不会影响系统的性能。 </p>
<p class="a14">2. 内存数据库到Oracle DB同步 </p>
<p class="a14">由于Oracle的计费后台批价、累账数据几乎都加载到了内存数据库中，所以Oracle数据库对应的数据表将主要用于对内存数据库的数据备份。 </p>
<p class="a14">用户最新的实时话费等信息都保存在内存数据库中，实时话费查询将直接连接到内存数据库中查询，保证用户得到最新的费用信息。信控也直接从内存数据库查询数据，因此对Oracle中的这部分数据已经没有实时性的要求。这时内存数据库到Oracle的同步可以由应用程序生成文件，定时地往Oracle数据库中同步备份，或者采用Oracle 存储过程在系统相对空闲时间段进行数据导入就可以了。 </p>
<p class="a14">总体而言，由于市场与技术的快速发展，电信业务在不断扩充，其运营和管理不断优化，传统的一些支撑系统的架构已经逐渐不能满足日益增长的业务要求和客户需求，引入一些新的技术来解决我们生产中遇到的问题是必然的。比如采用内存数据库来代替以前的共享内存技术，使得原来在内存中不标准的东西，包括接口、格式和管理都标准化了。 </p>
<p class="a14">内存数据库只是多种新技术中有代表性的一种而已，只要解放思想、选用得当，完全可以在投入不大的情况下克服系统中的瓶颈，以最小的代价获得最大回报。 </p>
<p class="a14">二次批价内存数据操作流程图 </p>
<p class="a14">链接一:内存数据库与传统数据库的异同 </p>
<p class="a14">传统的数据库系统是关系型数据库，开发这种数据库的目的，是处理永久、稳定的数据。关系数据库强调维护数据的完整性、一致性，但很难顾及有关数据及其处理的定时限制，不能满足工业生产管理实时应用的需要，因为实时事务要求系统能较准确地预报事务的运行时间。 </p>
<p class="a14">对磁盘数据库而言，由于磁盘存取、内外存的数据传递、缓冲区管理、排队等待及锁的延迟等使得事务实际平均执行时间与估算的最坏情况执行时间相差很大，如果将整个数据库或其主要的&ldquo;工作&rdquo;部分放入内存，使每个事务在执行过程中没有I/O，则为系统较准确估算和安排事务的运行时间，使之具有较好的动态可预报性提供了有力的支持，同时也为实现事务的定时限制打下了基础。这就是内存数据库出现的主要原因。 </p>
<p class="a14">内存数据库所处理的数据通常是&ldquo;短暂&rdquo;的，即有一定的有效时间，过时则有新的数据产生，而当前的决策推导变成无效。所以，实际应用中采用内存数据库来处理实时性强的业务逻辑处理数据。而传统数据库旨在处理永久、稳定的数据，其性能目标是高的系统吞吐量和低的代价，处理数据的实时性就要考虑的相对少一些。实际应用中利用传统数据库这一特性存放相对实时性要求不高的数据。 </p>
<p class="a14">在实际应用中这两种数据库常常结合使用，而不是以内存数据库替代传统数据库。 </p>
<p class="a14">链接二:几款内存数据库产品 </p>
<p class="a14">■ Oracle TimesTen </p>
<p class="a14">Oracle TimesTen是Oracle从TimesTen公司收购的一个内存优化的关系数据库，它为应用程序提供了实时企业和行业（例如电信、资本市场和国防）所需的即时响应性和非常高的吞吐量。Oracle TimesTen可作为高速缓存或嵌入式数据库被部署在应用程序层中，它利用标准的 SQL 接口对完全位于物理内存中的数据存储区进行操作。 </p>
<p class="a14">■ Altibase </p>
<p class="a14">Altibase是一个在事务优先的环境中提供高性能和高可用性的软件解决方案。它提供高性能、容错能力和事务管理能力，特别适合通信、网上银行、证券交易、实时应用和嵌入式系统领域。Altibase能够最大限度地发挥数据库服务系统的潜力，增强数据服务器的处理能力。Altibase支持客户端/服务器架构或嵌入式架构。其中客户端/服务器架构非常适合一般的应用。而嵌入式架构将应用程序嵌入到数据库服务器，适合于有高时效要求的实时系统。 </p>
<p class="a14">■ eXtremeDB </p>
<p class="a14">eXtremeDB实时数据库是McObject公司的一款特别为实时与嵌入式系统数据管理而设计的数据库，只有50K到130K的开销，速度达到微秒级。eXtremeDB完全驻留在主内存中，不使用文件系统（包括内存盘）。eXtremeDB采用了新的磁盘融合技术，将内存拓展到磁盘，将磁盘当做虚拟内存来用，实时性能保持微秒级的同时，数据管理量在32BIT下能达到20G。 </p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://dangzhao.javaeye.com/blog/210617#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jul 2008 14:52:16 +0800</pubDate>
        <link>http://dangzhao.javaeye.com/blog/210617</link>
        <guid>http://dangzhao.javaeye.com/blog/210617</guid>
      </item>
      <item>
        <title>Hibernate、内存数据库和对象数据库</title>
        <author>dangzhao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dangzhao.javaeye.com">dangzhao</a>&nbsp;
          链接：<a href="http://dangzhao.javaeye.com/blog/210615" style="color:red;">http://dangzhao.javaeye.com/blog/210615</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p>Hibernate是面向对象应用和关系数据库间的桥梁，这种作用将随着对象数据库的广泛应用而消失。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>不可忽视Hibernate在一定程度上起到了换存数据的作用，类似内存数据库的作用。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://dangzhao.javaeye.com/blog/210615#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jul 2008 14:49:40 +0800</pubDate>
        <link>http://dangzhao.javaeye.com/blog/210615</link>
        <guid>http://dangzhao.javaeye.com/blog/210615</guid>
      </item>
      <item>
        <title>JavaScript继承</title>
        <author>dangzhao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dangzhao.javaeye.com">dangzhao</a>&nbsp;
          链接：<a href="http://dangzhao.javaeye.com/blog/208228" style="color:red;">http://dangzhao.javaeye.com/blog/208228</a>&nbsp;
          发表时间: 2008年06月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&lt;html&gt;<br />&lt;head&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;<br />&lt;title&gt;Insert title here&lt;/title&gt;<br />&lt;script type="text/javascript"&gt;<br />/*People Class*/<br />var People=function(height,weight){<br />&nbsp;this.height=height;<br />&nbsp;this.weight=weight;<br />};<br />People.prototype.say=function(){<br />&nbsp;return "Hi,My Height "+this.height+"cm &amp; Weight "+this.weight+"kg.";<br />};<br />/*Man Class*/<br />var Man=function(height,weight){<br />&nbsp;this.height=height;<br />&nbsp;this.weight=weight;<br />};<br />Man.prototype.say=People.prototype.say;<br />Man.prototype.manSay=function(){<br />&nbsp;return "I am Man!"+"&nbsp; "+this.say();<br />};<br />/*Test*/<br />var p=new People(170,160);<br />alert(p.say());<br />var man=new Man(175,165);<br />alert(man.say());<br />alert(man.manSay());</p>
<p><br />&lt;/script&gt;<br />&lt;/head&gt;<br />&lt;body&gt;</p>
<p>&lt;/body&gt;<br />&lt;/html&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>可能说这是JavaScript继承不太准确，但本人认为这种方式可以实现继承类似的功能。</p>
          <br/>
          <span style="color:red;">
            <a href="http://dangzhao.javaeye.com/blog/208228#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 26 Jun 2008 14:25:04 +0800</pubDate>
        <link>http://dangzhao.javaeye.com/blog/208228</link>
        <guid>http://dangzhao.javaeye.com/blog/208228</guid>
      </item>
      <item>
        <title>Webservice 的设计和模式 </title>
        <author>dangzhao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dangzhao.javaeye.com">dangzhao</a>&nbsp;
          链接：<a href="http://dangzhao.javaeye.com/blog/200773" style="color:red;">http://dangzhao.javaeye.com/blog/200773</a>&nbsp;
          发表时间: 2008年06月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Webservice 作为一项新的技术出现在我们面前，它的出世是用于解决在不同的平台下的应用的协同的。目前几乎每家厂商都要去开发Webservice 应用，然而如果缺乏对Webservice更深的了解，不能很好的在设计阶段处理好一些重要的问题，那么最终完成的系统必然是效率低下，没有可靠性的产品。 </p>
<div>&nbsp;</div>
<div>在设计Webservice 应用时，以下几点务必要考虑到：</div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>管理好与外系统的协同关系</strong></div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>掌握底层的传输模型</strong></div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>提供与应用相适应的安全策略</strong></div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>计划好部署的相关事项</strong></div>
<div>&nbsp;</div>
<div>以下，将就这几条相关的设计需求和一些常用模式是如何应用于Webservice模型展开详细讨论。在讨论中，你会发现Webservice这项新的技术是如何与我们在以往的软件开发相结合的。</div>
<div><strong>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 标准提供了协同的能力</strong></div>
<div>
<div>Webservice的一个最基本的目的就是提供在各个不同平台的不同应用系统的协同工作能力。</div>
<div>为了使得一个公司的网络应用达到最高的效率，存在它自己和它的合作伙伴，供应商以及客户之间的Webservice，应该能够实现无缝的交互。如果在众多的Webservice之间不能轻松的实现交互，那么该应用的效率将大打折扣。但是，在现实中这种情况是极有可能出现的。由于各个公司对业务的理解各不相同，就是理解相同的情况下，对于相同的概念也可能用不同的形式加以表现，具体而言就是对于同一数据可能采取不同的xml表示。由于以上的原因，对于协同性的问题应该在设计应用架构时就加以考虑，而不是留待以后去改变。</div>
<div>
<div>Webservice 主要由以下几块技术所构成，SOAP (Simple Object Access Protocol), WSDL (Web service Description Language), 以及UDDI (Universal Description, Discovery and Integration)。</div>
<div>&nbsp;</div>
<div>在这里我们不会去详细研究这些技术，而是揭示他们的一些重要特性，这些特性需要在Webservice的设计时详加考虑。</div>
<div>&nbsp;</div>
<div>WSDL是实现协同能力的关键，它提供了一份契约用于与新老的应用之间交互。这项技术使得各个组织可以将标准的制定集中在Service的外部接口，而不用考虑各组织的具体实现。简而言之，它实现了Webservice的接口与实现的分离。从而使得标准的制定，更加容易。并且，基于这份接口描述，很多工具可以从中自动生成客户端代码，减少了开发者的工作量，并使得大部分开发者摆脱了编写SOAP消息传递代码过程。</div>
<div>&nbsp;</div>
<div>SOAP是实现在各个Webservice组件之间传递消息的传输层。因此，SOAP应该是一项透明的协同技术。但是，由于很多的SOAP实现方法却与标准背道而驰，要么添加了新的扩展功能要么删减了一些标准功能。由于对SOAP标准的支持程度不同，使得Webservice的协同能力大打折扣，实现协同的困难加大了。基于这种情况，当开发者需要Webservice运行在不同平台上时，就要对具体情况加以了解并相应的编码以解决这种不一致性。如果所有的SOAP实现组织都能够遵循标准的话，那么Webservice的开发者就不需要考虑使用该Webservice的底层平台了。</div>
<div>&nbsp;</div>
<div>尽管如此，不同SOAP实现的协同还是相当困难，因为协同标准的制定存在大量的分歧，目前一些组织正致力于标准的制定，比如<a href="http://www.soapbuilders.org/"><span style="color: #1d58d1;">SOAP Builders</span></a> 和 <a href="http://www.ws-i.org/"><span style="color: #1d58d1;">WS-I</span></a>。然而，现在Webservice开发者只有针对不同平台，给予不同的实现，使得开发的成本和负担加大了。 </div>
<div>&nbsp;</div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 理解传输模型</div>
<div>&nbsp;</div>
<div>SOAP并不是完全透明的解决方案，它把一些复杂的实现细节隐藏起来。Webservice的开发者必须深入的了解SOAP，了解底层的传输机制以及模型,从而知道SOAP是如何实现的。在一些简单的应用中，某些工具可以帮助Webservice的开发者生成SOAP消息传递的代码，但是这只在最简单的应用中有效。真正的情况不可能那么简单，可能在某些方面你需要有特殊的处理（这种情况在实际开发中是很常见的），这个时候，你就需要直接操纵SOAP的消息传递代码，以及一些底层的XML内容。因此，Webservice的开发者需要深入了解SOAP和XML层的内容。</div>
<div>&nbsp;</div>
<div>在开发Webservice的接口的时候，不要以为使用XML技术，协作性的问题就迎刃而解了，XML并不是解决集成问题的灵丹妙药。这里同样需要标准的制定，需要一个在业界公认的词汇表。仅仅在你的设计框架中引入XML技术并不能保证系统具有协同性，XML仅仅是用来描述数据的语言，XML自己并不提供语义去理解数据。就如同英语和德语都使用拉丁字母，但是他们的语义却并不相同。</div>
<div>&nbsp;</div>
<div>即使你使用相同的语言，也不能保证具有良好的协作性。比如你的公司可能使用Order描述一个订单，但你的合作伙伴可能使用Purchase_Order，而另一个伙伴可能又不相同。你不可能强迫你所有的合作伙伴都采用和你相同的词汇。因此需要有一项技术可以在众多的描述之间充当翻译的角色。XSLT就是这么一种技术，它用于不同语言的转换。和XSLT的配合使用XML才能解决协同性的问题。</div>
<div>&nbsp;</div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM vs. SAX</div>
<div>许多的Webservice开发环境，将开发者从底层的XML文档的解析和处理中解放出来，他们提供了自动化或者很方便的工具，使得这一过程变得很简单。但是对于一些有特殊要求的Webservice应用，比如需要更好的柔性或者对速度要求特别高的应用，就需要手工处理XML文档。这时候两种XML解析的模型－DOM 和SAX的选择，将成为重要的问题。</div>
<div>&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div>DOM使用树状图的方式解析XML文档，而SAX则更多的采用事件驱动的模型。</div>
<div>&nbsp;</div>
<div>DOM先将XML文档映射成一颗树，然后通过采用一系列与树相关的操作去处理这份文档。这种方法有很多的好处，首先开发者很容易理解，使用一颗树这对于开发者来说是最常见不过的了。DOM最常用于XML在Service中需要频繁修改的场合。当然DOM也有它的缺点，在处理XML文档的时候，它需要载入整个文档，而不管你需要修改的是否只是其中的一小部分。因此它的运行效率以及对内存的使用显然是不能接受的，尤其是面对很大的XML文档。</div>
<div>SAX使用事件驱动的模型来处理XML文档。通过一系列事件的触发，来完成对XML的解析，你可以只关心你所要处理的事件，当这些事件发生时，会调用到相应的回调函数来通知到你。采用这种方式就可以在很大程度上提高XML文档解析的效率。但是它的缺点在于难于使用，以及对同一文档的多次处理会存在一些问题。</div>
<div>总而言之，DOM更适合处理那种文档型的XML文件，而SAX则适于那种想直接将XML结构映射成在你系统中的一个对象的操作。（比如将一个XML结构直接映射成JAVA中的一个Class）或者那种针对XML文件中特殊Tag的操作。</div>
<div>&nbsp;</div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文档交换vs. RPC模型</div>
<div>这两种交互方式应该在应用架构的设计初始就应该详加考虑，因为它将在很大程度上决定系统的耦合程度。</div>
<div>RPC（Remote Procedure Call）本质上就是远程方法的调用。尽管Webservice是基于XML的但是你仍然可以使用远程方法调用这种模式来进行Webservice的实现，尤其是在那种简单的请求相应的模型中。在这个过程中，传输中的XML文件所描述的更多是有关远程方法的信息，比如方法名，方法参数等等。</div>
<div>而文档交换方式，与RPC相比较在XML文件中不是做远程方法的映射，而是一份完整的自包含的业务文档，当Service端收到这份文档后，先进行预处理（比如词汇的翻译和映射），然后再构造出返回消息。这个构造返回消息的过程中，往往不再是简简单单的一个方法调用，而是多个对象协同完成一个事务的处理，再将结果返回。</div>
<div>这两种方式的区别，类似与打电话和发邮件的不同处理方法。在目前，对于第一种方法提供了很多自动化的工具使得远程方法的调用能够很容易的完成，而后一种方法缺少一系列工具的支持，需要开发者手工完成。</div>
<div>尽管如此，在此还是推荐使用文档交换的方式。由于它在以下方面具有RPC所不具备的优点。</div>
<div>使用文档方式，你可以充分利用XML文件的功能去描述和验证一份业务文档，而在RPC模型中XML仅仅被用于描述方法的信息。</div>
<div>使用文档方式，在客户的Service的提供者之间不再需要紧密的约定，而RPC模型需要客户和Service的提供者紧密相连，一旦方法发生变化，客户端就需要做相应的改动。这不符合低耦合系统的要求，而在文档交换方式中则灵活的多。</div>
<div>由于业务数据是自包含的，显然文档模型更利于采用异步处理。</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 利用设计模式</div>
<div>设计模式在设计Webservice的时候显然可以起到相当大的作用。设计模式的主要目的就是为解决某些在类似环境下的相像问题提供已有的较为成熟的设计方案。在这里，只简单的提及一些很常用的模式，让我们了解到模式在Webservice中可以起到的作用。</div>
<div>Adapter ：为内部系统提供一个不同的接口</div>
<div>Fa&ccedil;ade： 封装复杂的内部实现，提供一系列简单的接口</div>
<div>Proxy： 作为其他对象的代理，代替它提供服务</div>
<div>&nbsp;</div>
<div>Adapter模式用于将一个组件的接口转化成客户所需要的样子，这里的客户就是Webservice。一个常见的情况就是将原有的老的系统包装成一个Webservice。比如现在使用的是J2EE的平台，而原来有一个C++的系统实现了某些功能，现在需要将它发布成Webservice，那么就需要利用JNI技术做一个Adapter，为原来的C++组件提供一个Java的接口，然后再转化为Webservice。</div>
<div>&nbsp;</div>
<div>Fa&ccedil;ade模式用于构建粗粒度的服务，它包装了细粒度的服务，从而为复杂的系统提供了一个简单的接口。在J2EE中，Session Bean就象是一个Fa&ccedil;ade，而Entity Bean则是细粒度的服务。在Webservice中也一样，使用Fa&ccedil;ade模式可以将已有的组件的功能发挥殆尽。</div>
<div>&nbsp;</div>
<div>Proxy 模式用于充当其他对象的代理，类似于中间人的作用，将处理工作从一个对象传递到另一个对象。在Webservice中，它主要用于隐藏Soap消息构造的过程。也可以用于模拟对象（Mock Object）的创建。</div>
<div>&nbsp;</div>
<div>以上仅仅是一些可以用于Webservice开发的模式，如果你熟练的将这些模式应用于Webservice开发，你将会发现开发Webservice应用，将好像做一种特殊的面向对象设计。</div>
<div>&nbsp;</div>
<div>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安全</div>
<div>Webservice为作为方便的服务被用广大领域使用的同时，也成为了黑客们的美食。在这里，本文将就目前对Webservice安全所能做的改进做简单介绍。</div>
<div>在Webservice中的安全主要分为以下三个方面。</div>
<div>传输&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SSL/HTTPS 对连接加密，而不是传输数据</div>
<div>消息&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据加密(XML Encryption) &nbsp;&nbsp;数字签名(XML-DSIG)</div>
<div>底层架构&nbsp; 利用应用服务安全机制</div>
<div>&nbsp;</div>
<div>传输时的安全是最容易被加入到你的Webservice应用中的，利用现有的SSL 和HTTPS协议，就可以很容易的获得连接过程中的安全。</div>
<div>&nbsp;</div>
<div>然而这种安全实现方法有两个弱点。一是它只能保证数据传输的安全，而不是数据本身的安全，数据一旦到达某地，那么就可以被任何人所查看。而在Webservice中，一份数据可能到达多个地方，而这份数据却不该被所有的接受者所查看。二是它提供的是要么全有要么全无的保护，你不能选择哪部分数据要被保护，而这种可选择性也是在Webservice中所常要用到的。</div>
<div>&nbsp;</div>
<div>第二层的保护是对于消息本身的保护。你可以使用已有的XML安全扩展标准，实现数字签名的功能，从而保证你的消息是来自特定方并没有被修改过。XML文件的加密技术从更大程度上加强了Webservice的安全，它能够定制数据传输到后，能否被接受者所查看，进一步完善了传输后的安全，业界也在不断的制定Webservice的安全标准，比如SAML 和 WS-Security。</div>
<div>&nbsp;</div>
<div>最后一层保护就是依靠底层架构的安全，这更多的来自于操作系统和某些中间件的保护。比如在J2EE中，主持Webservice的应用服务器。目前很多的J2EE应用服务器都支持Java Authentication and Authorization Service (JAAS)，这是最近被加入到J2SE 1.4当中的。利用主持Webservice的服务器，实现一些安全机制这是很自然的做法。另一种利用底层架构的安全方法就是，做一个独立的负责安全的服务器，Webservice的使用者和创建者都需要与之取得安全信任。<br /><br /></div>
</div>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://dangzhao.javaeye.com/blog/200773#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 06 Jun 2008 09:37:05 +0800</pubDate>
        <link>http://dangzhao.javaeye.com/blog/200773</link>
        <guid>http://dangzhao.javaeye.com/blog/200773</guid>
      </item>
      <item>
        <title>Spring Bean的配置</title>
        <author>dangzhao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dangzhao.javaeye.com">dangzhao</a>&nbsp;
          链接：<a href="http://dangzhao.javaeye.com/blog/200370" style="color:red;">http://dangzhao.javaeye.com/blog/200370</a>&nbsp;
          发表时间: 2008年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&lt;beans&gt; <br />&nbsp;&nbsp; &lt;description&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Spring Bean Configuration Sample<br />&nbsp; &lt;/description&gt; <br />&nbsp; &lt;bean <br />&nbsp;&nbsp; id="TheAction"&nbsp; <br />&nbsp;&nbsp; class="net.xiaxin.spring.qs.UpperAction" <br />&nbsp;&nbsp; singleton="true"&nbsp; <br />&nbsp;&nbsp; init-method="init"&nbsp; <br />&nbsp;&nbsp; destroy-method="cleanup"&nbsp; <br />&nbsp;&nbsp; depends-on="ActionManager"&gt; </p>
<p>&nbsp;&nbsp; &lt;property name="message"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;HeLLo&lt;/value&gt;&nbsp; <br />&nbsp;&nbsp; &lt;/property&gt;&nbsp;&nbsp; </p>
<p>&lt;property name="desc"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;null/&gt; <br />&nbsp;&nbsp; &lt;/property&gt; </p>
<p>&nbsp;&nbsp; &lt;property name="dataSource"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local="dataSource"/&gt;&nbsp; <br />&nbsp;&nbsp; &lt;/property&gt; <br />&nbsp; &lt;/bean&gt; <br />&nbsp; &lt;bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="jndiName"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;java:comp/env/jdbc/sample&lt;/value&gt; <br />&nbsp;&nbsp;&nbsp; &lt;/property&gt; <br />&nbsp; &lt;/bean&gt; <br />&lt;/beans&gt; </p>
<p>&nbsp;</p>
<p>1、 id <br />Java Bean在BeanFactory中的唯一标识，代码中通过BeanFactory获取JavaBean实例时需以此作为索引名称。 </p>
<p>2、 class <br />Java Bean 类名 </p>
<p>3、 singleton <br />&nbsp; 指定此Java Bean是否采用单例（Singleton）模式，如果设为&ldquo;true&rdquo;，则在BeanFactory作用范围内，只维护此Java Bean的一个实例，代码通过BeanFactory获得此Java Bean实例的引用。反之，如果设为&ldquo;false&rdquo;，则通过BeanFactory获取此Java Bean实例时，BeanFactory每次都将创建一个新的实例返回。 </p>
<p>4、init-method <br />&nbsp;&nbsp; 初始化方法，此方法将在BeanFactory创建JavaBean实例之后，在向应用层返回引用之前执行。一般用于一些资源的初始化工作。 </p>
<p>5、destroy-method <br />&nbsp;&nbsp; 销毁方法。此方法将在BeanFactory销毁的时候执行，一般用于资源释放。 </p>
<p>6、 depends-on <br />&nbsp;&nbsp; Bean依赖关系。一般情况下无需设定。Spring会根据情况组织各个依赖关系的构建工作（这里示例中的depends-on属性非必须）。只有某些特殊情况下，如JavaBean中的某些静态变量需要进行初始化（这是一种BadSmell，应该在设计上应该避免）。通过depends-on指定其依赖关系可保证在此Bean加载之前，首先对depends-on所指定的资源进行加载。 </p>
<p>7、 &lt;value&gt; <br />&nbsp;&nbsp; 通过&lt;value/&gt;节点可指定属性值。BeanFactory将自动根据Java Bean对应的属性类型加以匹配。下面的&rdquo;desc&rdquo;属性提供了一个null值的设定示例。注意&lt;value&gt;&lt;/value&gt;代表一个空字符串，如果需要将属性值设定为null，必须使用&lt;null/&gt;节点。 </p>
<p>8、 &lt;ref&gt; <br />&nbsp; 指定了属性对BeanFactory中其他Bean的引用关系。示例中，TheAction的dataSource属性引用了id为dataSource的Bean。BeanFactory将在运行期创建dataSource bean实例，并将其引用传入TheAction Bean的dataSource属性。 </p>
<p>下面的代码演示了如何通过BeanFactory获取Bean实例： <br />&nbsp;&nbsp; InputStream is = new FileInputStream("bean.xml"); <br />&nbsp;&nbsp; XmlBeanFactory factory = new XmlBeanFactory(is); <br />&nbsp;&nbsp; Action action = (Action) factory.getBean("TheAction"); </p>
<p>此时我们获得的Action实例，由BeanFactory进行加载，并根据配置文件进行了初始化和属性设定。</p>
          <br/>
          <span style="color:red;">
            <a href="http://dangzhao.javaeye.com/blog/200370#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jun 2008 09:49:32 +0800</pubDate>
        <link>http://dangzhao.javaeye.com/blog/200370</link>
        <guid>http://dangzhao.javaeye.com/blog/200370</guid>
      </item>
      <item>
        <title>架构的设计不是照搬</title>
        <author>dangzhao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dangzhao.javaeye.com">dangzhao</a>&nbsp;
          链接：<a href="http://dangzhao.javaeye.com/blog/197745" style="color:red;">http://dangzhao.javaeye.com/blog/197745</a>&nbsp;
          发表时间: 2008年05月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p>有一段时间没写日记啦，本来是想把这些框框架架都写个例子总结一下....</p>
<p>&nbsp;</p>
<p>然而，这个东西越想越没什么可写的...</p>
<p>&nbsp;</p>
<p>我们需要自己的东西，而不是简单照搬！</p>
<p>&nbsp;</p>
<p>尽管我曾经为这些欣喜若狂，感染我的是它的思想，它的文化，它的气质...</p>
<p>&nbsp;</p>
<p>而不是因为我会用了这些东西，可以自豪了，可以骄傲了...</p>
<p>&nbsp;</p>
<p>我们需要自己的东西，自己的架构，API是我们写的标准中文的&nbsp;&nbsp;架构...</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>我们需要自己的东西.....</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://dangzhao.javaeye.com/blog/197745#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 28 May 2008 09:48:28 +0800</pubDate>
        <link>http://dangzhao.javaeye.com/blog/197745</link>
        <guid>http://dangzhao.javaeye.com/blog/197745</guid>
      </item>
      <item>
        <title>Ibatis之缓存插件</title>
        <author>dangzhao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dangzhao.javaeye.com">dangzhao</a>&nbsp;
          链接：<a href="http://dangzhao.javaeye.com/blog/193572" style="color:red;">http://dangzhao.javaeye.com/blog/193572</a>&nbsp;
          发表时间: 2008年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p>缓存类型 Types in [MEMORY、LRU、FIFO、OSCACHE]</p>
<p>Ibatis中实现com.ibatis.sqlmap.engine.cache.&nbsp;CacheController&nbsp; [inteface]</p>
<p>public void flush(CacheModel cacheModel);/*Flush*/</p>
<p>public Object getObject(CacheModel cacheModel, Object key);/*Get*/</p>
<p>public Object removeObject(CacheModel cacheModel, Object key);/*Remove*/</p>
<p>public void putObject(CacheModel cacheModel, Object key, Object object);/*Add */</p>
<p>public void configure(Properties props);/*Set*/</p>
<p>&nbsp;</p>
<p>如果Ibatis自带的缓存策略不适合你的具体应用，可以实现CacheController&nbsp; Interface来实现自己的方法</p>
<p>&nbsp;</p>
<p>一：MEMORY&nbsp; 内存缓存，和Java内存管理机制类似分为[SOFT、WEAK、STRONG]</p>
<p>&nbsp;&lt;property name="reference-type"&nbsp; value="SOFT|WEAK|STRONG"/&gt;</p>
<p><span style="font-size: x-small;">SOFT:</span></p>
<p><span style="font-size: x-small;">只有当目前内存不足的情况下，JVM 在垃圾回收时才会收回其包含的引用（JVM 并不是只有当内存不足时才启动垃圾回收机制，</span><span style="font-size: x-small; font-family: sans-serif;"><span style="color: #0000ff;">何时进行垃圾回收取决于各版本JVM 的垃圾回收策略</span>。如某这垃圾回收策略为：当系统目前较为空闲，且无效对象达到一定比</span> <span style="font-size: x-small; font-family: sans-serif;">率时启动垃圾回收机制，此时的空余内存倒可能还比较充裕）</span></p>
<p>&nbsp;</p>
<p>WEAK:</p>
<p><span style="font-size: x-small;">WeakReference 比SoftReference 在引用的维持性上来看更加微弱。无需等到内存不足的</span><span style="font-size: x-small; font-family: sans-serif;">情况，只要JVM 启动了垃圾回收机制，那么WeakReference 所对应的对象就将被JVM 回收。</span><span style="font-size: x-small; font-family: sans-serif;">相对SoftReference 而言，WeakReference 被JVM 回收的概率更大。</span></p>
<p>&nbsp;</p>
<p>STRONG:</p>
<p><span style="font-size: x-small;">所引用的对象几乎无法被回收重用。它指向的对象实</span><span style="font-size: x-small; font-family: sans-serif;">际上已经被JVM 销毁（finalize 方法已经被执行），只是暂时还没被垃圾回收器收回而已。</span><span style="font-size: x-small; font-family: sans-serif;">PhantomReference 主要用于辅助对象的销毁过程，在实际应用层研发中，几乎不会涉及。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: x-small; font-family: Arial;">其控制器com.ibatis.sqlmap.engine.cache.memory.MemoryCacheController</span></p>
<p><span style="font-size: x-small; font-family: Arial;">private MemoryCacheLevel cacheLevel = MemoryCacheLevel.WEAK;</span></p>
<p><span style="font-size: x-small; font-family: Arial;">private Map cache = Collections.synchronizedMap(new HashMap());/*Map 存储结构*/</span></p>
<p>&nbsp;</p>
<p><span style="font-size: x-small; font-family: Arial;">二：<span style="font-family: Verdana;">LRU 最近最少使用算法</span></span></p>
<p><span style="font-size: x-small;">&lt;property name="size" value="Number"/&gt;</span></p>
<p><span style="font-size: x-small;">其控制器<span style="font-family: Arial;">com.ibatis.sqlmap.engine.cache.lru.LruCacheController</span></span></p>
<p><span style="font-size: x-small; font-family: Arial;">private Map cache&lt;Collections.synchronizedMap(new HashMap())&gt;;<br />private List keyList&lt;Collections.synchronizedList(new LinkedList())&gt;;</span></p>
<p><span style="font-size: x-small; font-family: Arial;">Put算法</span></p>
<p>&nbsp; public void putObject(CacheModel cacheModel, Object key, Object value) {<br />&nbsp;&nbsp;&nbsp; cache.put(key, value);<br />&nbsp;&nbsp;&nbsp; keyList.add(key);<br />&nbsp;&nbsp;&nbsp; if (keyList.size() &gt; cacheSize) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object oldestKey = keyList.remove(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cache.remove(oldestKey);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IndexOutOfBoundsException e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ignore<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }</p>
<p>Get算法</p>
<p>&nbsp; public Object getObject(CacheModel cacheModel, Object key) {<br />&nbsp;&nbsp;&nbsp; Object result = cache.get(key);<br />&nbsp;&nbsp;&nbsp; keyList.remove(key);<br />&nbsp;&nbsp;&nbsp; if (result != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keyList.add(key);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return result;<br />&nbsp; }</p>
<p>&nbsp;</p>
<p>使用[沉淀]技巧把最近最少使用的沉淀到最前面</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: x-small; font-family: Arial;">FIFO：</span></p>
<p><span style="font-size: x-small; font-family: Arial;">&lt;property name="size" value="Number"/&gt;</span></p>
<p><span style="font-size: x-small; font-family: Arial;">其控制器com.ibatis.sqlmap.engine.cache.fifo.FifoCacheController</span></p>
<p><span style="font-size: x-small; font-family: Arial;">&nbsp; public void putObject(CacheModel cacheModel, Object key, Object value) {<br />&nbsp;&nbsp;&nbsp; cache.put(key, value);<br />&nbsp;&nbsp;&nbsp; keyList.add(key);<br />&nbsp;&nbsp;&nbsp; if (keyList.size() &gt; cacheSize) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object oldestKey = keyList.remove(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cache.remove(oldestKey);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IndexOutOfBoundsException e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ignore<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }</span></p>
<p><span style="font-size: x-small; font-family: Arial;">public Object getObject(CacheModel cacheModel, Object key) {<br />&nbsp;&nbsp;&nbsp; return cache.get(key);<br />&nbsp; }</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: x-small; font-family: Arial;">OSCACHE：使用oscache自带的配置文件oscache.properties</span></p>
<p><span style="font-size: x-small; font-family: Arial;"># CACHE IN MEMORY<br />#<br /># If you want to disable memory caching, just uncomment this line.<br />#<br />&nbsp;cache.memory=false&nbsp; /*是否缓存到内存中，一般为true，这里为测试缓存到磁盘*/</span></p>
<p><span style="font-size: x-small; font-family: Arial;">
<p><br /># CACHE KEY<br />#<br /># This is the key that will be used to store the cache in the application<br /># and session scope.<br />#<br /># If you want to set the cache key to anything other than the default<br /># uncomment this line and change the cache.key<br />#<br />&nbsp;cache.key=__oscache_cache</p>
<p><br /># USE HOST DOMAIN NAME IN KEY<br />#<br /># Servers for multiple host domains may wish to add host name info to<br /># the generation of the key.&nbsp; If this is true, then uncomment the<br /># following line.<br />#<br /># cache.use.host.domain.in.key=true</p>
<p><br /># CACHE LISTENERS<br />#<br /># These hook OSCache events and perform various actions such as logging<br /># cache hits and misses, or broadcasting to other cache instances across a cluster.<br /># See the documentation for further information.<br />#<br /># cache.event.listeners=com.opensymphony.oscache.plugins.clustersupport.JMSBroadcastingListener,<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.opensymphony.oscache.extra.CacheEntryEventListenerImpl,<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.opensymphony.oscache.extra.CacheMapAccessEventListenerImpl,<br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.opensymphony.oscache.extra.ScopeEventListenerImpl</p>
<p><br /># CACHE PERSISTENCE CLASS<br />#<br /># Specify the class to use for persistence. If you use the supplied DiskPersistenceListener,<br /># don't forget to supply the cache.path property to specify the location of the cache<br /># directory.<br /># <br /># If a persistence class is not specified, OSCache will use memory caching only.<br />#<br />cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener</p>
<p># CACHE OVERFLOW PERSISTENCE<br /># Use persistent cache in overflow or not. The default value is false, which means<br /># the persistent cache will be used at all times for every entry.&nbsp; true is the recommended setting.<br />#<br /># cache.persistence.overflow.only=true</p>
<p># CACHE DIRECTORY<br />#<br /># This is the directory on disk where caches will be stored by the DiskPersistenceListener.<br /># it will be created if it doesn't already exist. Remember that OSCache must have<br /># write permission to this directory.<br />#<br /># Note: for Windows machines, this needs \ to be escaped<br /># ie Windows:<br />cache.path=c:\\myapp\\cache<br /># or *ix:<br /># cache.path=/opt/myapp/cache<br />#<br /># cache.path=c:\\app\\cache</p>
<p><br /># CACHE ALGORITHM<br />#<br /># Default cache algorithm to use. Note that in order to use an algorithm<br /># the cache size must also be specified. If the cache size is not specified,<br /># the cache algorithm will be Unlimited cache.<br />#</p>
<p><br />cache.algorithm=com.opensymphony.oscache.base.algorithm.LRUCache/*缓存淘汰算法*/</p>
<p><br /># cache.algorithm=com.opensymphony.oscache.base.algorithm.FIFOCache<br /># cache.algorithm=com.opensymphony.oscache.base.algorithm.UnlimitedCache</p>
<p># THREAD BLOCKING BEHAVIOR<br />#<br /># When a request is made for a stale cache entry, it is possible that another thread is already<br /># in the process of rebuilding that entry. This setting specifies how OSCache handles the<br /># subsequent 'non-building' threads. The default behaviour (cache.blocking=false) is to serve<br /># the old content to subsequent threads until the cache entry has been updated. This provides<br /># the best performance (at the cost of serving slightly stale data). When blocking is enabled,<br /># threads will instead block until the new cache entry is ready to be served. Once the new entry<br /># is put in the cache the blocked threads will be restarted and given the new entry.<br /># Note that even if blocking is disabled, when there is no stale data available to be served<br /># threads will block until the data is added to the cache by the thread that is responsible<br /># for building the data.<br />#<br /># cache.blocking=false</p>
<p># CACHE SIZE<br />#<br /># Default cache size in number of items. If a size is specified but not<br /># an algorithm, the cache algorithm used will be LRUCache.<br />#<br />cache.capacity=1000 /*Size*/</p>
<p><br /># CACHE UNLIMITED DISK<br /># Use unlimited disk cache or not. The default value is false, which means<br /># the disk cache will be limited in size to the value specified by cache.capacity.<br />#<br /># cache.unlimited.disk=false</p>
<p><br /># JMS CLUSTER PROPERTIES<br />#<br /># Configuration properties for JMS clustering. See the clustering documentation<br /># for more information on these settings.<br />#<br />#cache.cluster.jms.topic.factory=java:comp/env/jms/TopicConnectionFactory<br />#cache.cluster.jms.topic.name=java:comp/env/jms/OSCacheTopic<br />#cache.cluster.jms.node.name=node1</p>
<span style="font-size: x-small; font-family: Arial;">
<p><br /># JAVAGROUPS CLUSTER PROPERTIES<br />#<br /># Configuration properites for the JavaGroups clustering. Only one of these<br /># should be specified. Default values (as shown below) will be used if niether<br /># property is set. See the clustering documentation and the JavaGroups project<br /># (<a href="http://www.javagroups.com">www.javagroups.com</a>) for more information on these settings.<br />#<br />#cache.cluster.properties=UDP(mcast_addr=231.12.21.132;mcast_port=45566;ip_ttl=32;\<br />#mcast_send_buf_size=150000;mcast_recv_buf_size=80000):\<br />#PING(timeout=2000;num_initial_members=3):\<br />#MERGE2(min_interval=5000;max_interval=10000):\<br />#FD_SOCK:VERIFY_SUSPECT(timeout=1500):\<br />#pbcast.NAKACK(gc_lag=50;retransmit_timeout=300,600,1200,2400,4800;max_xmit_size=8192):\<br />#UNICAST(timeout=300,600,1200,2400):\<br />#pbcast.STABLE(desired_avg_gossip=20000):\<br />#FRAG(frag_size=8096;down_thread=false;up_thread=false):\<br />#pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_local_addr=true)<br />#cache.cluster.multicast.ip=231.12.21.132</p>
</span></span>
<p>&nbsp;</p>
</p>
<p>&nbsp;</p>
<p><span style="font-size: x-small; font-family: Arial;">一般推荐使用OSCACHE这个[专业]缓存插件</span></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://dangzhao.javaeye.com/blog/193572#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 May 2008 11:12:46 +0800</pubDate>
        <link>http://dangzhao.javaeye.com/blog/193572</link>
        <guid>http://dangzhao.javaeye.com/blog/193572</guid>
      </item>
      <item>
        <title>Ibatis环境配置</title>
        <author>dangzhao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dangzhao.javaeye.com">dangzhao</a>&nbsp;
          链接：<a href="http://dangzhao.javaeye.com/blog/193521" style="color:red;">http://dangzhao.javaeye.com/blog/193521</a>&nbsp;
          发表时间: 2008年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p>一：网上<a href="http://www.apache.org/">http://www.apache.org/</a>上下载Ibatis包</p>
<p>&nbsp;</p>
<p>和Ibatis关联的几个包</p>
<p>&nbsp;</p>
<p>commons-dbcp.jar</p>
<p>log4j.jar</p>
<p>cglib.jar</p>
<p>oscache.jar</p>
<p>commons-logging.jar</p>
<p>有时候可能各个版本不同会产生错误</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>二：配置Ibatis主配置文件</p>
<p>&nbsp;</p>
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</p>
<p>&lt;!DOCTYPE sqlMapConfig&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; "<a href="http://ibatis.apache.org/dtd/sql-map-config-2.dtd">http://ibatis.apache.org/dtd/sql-map-config-2.dtd</a>"&gt;</p>
<p>&lt;sqlMapConfig&gt;</p>
<p>&nbsp; &lt;settings cacheModelsEnabled="true"&lt;!--使用缓存--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enhancementEnabled="true"<br />&nbsp; &nbsp;&nbsp;&nbsp;lazyLoadingEnabled="true"<br />&nbsp; &nbsp;&nbsp;&nbsp;maxRequests="32"<br />&nbsp; &nbsp;&nbsp;&nbsp;maxSessions="10"<br />&nbsp; &nbsp;&nbsp;&nbsp;maxTransactions="10"<br />&nbsp; &nbsp;&nbsp;&nbsp;useStatementNamespaces="false"<br />&nbsp; /&gt;<br />&nbsp; &lt;transactionManager type="JDBC" commitRequired="false"&gt;&lt;!--使用连接池--&gt;<br />&nbsp;&nbsp;&nbsp; &lt;dataSource type="JNDI"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="DataSource" value="ibatis"/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/dataSource&gt;</p>
<p>&lt;!-- <br />&nbsp;&nbsp;&nbsp; &lt;dataSource type="SIMPLE"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="JDBC.Driver" value="org.hsqldb.jdbcDriver"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="JDBC.ConnectionURL" value="jdbc:hsqldb:."/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="JDBC.Username" value="sa"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="JDBC.Password" value="sa"/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/dataSource&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; --&gt;</p>
<p>&nbsp; &lt;/transactionManager&gt;</p>
<p>&nbsp; &lt;sqlMap resource="com/myspackage/***.xml"/&gt;&lt;!--SQL映射配置文件--&gt;</p>
<p>&lt;/sqlMapConfig&gt;</p>
<p>&nbsp;</p>
<p>此主配置文件可以放到class下的任何位置，只要在得到此配置文件时候的标明URI即可。</p>
<p>&nbsp;</p>
<p>com/myspackage/***.xml 格式如下</p>
<p>&nbsp;</p>
<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</p>
<p>&lt;!DOCTYPE sqlMap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; "<a href="http://ibatis.apache.org/dtd/sql-map-2.dtd">http://ibatis.apache.org/dtd/sql-map-2.dtd</a>"&gt;</p>
<p>&lt;sqlMap namespace="Account"&gt;</p>
<p>&nbsp; &lt;typeAlias alias="Account" type="com.mydomain.domain.Account"/&gt;</p>
<p>&nbsp;&nbsp; &lt;resultMap id="MapResult" class="HashMap"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;result property="id" column="ACC_ID"/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;result property="firstName" column="ACC_FIRST_NAME"/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;result property="lastName" column="ACC_LAST_NAME"/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;result property="emailAddress" column="ACC_EMAIL"/&gt;<br />&nbsp; &lt;/resultMap&gt;<br />&nbsp; &lt;cacheModel id="CacheID" type="OSCACHE"&gt;&lt;!--[OSCACHE,MEMORY,LRU,FIFO]--&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;flushInterval hours="24"/&gt;<br />&nbsp; &lt;property name="size" value="1000" /&gt; <br />&nbsp; &lt;/cacheModel&gt;</p>
<p>&nbsp; &lt;select id="selectId" parameterClass="int" resultClass="Map"&gt;&lt;!--返回一个Map类型的VO--&gt;<br />&nbsp;&nbsp;&nbsp; select<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp; from&nbsp;SomeTable<br />&nbsp;&nbsp;&nbsp; where SomeTable_id = #id#<br />&nbsp; &lt;/select&gt;</p>
<p>&nbsp; &lt;insert id="insertAccount" parameterClass="Account"&gt;&lt;!--使用AccoutVO作为in parameter,也可以使用Map--&gt;<br />&nbsp;&nbsp;&nbsp; insert into ACCOUNT (<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACC_ID,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACC_FIRST_NAME,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACC_LAST_NAME,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACC_EMAIL<br />&nbsp;&nbsp;&nbsp; values (<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #id#, #firstName#, #lastName#, #emailAddress#<br />&nbsp;&nbsp;&nbsp; )<br />&nbsp; &lt;/insert&gt;</p>
<p>&nbsp; &lt;update id="updateAccount" parameterClass="Account"&gt;<br />&nbsp;&nbsp;&nbsp; update ACCOUNT set<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACC_FIRST_NAME = #firstName#,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACC_LAST_NAME = #lastName#,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACC_EMAIL = #emailAddress#<br />&nbsp;&nbsp;&nbsp; where<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACC_ID = #id#<br />&nbsp; &lt;/update&gt;</p>
<p>&nbsp; &lt;delete id="deleteAccountById" parameterClass="int"&gt;<br />&nbsp;&nbsp;&nbsp; delete from ACCOUNT where ACC_ID = #id#<br />&nbsp; &lt;/delete&gt;</p>
<p>&lt;/sqlMap&gt;</p>
<p>&nbsp;</p>
<p>三：DAO</p>
<p>import com.ibatis.sqlmap.client.SqlMapClient;<br />import com.ibatis.sqlmap.client.SqlMapClientBuilder;<br />import com.ibatis.common.resources.Resources;<br />import com.mydomain.domain.Account;</p>
<p>import java.io.Reader;<br />import java.io.IOException;<br />import java.util.List;<br />import java.sql.SQLException;</p>
<p>public class SimpleExample {</p>
<p>&nbsp; private static SqlMapClient sqlMapper;</p>
<p>&nbsp; static {<br />&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader.close(); <br />&nbsp;&nbsp;&nbsp; } catch (IOException e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new RuntimeException("Something bad happened while building the SqlMapClient instance." + e, e);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }</p>
<p>&nbsp; public static List selectAllAccounts (java.util.Map map) throws SQLException {<br />&nbsp;&nbsp; List list=(List)sqlMapper.queryForObject("selectAllAccounts", map);<br />&nbsp;&nbsp;&nbsp; return list;<br />&nbsp; }</p>
<p>&nbsp; public static Account selectAccountById&nbsp; (int id) throws SQLException {<br />&nbsp;&nbsp;&nbsp; return (Account) sqlMapper.queryForObject("selectAccountById", new Integer(id));<br />&nbsp; }</p>
<p>&nbsp; public static void insertAccount (Account account) throws SQLException {<br />&nbsp;&nbsp;&nbsp; sqlMapper.insert("insertAccount", account);<br />&nbsp; }</p>
<p>&nbsp; public static void updateAccount (Account account) throws SQLException {<br />&nbsp;&nbsp;&nbsp; sqlMapper.update("updateAccount", account);<br />&nbsp; }</p>
<p>&nbsp; public static void deleteAccount (int id) throws SQLException {<br />&nbsp;&nbsp;&nbsp; sqlMapper.delete("deleteAccount", new Integer(id));<br />&nbsp; }</p>
<p>}</p>
<p>&nbsp;</p>
<p>四：使用此DAO</p>
<p>&nbsp;</p>
<p>Map map=new HashMap();<br />map.put("id",request.getParameter("id"));<br />List list=SimpleExample .queryForList("selectAllAccounts",map);</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>追加几个包</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://dangzhao.javaeye.com/blog/193521#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 May 2008 09:21:22 +0800</pubDate>
        <link>http://dangzhao.javaeye.com/blog/193521</link>
        <guid>http://dangzhao.javaeye.com/blog/193521</guid>
      </item>
      <item>
        <title>营销的四种模式</title>
        <author>dangzhao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dangzhao.javaeye.com">dangzhao</a>&nbsp;
          链接：<a href="http://dangzhao.javaeye.com/blog/193512" style="color:red;">http://dangzhao.javaeye.com/blog/193512</a>&nbsp;
          发表时间: 2008年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">营销有<span lang="EN-US">4P</span>（<span style="color: #3366ff;">产品<span lang="EN-US">Product</span>、价格<span lang="EN-US">Price</span>、地点<span lang="EN-US">Place</span>、促销<span lang="EN-US">Promotion</span></span>），至于后来的<span lang="EN-US">4C</span>和<span lang="EN-US">4R</span>等都是概念的演绎，对企业最有用的还是那<span lang="EN-US">4</span>个<span lang="EN-US">P</span>。而如何组合这<span lang="EN-US">4P</span>是重要的，所以我们把营销研究从<span lang="EN-US">4P</span>的要素研究，发展到组合的研究。如何组合<span lang="EN-US">4P</span>？国内对这方面的探讨非常少，倒是《孙子兵法》颇有论述。其实三十六计本身并不重要，重要的是它们之间的动态组合和使用条件，而使用的原则就是模式。[br]</span></p>
<p>&nbsp;</p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">我认为：营销有且只有四种模式。以前是把<span lang="EN-US">4P</span>看成是在一个平面上的四个点，现在我们把它变成锥体：其中一个<span lang="EN-US">P</span>是战略性的，其它<span lang="EN-US">3P</span>围绕这一个<span lang="EN-US">P</span>来组合。这种超静力结构就非常有力。由此，我们就可以把营销模式分为分别以产品、渠道、价格和促销为核心的模式，其它林林总总的营销招术，比如：服务营销、娱乐营销等，都可以归到这里面来。</span></p>
<p>&nbsp;</p>
<p align="center" style="text-align: center;"><strong><span style="font-size: 11pt; font-family: 宋体; mso-bidi-font-family: 宋体;">一、以产品为核心的营销模式</span></strong></p>
<p align="center" style="text-align: center;"><strong></strong></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">以产品为核心进行营销策略的组合。典型的如：<span lang="EN-US">IT</span>行业和医药行业。在<span lang="EN-US">IT</span>行业，没有分销的概念，只有代理商的概念，渠道扁平、混乱、无管理而且扎堆，但只要能满足市场的变化就行。因为<span lang="EN-US">IT</span>行业遵循摩尔定律，产品更新非常快，要求渠道快速响应。随着新品推出，旧货马上跟进降价。企业十之七八的营销费用是用于新产品推广，而不是投入渠道和包装等。</span></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">在这种模式下，营销组织以产品经理为主，营销的策源地也来自产品经理。</span></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">摩托罗拉在进中国之前<span lang="EN-US">12</span>个月才研发一个新品，现在在中国是<span lang="EN-US">4</span>个月研发一个新品。由于其技术能力强，所以营销以产品为核心，渠道很简单，全国有几个大的代理商就可以了，不用深度分销。摩托罗拉的这种模式会对竞争对手造成致命的杀伤力，但这种模式中国大部分企业做不了，因为中国企业大都没有核心技术，所以做不到以产品为核心。</span></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">三星手机采用的也是以产品为核心的营销模式，针对竞争对手诺基亚、摩托罗拉在中国市场产品更新速度相对较慢的特点，不断推出手机新品，与中国消费者物质生活水平同步，获得消费者的热切关注。三星每年要开发几百种新产品，平均每隔<span lang="EN-US">3</span>个月，就会推出针对不同目标客户定位的新产品，这使三星的品牌保持了旺盛的生命力，不断巩固在消费者心中的形象。</span></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">反观<span lang="EN-US">2001</span>～<span lang="EN-US">2003</span>年，<span lang="EN-US">TCL</span>等国内手机厂家也是类似三星手机的做法，目标客户也基本一致，但具体运作上只是<span lang="EN-US">&ldquo;</span>形似神不似<span lang="EN-US">&rdquo;</span>。最大的问题就是在产品技术上、个性化的外观设计上不能做出实质上的推陈出新，而且产品不合格率太高，也严重地损害了品牌形象。</span></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">所以，企业要根据自己能力的不同，选择不同的模式。我们都知道<span lang="EN-US">&ldquo;</span>设计的三星<span lang="EN-US">&rdquo;</span>和<span lang="EN-US">&ldquo;</span>技术的索尼<span lang="EN-US">&rdquo;</span>，而相同行业的企业所选的营销模式之所以不同，正因为各自所掌握的能力和资源不一样。</span></p>
<p>&nbsp;</p>
<p align="center" style="text-align: center;"><strong><span style="font-size: 11pt; font-family: 宋体; mso-bidi-font-family: 宋体;">二、以价格为核心的营销模式</span></strong></p>
<p align="center" style="text-align: center;"><strong></strong></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">以价格为核心进行营销策略的组合，产品、渠道和促销策略都以价格战为核心。典型的企业比如：格兰仕。过去一台微波炉<span lang="EN-US">3000</span>元一台，现在卖<span lang="EN-US">300</span>元还送很多东西。格兰仕发动了一波又一波的价格战，每波的降价幅度都在<span lang="EN-US">30%</span>以上。但是其新产品的技术差异并不大，大都是功能的重新组合，是人为制造差异化，为的是配合价格战。而它的渠道也是扁平化，直接控制终端。广告也是围绕价格展开的，这是典型的以价格为核心的模式。</span></p>
<p><span style="font-size: 11pt;">&nbsp;</span><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">这种模式对资源和能力有如下要求：要有大规模的生产能力，行业要有规模经济性，规模曲线非常明显。格兰仕是从国外搬来的生产线，同时也拿来订单，通过扩大生产规模来降成本，实现双赢，提高了整个产业的效率。</span></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">以价格为核心的模式本身有合理性，但不可用过了头。</span></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">采用以价格为核心的营销模式，其营销组织的管理重心较高，营销权力在总部，下面人执行好就行了。销售队伍不大，渠道结构扁平。目标市场明确，通过价格张力扩大市场份额，比如：价格降<span lang="EN-US">5%</span>，市场份额能扩大<span lang="EN-US">10%</span>，企业就赢了。 </span></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">由于中国企业的能力就是依靠廉价人力进行低成本制造，还没有能力建营销组织和渠道，也没有能力进行大规模的促销，销售队伍能力也不足，所以许多中小企业和行业挑战者经常采用这种模式。</span></p>
<p>&nbsp;</p>
<p align="center" style="text-align: center;"><strong><span style="font-size: 11pt; font-family: 宋体; mso-bidi-font-family: 宋体;">三、以促销为核心的营销模式</span></strong></p>
<p align="center" style="text-align: center;"><strong></strong></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">以促销为核心进行营销策略的组合，其余<span lang="EN-US">3P</span>围绕促销展开。在这种模式下，营销组织和营销的核心动力来自于产品推广。大部分保健品和部分药品，以及一些化妆品采用这种模式。比如：安利就是以市场推广为核心展开产品市场策略的组合，广告不多，渠道也看不见。</span></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">应用这种模式要求企业的企划能力和品牌传播能力比较强，有管理能力和激励能力。产品虽然有一定差异性，但并不需要许多原创的差异，有组合差异和功能差异性就行。一般情况下，这种模式需要产品的目标人群比较精准，比如：脑白金定位中老年，安利定位于职业白领等。</span></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">这种模式下，营销组织模式有多样性，营销重心比较高。需要统一企划，策划重心高，执行重心却比较低，走两极，营销组织非常简单，人力资源质量要求高，组织管控体系要求也高。</span></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">例如：脑白金的营销就是采用了以促销为核心的模式。脑白金作为单一品种的保健品，以极短的时间迅速启动市场，在<span lang="EN-US">2</span>－<span lang="EN-US">3</span>年内创造了十几亿元的销售奇迹。首先是因为其目标人群和形象的精准定位。针对中老年消费者，脑白金诉求的概念就是<span lang="EN-US">&ldquo;</span>年轻态<span lang="EN-US">&rdquo;</span>、<span lang="EN-US">&ldquo;</span>健康品<span lang="EN-US">&rdquo;</span>。诉求原理是脑白金使人体进入年轻态，年轻态可以解决衰老导致皮肤老化、老人斑、心脏病、高血压、免疫力下降、性能力下降等。定位问题确定后，脑白金以软性文章和宣传册为主要手段，利用媒体和终端，有节奏地进行<span lang="EN-US">&ldquo;</span>空中<span lang="EN-US">&rdquo;</span>和<span lang="EN-US">&ldquo;</span>地面<span lang="EN-US">&rdquo;</span>有效协同的立体整合传播，同时，<span lang="EN-US">&ldquo;</span>脑白金<span lang="EN-US">&rdquo;</span>作为商标，也阻止了竞争对手进入。</span></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">虽然很多人对脑白金铺天盖地的电视广告轰炸、随处可见的软文宣传冲击，以及<span lang="EN-US">&ldquo;</span>收礼只收脑白金<span lang="EN-US">&rdquo;</span>的喧嚣褒贬不一，但是从商业运作和营销管理角度来说，脑白金还是提供了很多好的经验和做法。</span></p>
<p>&nbsp;</p>
<p align="center" style="text-align: center;"><strong><span style="font-size: 11pt; font-family: 宋体; mso-bidi-font-family: 宋体;">四、以渠道为核心的营销模式</span></strong></p>
<p align="center" style="text-align: center;">&nbsp;</p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">以渠道为核心进行营销策略的组合，典型的就是和君创业倡导的深度营销。深度营销相当于有协同性的兵团来打那些散兵。</span></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">这是中国大部分企业采用的模式，因为：第一，中国大部分企业没有产品竞争力；第二，产品低成本程度相似；第三，高空传播对资源的要求高，大部分企业没完成原始积累，高举高打的传播方式做不了，而人员推广的方式需要产品可以高加价，这种方式中国企业也做不了。</span></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">随着消费者不断理性，这个模式会慢慢失效。中国市场大而且多元化、城乡差异也大，流通发展滞后于上游产业，渠道发育弱，这使得渠道发力能取得很好的竞争力。在中国现在情况下，既有传统渠道，又有现代渠道，多渠道混杂并存，你能在复杂情况之下，构建渠道协同就能取得优势，典型的如：家电业的创维、<span lang="EN-US">TCL</span>等。它们很早开始做三四级市场，农民富了，它们就成长起来了。</span></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">应用这种模式的企业需要对营销本土化有非常深刻的理解，对渠道结构、消费者特性都非常了解，也需要有很好的组织管理能力，有清晰的战略，组织管控能力比较强。从制造来讲，要有快速研、产、销一体化响应能力。因为产品没有差异性，靠渠道取胜，所以营销组织重心低，遵循就近和对等原则：谁代表市场谁拥有权力，谁配置资源谁承担责任。区域市场瞬息万变，所以要有具备洞察力和执行力的队伍。这个队伍要求部分精英与大量地方武装，又需要指挥者比较精明。</span></p>
<p><span lang="EN-US" style="font-size: 11pt;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 11pt;">应用这种模式的娃哈哈的品牌玩不过可口可乐，价格也不便宜，却做成了中国第一，靠的就是渠道能力。再比如山东六合的饲料，靠的就是渠道贴近养殖户。这种案例非常多，短期内也最厉害。</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://dangzhao.javaeye.com/blog/193512#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 16 May 2008 08:31:22 +0800</pubDate>
        <link>http://dangzhao.javaeye.com/blog/193512</link>
        <guid>http://dangzhao.javaeye.com/blog/193512</guid>
      </item>
      <item>
        <title>FormPanel的使用方法</title>
        <author>dangzhao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dangzhao.javaeye.com">dangzhao</a>&nbsp;
          链接：<a href="http://dangzhao.javaeye.com/blog/193037" style="color:red;">http://dangzhao.javaeye.com/blog/193037</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>FormPanelTest.html</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&lt;html xmlns="<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>" xml:lang="zh-CN" dir="ltr"&gt;<br />&lt;head&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/&gt;<br />&lt;title&gt;FormTest&lt;/title&gt;<br />&lt;link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css"/&gt;<br />&lt;script type="text/javascript" src="../../adapter/ext/ext-base.js"&gt;&lt;/script&gt;<br />&lt;script type="text/javascript" src="../../ext-all.js"&gt;&lt;/script&gt;</p>
<p>&nbsp;</p>
<p>&lt;script language="javascript" type="text/javascript"&gt;</p>
<p><br />Ext.onReady(function(){<br />&nbsp;function checkNameFn(v,o){/*这个validation方法是修改后的，Ext2.0中不支持参数o*/<br />&nbsp;&nbsp;function successFn(v,p){<br />&nbsp;&nbsp;&nbsp;if(!eval(v.responseText)){<br />&nbsp;&nbsp;&nbsp;&nbsp;o.markInvalid();<br />&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;};<br />&nbsp;&nbsp;function failureFn(v,p){<br />&nbsp;&nbsp;&nbsp;o.markInvalid();<br />&nbsp;&nbsp;};</p>
<p>&nbsp;&nbsp;Ext.Ajax.request({<br />&nbsp;&nbsp;&nbsp;&nbsp; url: 'http://127.0.0.1:8080/CsssWeb/checker.jsp',<br />&nbsp;&nbsp;&nbsp;&nbsp; success: successFn,<br />&nbsp;&nbsp;&nbsp;&nbsp; failure: failureFn,<br />&nbsp;&nbsp;&nbsp;&nbsp; params: { checkValue: v }<br />&nbsp;&nbsp;});<br />&nbsp;&nbsp;return true;<br />&nbsp;}<br />&nbsp;<br />&nbsp;var nameField = new Ext.form.NumberField({<br />&nbsp;&nbsp;fieldLabel : 'ID',<br />&nbsp;&nbsp;name: 'numField',<br />&nbsp;&nbsp;width : 120,<br />&nbsp;&nbsp;value : 0,<br />&nbsp;&nbsp;validationEvent : 'onblur',<br />&nbsp;&nbsp;allowBlank : false<br />&nbsp;});<br />&nbsp;var nameField1 = new Ext.form.TextField({<br />&nbsp;&nbsp;fieldLabel : '名称',<br />&nbsp;&nbsp;name: 'nameField',<br />&nbsp;&nbsp;width : 120,<br />&nbsp;&nbsp;allowBlank : false,<br />&nbsp;&nbsp;validationEvent : 'onblur',<br />&nbsp;&nbsp;validator : checkNameFn<br />&nbsp;});<br />&nbsp;<br />&nbsp;var formPanel=new Ext.form.FormPanel({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; labelWidth: 75, // label settings here cascade unless overridden<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame:true,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title: 'Simple Form',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bodyStyle:'padding:10px 10px 10px',<br />&nbsp;&nbsp;labelAlign : 'right',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width: 350,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; defaults: {width: 230},<br />&nbsp;&nbsp;items : [<br />&nbsp;&nbsp;&nbsp;nameField,<br />&nbsp;&nbsp;&nbsp;nameField1<br />&nbsp;&nbsp;],<br />&nbsp;&nbsp;buttonAlign : 'center',<br />&nbsp;&nbsp;buttons: [<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;text : '提交',<br />&nbsp;&nbsp;&nbsp;&nbsp;listeners : {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;click : function(){formPanel.getForm().doAction('submit',{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="'http://127.0.0.1:7001/CsssWeb/jsonData.jsp'">url:'http://127.0.0.1:7001/CsssWeb/jsonData.jsp'</a>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;waitMsg:'Saving Data...',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clientValidation : false <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;text : '重填',<br />&nbsp;&nbsp;&nbsp;&nbsp;listeners : {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;click : function(){formPanel.getForm().getEl().dom.reset();}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;]</p>
<p>&nbsp;});<br />&nbsp;formPanel.render(Ext.getBody());<br />&nbsp;<br />});</p>
<p>&lt;/script&gt;<br />&lt;/head&gt;</p>
<p>&lt;body&gt;</p>
<p>&nbsp;</p>
<p>&lt;/body&gt;</p>
<p>&lt;/html&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>checker.jsp</p>
<p>&nbsp;</p>
<p>&lt;%=true|false%&gt;</p>
<p>可以在此Jsp中加入判断逻辑最后返回 true|false。</p>
<p><span style="text-decoration: underline;"></span></p>
<p>JsonData.jsp</p>
<p>返回Json数据，数据格式如下</p>
<p>{<br />&nbsp;success : false|false,<br />&nbsp;errors&nbsp; : {<br />&nbsp;&nbsp;nameField: "Client not found",<br />&nbsp;&nbsp;numField: "Client not found"<br />&nbsp;}|null<br />}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://dangzhao.javaeye.com/blog/193037#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 17:38:53 +0800</pubDate>
        <link>http://dangzhao.javaeye.com/blog/193037</link>
        <guid>http://dangzhao.javaeye.com/blog/193037</guid>
      </item>
      <item>
        <title>经历过的WEB数据交换方法与格式</title>
        <author>dangzhao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dangzhao.javaeye.com">dangzhao</a>&nbsp;
          链接：<a href="http://dangzhao.javaeye.com/blog/192806" style="color:red;">http://dangzhao.javaeye.com/blog/192806</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>第一个阶段：直接Html页面交换，直接执行CGI返回已经格式化好的HTML页面供浏览器解析展示。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于这种基于请求响应返回整体HTML格式数据方式虽简单但很笨重不灵活，出现了很多替代的方法</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 内嵌&lt;ifream width="0" height="0"&gt;&lt;/ifream&gt;用JavaScript控制请求指定数据，</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用&lt;script language="javaScript" src="" id=""&gt;用JavaScript控制Src属性请求指定数据(这种方法其实在Ext中的ScriptTagProxy中使用)</p>
<p>&nbsp;</p>
<p>第二个阶段：随着Ajax的发展，Xml成了数据交换及转换的中间工具，但XMl的生成和解析都属重量级的(本人认为)特别是在客户端是用JavaScript解析在性能和速度上有些欠缺。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中间方法，把XML中间格式话的东西都去掉剩下ROOT结点和中间JavaScript的Text，可以减少解析时间以及减少网络流量.</p>
<p>&nbsp;</p>
<p>第三阶段：JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式，是依据过渡方法把根结点的东西也去掉，Client在收到数据对象时 直接调用eval函数来转换成JavaScript对象</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这种方式减少了网络流量提高了Client的解析效率和减低了解析复杂度，但仍需要Server端对数据进行Json的转换输出，尽管目前有些免费的Java组件可以完成这些操作，但效率还是比较低特别是在类结构未知的情况下....</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>第四阶段（推测）：Java对象直接序列化即实现Serializable接口，把Java对象写到Client，由JavaScript对其解析实现对象复活</p>
<p>&nbsp;</p>
<p>以上观点仅仅是个人观点和看法</p>
          <br/>
          <span style="color:red;">
            <a href="http://dangzhao.javaeye.com/blog/192806#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 08:54:37 +0800</pubDate>
        <link>http://dangzhao.javaeye.com/blog/192806</link>
        <guid>http://dangzhao.javaeye.com/blog/192806</guid>
      </item>
      <item>
        <title>Action的使用</title>
        <author>dangzhao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dangzhao.javaeye.com">dangzhao</a>&nbsp;
          链接：<a href="http://dangzhao.javaeye.com/blog/192280" style="color:red;">http://dangzhao.javaeye.com/blog/192280</a>&nbsp;
          发表时间: 2008年05月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&lt;html&gt;<br />&lt;head&gt;<br />&lt;link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css" /&gt;<br />&lt;script type="text/javascript" src="../../adapter/ext/ext-base.js"&gt;&lt;/script&gt;<br />&lt;script type="text/javascript" src="../../ext-all.js"&gt;&lt;/script&gt;<br />&lt;script language="javascript" type="text/javascript"&gt;</p>
<p><br />Ext.onReady(function(){</p>
<p>&nbsp;var action = new Ext.Action({<br />&nbsp;&nbsp;text: 'Click Me',<br />&nbsp;&nbsp;handler: function(){<br />&nbsp;&nbsp;&nbsp;Ext.Msg.alert('ClickTitle', 'You Clicked me.');<br />&nbsp;&nbsp;}<br />&nbsp;});<br />&nbsp;var btn = new Ext.CycleButton({<br />&nbsp;&nbsp;showText: true,<br />&nbsp;&nbsp;prependText: 'View as ',<br />&nbsp;&nbsp;items: [{<br />&nbsp;&nbsp;&nbsp;text:'text only',<br />&nbsp;&nbsp;&nbsp;checked:true<br />&nbsp;&nbsp;},{<br />&nbsp;&nbsp;&nbsp;text:'HTML'<br />&nbsp;&nbsp;}],<br />&nbsp;&nbsp;changeHandler:function(btn, item){<br />&nbsp;&nbsp;&nbsp;Ext.Msg.alert('Change View', item.text);<br />&nbsp;&nbsp;}<br />&nbsp;});<br />&nbsp;var panel = new Ext.Panel({<br />&nbsp;&nbsp;title: 'Actions',<br />&nbsp;&nbsp;width:500,<br />&nbsp;&nbsp;height:300,<br />&nbsp;&nbsp;tbar: [<br />&nbsp;&nbsp;&nbsp;action, <br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;text: 'Action Menu',<br />&nbsp;&nbsp;&nbsp;&nbsp;menu: [action]<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;],<br />&nbsp;&nbsp;items : [btn],<br />&nbsp;&nbsp;renderTo : Ext.getBody()<br />&nbsp;});</p>
<p>&nbsp;<br />})<br />&lt;/script&gt;<br />&lt;/head&gt;</p>
<p>&lt;body&gt;</p>
<p>&lt;/html&gt;</p>
          <br/>
          <span style="color:red;">
            <a href="http://dangzhao.javaeye.com/blog/192280#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 12 May 2008 16:25:04 +0800</pubDate>
        <link>http://dangzhao.javaeye.com/blog/192280</link>
        <guid>http://dangzhao.javaeye.com/blog/192280</guid>
      </item>
      <item>
        <title>TreePanel的使用方法</title>
        <author>dangzhao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dangzhao.javaeye.com">dangzhao</a>&nbsp;
          链接：<a href="http://dangzhao.javaeye.com/blog/191086" style="color:red;">http://dangzhao.javaeye.com/blog/191086</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p>TreePanelTest.html</p>
<p>&nbsp;</p>
<p>&lt;html&gt;<br />&lt;head&gt;<br />&lt;link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css" /&gt;<br />&lt;script type="text/javascript" src="../../adapter/ext/ext-base.js"&gt;&lt;/script&gt;<br />&lt;script type="text/javascript" src="../../ext-all.js"&gt;&lt;/script&gt;<br />&lt;script language="javascript" type="text/javascript"&gt;</p>
<p><br />Ext.onReady(function(){<br />&nbsp;var tree = new Ext.tree.TreePanel({<br />&nbsp;&nbsp;&nbsp;&nbsp;animate : true,<br />&nbsp;&nbsp;&nbsp;&nbsp;autoScroll : true,<br />&nbsp;&nbsp;&nbsp;&nbsp;loader : new Ext.tree.TreeLoader({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;baseParams : {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myName : "Dangzhao"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clearOnLoad : false ,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataUrl : "<a href="http://127.0.0.1:8080/CommonWeb/jsonData.jsp">http://127.0.0.1:8080/CommonWeb/jsonData.jsp</a>" ,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listeners : {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beforeload : function(){alert("beforeLoad")},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;load : function(){alert("load")},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadexception : function(){alert("loadexception")}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preloadChildren : false,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;requestMethod : "POST" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}),<br />&nbsp;&nbsp;&nbsp;&nbsp;el : 'tr',<br />&nbsp;&nbsp;&nbsp;&nbsp;enableDD:true<br />&nbsp;&nbsp;&nbsp;});<br />&nbsp;var root = new Ext.tree.AsyncTreeNode({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text: 'Tree Root', <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draggable:false,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id:'0'<br />&nbsp;&nbsp;&nbsp; });<br />&nbsp;tree.setRootNode(root);<br />&nbsp;tree.render();<br />})</p>
<p><br />&lt;/script&gt;<br />&lt;/head&gt;</p>
<p>&lt;body&gt;<br />&lt;div id="tr" style="width:300;height:400;top:40;left:120;position:absolute "&gt;&lt;/div&gt;</p>
<p>&lt;/body&gt;<br />&lt;/html&gt;</p>
<p>&nbsp;</p>
<p>jsonData.jsp</p>
<p>&nbsp;</p>
<p>&lt;<a href="mailto:%@page">%@page</a> import="java.util.*" %&gt;<br />[{<br />&nbsp;id: 1,<br />&nbsp;text: 'A Folder Node',<br />&nbsp;leaf: false<br />},{<br />&nbsp;id: 2,<br />&nbsp;text: 'A leaf Node',<br />&nbsp;leaf: true<br />}]<br />&lt;%<br />Enumeration enm=request.getHeaderNames();<br />while(enm.hasMoreElements()){<br />&nbsp;&nbsp; &nbsp;String key=(String)enm.nextElement();<br />&nbsp;&nbsp; &nbsp;System.out.println(key+":"+request.getHeader(key));<br />}<br />Map p=request.getParameterMap();<br />Iterator it=p.keySet().iterator();<br />while(it.hasNext()){<br />&nbsp;&nbsp; &nbsp;String key=(String)it.next();<br />&nbsp;&nbsp; &nbsp;System.out.println(key+":"+((String[])p.get(key))[0]);<br />}<br />%&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>System.out Information</p>
<p>&nbsp;</p>
<p>Accept:*/*<br />Accept-Language:zh-cn<br />Referer:file://E:\ext-2.0.2\ext-2.0.2\examples\grid\TreePanelTest.html<br />x-requested-with:XMLHttpRequest<br />Content-Type:application/x-www-form-urlencoded<br />Accept-Encoding:gzip, deflate<br />User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)<br />Host:127.0.0.1:7001<br />Content-Length:22<br />Connection:Keep-Alive<br />Cache-Control:no-cache<br />Cookie:2=1; 74=1; JSESSIONID=LvpgLBNZ!-832179795<br />node:0<br />myName:Dangzhao</p>
<p>&nbsp;</p>
<p>Show 一下Ext Tree的魅力</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://dangzhao.javaeye.com/blog/191086#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 May 2008 14:59:04 +0800</pubDate>
        <link>http://dangzhao.javaeye.com/blog/191086</link>
        <guid>http://dangzhao.javaeye.com/blog/191086</guid>
      </item>
      <item>
        <title>EditorGridPanel的使用方法</title>
        <author>dangzhao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dangzhao.javaeye.com">dangzhao</a>&nbsp;
          链接：<a href="http://dangzhao.javaeye.com/blog/190651" style="color:red;">http://dangzhao.javaeye.com/blog/190651</a>&nbsp;
          发表时间: 2008年05月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p>&lt;html&gt;<br />&lt;head&gt;<br />&lt;link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css" /&gt;<br />&lt;script type="text/javascript" src="../../adapter/ext/ext-base.js"&gt;&lt;/script&gt;<br />&lt;script type="text/javascript" src="../../ext-all.js"&gt;&lt;/script&gt;<br />&lt;script language="javascript" type="text/javascript"&gt;</p>
<p><br />var myData=[<br />&nbsp;&nbsp;[0,"MysTitle_0","Dangzhao_0"],<br />&nbsp;&nbsp;[1,"MysTitle_1","Dangzhao_1"],<br />&nbsp;&nbsp;[2,"MysTitle_2","Dangzhao_2"],<br />&nbsp;&nbsp;[3,"MysTitle_3","Dangzhao_3"],<br />&nbsp;&nbsp;[4,"MysTitle_4","Dangzhao_4"]<br />&nbsp;];</p>
<p>var store = new Ext.data.SimpleStore({<br />&nbsp;&nbsp;autoLoad : true,<br />&nbsp;&nbsp;baseParams : {<br />&nbsp;&nbsp;&nbsp;"Action" : "Select",<br />&nbsp;&nbsp;&nbsp;"Id" : "0"<br />&nbsp;&nbsp;},<br />&nbsp;&nbsp;data : myData,<br />&nbsp;&nbsp;fields : [<br />&nbsp;&nbsp;&nbsp;{ name : "id" , mapping : 0},<br />&nbsp;&nbsp;&nbsp;{ name : "name" , mapping : 2},<br />&nbsp;&nbsp;&nbsp;{ name : "title" , mapping : 1}<br />&nbsp;&nbsp;],<br />&nbsp;&nbsp;id : 0,<br />&nbsp;&nbsp;listeners : {<br />&nbsp;&nbsp;&nbsp;beforeload : function(){alert("beforedload")},<br />&nbsp;&nbsp;&nbsp;load : function(){alert("load")},<br />&nbsp;&nbsp;&nbsp;loadexception : function(){alert("loadexception")}<br />&nbsp;&nbsp;&nbsp;//And all SimpleStore's Event<br />&nbsp;&nbsp;},<br />&nbsp;&nbsp;pruneModifiedRecords : false,<br />&nbsp;&nbsp;remoteSort : false//because use client data so this property must false,<br />&nbsp;});</p>
<p>var colum = new Ext.grid.ColumnModel([<br />&nbsp;&nbsp;&nbsp;{id : "id" ,header : "id" , width: 160 ,sortable: true, dataIndex : 'id'},<br />&nbsp;&nbsp;&nbsp;{header : "name" , width: 160 , editor : new Ext.form.TextField({allowBlank: false}) ,sortable: true, dataIndex : 'name'},<br />&nbsp;&nbsp;&nbsp;{header : "title" , width: 160 ,sortable: true, dataIndex : 'title'}<br />&nbsp;]);</p>
<p>colum.setEditable(1,true);</p>
<p>function modify(value){<br />&nbsp;return "&lt;span style=\"color:red;\"&gt;" +value +"&lt;/span&gt;";<br />}</p>
<p>var grid = new Ext.grid.EditorGridPanel({<br />&nbsp;&nbsp;store : store,<br />&nbsp;&nbsp;title:'Mys GridPanel',<br />&nbsp;&nbsp;height:360,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width:600,<br />&nbsp;&nbsp;collapsible : true,<br />&nbsp;&nbsp;animCollapse : true,<br />&nbsp;&nbsp;allowDomMove : true,<br />&nbsp;&nbsp;colModel : colum ,<br />&nbsp;&nbsp;clicksToEdit : 2<br />&nbsp;});</p>
<p>grid.on({<br />&nbsp;afteredit : function(e){alert(e.field+" "+e.row+"&nbsp; "+e.column+"&nbsp; "+e.originalValue+"&nbsp; "+e.value)}<br />});</p>
<p>Ext.onReady(init);<br />function init(){<br />&nbsp;grid.render("gridDiv");<br />&nbsp;<br />}</p>
<p>function checkData(){<br />&nbsp;var xData = grid.getStore();<br />&nbsp;var modR = xData.getModifiedRecords();<br />&nbsp;for(i=0;i&lt;modR.length;i++){<br />&nbsp;&nbsp;var map=modR[i].modified;<br />&nbsp;&nbsp;alert(map["name"]);<br />&nbsp;}<br />&nbsp;<br />}<br />&lt;/script&gt;<br />&lt;/head&gt;</p>
<p>&lt;body&gt;<br />&lt;input type="button" onClick="checkData()" value="Check Changed Data"&gt;</p>
<p>&lt;div style="position:absolute;top:40px;left:40px;width:600px;height=360px" id="gridDiv"&gt;</p>
<p>&lt;/div&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://dangzhao.javaeye.com/blog/190651#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 May 2008 16:53:14 +0800</pubDate>
        <link>http://dangzhao.javaeye.com/blog/190651</link>
        <guid>http://dangzhao.javaeye.com/blog/190651</guid>
      </item>
      <item>
        <title>GridPanel的使用方法</title>
        <author>dangzhao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dangzhao.javaeye.com">dangzhao</a>&nbsp;
          链接：<a href="http://dangzhao.javaeye.com/blog/190107" style="color:red;">http://dangzhao.javaeye.com/blog/190107</a>&nbsp;
          发表时间: 2008年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p>GridPanelTest.html</p>
<p>&nbsp;</p>
<p>&lt;html&gt;<br />&lt;head&gt;<br />&lt;link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css" /&gt;<br />&lt;script type="text/javascript" src="../../adapter/ext/ext-base.js"&gt;&lt;/script&gt;<br />&lt;script type="text/javascript" src="../../ext-all.js"&gt;&lt;/script&gt;<br />&lt;script language="javascript" type="text/javascript"&gt;</p>
<p><br />var myData=[<br />&nbsp;&nbsp;[0,"MysTitle_0","Dangzhao_0"],<br />&nbsp;&nbsp;[1,"MysTitle_1","Dangzhao_1"],<br />&nbsp;&nbsp;[2,"MysTitle_2","Dangzhao_2"],<br />&nbsp;&nbsp;[3,"MysTitle_3","Dangzhao_3"],<br />&nbsp;&nbsp;[4,"MysTitle_4","Dangzhao_4"]<br />&nbsp;];</p>
<p>var store = new Ext.data.SimpleStore({<br />&nbsp;&nbsp;autoLoad : true,<br />&nbsp;&nbsp;baseParams : {<br />&nbsp;&nbsp;&nbsp;"Action" : "Select",<br />&nbsp;&nbsp;&nbsp;"Id" : "0"<br />&nbsp;&nbsp;},<br />&nbsp;&nbsp;data : myData,<br />&nbsp;&nbsp;fields : [<br />&nbsp;&nbsp;&nbsp;{ name : "id" , mapping : 0},<br />&nbsp;&nbsp;&nbsp;{ name : "name" , mapping : 2},<br />&nbsp;&nbsp;&nbsp;{ name : "title" , mapping : 1}<br />&nbsp;&nbsp;],<br />&nbsp;&nbsp;id : 0,<br />&nbsp;&nbsp;listeners : {<br />&nbsp;&nbsp;&nbsp;beforeload : function(){alert("beforedload")},<br />&nbsp;&nbsp;&nbsp;load : function(){alert("load")},<br />&nbsp;&nbsp;&nbsp;loadexception : function(){alert("loadexception")}<br />&nbsp;&nbsp;&nbsp;//And all SimpleStore's Event<br />&nbsp;&nbsp;},<br />&nbsp;&nbsp;pruneModifiedRecords : false,<br />&nbsp;&nbsp;remoteSort : false//because use client data so this property must false,<br />&nbsp;});</p>
<p>var grid = new Ext.grid.GridPanel({<br />&nbsp;&nbsp;store : store,<br />&nbsp;&nbsp;title:'Mys GridPanel',<br />&nbsp;&nbsp;height:360,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width:600,<br />&nbsp;&nbsp;collapsible : true,<br />&nbsp;&nbsp;animCollapse : true,<br />&nbsp;&nbsp;allowDomMove : true,<br />&nbsp;&nbsp;columns : [<br />&nbsp;&nbsp;&nbsp;{id : "id" ,header : "id" ,