<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>流星的博客</title>
    <description>&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0&quot; width=&quot;100%&quot; height=&quot;400&quot;  align=&quot;middle&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.similog.com/swf/slog.b1.swf&quot; /&gt;&lt;param name=&quot;quality&quot; value=&quot;high&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot; /&gt;&lt;param name=&quot;flashvars&quot; value=&quot;v=0.1&amp;type=epi&amp;act=h107331&amp;bgs=http://www.similog.com/img/bgswf/98.swf&quot; /&gt;&lt;embed src=&quot;http://www.similog.com/swf/slog.b1.swf&quot; quality=&quot;high&quot; width=&quot;100%&quot; height=&quot;400&quot;  flashvars=&quot;v=0.1&amp;type=epi&amp;act=h107331&amp;bgs=http://www.similog.com/img/bgswf/98.swf&quot; type=&quot;application/x-shockwave-flash&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; allowFullScreen=&quot;true&quot;&gt;&lt;/embed&gt;&lt;/object&gt;</description>
    <link>http://staratsky.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>案例(我们要的是开发者，而不是hacker)辩驳</title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/222429" style="color:red;">http://staratsky.javaeye.com/blog/222429</a>&nbsp;
          发表时间: 2008年07月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在javaeye上看到一篇文章:<a href="我们要的是开发者，而不是hacker(http://www.javaeye.com/topic/221325?page=1)" target="_blank">我们要的是开发者，而不是hacker(http://www.javaeye.com/topic/221325?page=1)</a>.其中的观点有些片面,引来一帮网友的拍砖.我以为通过这个案例,企业的管理者在招聘时先考虑清楚,公司到底需要什么样的人才?通过什么考核方式为公司招到所需要的人才?这样才能为企业招到合适的人才.而这个案例中企业的管理者,我不禁要问他是称职的管理者吗?<br /><br /><strong>案例</strong><br /><div class="quote_title">引用</div><div class="quote_div"><br />    某网络广告公司需要招聘一个程序员，来帮助公司创建企业对外和对内的网站。于是，两个应聘者来面试.面试官给出了一个任务：将一个Csv文件从一种格式，转换成另外一种格式。并要求应聘者在24小时之内完成。<br />    第一个应聘者回到家，设计了一个简单而又令人惊奇的网站，用户可以同时上传多个文件，并且转换成功后，系统会通过SMS或者email的方式告知用户。的确是一个很好用的软件。<br />    第二个应聘者收到任务后，他接下来花了30分钟和相关人员谈论业务需求，他要搞清楚用户用何种方式使用这套软件，这套软件提供了哪些有价值的东西。问完他想问的问题后，CTO没有让他直接离开，而是当场给了Offer.<br />    第二天，第一个应聘者只接到了“谢谢来面试，期望以后有合作机会”之类的电话。</div><br /><strong>作者dazuiba观点</strong><br />    程序员们都知道软件是为人开发的，你知道，我也知道。但是当我环顾四周，很少有程序员和用户交流。这貌似是不合清理的，但它的确大部分时间是这样，用这种开发方式，我们吃了很多亏。<br />    Hacker们每天都生产出高质量的代码。这很好，如果没有hacker，我不可能有消息系统、web服务器、等等等等。至少我不会有这么多可选的软件。但是，即使你是一个好的hacker，但这并不能保证能对业务有用！<br />   我经常会碰到这种事情：人们整理需求，但最终的结果已经离业务需要严重脱离。有两个途径可以解决这个问题<br />    1) 尽你最大努力把代码写好<br />    2) 好好和用户谈一下业务<br />    Hacker总是会选择第一个，这并不一定会错。事实上，一个好的hacker总会足够快地讲软件交付使用，即使他推到重来三四次。<br />   但是，作为一个开发者，应该在一开始就搞清楚这个软件到底是怎么被使用的。和用户多几次高质量的交流，会保证开发者理解业务如何运作，以及软件在其中扮演的角色。采用这种方式，更容易达成一个好的结果：软件为客户提供了一个好的解决方案，开发者也采用了最直接、高效的实现方式(比如：客户只需要一个命令行的csv转换工具，而不是一个websit)。<br />   Hacker们创建一个website(浪费了时间和精力)，而最终还会由客户买单。好的程序员用最快的方式满足客户，从而为客户节省了开支。<br />   以上这个道理，不是我头个讲的，但是我经常碰到，所以就把它写下来。Kent back好几年前就讲过，最近一次是在今年年初的伦敦的QCon上(InfoQ上有相关的视频)。<br />   不要觉得你是个写程序的，就可以不明白这个道理----只要你是在写软件，在写“给人使用的软件”。去看看Kent的演讲视频吧，他比我讲的透彻，看完后，你会想，是呀，这他妈的简直是真理呀，但是，环顾四周，大家都在这么做吗？如果答案是肯定的，你真幸运，你在和一帮优秀的同事共事。<br /><br /><br />我们再来看看正反双方pk的结果:<br /><strong>支持方意见</strong><br />1.网友hyhongyong<br />凡事皆事出有因！<br />环境会改变人，人也能影响环境！<br />多从自己身上找原因，才能提升更多。<br />不论别人如何看待，自己都要从更高的角度看问题，要善其身！<br />程序员既要低头拉车，也要抬头看路。不为别的，要对得起自己！<br />2.网友dazuiba<br />程序员是一个很宽泛的职业定义，我想这里的程序员，应该是那种可以独挡一面，或者争取独当一面的任务角色。<br />做螺丝钉无可厚非，但如果改变一下自己，就等当上发动机的火花塞或者中心齿轮，也是很好的事情。<br /><br /> <br /><br /><strong>反方意见</strong><br />1.网友jjx<br />再说如果不会写漂亮的代码,问清需求又有什么用.写出来的东西好维护吗?<br />凡事都掌握一个度就可以了,不要为了宣传一种思维将另一种思维贬到地下<br />2.网友equalto<br />如果作为项目经理甚至是部门负责人,产品规划师这样的人,完全的忽视客户和市场,那必然是灾难,但是,如果是程序员么,好好的干活就可以了.<br />每个人做好自己的本分工作,尽力做的出色,才是好的.<br />而且国内的情况,人心浮躁,从八〇年代开始的做导弹的不如卖咸鸭蛋的,我见过的人里面,想做项目经理的比愿意写好程序的人多几百倍.号召向市场看,不如号召踏实干.<br />也许,这个文章里面,所谓的程序员,不是和我们理解的程序员一个角色吧.<br />3.网友cocal<br />如果这个例子中的公司不是一个三、五人的小作坊，只充分说明那个CTO是个草包中的极品而已！！！他错失了一个高手。<br />当今世上能用甜言蜜语、喋喋不休把客户侃晕的“高人”一抓一大把，但能在极短的时间内拿出“简单而又令人惊奇的”工作成果的人却凤毛麟角的很。<br />这是一个完全失败的伪命题，明显，这个CTO不是在招一个程序员，但又堂而皇之把真正的程序员贬低为“螺丝钉”，然后把程序员和设计师、架构师、项目经理等概念混淆，拔高到非常人可到达的高度。既要和用户良好沟通，又能极快的拿出代码，那起码是“独挡两面”了，呵呵。一直以来总有些人把我们的IT往浮躁的方向上引，总有一种力量把中国IT引离最核心、最致命的区域，从而葬送了行业的过去、现在和未来。<br />个人感觉，这两个人是代表IT项目中两种十分对立的性格，一种是对外向的、一种是内敛的，让一个人同时具备两种性格，两者达到很高修为，是十分困难的。他们的对立在于相互矛盾，专注a方向的发展，b就会衰退，反之也一样。<br />但至少，我坚决反对把哪一种性格凌驾于另一种。一流的沟通能力是可贵的，一流的技术能力同样是可贵的。而对于程序员，毫无疑问（我是说程序员，不是说“很泛的职业定义”），应该是专注于前一种。<br />4.网友kaipingk@gmail.com<br />支持cocal.有些人都是希望每个员工是超人一样，不同人有不同的特长，要因才而用，不要动不动就说这样不行，那样不行。<br />5.网友Else<br />不知道大家看〈赢在中国〉没有，里面几位大佬夸夸其谈。<br />你玩点擦边球吧，他说你没有规则，你讲点规则吧，他说你不会变通，不是做事的料。<br />反正是他说的都对，至少理由，从来都不缺。<br />6.网友jieyuan_cg<br />让程序员去讨论需求？去理解客户的业务，还要理解得到位，这样才能做出成功的软件来？听起来挺不错的，但现实如此吗？而且，我觉得直接让程序员去跟客户沟通，本来是一件很不靠谱的事情～<br />1)程序员去跟客户沟通，首先会有语言障碍，特别是专业术语方面的障碍。<br />2)难道程序员跟客户讨论两三次，就能更深入地了解用户的需求？我看未必～有些行业经验并不是一次两次就能理解的，要是一次两次理解，那程序员就直接转行算了～别干这个吃力不讨好的事情了。<br />3)如果程序员直接跟客户去讨论需求，那需求调研人员，需求说明书撰写人员去干什么？失业？还是给程序员做会议纪要？<br />4)程序员一边揣摩需要，一边考虑设计，一边还要注意进度，程序员是铁打的？呵呵～如果这些都能协调好，那还是程序员吗？是项目经理～<br />7.网友lhyasia<br />这种问题PASS掉世界顶级黑客， 留下些平庸的所谓分析员
          <br/>
          <span style="color:red;">
            <a href="http://staratsky.javaeye.com/blog/222429#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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, 31 Jul 2008 19:58:58 +0800</pubDate>
        <link>http://staratsky.javaeye.com/blog/222429</link>
        <guid>http://staratsky.javaeye.com/blog/222429</guid>
      </item>
      <item>
        <title>IT老板招聘程序员(笑话)</title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/222142" style="color:red;">http://staratsky.javaeye.com/blog/222142</a>&nbsp;
          发表时间: 2008年07月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          老板:项目迟迟没有进展,怎么回事?<br />技术总监:人手不够,需要招人.<br />老板:那就招!这次一定要多招一些优秀的程序员.<br />技术总监:标准呢?<br />老板:有相关行业经验,有熟练的开发技能,有大型项目的开发经验.懂软件工程,并且掌握软件开发各个阶段的基本技能，如市场分析，可行性分析，需求分析，结构设计，详细设计，软件测试等等...<br />技术总监(自语):晕,这哪是招程序员?<br />技术总监:那准备给他开多少工资?<br />老板:不是有零工资就业的吗?我们就招零工资就业的!<br />技术总监:.......!@#%$^%^%&^*^&%^
          <br/>
          <span style="color:red;">
            <a href="http://staratsky.javaeye.com/blog/222142#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 31 Jul 2008 12:15:36 +0800</pubDate>
        <link>http://staratsky.javaeye.com/blog/222142</link>
        <guid>http://staratsky.javaeye.com/blog/222142</guid>
      </item>
      <item>
        <title>微软为什么会落后于互联网时代</title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/219777" style="color:red;">http://staratsky.javaeye.com/blog/219777</a>&nbsp;
          发表时间: 2008年07月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          微软早就意识到，PC时代已让位于以网络为中心的体验时代，互联网的发展，使越来越多的软件公司开始转变为互联网公司。软件产业互联网化,已经是不争的事实。作为全球软件产业的绝对霸主，鲍尔默已经表达了对微软互联网战略的强烈信心。<br />   今年最轰动的IT事件恐怕要数微软并购雅虎事件.微软希望通过对雅虎的收购，全面向互联网转型。微软需要雅虎的品牌和用户加速其互联网战略。收购雅虎也给微软带来很多实惠：如果收购成功，将使微软每月的网络受众翻一番而超过2.5亿，网络广告收入将增长2倍而达到100亿美元。微软今年的网络广告业务营收将只有33亿美元，远低于Google的220亿美元。<br /><br />   可见,微软全面向互联网转型的心情是相当急切的.可是,微软自1994年涉足浏览器市场,进入互联网的时间不可谓不长.但是在在决定互联网发展的核心技术和能力上，几乎没有什么影响力.落到现在还需要冒着反垄断的危险来并购雅虎.这也说明微软在互联网时代的失败.为什么微软会落后于互联网时代?<br />   究其原因,我认为微软的思维还是停留在传统的pc时代.在pc时代,微软每进入一个新领域,第一步是收购;第二步是模仿,第三步是免费.由于微软手中有window平台这张王牌,所以微软这个策略是累累奏效.<br />   但Google所带来的互联网模式，却可以在最短的时间内将某些基本的功能先放上网，可以每天无数次地通过互联网更新和纠错，而互联网化的产品可以免费提供给用户，然后通过服务赚钱。微软在PC时代的策略失去了着力点.<br />   可以这样认为,互联网模式是一种集体的智慧,他的游戏规则就是开源与共享.在这个平台上,一切都以用户为中心。用户通过这个平台得到了便利的服务,商家通过这个平台得到了他想要的数据,而开发商通过这个平台占有了市场.那最终谁会为互联网模式买单?自然是广告商和需要更多服务的用户.用中国人的话来形容互联网模式就是赔本赚吆喝.<br />   微软现在的主要盈利还是来自windows和office.微软不可能放弃既得利的盈利模式,所以,微软也就不可能执掌开源与共享的大旗,所以微软落后于互联网时代就不足为奇了<br /><br /> <br /><br />本文欢迎转载,转载请注明出处.
          <br/>
          <span style="color:red;">
            <a href="http://staratsky.javaeye.com/blog/219777#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 26 Jul 2008 11:47:03 +0800</pubDate>
        <link>http://staratsky.javaeye.com/blog/219777</link>
        <guid>http://staratsky.javaeye.com/blog/219777</guid>
      </item>
      <item>
        <title>数据库连接池技术的研究与实现</title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/209048" style="color:red;">http://staratsky.javaeye.com/blog/209048</a>&nbsp;
          发表时间: 2008年06月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          数据库连接池技术,它的原理是，在应用系统运行过程中，同时打开着一定数量的数据库连接，形成数据连接池，需要建立数据库连接时，只需从“缓冲池”中取出一个，使用完毕之后再放回去，完成某些SQL操作后，系统自动回收，以供其它用户（或进程）调用。现在大多数的WEB应用服务器如BEA的WebLogic和IBM的WebSphere等提供了连接池的机制.不过,比起配置应用服务器提供的数据库连接池,自己写一个数据库连接池更有成就感.<br /><br />要自己动手写一个连接池，有许多功能上的考虑。<br />1)连接池的分配与释放<br />连接池的分配与释放，对系统的性能有很大的影响。合理的分配与释放，可以提高连接的复用度，从而降低建立新连接的开销，同时还可以加快用户的访问速度。<br />　　对于连接的管理可使用空闲池。即把已经创建但尚未分配出去的连接按创建时间存放到一个空闲池中。每当用户请求一个连接时，系统首先检查空闲池内有没有空闲连接。如果有就把建立时间最长（通过容器的顺序存放实现）的那个连接分配给他（实际是先做连接是否有效的判断，如果可用就分配给用户，如不可用就把这个连接从空闲池删掉，重新检测空闲池是否还有连接）；如果没有则检查当前所开连接池是否达到连接池所允许的最大连接数（maxConn）,如果没有达到，就新建一个连接，如果已经达到，就等待一定的时间（timeout）。如果在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用户，如果等待时间超过预定时间timeout,则返回空值（null）。系统对已经分配出去正在使用的连接只做计数，当使用完后再返还给空闲池。对于空闲连接的状态，可开辟专门的线程定时检测，这样会花费一定的系统开销，但可以保证较快的响应速度。也可采取不开辟专门线程，只是在分配前检测的方法。<br />2)连接池的配置与维护<br />连接池中到底应该放置多少连接，才能使系统的性能最佳？系统可采取设置最小连接数（minConn）和最大连接数（maxConn）来控制连接池中的连接。最小连接数是系统启动时连接池所创建的连接数。如果创建过多，则系统启动就慢，但创建后系统的响应速度会很快；如果创建过少，则系统启动的很快，响应起来却慢。这样，可以在开发时，设置较小的最小连接数，开发起来会快，而在系统实际使用时设置较大的，因为这样对访问客户来说速度会快些。最大连接数是连接池中允许连接的最大数目，具体设置多少，要看系统的访问量，可通过反复测试，找到最佳点。<br />3)并发问题<br />　　为了使连接管理服务具有最大的通用性，必须考虑多线程环境，即并发问题。这个问题相对比较好解决，因为Java语言自身提供了对并发管理的支持，使用synchronized关键字即可确保线程是同步的。使用方法为直接在类方法前面加上synchronized关键字，如：<br />　　public synchronized Connection getConnection（）<br /><br /><br /><br />一个ConnectionPool的实现<br />以下代码在jdk1.4以上版本编译通过<br /><pre name="code" class="java">
package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Date;
import java.util.Vector;

public class ConnectionPool {
 private final Vector pools = new Vector();

 private int clients;

 private final int maxClients=25;

 /**
  * 获取数据库连接 如果当前池中有可用连接，则将池中最后一个返回；若没有，则创建一个新的返回
  */
 public synchronized java.sql.Connection getConnection() {
  java.sql.Connection con = null;
  if (pools.size() > 0) {
   // Pick the first Connection in the Vector
   // to get round-robin usage
   con = (java.sql.Connection) pools.firstElement();
   pools.removeElementAt(0);
   try {
    if (con.isClosed()) {
     System.out
       .println("Removed bad connection from connection pool");
     // Try again recursively
     con = getConnection();
    }
   } catch (SQLException e) {
    System.out
      .println("Removed bad connection from  connection pool");
    // Try again recursively
    con = getConnection();
   }
  } else if (maxClients == 0 || clients &lt; maxClients) {
   con = createConnection();
  }
  if (con != null) {
   clients++;
  }
  return con;
 }

 /*
  * 当对一个连接的请求不能被满足时，等待,直到pool中有空闲Connection
  */
 public synchronized java.sql.Connection getConnection(long timeout) {
  long startTime = new Date().getTime();
  java.sql.Connection con;
  while ((con = getConnection()) == null) {
   try {
    wait(timeout);
   } catch (InterruptedException e) {
   }
   if ((new Date().getTime() - startTime) >= timeout) {
    // Timeout has expired
    return null;
   }
  }
  return con;
 }

 /*
  * 生成一个数据库连接conn
  */
 public static Connection createConnection() {
  Connection conn = null;
  try {
   Class.forName("org.gjt.mm.mysql.Driver").newInstance();
   String url = "jdbc:mysql://localhost:3306/microerp";
   String user = "root";
   String password = "";
   conn = DriverManager.getConnection(url, user, password);
  } catch (InstantiationException e) {
   // TODO自动生成 catch 块
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO自动生成 catch 块
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   // TODO自动生成 catch 块
   e.printStackTrace();
  } catch (SQLException e) {
   // TODO自动生成 catch 块
   e.printStackTrace();
  }
  return conn;
 }

 /**
  * 将使用完毕的数据库连接放回池中 若池中连接已经超过阈值，则关闭该连接；否则放回池中下次再使用
  */
 public synchronized void releaseConnection(Connection conn) {
  if (pools.size() >= maxClients)
   try {
    conn.close();
   } catch (SQLException e) {
    // TODO自动生成 catch 块
    e.printStackTrace();
   }
  else {
   pools.add(conn);
   clients--;
   notify();
  }
 }
 
 public synchronized void clear(){
        for(int i=0;i&lt;pools.size();i++){
         Connection conn =(Connection)pools.get(i);
         try {
    conn.close();
   } catch (SQLException e) {
    // TODO自动生成 catch 块
    e.printStackTrace();
   }
        }
        pools.removeAllElements();

}


}</pre><br />本文欢迎转载,转载时请说明出处.
          <br/>
          <span style="color:red;">
            <a href="http://staratsky.javaeye.com/blog/209048#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 29 Jun 2008 01:11:02 +0800</pubDate>
        <link>http://staratsky.javaeye.com/blog/209048</link>
        <guid>http://staratsky.javaeye.com/blog/209048</guid>
      </item>
      <item>
        <title>一个人的字世界</title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/206832" style="color:red;">http://staratsky.javaeye.com/blog/206832</a>&nbsp;
          发表时间: 2008年06月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          台湾学者赵开灏先生，他自己说自己是文化流氓，在很多人眼里他是一个偏执狂，在我看来他是一个乔致庸式的人物，有像乔致庸一样的“汇通天下，货通天下“的梦想。并将这个梦想为他的毕生追求的事业。<br />   说实话，我一开始对赵先生的印象并不好。我刚入职不久的一次公司会议上，我见到了赵先生，一位满头白发，神情寥漠，手里夹着一支点燃的烟的老人。旁边一位同事悄悄对我说，你猜他多少岁？我说70多吧。他说，错了，只有50好几。人到齐后,赵先生开始发表了一通长篇大论。可是很多人都对他的话不屑一顾。好不容易，等他的话说完了，有位同事站起来说，北京公交太拥挤，上下班时间能否实行弹性制度？赵先生粗暴地打断他的话，说你先不要说公司怎么样，你先先问问你为公司做了什么？如果你对公司有贡献，公司会考虑的。（在不久的几个月后，我每天都是10多点时间才大摇大摆地出现在公司门口，赵先生知道以后，没说什么，也只是说了一句“工作需要”）。这位赵先生在众多员工面前，对文总(文小凡, 女, 委员, 中国图书进出口集团总公司中图信技术有限公司, 总经理)的讲话说“放屁”；和下属不顾风度的争个面红耳赤.在公司员工绝大多是大陆员工的会议上谈台独敏感性政治话题。<br />    我曾经讥笑过赵开灏先生是孔乙己。别人不解，问为什么。我说你难道没发现吗？孔乙己很痴迷茴香豆的茴有几种写法，而赵先生也喜欢收录各种异体字。由统一字符编码（Unicode）标准准协会收录的汉字不过2万多汉字，而炼珍堂收录的汉字却有16万多。收录这么多汉字干什么呢？平常人只要几千汉字就够用了。赵先生说文字是中国文化的基础，文字问题解决了，录入问题解决了，中华文化才能以数字形式创建、存储、检索。中华文化才能在互联网上方便的传播。建设世界最大的网上中文信息集散中心，弘扬中华文化才不是梦想。汉字与中华文化的关系，好比是对数表与天文学的关系，算珠口诀与算盘的关系。<br />   赵先生推出的中华文化的战略，是从字入手，由字而词，由词而句，由句到全部信息。在基于炼珍堂人工智能专利技术的基础上推出“字世界”、“书世界”、“库世界”三大产品。字世界主要是解决大陆及港澳台繁简字标准不统一带来的在信息处理和互联网应用等方面的诸多问题。“书世界”将现有的书籍数字化。库世界”是建立在“字世界”、“书世界”以及不断扩充的视频、音频数据库基础之上的综合性数据库。这就是一个中华文化知识库的完整思路.<br />   其中,字世界是中华文化知识库的基础.是一个基于中华字库的专业搜索引擎。字世界有12种查询功能，只要你能想的到的，字世界都能提供。包括部首查字、读音查字、笔画查字、笔顺查字、字根查字、韵根查询、知字查询、模糊查询、谐音查询、词格查询、词义查询、分类查询。使用者只要输入有关字词，便可得出该词的汉语拼音、相似词、相反词、主要解释及出处，查询方便快捷；而且里面又附有近义词索引表、反义词索引表。<br />   有关书世界和库世界,赵先生表示，“在炼珍堂公司诞生的那一刻起，我们就秉持运用先进技术挖掘中华文化的內涵价值，向全世界传播中华文化的发展理念努力工作。与技术系统开发同步，炼珍堂正在建设庞大精准的内容数据库――《中华文化知识库》。该库以中华上下五千年的历史、文化作为研究内容，目前总容量已超过数百Ｇ，并包含数十万张自有知识产权的图片。其数据内容可以被系统直接调用进行精准检索，并可以对信息进行二次处理生成二次文献和多次文献。“<br />    炼珍堂在14年中投入了数以千计的研究人员和数以亿计的研发费用，14年磨一剑，剑没完成，而赵先生却心力交瘁。赵先生曾经很悲伤的说过这样一段话：一只老龙，带着一批小龙，去干一件将中华文化推向世界的大事。可惜这只老龙老了，累了，而小龙却还没有成长起来。炼珍堂终于维持不下去了。赵先生遣散最后一批人。他说，他将中华文化推向世界的梦想不会熄灭，炼珍堂也会有东山再起的一天。
          <br/>
          <span style="color:red;">
            <a href="http://staratsky.javaeye.com/blog/206832#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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>Sun, 22 Jun 2008 14:15:23 +0800</pubDate>
        <link>http://staratsky.javaeye.com/blog/206832</link>
        <guid>http://staratsky.javaeye.com/blog/206832</guid>
      </item>
      <item>
        <title>小议基于j2ee框架下的ioc实现</title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/198047" style="color:red;">http://staratsky.javaeye.com/blog/198047</a>&nbsp;
          发表时间: 2008年05月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.ioc定义<br />  IoC就是Inversion of Control，控制反转。<br />  IoC 的概念是Michael Mattson在1996年一篇讨论面向对象框架(Object Oriented Frameworks)的文章中提出的。面向对象设计及编程（OOD/OOP）的基本思想简单地说就是把复杂软件系统分解成通过接口相互合作的对象。这些对象类的内部实现之间并不互相牵扯，因而降低了问题的复杂性，且可独立灵活地被重用和扩展。经典面向对象的编程语言（如C++，Java）的侧重点就是提供语言机制来方便并简化这种基于对象类的分解，重用和扩展。<br />  在基于模块化软件组装部署配置框架设计中,Michael Mattson提出了基于IOC容器的IoC设计原则。依照该原则，业务逻辑模块并不需知道更不必调用组件框架的服务，例如不用关心和调用其factory或lookup其directory或context等。软件的组装部署和配置完全是由Ioc容器反过来主动控制业务逻辑模块来安排。Michael Mattson用所谓的好莱坞原则（Hollywood Principle）“别来找我，到时候,我会去找你”（don't call me, I will call you）形象地比喻了这一设计思想。这个比喻中的“我”指的是Ioc容器，“你”则是被其调遣配置的一个组件。<br />   在Java开发中，IoC地实现通过工厂模式，由工厂新建所需要的类。在j2ee轻量级框架中,则由ioc容器来控制。ioc容器的一个著名实现是Spring.另外一个Guice，google名下的产物.这两种实现代表了ioc技术的两个发展方向。他们之间的最根本的区别在于，spring采用XML文件的形式来配置依赖注入关系;而Guice完全通过Java 5注解实现类型安全的注入。<br /> <br />2.spring的ioc容器实现<br />使用spring的方式，创建一个由spring ioc容器控制的ioc的应用程序。<br />1）定义用于接口，打印“hello,world”消息<br /><pre name="code" class="java">
public interface MessageProvider {
 public String getMessage();
}
</pre><br />2）实现这个接口<br /><pre name="code" class="java">
public class MessageHello implements MessageProvider {
 public String getMessage() {
  String message = "hello,world";
  return message;
 }
}
</pre><br />3）setter injection<br /><pre name="code" class="java">
public class HelloWorld {
 private MessageProvider provider;

 public void setProvider(MessageProvider provider) {
  this.provider = provider;
 }

 public void showMessage() {
  System.out.println(provider.getMessage());
 }
}
</pre><br />4)配置依赖注入关系<br />在applicationContext.xml中配置：<br /><br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

&lt;beans>
&lt;bean id="helloBean" class="test.spring.HelloWorld">
&lt;property name="provider">
   &lt;ref local="helloProvider"/>
&lt;/property>
&lt;/bean>
&lt;bean id="helloProvider" class="test.spring.MessageHello">&lt;/bean>
&lt;/beans>
</pre><br />5）创建测试类<br /><pre name="code" class="java">
public class ShowHello {
public static void main(String[] args){
 try{
 XmlBeanFactory factory =new XmlBeanFactory(new FileSystemResource("src/applicationContext.xml"));
 HelloWorld messageReader = (HelloWorld)factory.getBean("helloBean");
 messageReader.showMessage();
 }catch(Exception ex){
  System.out.println(ex.toString());
 }
}
}
</pre><br />运行测试类，控制台输出：Hello,World!<br /><br /><br />3.Guice的ioc容器实现<br /><br />Guice下载链接(http://code.google.com/p/google-guice/downloads/list)<br />1）定义接口<br /><pre name="code" class="java">
public interface MessageProvider{
    void myMethod();
}
</pre><br />2）定义实现类<br /><pre name="code" class="java">
public class MessageHello implements MessageProvider{
    public void myMethod(){
        System.out.println("Hello,World!");
    }
}
</pre><br /><br />3）Guice进行注入类<br /><pre name="code" class="java">
public class Client{
    MessageProvider service;
    @Inject //告诉容器，这里的service对象的引用,需要进行注入
    void injectMessageProvider(MessageProvider service){ //这里的方法名字可以任意定义
        this.service = service;
    }
    public void myMethod(){
        service.myMethod();
    }
}
</pre><br /><br />4）定义Guice的Module文件告诉容器如何进行注入<br /><pre name="code" class="java">
import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.Scopes;
public class MyModule implements Module{
    public void configure(Binder binder){
       binder.bind(MessageProvider.class).to(MessageHello.class).in(Scopes.SINGLETON);
    // 这句代码的意思是说：运行时动态的将MessageHello对象赋给MessageProvider定义的对象，而且这个对象是单例的。
    }
}
</pre><br /><br />5）创建测试类<br /><pre name="code" class="java">
import com.google.inject.Guice;
import com.google.inject.Injector;

public class Test{
    public static void main(String[] args){
   MyModule module = new MyModule();
   // 定义注射规则
   Injector injector = Guice.createInjector(module);
   // 根据注射规则，生成注射者
   Client client = new Client();
   injector.injectMembers(client);
   // 注射者将需要注射的bean,按照规则,把client这个客户端进行注射
   client.myMethod();   
  }
}
</pre><br /><br />运行测试类，控制台输出：Hello,World!
          <br/>
          <span style="color:red;">
            <a href="http://staratsky.javaeye.com/blog/198047#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 28 May 2008 23:43:22 +0800</pubDate>
        <link>http://staratsky.javaeye.com/blog/198047</link>
        <guid>http://staratsky.javaeye.com/blog/198047</guid>
      </item>
      <item>
        <title>小项目怎么做需求分析?</title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/192073" style="color:red;">http://staratsky.javaeye.com/blog/192073</a>&nbsp;
          发表时间: 2008年05月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在做项目时，经常会碰到这样的事情.<br />客户向我们反映在和你们的工程师谈论需求时，他们总是满口答应没问题。可是，当他们做好以后，拿过来一看，根本就不是这么回事。而开发人员也在诉苦：用户什么都不懂，而且他们的需求老是变动，时间又这么紧,你让我们怎么办？<br />我觉得如果开发人员在做需求分析时,如果注意以下几点,也许可以避免被动的局面.<br /><br /><strong>1、掌握相关的行业知识</strong><br />  在和客户沟通之前，最好了解一下相关的行业知识。<br />  有一个项目管理人员说：行业知识可有可无，作为需求人员，最重要的是和客户沟通。最好把客户讲的东西都记下来。然后，由项目组决定后，再把意见反馈给用户。这种沟通方式，既不能有效的发现问题，也容易延误项目时间。<br />   案例：<br />   小A某名牌大学毕业，公司为了锻炼他，特意安排他和一个比较重要的客户进行一次沟通。小A和客户电话联系，商定了见面的时间和地点。西装革履的小A提前十分钟来到了见面的地点。一番客套之后，小A和客户就开始进入话题。客户开始谈他的需求，从项目背景到项目目的，从业务流程到相关部门和人员。客户兴致勃勃地说着，小A手忙脚乱的记着。客户停下来，问小A你觉得我的观点有什么需要补充吗？小A老实地回答说，我对业务还不是很熟悉。客户一下兴致全无，对小A说，等你对业务熟悉了，再来找我把。<br /><br /><strong>2、重在沟通</strong><br />  沟通的方式可以是访谈和调研、会议、电话、电子邮件、小组讨论、模拟演示等不同形式。我的意见是最好是与客户面对面的沟通。金庸武侠小说中的高手过招，都是面带微笑，不露声色，比拼的是内力。面对面的沟通，就是比拼内力。所以，一定要把准备工作都做好了。<br />  沟通其实也是在相互妥协。对用户合理的要求，要尽量满足。用户的一些不合理的要求，要想办法避免。要委婉地提醒用户，如果这样做，可能要增加项目时间，或者对运行环境有更高的要求。<br />  沟通一定要有记录，对于交流的结果还可以进行分类，便于后续的分析活动。<br /><br /><strong>3、深究细节</strong><br />  不要等到项目做好后，才让客户发现问题。<br />  客户所能提供给你的只是他们想到的功能需求，很多问题并不在他们考虑的范围之内，如果作为项目承担方没有去做分析，简单的按照功能要求去设计、规划，最终出来的系统是很难完全符合客户的业务流程的.这时，在客户看来当然需要更改.但这种更改却被我们看成了需求的更改。既然是需求的更改,那么就需要增加项目成本(资源)或延长项目时间。我看过一篇文章,说要要想项目成功,就得和用户建立亲密的伙伴关系.可是,这种以需求的更改为理由让用户从口袋里掏钱,亲兄弟也不干阿.<br />  所以,需求分析不仅仅是拿到客户的需求，更重要的是还需进行分析，了解细节，并就细节跟客户咨询，获取最详细的资料。
          <br/>
          <span style="color:red;">
            <a href="http://staratsky.javaeye.com/blog/192073#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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 01:43:07 +0800</pubDate>
        <link>http://staratsky.javaeye.com/blog/192073</link>
        <guid>http://staratsky.javaeye.com/blog/192073</guid>
      </item>
      <item>
        <title>如何成为系统架构师</title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/188239" style="color:red;">http://staratsky.javaeye.com/blog/188239</a>&nbsp;
          发表时间: 2008年04月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          3月到5月正是跳槽的时节。<br />  有经验的求职者中会想：我现在虽然还在开发软件，可是我应该及早对人生作出规划呀。可以考虑试试应聘系统架构师。能应聘上，当然好。不能应聘上，也可以积累点经验。<br />  一些公司老板也在考虑，能招到有经验的系统架构师当然好，如果没有，也可以从一些有经验的开发人员中培养。但是，我怎么知道他们是否有这个潜力呢？<br />  我是做java开发的。所以就java方面的系统架构师所要具备的潜力提供一点自己的见解。<br />  首先，是否能成为系统架构师的第一要点，是否善于学习。有的开发人员能力很强，但忽视了自身的学习。总喜欢把过去的经验复制过来。喜欢对现在的管理方法，业务流程进行评头论足。他们经常得出这样的结论就是应该按照他的意见办，否则，项目就会进行不下去。这种类型的人很难真正成为系统架构师。一个员工到了一个新环境，不管他以前开发经验多么丰富，也不管他以前能力是多么强。她都应该多做多听少说，应该尽快的适应这个环境。熟悉公司的开发流程，项目管理方式，开发规范，人员组织，公司的规章制度等。<br />  第二，有较强的工作责任心和敬业精神，具备一定的沟通能力和组织、协调管理能力。不要因为给你分配的任务太简单而不愿做；也不要因为给你分配的任务太复杂而拒绝做。能从简单的工作中发现不为人注意的问题，能将复杂的工作理出头绪来，这就是反映系统架构师的一个能力。有问题应该及时沟通，切忌自己一个人埋头苦干。要对小组的每个成员给与足够的关注和信任。尽量的根据他们每个人的特点安排他们干比较适合自己的工作。<br />  第三，要具备独立分析问题的能力和较强的逻辑表达能力。一有问题就喜欢依赖别人的员工，也很难成为系统架构师。不能坚持自己观点的系统架构师也不是好的系统架构师。要坚持自己观点，这就要求要具备很强的独立分析问题的能力。要学会从正反两方面考虑问题。思想的火花往往是在争论中产生的。要学会在讨论中倾听反方的意见。倾听反方的意见是为了扩大思考的范围，以便更有利于坚持自己的意见。要记住解决问题的方案没有对错，只有优劣。但是在解决问题时，放弃自己的观点，那就是错的。<br />  第四，要有很扎实的专业基础和比较广泛的专业知识。专业基础比如，java语言的核心技术，面向对象的思想、23种设计模式。比较广泛的专业知识：熟悉主流应用服务器，熟悉主流数据库，熟悉J2EE主流架构技术。<br /><br />java应用系统开发中，java系统架构师的具体职责体现在两方面：<br />(1)行业应用架构。行业架构师往往是行业专家，了解行业应用需求，其架构行为主要是将需求进行合理分析布局到应用模型中去，偏向于应用功能布局。建议如果在开发过程中，积累的行业知识足够多，应该朝行业应用架构发展。<br />(2)应用系统技术体系架构。技术架构师往往是技术高手中的高手，掌握各类技术架构、掌握应用设计模式，其架构行为考虑软件系统的高效性、复用性、安全性、可维护性、灵活性、跨平台性等。这类就是我们常说的j2ee系统架构师。
          <br/>
          <span style="color:red;">
            <a href="http://staratsky.javaeye.com/blog/188239#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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, 30 Apr 2008 00:13:36 +0800</pubDate>
        <link>http://staratsky.javaeye.com/blog/188239</link>
        <guid>http://staratsky.javaeye.com/blog/188239</guid>
      </item>
      <item>
        <title>sqlserver锁机制研究</title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/186542" style="color:red;">http://staratsky.javaeye.com/blog/186542</a>&nbsp;
          发表时间: 2008年04月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          对锁机制的研究要具备两个条件：<br />1．数据量大<br />2．多个用户同时并发<br />如果缺少这两个条件，数据库不容易产生死锁问题。研究起来可能会事倍功半。如果这两个条件都有，但你还是按数据库缺省设置来处理数据，则会带来很多的问题，比如：<br />1）丢失更新<br />A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果<br />2）脏读<br />A用户修改了数据时,B用户也在读该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致<br />3）不可重复读<br />B用户读出该数据并修改,同时，A用户也在读取数据，此时A用户再读取数据时发现前后两次的值不一致<br />SQL SERVER 作为多用户数据库系统，以事务为单位，使用锁来实现并发控制。SQLSERVER使用“锁”确保事务完整性和数据一致性。<br /><br /><strong>一、锁的概念</strong><br />锁（LOCKING）是最常用的并发控制机构。是防止其他事务访问指定的资源控制、实现并发控制的一种主要手段。锁是事务对某个数据库中的资源（如表和记录）存取前，先向系统提出请求，封锁该资源，事务获得锁后，即取得对数据的控制权，在事务释放它的锁之前，其他事务不能更新此数据。当事务撤消后，释放被锁定的资源。<br />当一个用户锁住数据库中的某个对象时，其他用户就不能再访问该对象<br /><br /><strong>二、锁的粒度</strong><br />SQL Server 2000 具有多粒度锁定，允许一个事务锁定不同类型的的资源。为了使锁定的成本减至最少，SQL Server 自动将资源锁定在适合任务的级别。锁定在较小的粒度（例如行）可以增加并发但需要较大的开销，因为如果锁定了许多行，则需要控制更多的锁。锁定在较大的粒度（例如表）就并发而言是相当昂贵的，因为锁定整个表限制了其它事务对表中任意部分进行访问，但要求的开销较低，因为需要维护的锁较少。SQL Server 可以锁定行、页、扩展盘区、表、库等资源。<br /><ul><li>资源	级别	描述</li><li>RID	行锁	表中的单个行</li><li>Key	行级锁	索引中的行</li><li>Page	页级锁	一个数据页或者索引页</li><li>Extent	页级锁	一组数据页或者索引页</li><li>Table	表级锁	整个表</li><li>Database	数据库级锁	整个数据库</li></ul><br />选择多大的粒度，根据对数据的操作而定。如果是更新表中所有的行，则用表级锁;如果是更新表中的某一行，则用行级锁。<br />行级锁是一种最优锁，因为行级锁不可能出现数据既被占用又没有使用的浪费现象。但是，如果用户事务中频繁对某个表中的多条记录操作，将导致对该表的许多记录行都加上了行级锁，数据库系统中锁的数目会急剧增加，这样就加重了系统负荷，影响系统性能。因此，在SQL Server中，还支持锁升级(lock escalation)。<br />所谓锁升级是指调整锁的粒度，将多个低粒度的锁替换成少数的更高粒度的锁，以此来降低系统负荷。在SQL Server中当一个事务中的锁较多，达到锁升级门限时，系统自动将行级锁和页面锁升级为表级锁。<br />特别值得注意的是，在SQL Server中，锁的升级门限以及锁升级是由系统自动来确定的，不需要用户设置。 <br /><br /><strong>三、锁的模式</strong><br />锁模式以及描述表<br /><ul><br />锁模式	描述<li>共享（S）	用于不更改或不更新数据（只读操作），如SELECT语句</li><li>更新（U）	用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。</li><li>排它（X）	用于数据修改操作，例如 INSERT、UPDATE或DELETE。确保不会同时对同一资源进行多重更新</li><li>意向	当 Microsoft SQL Server 数据库引擎获取低级别的锁时，它还将在包含更低级别对象的对象上放置意向锁.例如： </li>当锁定行或索引键范围时，数据库引擎将在包含行或键的页上放置意向锁。当锁定页时，数据库引擎将在包含页的更高级别的对象上放置意向锁。<br />意向锁的类型为：意向共享（IS）、意向排它（IX）以及意向排它共享（SIX）<li>架构	在执行依赖于表架构的操作时使用。架构锁的类型为：架构修改（Sch-M）和架构稳定（Sch-S）</li><li>大容量更新（BU）	向表中大容量复制数据并指定了TABLOCK提示时使用</li></ul><br /><br /><br /><strong>四 SQL Server 中锁的设置</strong><br />1 处理死锁和设置死锁优先级<br />死锁就是多个用户申请不同封锁,由于申请者均拥有一部分封锁权而又等待其他用户拥有的部分封锁而引起的无休止的等待<br />可以使用SET DEADLOCK_PRIORITY控制在发生死锁情况时会话的反应方式。<br />Syntax:<br />SET DEADLOCK_PRIORITY { LOW | NORMAL}<br />其中LOW说明该进程会话的优先级较低，在出现死锁时，可以首先中断该进程的事务。<br />2 处理超时和设置锁超时持续时间。<br />@@LOCK_TIMEOUT 返回当前会话的当前锁超时设置，单位为毫秒<br />SET LOCK_TIMEOUT 设置允许应用程序设置语句等待阻塞资源的最长时间。当语句等待的时间大于 LOCK_TIMEOUT 设置时，系统将自动取消阻塞的语句，并给应用程序返回"已超过了锁请求超时时段"的 1222 号错误信息<br />示例<br />1）将锁超时期限设置为 1,800 毫秒。<br />SET LOCK_TIMEOUT 1800<br />2) 配置索引的锁定粒度<br />可以使用 sp_indexoption 系统存储过程来设置用于索引的锁定粒度<br />3）设置事务隔离级别<br />SET   TRANSACTION   ISOLATION   LEVEL <br /><br /><strong>五 查看锁的信息</strong><br />1 执行 EXEC SP_LOCK 报告有关锁的信息<br />2 查询分析器中按Ctrl+2可以看到锁的信息 <br /><br /><strong>六、奇怪的sql语句</strong><br /><pre name="code" class="java">begin tran
update titles set title_idid＝title_id  where 1＝2
if (selectavg(price)fromtitles)>$15
begin
update titles set price＝price*1.10
where price&lt;(select avg(price)from titles)
end
commit tran</pre><br /><br />update titles set title_idid＝title_id  where 1＝2，这个条件是永远也不会成立的，如此写的含义是什么呢？<br />这里的where子句看起来很奇怪，尽管计算出的结果总是false。当优化器处理此查询时，因为它找不到任何有效的SARG，它的查询规划就会强制使用一个独占锁定来进行表扫描。此事务执行时，where子句立即得到一个false值，于是不会执行实际上的扫描，但此进程仍得到了一个独占的表锁定。<br />因为此进程现在已有一个独占的表锁，所以可以保证没有其他事务会修改任何数据行，能进行重复读，且避免了由于holdlock所引起的潜在性死锁。<br />但是，在使用表锁定来尽可能地减少死锁的同时，也增加了对表锁定的争用。因此，在实现这种方法之前，你需要权衡一下：避免死锁是否比允许并发地对表进行访问更重要。<br />所以，在这个事务中，没有其他进程修改表中任何行的price。 <br /><br /><strong>七 如何避免死锁</strong><br />1 使用事务时，尽量缩短事务的逻辑处理过程，及早提交或回滚事务；<br />2 设置死锁超时参数为合理范围，如：3分钟-10分种；超过时间，自动放弃本次操作，避免进程悬挂；<br />3 所有的SP都要有错误处理（通过@error）<br />4 一般不要修改SQL SERVER事务的默认级别。不推荐强行加锁<br />5 优化程序，检查并避免死锁现象出现；<br />1）合理安排表访问顺序<br />2）在事务中尽量避免用户干预，尽量使一个事务处理的任务少些。<br />3）采用脏读技术。脏读由于不对被访问的表加锁，而避免了锁冲突。在客户机/服务器应用环境中，有些事务往往不允许读脏数据，但在特定的条件下，我们可以用脏读。<br />4）数据访问时域离散法。数据访问时域离散法是指在客户机/服务器结构中，采取各种控制手段控制对数据库或数据库中的对象访问时间段。主要通过以下方式实现: 合理安排后台事务的执行时间，采用工作流对后台事务进行统一管理。工作流在管理任务时，一方面限制同一类任务的线程数（往往限制为1个），防止资源过多占用; 另一方面合理安排不同任务执行时序、时间，尽量避免多个后台任务同时执行，另外，避免在前台交易高峰时间运行后台任务<br />5）数据存储空间离散法。数据存储空间离散法是指采取各种手段，将逻辑上在一个表中的数据分散到若干离散的空间上去，以便改善对表的访问性能。主要通过以下方法实现: 第一，将大表按行或列分解为若干小表; 第二，按不同的用户群分解。<br />6）使用尽可能低的隔离性级别。隔离性级别是指为保证数据库数据的完整性和一致性而使多用户事务隔离的程度，SQL92定义了4种隔离性级别：未提交读、提交读、可重复读和可串行。如果选择过高的隔离性级别，如可串行，虽然系统可以因实现更好隔离性而更大程度上保证数据的完整性和一致性，但各事务间冲突而死锁的机会大大增加，大大影响了系统性能。<br />7）使用Bound Connections。Bound connections 允许两个或多个事务连接共享事务和锁，而且任何一个事务连接要申请锁如同另外一个事务要申请锁一样，因此可以允许这些事务共享数据而不会有加锁的冲突。<br />8）考虑使用乐观锁定或使事务首先获得一个独占锁定。  <br /><br /><strong>八如何对行、 表、数据库加锁</strong><br />1 如何锁一个表的某一行<br /><pre name="code" class="java">SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT * FROM table1 ROWLOCK WHERE A = 'a1'</pre><br />2 锁定数据库的一个表<br />select col1 from 表 (tablockx) where 1=1 ;<br />加锁后其它人不可操作，直到加锁用户解锁，用commit或rollback解锁<br />3.实例<br />建表<br /><pre name="code" class="java">create table table1(A varchar(50)  not  null, B varchar(50) ,C varchar(50));
create table table2(D varchar(50),E varchar(50))
insert table1 (A,B,C) values(‘a1’,’b1’,’c1’);
insert table1 (A,B,C) values(‘a2’,’b2’,’c2’);
insert table1 (A,B,C) values(‘a3’,’b3’,’c3’);
insert table2 (D,E) values(‘d1’,’e1’);
insert table2 (D,E) values(‘d2’,’e2’);</pre><br />1）排它锁<br /><pre name="code" class="java">-- A事务先更新table1表，在更新时，对其他事务进行排他
begin tran
update table1 set A='aa' where B='b2'；
waitfor delay '00:00:30'； --等待30秒
commit tran
-- A事务先更新table2表
begin tran
select * from table1 where B='b2';
commit tran</pre>若同时执行上述两个事务，则select查询必须等待update执行完毕才能执行即要等待30秒<br />2）共享锁<br /><pre name="code" class="java">-- A事务先查询table1表，在查询时，加共享锁，防止其他事务对该表进行修改操作
begin tran
select * from table1 holdlock where B='b2' ;
 -holdlock人为加锁
waitfor delay '00:00:30';--等待30秒
commit tran
-- A事务先查询table1表，后更改table1表
begin tran
select A,C from table1 where B='b2';
update table1 set A='aa' where B='b2';
commit tran</pre>若并发执行上述两个事务，则B事务中的select查询可以执行,而update必须等待第一个事务释放共享锁转为排它锁后才能执行即要等待30秒<br />3）死锁<br /><pre name="code" class="java">-- A事务先更新table1表，然后延时30秒，再更新table2表；
begin tran
update table1 set A='aa' where B='b2';
--这将在 Table1 中生成排他行锁，直到事务完成后才会释放该锁。
waitfor delay '00:00:30';
--进入延时
update table2 set D='d5' where E='e1' ;
commit tran
-- B事务先更新table2表，然后延时10秒，再更新table1表；
begin tran
update table2 set D='d5' where E='e1';
--这将在 Table2 中生成排他行锁，直到事务完成后才会释放该锁
waitfor delay '00:00:10'
--进入延时
update table1 set A='aa' where B='b2' ;
commit tran</pre>若并发执行上述两个事务，A,B两事务都要等待对方释放排他锁，这样便形成了死锁。<br /><br /><strong>九、sqlserver提供的表级锁</strong><br />sqlserver所指定的表级锁定提示有如下几种<br />1． HOLDLOCK: 在该表上保持共享锁，直到整个事务结束，而不是在语句执行完立即释放所添加的锁。  <br />2． NOLOCK：不添加共享锁和排它锁，当这个选项生效后，可能读到未提交读的数据或“脏数据”，这个选项仅仅应用于SELECT语句。   <br />3． PAGLOCK：指定添加页锁（否则通常可能添加表锁）<br />4． READCOMMITTED用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下，SQL Server 2000 在此隔离级别上操作。<br />5． READPAST: 跳过已经加锁的数据行，这个选项将使事务读取数据时跳过那些已经被其他事务锁定的数据行，而不是阻塞直到其他事务释放锁，READPAST仅仅应用于READ COMMITTED隔离性级别下事务操作中的SELECT语句操作<br />6． READUNCOMMITTED：等同于NOLOCK。    <br />7． REPEATABLEREAD：设置事务为可重复读隔离性级别。  <br />8． ROWLOCK：使用行级锁，而不使用粒度更粗的页级锁和表级锁。 <br />9． SERIALIZABLE：用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于 HOLDLOCK。<br />  10． TABLOCK：指定使用表级锁，而不是使用行级或页面级的锁，SQL Server在该语句执行完后释放这个锁，而如果同时指定了HOLDLOCK，该锁一直保持到这个事务结束。<br />11． TABLOCKX：指定在表上使用排它锁，这个锁可以阻止其他事务读或更新这个表的数据，直到这个语句或整个事务结束。<br />12． UPDLOCK ：指定在读表中数据时设置更新锁（update lock）而不是设置共享锁，该锁一直保持到这个语句或整个事务结束，使用UPDLOCK的作用是允许用户先读取数据（而且不阻塞其他用户读数据），并且保证在后来再更新数据时，这一段时间内这些数据没有被其他用户修改<br />SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表，但不能更新删除<br />SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除<br /><br /><strong>十、应用程序锁</strong><br /><br />应用程序锁就是客户端代码生成的锁，而不是sql server本身生成的锁处理应用程序锁的两个系统存储过程<br />sp_getapplock： 锁定应用程序资源<br />sp_releaseapplock： 为应用程序资源解锁
          <br/>
          <span style="color:red;">
            <a href="http://staratsky.javaeye.com/blog/186542#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 24 Apr 2008 21:33:55 +0800</pubDate>
        <link>http://staratsky.javaeye.com/blog/186542</link>
        <guid>http://staratsky.javaeye.com/blog/186542</guid>
      </item>
      <item>
        <title>java继承容易犯的错误</title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/180601" style="color:red;">http://staratsky.javaeye.com/blog/180601</a>&nbsp;
          发表时间: 2008年04月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在网上看见一个关于java继承的问题，觉得这是很多初学java应该注意的问题。<br /><pre name="code" class="java">
public abstract class A {
  int i=1;
  public void printI() {
    System.out.println("i="+i);
  }
}

public class B  extneds A{
  int i=2;
  public static void main(String[] args) {
    B b=new B();
    b.printI();
  }
}
</pre><br />那么，控制台打出来的i的值是多少？<br />呵呵，如果一下功夫就能说出正确结果1，那么，下面部分就不需要往下看了。<br /><br />1、类的继承知识点<br />（1）java不支持多重继承，也就是说子类至多只能有一个父类<br />（2）子类继承了其父类中不是私有的成员变量和成员方法，作为自己的成员变量和方法<br />（3）子类中定义的成员变量和父类中定义的成员变量相同时，则父类中的成员变量不能被继承<br />（4）子类中定义的成员方法，并且这个成员方法的名字，返回类型，及参数个数和类型与父类的某个成员方法完全相同，则父类的成员方法不能被继承。<br /><br />2、答案是2者如是说<br />  子类B中的变量i和父类A中的变量i重名, 那么子类B中的变量i将会覆盖掉父类中的同名变量i. 则访问父类中的变量时jvm会把子类cast到父类.所以，打印出的结果应该是“i=2”;<br /><br />3、歧义的产生<br />  歧义的产生最关键的地方是子类B中的变量i将会覆盖掉父类中的同名变量i的覆盖两个字。这里，我觉得这两个字容易误导。应该改为屏蔽或隐藏。因为在这里父类的成员变量是没有被改变。<br /><br />4、jvm的执行过程<br />（1）子类B 的构造方法被调用，实例化一个B对象，B对象的成员被初始化<br />（2）jvm隐含的调用父类的构造方法,实例化一个A对象，A对象的成员被初始化。<br />（3）由于A对象的printI()未被屏蔽，所以调用的A对象的printI()函数。<br />那么，在这里A的成员函数当然是访问自己的成员变量了。<br /><br />5、super关键字<br />super关键字在java中的作用是使被屏蔽的成员变量或者成员方法或变为可见，或者说用来引用被屏蔽的成员变量和成员成员方法。super是用在子类中，目的是访问直接父类中被屏蔽的成员。上面的代码也可以这样写：<br /><pre name="code" class="java">
public abstract class A {
  int i=1;
  public void printI() {
    System.out.println("i="+i);
  }
}
public class B extends A{
	public int i=2;
	public void printI(){
		super.printI();
	}
	public static void main(String[] args){
		B b= new B();
		b.printI();
		
	}
}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://staratsky.javaeye.com/blog/180601#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Apr 2008 20:28:06 +0800</pubDate>
        <link>http://staratsky.javaeye.com/blog/180601</link>
        <guid>http://staratsky.javaeye.com/blog/180601</guid>
      </item>
      <item>
        <title>步入j2ee架构设计</title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/178620" style="color:red;">http://staratsky.javaeye.com/blog/178620</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.RUP简介<br />   谈到架构设计，就不能说rup,架构是在rup中最早提出来的。<br />   RUP(Rational Unified Process,统一软件开发过程,统一软件过程)是一个面向对象且基于网络的程序开发方法论。<br />   RUP把一个项目开发概括成4个阶段，9个核心工作流程，6大方法。<br />RUP定义了初始、细化、实现和部署4个阶段<br />RUP是最佳软件开发经验的总结，它包括了软件开发中的六大方法：<br />1）迭代式开发；<br />2）管理需求；<br />3）使用基于组件的软件体系结构；<br />4）可视化建模；<br />5）验证软件质量；<br />6）控制软件变更。<br />RUP的9个核心工作流程是：<br />1）业务建模，理解待开发系统所在的机构及其商业运作，确保所有人员对它有共同的认识，评估待开发系统对结构的影响；<br />2）需求，定义系统功能 及用户界面，为项目预算及计划提供基础；<br />3）分析与设计，把需求分析结果转换为分析与设计模型；<br />4）实现，把设计模型转换为实现结果，并做单元测试，集成为可执行系统；<br />5）测试，验证所有需求是否已经被正确实现，对软件质量提出改进意见；<br />6）部署，打包、分发、安装软件，培训用户及销售人员；<br />7）配置与变更管理，跟踪并维护系统开发过程中产生的所有制品的完整性和一致性；<br />8）项目管理，为软件开发项目提供计划、人员分配、执行、监控等方面指导，为风险管理提供框架；<br />9）环境，为软件开发机构提供软件开发环境。<br />架构是rup的一个核心元素。<br />在rup中，软件的架构涉及到从早期的系统概念到设计,开发,测试,操作范围内的系统结构的计划和维护。<br /><br />2.架构设计定义<br />    架构设计其实是两个概念：架构和设计。架构主要关注非功能性的，而设计关注的是应用业务用例，是和软件功能相关的。<br />    架构设计中的架构部分是一种抽象机制，用以澄清设计意图，提供设计之分析基础，改善可维护性，提供决策，减少风险所需的信息。<br />   架构设计中的设计部分主要是指如何将软件系统分解成不同的部分、各部分之间的静态结构关系和动态交互关系等。<br /><br />3.架构设计的总体目标<br />   架构设计的总体目标，可以概括如下：<br />1）最大化的重用<br />2）尽可能的简单明了<br />3）最灵活的扩展性<br /><br />4.基于组件的架构设计<br />    能够像生产汽车那样，将各个部件组装起来就能造出一辆汽车，在软件开发领域一直是个梦想。组件开发思想的出现，则使这个梦想更近了一步。组件，意味着高内聚、高复用，我们只需了解其外部接口规格，就能使用其功能，无需知道其内部如何实现及运作。<br />　　软件架构在组件的设计、规范和使用中扮演着重要角色。软件的架构提供了组件设计和重复使用的设计环境。组件在软件架构的预定义方面扮演一定的角色。<br />    基于组件的架构设计必须由一系列独立部署的组件组成，组件的设计应该满足以下要求： <br />    第一，组件粒度合理。 <br />    第二，分布式、面向接口访问 <br />       组件实例能部署在一台或多台主机，服务使用者通过构件的逻辑名称即可获取服务而与构件所在主机的物理位置无关。 <br />    第三，松耦合、高内聚原则 <br />       组件之间保持松耦合状态，服务的具体实现方式对服务使用者透明。在构件内部所实现的功能与结构保持高度逻辑相关性的同时,保证组件间的相互独立性。 <br />    第四，共享信息服务 <br />      共享信息服务遵循企业的数据模型规范，外部系统通过企业集成与接口平台，访问系统的共享信息，以实现系统间的集成与互操作。 <br />    第五，业务过程与组件实现分离 <br />      业务过程与组件实现的分离的原则，利用流程管理、策略管理和界面集成技术，动态地定义系统的行为以实现系统功能。 <br /><br />   5.框架，模式，架构设计　<br />   框架是一个可实例化的、部分完成的软件系统或子系统，它为一组系统或子系统定义了架构，并提供了构造系统的基本构造块，还为实现特定功能定义了可调整点。在面向对象环境中，框架由抽象类和具体类组成。<br />   模式用来描述所交流问题及其解决方案。每个模式都是由三部分组成的一个规则。这个规则描述特定环境，特定系统作用，特定软件配置之间的关系。当一个领域逐渐成熟的时候，自然会出现很多模式。<br />   他们三者之间的关系如下：架构设计、框架、模式是一种从大到小的关系，也是一种组合关系。一个框架可能使用了多个模式，而一个架构设计有可能应用了多个框架。<br /><br />6.j2ee平台的架构设计<br />      j2ee平台技术架构的核心思路是采用分层结构开发和设计，将界面、业务逻辑和数据分离，实现系统内部松耦合，以灵活、快速地响应业务变化对系统的需求。涉及到的设计模式包括:<br />   a.server page(叶面内容和逻辑)<br />   b.页面控件重用<br />    c.页面内容和表现风格的分离<br />    d.页面输入验证<br />    e.多语言支持<br />    f.用户身份认证确认<br />1)j2ee系统层次结构<br />系统层次结构一般划分为数据层、业务逻辑层和控制层。当然,也可以根据需要划分更多层.<br />  a. 数据层 <br />     这一层为企业的信息系统服务,包括数据库系统,事务处理系统和与数据库交互的系统<br />  b.业务逻辑层 <br />    实现系统业务逻辑相关的处理功能，它包括业务组件子层和展现组件子层，分别实现人机界面无关的业务逻辑组件与人机界面相关的界面展示组件。业务逻辑层的组件以服务的形式提供与业务逻辑紧密相关的系统功能。 <br />  c.控制层 <br />主要实现对系统行为以及其它资源进行关联和控制，包括：对组件所提供的服务和系统资源的配置和控制，对业务流程的关联和控制以及对人机交互界面的关联和控制.控制层利用流程管理技术实现业务流程的动态定义和控制，利用策略管理及界面集成等技术实现界面外观和行为的动态控制。引入控制层有利于保证系统迅速适应业务需求的变化和发展。 <br />2)系统服务框架 <br />    系统服务框架需要如下的系统运行的公共机制并实现系统内部的公共服务，包括日志服务、系统监控服务、配置管理服务、认证鉴权服务、异常处理服务、流程管理服务和策略管理服务等。<br />   使用这些服务与机制可以简化系统构件的开发、部署和各种运行信息的管理。保证系统运行的一致性和各构件的高度集成。各应用系统可以建立私有的系统服务框架也可以共用同一个框架所实现的系统服务。
          <br/>
          <span style="color:red;">
            <a href="http://staratsky.javaeye.com/blog/178620#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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, 02 Apr 2008 00:35:56 +0800</pubDate>
        <link>http://staratsky.javaeye.com/blog/178620</link>
        <guid>http://staratsky.javaeye.com/blog/178620</guid>
      </item>
      <item>
        <title>在网站中加入google的搜索服务 </title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/174687" style="color:red;">http://staratsky.javaeye.com/blog/174687</a>&nbsp;
          发表时间: 2008年03月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在某个论坛中，想搜索自己的发表的帖子，发现该论坛调用google的搜索引擎去搜索。这也给我提了个醒，在自己的网页中加入google的搜索功能，岂不显得自己的网站更专业？<br />   google的搜索功能太强大太专业了，有网页搜索，视频搜索，图片搜索，博客搜索等。可以根据自己的需要进行选择。以下是代码：<br />1.加入google的网页搜索<br /><pre name="code" class="java">
&lt;html>
&lt;script language="javascript">
    function goSearch(){
      document.forms[0].target="_blank";
      document.forms[0].submit();
    }
    
&lt;/script>
&lt;body>
&lt;FORM   name=f   action=http://www.google.com/search>   
  &lt;TABLE   cellSpacing=0   cellPadding=0>   
      &lt;TBODY>   
      &lt;TR   vAlign=center>   
          &lt;TD   width=75>&nbsp;&lt;/TD>   
          &lt;TD   align=middle>&lt;INPUT   maxLength=256   size=55   name=q>   
                &lt;INPUT   type=hidden   value=zh-CN   name=hl>&lt;BR>
                &lt;INPUT   type=hidden   value=utf-8   name=ie>
          &lt;/TD>   
          &lt;TD   vAlign=top   noWrap>&lt;FONT   size=-1>&nbsp;&#8226;&nbsp;
          &lt;A    href="#" onclick="goSearch()">google搜索&lt;/A>&lt;/FONT>&lt;/TD>&lt;/TR>   
     &lt;/TBODY>&lt;/TABLE>&lt;/FORM>

&lt;/body>
&lt;/html>
</pre><br />2.加入google的视频搜索<br /><pre name="code" class="java">
&lt;html>
&lt;script language="javascript">
    function goSearch(){
      document.forms[0].target="_blank";
      document.forms[0].submit();
    }
    
&lt;/script>
&lt;body>
&lt;FORM   name="f"   action="http://video.google.cn/videosearch">   
  &lt;TABLE   cellSpacing=0   cellPadding=0>   
      &lt;TBODY>   
      &lt;TR   vAlign=center>   
          &lt;TD   width=75>&nbsp;&lt;/TD>   
          &lt;TD   align=middle>&lt;INPUT   maxLength=256   size=55   name=q>   
                &lt;INPUT   type=hidden   value=zh-CN   name=hl>&lt;BR>
                &lt;INPUT   type=hidden   value=utf-8   name=ie>
          &lt;/TD>   
          &lt;TD   vAlign=top   noWrap>&lt;FONT   size=-1>&nbsp;&#8226;&nbsp;
          &lt;A    href="#" onclick="goSearch()">google搜索&lt;/A>&lt;/FONT>&lt;/TD>&lt;/TR>   
     &lt;/TBODY>&lt;/TABLE>&lt;/FORM>

&lt;/body>
&lt;/html>
</pre><br /><br />3.加入google的地图搜索<br /><pre name="code" class="java">
&lt;html>
&lt;script language="javascript">
    function goSearch(){
      document.forms[0].target="_blank";
      document.forms[0].submit();
    }
    
&lt;/script>
&lt;body>
&lt;FORM   name="f"   action="http://ditu.google.cn/maps">   
  &lt;TABLE   cellSpacing=0   cellPadding=0>   
      &lt;TBODY>   
      &lt;TR   vAlign=center>   
          &lt;TD   width=75>&nbsp;&lt;/TD>   
          &lt;TD   align=middle>
                &lt;INPUT   maxLength=128   size=35   name=q>   
                &lt;INPUT   type=hidden   value=zh-CN   name=hl>
                &lt;INPUT   type=hidden   value=utf-8   name=ie>
                &lt;INPUT   type=hidden   value=wl   name=tab>
          &lt;/TD>   
          &lt;TD   vAlign=top   noWrap>&lt;FONT   size=-1>&nbsp;&#8226;&nbsp;
          &lt;A    href="#" onclick="goSearch()">google搜索&lt;/A>&lt;/FONT>&lt;/TD>&lt;/TR>   
     &lt;/TBODY>&lt;/TABLE>&lt;/FORM>

&lt;/body>
&lt;/html>
</pre><br /><br />4.加入google的图片搜索<br /><pre name="code" class="java">
&lt;html>
&lt;script language="javascript">
    function goSearch(){
      document.forms[0].target="_blank";
      document.forms[0].submit();
    }
    
&lt;/script>
&lt;body>
&lt;FORM   name="f"   action="http://images.google.cn/images">   
  &lt;TABLE   cellSpacing=0   cellPadding=0>   
      &lt;TBODY>   
      &lt;TR   vAlign=center>   
          &lt;TD   width=75>&nbsp;&lt;/TD>   
          &lt;TD   align=middle>
                &lt;INPUT   maxLength=128   size=35   name=q>   
                &lt;INPUT   type=hidden   value=zh-CN   name=hl>
                &lt;INPUT   type=hidden   value=utf-8   name=ie>
                &lt;INPUT   type=hidden   value=wl   name=tab>
          &lt;/TD>   
          &lt;TD   vAlign=top   noWrap>&lt;FONT   size=-1>&nbsp;&#8226;&nbsp;
          &lt;A    href="#" onclick="goSearch()">google搜索&lt;/A>&lt;/FONT>&lt;/TD>&lt;/TR>   
     &lt;/TBODY>&lt;/TABLE>&lt;/FORM>

&lt;/body>
&lt;/html>
</pre><br />5.加入google的资讯搜索<br /><pre name="code" class="java">
&lt;html>
&lt;script language="javascript">
    function goSearch(){
      document.forms[0].target="_blank";
      document.forms[0].submit();
    }
    
&lt;/script>
&lt;body>
&lt;FORM   name="f"   action="http://news.google.cn/news">   
  &lt;TABLE   cellSpacing=0   cellPadding=0>   
      &lt;TBODY>   
      &lt;TR   vAlign=center>   
          &lt;TD   width=75>&nbsp;&lt;/TD>   
          &lt;TD   align=middle>
                &lt;INPUT   maxLength=128   size=35   name=q>   
                &lt;INPUT   type=hidden   value=zh-CN   name=hl>
                &lt;INPUT   type=hidden   value=1   name=um>
                &lt;INPUT   type=hidden   value=in   name=tab>
          &lt;/TD>   
          &lt;TD   vAlign=top   noWrap>&lt;FONT   size=-1>&nbsp;&#8226;&nbsp;
          &lt;A    href="#" onclick="goSearch()">google搜索&lt;/A>&lt;/FONT>&lt;/TD>&lt;/TR>   
     &lt;/TBODY>&lt;/TABLE>&lt;/FORM>

&lt;/body>
&lt;/html>
</pre><br />6.加入google的博客搜索<br /><pre name="code" class="java">
&lt;html>
&lt;script language="javascript">
    function goSearch(){
      document.forms[0].target="_blank";
      document.forms[0].submit();
    }
    
&lt;/script>
&lt;body>
&lt;FORM   name="f"   action="http://blogsearch.google.cn/blogsearch">   
  &lt;TABLE   cellSpacing=0   cellPadding=0>   
      &lt;TBODY>   
      &lt;TR   vAlign=center>   
          &lt;TD   width=75>&nbsp;&lt;/TD>   
          &lt;TD   align=middle>
                &lt;INPUT   maxLength=128   size=35   name=q>   
                &lt;INPUT   type=hidden   value=zh-CN   name=hl>
                &lt;INPUT   type=hidden   value=1   name=um>
                &lt;INPUT   type=hidden   value=nb   name=tab>
          &lt;/TD>   
          &lt;TD   vAlign=top   noWrap>&lt;FONT   size=-1>&nbsp;&#8226;&nbsp;
          &lt;A    href="#" onclick="goSearch()">google搜索&lt;/A>&lt;/FONT>&lt;/TD>&lt;/TR>   
     &lt;/TBODY>&lt;/TABLE>&lt;/FORM>

&lt;/body>
&lt;/html></pre>
          <br/>
          <span style="color:red;">
            <a href="http://staratsky.javaeye.com/blog/174687#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 22 Mar 2008 00:12:46 +0800</pubDate>
        <link>http://staratsky.javaeye.com/blog/174687</link>
        <guid>http://staratsky.javaeye.com/blog/174687</guid>
      </item>
      <item>
        <title>java设计模式之单例模式</title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/166671" style="color:red;">http://staratsky.javaeye.com/blog/166671</a>&nbsp;
          发表时间: 2008年03月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.定义<br />单例模式是对象的创建模式的一种，它保证一个类有且只有一个实例，而且自行实例化并向整个系统提供这个实例。这个类则称为单例类。<br /><br />2.使用场合<br />简而言之，就是任何只需要一个实例的地方.例如，窗口管理器，假脱机打印设备，数据库连接池。具体应用中，配置信息类，管理类，控制类，门面类，代理类通常被设计为单例类.<br />（1）配置信息类<br />负责配置文件的解析，通常被设计为单例类<br />（2）管理类<br />如连接池管理类，通常被设计为单例类<br />（3）控制类，<br />如struts的ActionServlet类，也是单例类。<br />如下，只需在web.xml配置以下ActionServlet,tomcat容器自动装载后，即可完成对整个web系统提供ActionServlet实例。<br /><pre name="code" class="java">    &lt;servlet>
        &lt;servlet-name>action&lt;/servlet-name>
        &lt;servlet-class>
             org.apache.struts.action.ActionServlet
        &lt;/servlet-class>        
    &lt;/servlet>
    &lt;servlet-mapping>
        &lt;servlet-name>action&lt;/servlet-name>
        &lt;url-pattern>*.do&lt;/url-pattern>
    &lt;/servlet-mapping></pre><br />（4）门面类<br />说到门面类，就不能不提门面（Facade）模式。客户端与多个子系统的通信必须通过一个统一的门面(Facade)对象进行，这就是门面模式。这个统一的门面(Facade)对象就是门面类。在门面模式中，通常只需要一个门面类，并且此门面类只有一个实例，换言之它是一个单例类。但这不是绝对的。<br />（5）代理类<br />在Jive中，使用代理模式实现权限访问的入口，就采用了单例模式。<br /><br />3.单例模式在Java语言的实现<br />单例模式在Java语言的实现上有三种情况：饿汉式单例类,懒汉式单例类,登记式单例类。<br />(1)饿汉式单例类<br />饿汉式单例类饿汉式单例类是在Java 语言里实现得最为简便的单例类。在类被加载时，就会将自己实例化。<br /><pre name="code" class="java">
public class Singleton2{   
    //注意这是private 
    private static Singleton2 theInstance = new Singleton2();   
    //这里提供了一个供外部访问本class的静态方法，可以直接访问  
    public static Singleton2 getInstance(){   
        return theInstance;  
    }   
} 
 </pre><br /><br />(2)懒汉式单例类<br />与饿汉式单例类不同的是，懒汉式单例类在第一次被引用时将自己实例化。<br /><pre name="code" class="java">
public class Singleton {   
    public static Singleton theInstance = null;   
    private Singleton(){}   
    public synchronized static Singleton instance(){  
        if(theInstance == null){  
            return new Singleton();  
        }  
        return theInstance;  
    }   
} 
 </pre><br /><br />(3)登记式单例类<br />登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的。<br /><pre name="code" class="java">
public class RegSingleton  
{  
    static private HashMap m_registry = new HashMap();  
    static  
    {  
        RegSingleton x = new RegSingleton();  
        m_registry.put(x.getClass().getName(), x);  
    }   
    protected RegSingleton(){   
    }   
    static public RegSingleton getInstance(String name)  
    {  
        if (name == null)  
        {  
            name = "com.javapatterns.singleton.demos.RegSingleton";  
        }  
        if (m_registry.get(name) == null)  
        {  
            try  
            {  
                m_registry.put(name, Class.forName(name).newInstance());  
            }  
            catch (Exception e)  
            {  
                System.out.println("Error happened.");  
            }  
        }  
        return (RegSingleton) (m_registry.get(name));  
    }   
}
</pre><br />登记式单例类的子类<br /><pre name="code" class="java">
import java.util.HashMap;
public class RegSingletonChild extends RegSingleton
{
public RegSingletonChild() {}
static public RegSingletonChild getInstance()
{
return (RegSingletonChild)
RegSingleton.getInstance(
"com.javapatterns.singleton.demos.RegSingletonChild" );
}

public String about()
{
return "Hello， I am RegSingletonChild.";
}
} 
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://staratsky.javaeye.com/blog/166671#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 02 Mar 2008 19:20:55 +0800</pubDate>
        <link>http://staratsky.javaeye.com/blog/166671</link>
        <guid>http://staratsky.javaeye.com/blog/166671</guid>
      </item>
      <item>
        <title>中文搜索引擎研究</title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/164658" style="color:red;">http://staratsky.javaeye.com/blog/164658</a>&nbsp;
          发表时间: 2008年02月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.为什么需要搜索引擎?<br />什么叫搜索引擎呢？Internet是一个巨大的信息资源宝库,几乎所有的Internet用户都希望宝库中的资源越来越丰富，使之应有尽有。每天都有新的主机被连接到Internet上，每天都有新的信息资源被增加到Internet中，使Internet中的信息以惊人的速度增长。然而Internet中的信息资源分散在无数台主机之中，如果用户想将所有主机中的信息都做一番详尽的考察，无异于大海捞针。那么用户如何在数百万个网站中快速有效地查找到想要得到的信息呢？这就要借助于Internet中的搜索引擎。<br /><br />2.搜索引擎使用的信息检索技术<br />目前搜索引擎使用的信息检索技术主要有：Robot技术、索引技术、翻译技术、转换技术、过滤技术、数据库技术、结果处理技术等。<br />2.1Robot技术<br />搜索引擎通过蜘蛛机器人自动在选定的范围内进行检索，并将所检索到的信息自动标引导入数据库中<br />2.2翻译技术<br />翻译技术主要运用于跨语言搜索引擎工作过程。如下：<br />用户向系统提交检索词，形成一个源语言的搜索式，系统对搜索式进行语言识别，识别出语种后，就对进行提问式的词法分析和结构分析，然后把这个分析过的搜索式翻译成各种语言的搜索式，最后把这一系列的搜索式提交给系统进行检索就可以了。<br />2.3转换技术<br />转换技术主要针对中文繁简转换出理。如下：<br />大陆与台湾、香港的文化背景不同，因此形成的一些词汇方面的差异。例如：<br />大陆词汇 录像　　 知识产权 磁盘　　 新西兰　 克林顿　硅谷　　<br />台港词汇 录影　　 智慧财产权 磁碟　　 纽西兰　 柯林顿　 矽谷<br />搜索引擎应该根据自动判别词汇的繁简编码，转成相对应的词汇意思，然后进行检索<br />2.4过滤技术<br />搜索引擎通过“关键字过滤”等过滤技术对检索到的信息进行过滤、屏蔽。<br />2.5结果处理技术<br />结果处理技术主要是将检索到查询结果，进行去重、基本信息提取、排序等操作。<br /><br /> <br /><br />3.搜索引擎分类<br />3.1按信息的组织方式<br />按照信息的组织方式，一般把搜索引擎分为目录式分类搜索引擎,机器人搜索引擎,“混合型”搜索引擎<br />(1)目录式分类搜索引擎<br />录搜索引擎是通过人工方式进行资源搜集，且采取人工方式来进行网站描述。<br />参照分类法的思路，按照主题建立分类索引，形成一个树形等级式的分类体系结构，建立起一套既可搜索又可浏览的等级式主题分类目录，以<br /><br />超文本链接方式把资源按不同类型划分成不同的目录，各类目录下面引出属于这一类别的网站名称和网址链接以及每个网站的内容简介<br />目前，对于中文网站来说，最重要的分类目录有以下几个：开放式目录ODP，Yahoo！，门户搜索引擎目录搜狐、网易、新浪。<br />。当用户查询某个关键词，系统会在这些描述中进行搜索。由于目录是依靠人工进行整理搜索的，而且只在保存的对站点的描述中进行搜索，<br /><br />因此搜索范围较小，查全率较低，对偏僻主题、新兴学科、交叉学科不能很好地涵盖，类目间的交叉又会导致重复和资源浪费。另外，由于数<br /><br />据库更新速度比较慢，站点本身的动态变化不能及时地反映到搜索结果中，严重影响了查询结果的时效性。<br />够提供更为准确的查询结果，但收集的内容却非常有限<br />(2)机器人搜索引擎<br />搜索引擎机器人(robots), 或者说是爬行程序(crawlers)、蜘蛛程序(spiders)。<br />机器人(robots)事实上是一个精心设计的网站爬行程序，依照网站的连接从一个网站游历到另一个网站。根据这种自动化程序，基于预先设计<br /><br />好的网站排名标准及算法，对网站进行评估排名。<br />查全率，精确率<br />(3)“混合型”搜索引擎<br />提供分类浏览检索和关键词检索两种途径.目前，大多数引擎都采用这种方式。<br /><br />3.2按支持的语言进行分类<br />目前国内用户使用的搜索引擎主要有两类：即英文引擎和中文引擎。<br />常用的英文搜索引擎包括google、Yahoo！、MSN、Infoseek等。<br />常用的中文搜索引擎主要有：中文google、一搜、3721、百度、中搜、搜狐搜狗、网易等。<br />传统中文引擎所采用的技术：<br />中文分词技术；<br />索引技术；<br />繁简转换；<br />关键词加亮；<br />热词提取；<br />词频分析；<br />新词发现；<br />更新频率；<br />新一代中文搜索引擎的技术特点：<br />海量级数据的精确搜索；<br />智能信息处理—基于语义理解的文本挖掘技术；<br /><br />3.3垂直搜索引擎和普通的网页搜索引擎<br />垂直搜索是针对某一个行业的专业搜索引擎，是搜索引擎的细分和延伸，是对网页库中的某类专门的信息进行一次整合，定向分字段抽取出需要的数据进行处理后再以某种形式返回给用户。<br />　  垂直搜索引擎和普通的网页搜索引擎的最大区别是对网页信息进行了结构化信息抽取，也就是将网页的非结构化数据抽取成特定的结构化信息数据，好比网页搜索是以网页为最小单位，基于视觉的网页块分析是以网页块为最小单位，而垂直搜索是以结构化数据为最小单位。然后将这些数据存储到数据库，进行进一步的加工处理，如：去重、分类等，最后分词、索引再以搜索的方式满足用户的需求。<br />　　整个过程中，数据由非结构化数据抽取成结构化数据，经过深度加工处理后以非结构化的方式和结构化的方式返回给用户。<br />    垂直搜索引擎的应用方向很多，比如企业库搜索、供求信息搜索引擎、购物搜索、房产搜索、人才搜索、地图搜索、mp3搜索、图片搜索…<br /><br />…几乎各行各业各类信息都可以进一步细化成各类的垂直搜索引擎。<br />    举个例子来说明会更容易理解，比如购物搜索引擎，整体流程大致如下：抓取网页后，对网页商品信息进行抽取，抽取出商品名称、价格、简介……甚至可以进一步将笔记本简介细分成“品牌、型号、CPU、内存、硬盘、显示屏、……”然后对信息进行清洗、去重、分类、分析比较、数据挖掘，最后通过分词索引提供用户搜索、通过分析挖掘提供市场行情报告。<br />   垂直搜索引擎大体上需要以下技术：<br />    网页结构化信息抽取技术或元数据采集技术<br />    分词、索引<br />    其他信息处理技术<br />   垂直搜索引擎是相对通用搜索引擎的信息量大、查询不准确、深度不够等提出来的新的搜索引擎服务模式，通过针对某一特定领域、某一特定人群或某一特定需求提供的有一定价值的信息和相关服务。其特点就是“专、精、深”，且具有行业色彩，相比较通用搜索引擎的海量信息无序化，垂直搜索引擎则显得更加专注、具体和深入。<br /><br /> <br /><br />4.主流中文搜索引擎简介<br />4.1、Google简介<br />http://www.google.com<br />Google的成功得益于其强大的功能和独到的特点：<br /><br />Google检索网页数量达24亿，搜索引擎中排名第一；<br />Google支持多达132种语言，包括简体中文和繁体中文；<br />Google网站只提供搜索引擎功能，没有花里胡哨的累赘；<br />Google速度极快，年初时据说有15000多台服务器，200多条T3级宽带；<br />Google的专利网页级别技术PageRank能够提供准确率极高的搜索结果；<br />Google智能化的“手气不错”功能，提供可能最符合要求的网站；<br />Google的“网页快照”功能，能从Google服务器里直接取出缓存的网页。<br /><br />Google具有独到的图片搜索功能；<br />Google具有强大的新闻组搜索功能；<br />Google具有二进制文件搜索功能（PDF，DOC，SWF等）；<br />Google还有很多尚在开发阶段的令人吃惊的设想和功能。<br /><br />4.2、百度搜索<br />http://www.baidu.com<br />百度搜索引擎拥有目前世界上最大的中文搜索引擎，总量超过3亿页以上，并且还在保持快速的增长。百度搜索引擎具有高准确性、高查全率、更新快以及服务稳定的特点<br /><br />4.3、雅虎中国<br />http://www.yahoo.com.cn<br />雅虎在全球共有24个网站，12种语言版本，其中雅虎中国网站（www.yahoo.com.cn）于1999年9月正式开通，它是雅虎在全球的第20个网站。<br />Yahoo！目录是一个Web资源的导航指南，包括14个主题大类的内容<br />支持中国用户完成包括英文在内的38种语言搜索<br />4.4、中国搜索<br />http://www.zhongsou.com/<br />中国搜索(原慧聪搜索)2002年正式进入中文搜索引擎市场,2003年8月24日慧聪搜索(现中国搜索)正式推出第三代智能中文搜索引擎.特点：<br />海量数据：超过2亿网页的中文信息库。<br /> 高速响应：检索平均响应时间不超过0.2秒，支持500次/秒高迸发量。<br /> 智能排序：非唯一主导因素的高级人工排序<br /> 行业分类：43个行业的分类，使搜索更加精准<br />具备第三代智能中文搜索引擎的特点<br /><br /><br />4.5、搜狗搜索<br />http://www.sogou.com/<br />搜狗是搜狐公司于2004年8月3日推出的完全自主技术开发的全球首个第三代互动式中文搜索引擎，是一个具有独立域名的专业搜索网站--“搜狗”。以一种人工智能的新算法，分析和理解用户可能的查询意图，给予多个主题的“搜索提示”，在用户查询和搜索引擎返回结果的人机交互过程中，引导用户更快速准确定位自己所关注的内容，帮助用户快速找到相关搜索结果，并可在用户搜索冲浪时，给与用户未曾意识到的主题提示。<br />搜狗搜索引擎的三大特点：<br />　　海量：全球首个网页收录量达到100亿的中文搜索引擎<br />　　及时：每天更新5亿网页，最新资讯最快1分钟即可被检索到<br />4.6、奇虎社区搜索引擎<br />http://www.qihoo.com/<br />特点：<br />奇虎社区搜索引擎是具备Web2.0特征的垂直搜索引擎<br />专著于社区搜索,增强与网民的互动，强调个性化搜索。<br /><br />4.7、网易搜索引擎 (http://search.163.com/)<br />特点：<br />开放式目录管理系统（ODP）<br />拥有超过一万个类目，超过25万条活跃站点信息，<br />日增加新站点信息500~1000条，日访问量超过500万次<br />4.8、北京大学天网中英文搜索引擎<br />http://e.pku.edu.cn/<br />收录 135 万网页和 9 万新闻组文章，<br />支持电子邮件查询。<br />无分类查询。<br />不支持数字关键词和URL名检索。<br /><br />4.9、Openfind搜索引擎<br />http://www.openfind.com.tw<br />Openfind创立于1998年1月，其技术源自台湾中正大学吴升教授所领导的GAIS实验室。Openfind起先只做中文搜索引擎，鼎盛时期同时为三大著名门户新浪、奇摩、雅虎提供中文搜索引擎，但2000年后市场逐渐被Baidu和Google瓜分。2002年6月，Openfind重新发布基于GAIS30 Project的Openfind搜索引擎Beta版，特点：<br />海量数据：宣布累计抓取网页35亿，<br />多元排序(PolyRankTM)：使用者用可以不同标准来排序查询结果
          <br/>
          <span style="color:red;">
            <a href="http://staratsky.javaeye.com/blog/164658#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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>Mon, 25 Feb 2008 00:29:01 +0800</pubDate>
        <link>http://staratsky.javaeye.com/blog/164658</link>
        <guid>http://staratsky.javaeye.com/blog/164658</guid>
      </item>
      <item>
        <title>谈谈团队精神 </title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/161742" style="color:red;">http://staratsky.javaeye.com/blog/161742</a>&nbsp;
          发表时间: 2008年02月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          很多求职者在面试时，都说自己具有团队精神。有一次我问一个求职者，说能否解释一下什么是团队精神吗？这个求职者没想到我会这样问，结果一下功夫没反映过来。我不是有意为难这个面试者，我是想明白他是否真正理解了团队精神的内涵。<br /><br />    团队精神对于我的理解就是目标，团结，合作，竞争。<br /><br />    一堆鱼变成不了鲸鱼。没有目标的团队永远是乌合之众。一个团队要有凝聚力，团队的所有成员就得认同一个目标。只有当团队所有成员认同这个目标，团队才有凝聚力。每个团队成员都能强烈感受到自己是团队当中的一分子，把个人工作和团队目标联系在一起，对团队表现出一种忠诚，对团队的业绩表现出一种荣誉感，对团队的成功表现出一种骄傲，对团队的困境表现出一种忧虑。这样团队和个人才能提升自己。我曾经听过一个笑话：一个传教士路过一个建筑工地，发现两个工人，一个干得热火朝天，一个在那里磨洋工。于是就问那个干得热火朝天的工人，你在干什么？那个工人说，我在盖一座雄伟的教堂。然后传教士又去问那个磨洋工的工人，那个磨洋工的工人说，我在盖厕所。一个月后，传教士又经过此地，发现只有那个磨洋工的工人还在那里，于是就问，那个工人哪去了？那个磨洋工的工人说，他走了。他以为自己是盖雄伟的教堂呢。<br /><br />    其次，团队精神就是要团结，就是要尽快融入到集体中。个人如果尽快不融入集体这个大环境中，那么就很危险了。这里可能有两种情况：一种是融入不进去。一种是不愿融入。先说说融入不进去的情况：个人能力如果太差，如《士兵突击》中的许三多刚进新病连那会，处处拖人后腿，大家都瞧不起他，哪怕许三多把全班的内务全包了，他还是被别人排除在圈子之外。我想如果许三多是那种怨天尤人的人，怨自己比别人笨，怨别人排斥自己，那么许木木就真的不可救药了。在《士兵突击》这部电视剧中我最喜爱许三多这个人物，因为他敢于承认自己的差距，坚持自己的原则，默默的去改变，比别人多几倍甚至十几倍的付出。他不仅改变了自己，也改变了他身边的人。不愿融入的情况正好相反，老觉得自己比周围的人强，老想以自己为中心，要求别人对自己作出让步，这种人如《士兵突击》中早期的成才，在人生顺畅时，忘乎所以，眼高于顶，不愿意帮助别人；一遇挫折，就觉得英雄无用武之处，委屈自己了。在《士兵突击》中成才也最终成长起来了，他最后一次演习中，表现的有大局观和集体观，个人能力也很出色，最后成才也重新被老A接受了。但是团结也不是无条件，无原则的团结。比如《士兵突击》中的班长老马，那么他眼中的团结就是相互掩护，滥竽充数，逆向淘汰。<br /><br />    《士兵突击》中许三多可以一个人修一条米为单位长的土路。但他能完成以公里为单位的高速公路吗？再想象一下，微软公司的视窗产品，上亿行的代码量，上万名软件工程师的参与。没有全部参与者的默契与分工合作，微软公司的视窗产品能完成吗？在一个团队中最重要的成员之间的相互协作，积极的参与解决问题。你体会过吗？一旦棘手的问题得到解决，整个团队立刻就会有一股轻松快乐的气氛，大家都感到愉快，从而提高士气。最忌讳的就是把功劳揽到自己头上，把失败怪罪到别人身上去。尤其是一些重要的场合，这样会让大家很恼火。更为严重的是容易使团队产生内讧。这样的成员一般也不愿付出，当团队出现困境时不是想如何去解决面临的困境，而总想另谋出路，脱离现有团队。这样的员工在自己的职业生活中会走很多弯路，总找不到适合自己发展的空间。<br /><br />   一个人不能老想着要团队其他成员帮自己。这样他就成了团队的累赘了。比如《士兵突击》中的许三多，在新兵连班长史今不管怎样帮助他，他都不会去想想，怎样才能让班长少把心思放在自己身上。班长把管着一个班呢，把精力都放在自己身上，那不成了自己的保姆了？所以，许三多理所当然地被整个集体当成了累赘了。所以，要通过竞争使团队接受你，要通过竞争告诉整个团队，你是这个团队不可或缺的一员。
          <br/>
          <span style="color:red;">
            <a href="http://staratsky.javaeye.com/blog/161742#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 09 Feb 2008 13:29:55 +0800</pubDate>
        <link>http://staratsky.javaeye.com/blog/161742</link>
        <guid>http://staratsky.javaeye.com/blog/161742</guid>
      </item>
      <item>
        <title>品评sqlserver2008数据库技术</title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/159695" style="color:red;">http://staratsky.javaeye.com/blog/159695</a>&nbsp;
          发表时间: 2008年01月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.技术方向:数据仓库与XML引领主流<br /> 　　随着SOA和Enterprise2.0从概念走向实施，在巩固数据仓库市场的同时，为了抓住下一个以数据服务和用户体验为主体的数据库应用时代，SQLServer2008在XML数据库方面的宣传声势比商务智能更大，由于XML技术已经从简单的数据内容，逐步过渡到数据结构定义、业务数据模型和业务语义模型，数据库厂商在上一代产品XML数据引擎的基础上，也面向XML应用不断增加必要的XML数据转换、数据验证、层次型数据重构和更高效的层次信息检索技术，并且在国内一些信息化应用水平较高的行业投入实际应用<br /><br /> <br /><br />2.Microsoft数据平台愿景<br />　　Microsoft甛数据平台愿景提供了一个解决方案来满足这些需求，这个解决方案就是公司可以使用存储和管理许多数据类型，包括XML、e-mail、时间/日历、文件、文档、地理等等，同时提供一个丰富的服务集合来与数据交互作用：搜索、查询、数据分析、报表、数据整合，和强大的同步功能。用户可以访问从创建到存档于任何设备的信息，从桌面到移动设备的信息。<br /><br /> <br /><br />3.SQLServer2008不只是关系型数据库管理系统<br />3.1空间数据管理<br />    说起空间数据库系统，主要包括三方面，存储，查询和索引。储存就是指空间数据类型定义，而查询指各种空间算子的集合，空间索引是特定于空间类型数据的索引。<br />·存储大型和复杂的空间对象<br />  SQLServer2008把空间数据分为两类，基于球面的geography和基于平面的geometry。使用SQL Server 2008中提供的用于空间对象的空间类型，无论对象是简单的还是非常复杂的<br />·采用空间数据索引构建高性能的解决方案<br />  空间索引采用的是多级网格索引，和ArcSDE一样。<br />  通过使用集成在SQL Server数据库引擎中的用于空间数据的索引来加强查询性能。利用精确的查询优化器对空间查询进行评估，它可以决定优化查询计划和给出适当的索引选择。<br />·合并商业应用中的关系数据和空间数据<br />    SQLServer2008也提供了方法集用于查询分析，针对geometry的方法基于OGC SFS规范(MS今年早些时候成为OGC成员)。提供了相交查询示。<br />    支持OGC的WKB，WKT以及GML格式的数据导入。<br />·使用空间标准支持来集成应用程序<br />    空间数据类型派生自.NET CLR类，<br />    提供了一个和ve集成的示例。<br />3.2xml数据管理<br />在sqlserver 2000中，对xml数据的支持包括：<br />·新增XML数据类型<br />·数据库引擎对XQuery的支持<br />·对SQLXML的增强和扩充<br />·对FOR XML和OPENXML的增强<br />·新增XML DML(XML数据修改语言)，用来对作为XML数据类型存储的XML数据。<br />·新增XQuery设计器。<br />SQLServer2008中，描述对xml数据的支持资料少。但我想对xml数据的支持应该更强.至少应该反映在两方面:<br />·在应用访问方面,支持 SQL 和 XML 两种访问方式。<br />·所有关系型的操作方式和数据库工具都可用于 XML 之上，例如索引机制、导入导出、关联查询、高速批量加载、系统优化等等。<br /><br />4.更强的商务智能(BI)<br />4.1SQLServer集成服务<br />　　SSIS(SQLServer集成服务)是一个嵌入式应用程序，用于开发和执行ETL(解压缩、转换和加载)包。SSIS代替了SQL2000的DTS。整合服务功能既包含了实现简单的导入导出包所必需的Wizard导向插件、工具以及任务，也有非常复杂的数据清理功能。SQLServer2008SSIS的功能有很大的改进和增强，比如它的执行程序能够更好地并行执行。在SSIS2005，数据管道不能跨越两个处理器。而SSIS2008能够在多处理器机器上跨越两个处理器。而且它在处理大件包上面的性能得到了提高。SSIS引擎更加稳定，锁死率更低。<br />　　Lookup功能也得到了改进。Lookup是SSIS一个常用的获取相关信息的功能。比如从CustomerID查找CustomerName，获取数据集。Lookup在<br /><br />SSIS中很常见，而且可以处理上百万行的数据集，因此性能可能很差。SQL2008对Lookup的性能作出很大的改进，而且能够处理不同的数据源，<br /><br />包括ADO.NET，XML，OLEDB和其他SSIS压缩包。<br />4.2数据合并<br />　　SQL2008可以执行TSQL的MERGE命令。用MERGE命令，只需一个语句就可以对行进行UPDATE、INSERT或DELETE。下面的例子就是如何用MERGE命令来把新的InventoryItemdescriptions列表插入已有的InventoryMaster中。除了descriptions，NewInventory表格中还加入了其他一些部分。如果没有MERGE语句，就需要执行两个命令才能完成。第一个命令查找匹配的Description然后更新。第二个命令查找不匹配项然后插入。有了MERGE，一个语句就可以完成这两个任务。步骤如下：<br />　　MERGEInventoryMasterASim<br />　　USING(SELECTInventoryID,DescrFROMNewInventory)ASsrc<br />　　ONim.InventoryID=src.InventoryID<br />　　WHENMATCHEDTHEN<br />　　UPDATESETim.Descr=src.Descr<br />　　WHENNOTMATCHEDTHEN<br />　　INSERT(InventoryID,Descr)VALUES(src.InventoryID,src.Descr);<br />4.3分析服务<br />　　SSAS(SQLServer分析服务)也得到了很大的改进和增强。IB堆叠做出了改进，性能得到很大提高，而硬件商品能够为Scaleout管理工具所使用。BlockComputation也增强了立体分析的性能。<br />4.4报表服务<br />　　SSRS(SQLServer报表服务)的处理能力和性能得到改进，使得大型报表不再耗费所有可用内存。另外，在报表的设计和完成之间有了更好的一致性。SQLSSRS2008还包含了跨越表格和矩阵的TABLIX。ApplicationEmbedding允许用户点击报表中的URL链接调用应用程序。<br />4.5MicrosoftOffice2007<br />　　SQLServer2008能够与MicrosoftOffice2007完美地结合。例如，SQLServerReportingServer能够直接把报表导出成为Word文档。而且使用<br /><br />ReportAuthoring工具，Word和Excel都可以作为SSRS报表的模板。ExcelSSAS新添了一个数据挖掘插件，提高了其性能。<br /><br /> <br /><br />5.全面和可扩展的数据仓库平台<br />SQL Server 2008提供了一个全面和可扩展的数据仓库平台.他能使你<br />　　·快速建立你的数据仓库<br />　　给开发团队提供工具，使其可以建立一个用于生成解决方案的高效和协作的环境。<br />　　·改进可视化开发<br />　　商业智能开发套件(Business Intelligence Development Studio，BIDS)与Visual Studio紧密集成，为正在开发数据集中应用程序的开发团队提供了工具，这些工具可建立用于生成解决方案的高效和协作的环境。<br />　　·加强数据整合<br />　　SQL Server 2008整合服务(SQL Server 2008 Integration Services，SSIS)，作为SQL Server 2008的一部分，为构建企业级数据整合应用提供了必要的功能和性能。使得不同数据源和目的地的整合变得容易多了。<br />　　·轻松管理数据<br />　　你将受益于SQL Server 2008所提供的增强的可扩展性、可管理性和性能。<br />　　·企业可扩展性<br />　　利用可扩展的功能，例如分割、快照隔离和对64位的支持，来构建和部署大多数应用程序。<br />　　·增强的可管理性<br />　　提供了一个整合的管理环境来监控、管理和调整企业中所有的数据库和相关的服务，以此简化了管理。改进对企业数据库应用的管理，包括加强了对大型数据库的支持和使对分散的数据库的管理更加灵活。<br />　　·提供更好的商业洞察力<br />　　给所有的雇员提供高级的分析能力、丰富的可视化和协作能力、还有企业报表。<br />　　·高级的分析能力<br />　　SQL Server 2008分析服务将传统关系型报表模型的灵活性和丰富的内容与强大的、用户友好的分析和可扩展的性能相结合，提供了一组丰富的功能，将背后的关系型数据显示给你的终端用户。<br />　　·丰富的可视化和协作能力<br />　　不只是使用与其它Microsoft 商业智能产品无缝集成的Microsoft Office PerformancePoint Server来简单的监控其它应用程序中的数据，还为应用程序设计者提供了日常使用的分析。<br />　　·企业报表<br />　　SQL Server 2008 报表服务扩展了数据仓库平台以满足需要访问商业数据的信息工作人员。<br /><br /><br /> <br /><br />本文欢迎转载，但转载时请注明出处。
          <br/>
          <span style="color:red;">
            <a href="http://staratsky.javaeye.com/blog/159695#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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>Sun, 27 Jan 2008 03:46:09 +0800</pubDate>
        <link>http://staratsky.javaeye.com/blog/159695</link>
        <guid>http://staratsky.javaeye.com/blog/159695</guid>
      </item>
      <item>
        <title>用dwr技术显示页面数据加载状态</title>
        <author>mfcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://staratsky.javaeye.com">mfcai</a>&nbsp;
          链接：<a href="http://staratsky.javaeye.com/blog/155430" style="color:red;">http://staratsky.javaeye.com/blog/155430</a>&nbsp;
          发表时间: 2008年01月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          问题:<br />用dwr技术查询海量数据时,用户点击按钮,提交请求后,页面长时间没反应.问题反映到我这.当然除了要提高性能外,也得给用户一个提示,比如出现"正在加载数据.."的提示. <br />解决办法:<br />如果要实现这种效果,就得在客户端用js判断加载情况，请求前是一种状态,请求后(后台处理,返回数据给前台)又是一种状态.<br /><br />dwr工具包提供了两个函数,专门处理这两种情况:<br />(1) 请求前处理<br />DWREngine.setPreHook(jsfun)<br />在DWR调用之前设置执行一个函数(但是这个函数无参数),例如显示"正在加载数据.."信息<br />(2)请求后处理<br />DWREngine.setPostHook(jsfun) 在DWR调用之后要执行的函数.例如隐藏"正在加载数据.."信息<br /><br />DWREngine.setPreHook(jsfun)在调用DWR之前，运行jsfun函数。DWREngine.setPostHook(jsfun)在调用完DWR后，运行jsfun函数。<br />当然我们可以用它来显示程序运行时的动画效果.<br /><br />//====================================================================<br /><br />//显示文字提示消息<br />function useLoadingMessage(message) {<br />  var loadingMessage;<br />  if (message) loadingMessage = message;<br />  else loadingMessage = "Loading";<br /><br />  DWREngine.setPreHook(function() {<br />    var disabledZone = $('disabledZone');<br />    if (!disabledZone) {<br />      disabledZone = document.createElement('div');<br />      disabledZone.setAttribute('id', 'disabledZone');<br />      disabledZone.style.position = "absolute";<br />      disabledZone.style.zIndex = "1000";<br />      disabledZone.style.left = "0px";<br />      disabledZone.style.top = "0px";<br />      disabledZone.style.width = "100%";<br />      disabledZone.style.height = "100%";<br />      document.body.appendChild(disabledZone);<br />      var messageZone = document.createElement('div');<br />      messageZone.setAttribute('id', 'messageZone');<br />      messageZone.style.position = "absolute";<br />      messageZone.style.top = "0px";<br />      messageZone.style.right = "0px";<br />      messageZone.style.background = "red";<br />      messageZone.style.color = "white";<br />      messageZone.style.fontFamily = "Arial,Helvetica,sans-serif";<br />      messageZone.style.padding = "4px";<br />      disabledZone.appendChild(messageZone);<br />    