<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Rain Life</title>
    <description></description>
    <link>http://rainlife.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>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/189554" style="color:red;">http://rainlife.javaeye.com/blog/189554</a>&nbsp;
          发表时间: 2008年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p align="center"><strong><span style="font-size: 18px; color: #ff0000;">Work smarter, not harder!</span></strong></p>
<p align="center"><strong><span style="font-size: 18px; color: #ff0000;">更智慧地工作，而不是更努力地工作。</span></strong></p>
<p><span style="font-family: 宋体;">&nbsp;</span></p>
<p>&nbsp;&nbsp;&nbsp; 我每天都在想：如何工作效率才最高？效果才最好？才能更&ldquo;偷懒&rdquo;？</p>
<p>&nbsp;&nbsp;&nbsp; 当然答案就是：不断学习，不断调整。</p>
<p>&nbsp;&nbsp;&nbsp; 下面和大家一起疯狂分享&ldquo;人生12大著名法则&rdquo;！重点的地方，我已经帮你用红色画出来了。</p>
<p><br /><strong><span style="color: #ff0000;">法则一：马太效应</span></strong><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 《新约马太福音》中有这样一个故事，一个国王远行前，交给3个仆人每人一锭银子，吩咐他们：&ldquo;你们去做生意，等我回来时，再来见我。&rdquo;国王回来时，第一个仆人说：&ldquo;主人，你交给我们的一锭银子，我已赚了10锭。&rdquo;于是国王奖励他10座城邑。第二个仆人报告说：&ldquo;主人，你给我的一锭银子，我已赚了5锭。&rdquo;于是国王例奖励了他5座城邑。第三个仆人报告说：&ldquo;主人，你给我的一锭银子，我一直包在手巾里存著，我怕丢失，一直没有拿出来。&rdquo;于是国王命令将第三个仆人的一锭银子也赏给第一个仆人，并且说：&ldquo;凡是少的，就连他所有的也要夺过来。凡是多的，还要给他，叫他多多益善。&rdquo;这就是马太效应。看看我们周围，就可以发现许多马太效应的例子。朋友多的人会借助频繁的交往得到更多的朋友；缺少朋友的人会一直孤独下去。金钱方面更是如此，即使投资回报率相同，一个比别人投资多10倍的人，收益也多10倍。<br />&nbsp;&nbsp;&nbsp; <strong><span style="color: #ff0000;">这是个赢家通吃的社会，善用马太效应，赢家就是你。</span></strong><br />&nbsp;&nbsp;&nbsp; 对企业经营发展而言，马太效应则告诉我们，要想在某一个领域保持优势，就必须在此领域迅速做大。当你成为某个领域的领头羊的时候，即使投资回报率相同，你也能更轻易的获得比弱小的同行更大的收益。而若没有实力迅速在某个领域做大，就要不停地寻找新的发展领域，才能保证获得较好的回报。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br /><span style="color: #ff0000;"><strong>法则二：手表定理</strong></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br />&nbsp;&nbsp;&nbsp; 手表定理是指一个人有一只表时，可以知道现在是几点钟，而当他同时拥有两只表时却无法确定。两只表并不能告诉一个人更准确的时间，反而会让看表的人失去对准确时间的信心。你要做的就是选择其中较信赖的一只，尽力校准它，并以此作为你的标准，听从它的指引行事。记住尼采的话：<strong><span style="color: #ff0000;">&ldquo;兄弟，如果你是幸运的，你只需有一种道德而不要贪多，这样，你过桥更容易些。&rdquo;</span></strong><br />&nbsp;&nbsp;&nbsp; 如果每个人都&ldquo;选择你所爱，爱你所选择&rdquo;，无论成败都可以心安理得。然而，困扰很多人的是：他们被&ldquo;两只表&rdquo;弄得无所，心身交瘁，不知自己该信仰哪一个，还有人在环境、他人的压力下，违心选择了自己并不喜欢的道路，为此而郁郁终生，即使取得了受人瞩目的成就，也体会不到成功的快乐。<br />&nbsp;&nbsp;&nbsp; 手表定理在企业经营管理方面给我们一种非常直观的启发，就是对同一个人或同一个企业的管理不能同时采用两种不同的方法，不能同时设置两个不同的目标。甚至每一个人不能由两个人来同时指挥，否则将使这个企业或这个人无所适从。手表定理所指的另一层含义在于每个人都不能同时挑选两种不同的价值观，否则，你的行为将陷于混乱。</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;"><strong><span style="color: #ff0000;">法则三：不值得定律</span></strong><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br />&nbsp;&nbsp;&nbsp; 不值得定律最直观的表述是：不值得做的事情，就不值得做好，这个定律似乎再简单不过了，但它的重要性却时时被人们疏忘。不值得定律反映出人们的一种心理，一个人如果从事的是一份自认为不值得做的事情，往往会保持冷嘲热讽，敷衍了事的态度。不仅成功率小，而且即使成功，也不会觉得有多大的成就感。<br />&nbsp;&nbsp;&nbsp; 哪些事值得做呢？一般而言，这取决于三个因素。<br />&nbsp;&nbsp;&nbsp; a、价值观。只有符合我们价值观的事，我们才会满怀热情去做。<br />&nbsp;&nbsp;&nbsp; b、个性和气质。一个人如果做一份与他的个性气质完全背离的工作，他是很难做好的，如一个好交往的人成了档案员，或一个害羞者不得不每天和不同的人打交道。<br />&nbsp;&nbsp;&nbsp; c、现实的处境。同样一份工作，在不同的处境下去做，给我们的感受也是不同的。例如，在一家大公司，如果你最初做的是打杂跑腿的工作，你很可能认为是不值得的，可是，一旦你被提升为领班或部门经理，你就不会这样认为了。<br />&nbsp;&nbsp;&nbsp; 总结一下，值得做的工作是：符合我们的价值观，适合我们的个性与气质，并能让我们看到期望。如果你的工作不具备这三个因素，你就要考虑换一个更合适的工作，并努力做好它。<br />&nbsp;&nbsp;&nbsp; 因此，对个人来说，应在多种可供选择的奋斗目标及价值观中挑选一种，然后为之而奋斗。&ldquo;选择你所爱的，爱你所选择的&rdquo;，才可能激发我们的奋斗毅力，也才可以心安理得。而对一个企业或管理者来说，则要很好地分析员工的性格特性，合理分配工作，如让成就欲较强的职工单独或牵头来完成具有一定风险和难度的工作，并在其完成时给予定时的肯定和赞扬；让依附欲较强的职工更多地参加到某个团体的共同工作；让权力欲较强的职工担任一个与之能力相适应的主管。同时要加强员工对企业目标的认同感，让员工感觉到自己所做的工作是值得的，这样才能激发职工的热情。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br /><strong><span style="color: #ff0000;">法则四：彼得原理</span></strong><br />&nbsp;&nbsp;&nbsp; 彼得原理是美国学者劳伦斯&middot;彼得在对企业中人员晋升的相关现象研究后得出的一个结论；在各种组织中，由于习惯于对在某个等级上称职的人员进行晋升提拔，因而雇员总是趋向于晋升到其不称职的地位。彼得原理有时也被称为&ldquo;向上爬&rdquo;原理。这种现象在现实生活中无处不在：一名称职的教授被提升为大学校长后无法胜任；一个优秀的运动员被提升为主管体育的官员，而无所作为。<br />　　对一个企业而言，一旦企业中的相当部分人员被推到了其不称职的级别，就会造成企业的人浮于事，效率低下，导致平庸者出人头地，发展停滞。因此，这就要求改变单纯的&ldquo;根据贡献决定晋升&rdquo;的企业员工晋升机制，不能因某个人在某一个岗位级别上干得很出色，就推断此人一定能够胜任更高一级的职务。要建立科学、合理的人员选聘机制，客观评价每一位职工的能力和水平，将职工安排到其可以胜任的岗位。不要把岗位晋升当成对职工的主要奖励方式，应建立更有效的奖励机制，更多地以加薪、休假等方式作为奖励手段。有时将一名职工晋升到一个其无法很好发挥才能的岗位，不仅不是对职工的奖励，反而使职工无法很好发挥才能，也给企业带来损失。<br />&nbsp;&nbsp;&nbsp; 对个人而言，虽然我们每个人都期待著不停地升职，但不要将往上爬作为自己的惟一动力。与其在一个无法完全胜任的岗位勉力支撑、无所适从，还不如找一个自己能游刃有余的岗位好好发挥自己的专长。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br /><strong><span style="color: #ff0000;">法则五：零和游戏原理</span></strong><br /></span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 当你看到两位对弈者时，你就可以说他们正在玩&ldquo;零和游戏&rdquo;。因为在大多数情况下，总会有一个赢，一个输，如果我们把获胜计算为得1分，而输棋为-1分，那么，这两人得分之和就是：1 (-1)=0。<br />&nbsp;&nbsp;&nbsp; 这正是&ldquo;零和游戏&rdquo;的基本内容：游戏者有输有赢，一方所赢正是另一方所输，游戏的总成绩永远是零。零和游戏原理之所以广受关注，主要是因为人们发现在社会的方方面面都能发现与&ldquo;零和游戏&rdquo;类似的局面，胜利者的光荣后面往往隐藏著失败者的辛酸和苦涩。从个人到国家，从政治到经济，似乎无不验证了世界正是一个巨大的&ldquo;零和游戏&rdquo;场。这种理论认为，世界是一个封闭的系统，财富、资源、机遇都是有限的，个别人、个别地区和个别国家财富的增加必然意味著对其他人、其他地区和国家的掠夺，这是一个&ldquo;邪恶进化论&rdquo;式的弱肉强食的世界。<br />&nbsp;&nbsp;&nbsp; 但20世纪人类在经历了两次世界大战，经济的高速增长、科技进步、全球化以及日益严重的环境污染之后，&ldquo;零和游戏&rdquo;观念正逐渐被&ldquo;双赢&rdquo;观念所取代。人们开始认识到&ldquo;利己&rdquo;不一定要建立在&ldquo;损人&rdquo;的基础上。通过有效合作，皆大欢喜的结局是可能出现的。但从&ldquo;零和游戏&rdquo;走向&ldquo;双赢&rdquo;，要求各方要有真诚合作的精神和勇气，在合作中不要耍小聪明，不要总想占别人的小便宜，要遵守游戏规则，否则&ldquo;双赢&rdquo;的局面就不可能出现，最终吃亏的还是自己。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br /><strong><span style="color: #ff0000;">法则六：华盛顿合作规律<br /></span></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br />　　华盛顿合作规律说的是：一个人敷衍了事，两个人互相推诿，三个人则永无成事之日。多少有点类似于我们&ldquo;三个和尚&rdquo;的故事。人与人的合作不是人力的简单相加，而是要复杂和微妙得多。在人与人的合作中，假定每个人的能力都为1，那么10个人的合作结果就有时比10大得多，有时甚至比1还要小。因为人不是静止的动物，而更像方向各异的能量，相推动时自然事半功倍，相互抵触时则一事无成。我们传统的管理理论中，对合作研究得并不多，最直观的反映就是，目前的大多数管理制度和行业都是致力于减少人力的无谓消耗，而非利用管理提高人的效能。换言之，不妨说管理的主要目的不是让每个人做到最好，而是避免内耗过多。<strong><span style="color: #ff0000;">21世纪将是一个合作的时代，值得庆幸的是，越来越多的人已经认识到真诚合作的重要性，正在努力学习合作。</span></strong><br />　　还有一个邦尼人力定律：一个人一分钟可以挖一个洞，60个人一秒种却挖不了一个洞。合作是一个问题，如何合作也是一个问题。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;"><strong><span style="color: #ff0000;">法则七：酒与污水定律</span></strong><br />　　酒与污水定律是指，如果把一匙酒倒进一桶污水中，你得到的是一桶污水；如果把一匙污水倒进一桶酒中，你得到的还是一桶污水。几乎在任何企业里，都存在几个难弄的人物，他们存在的目的似乎就是为了把事情搞糟。他们到处搬弄是非，传播流言、破坏企业内部的和谐。最糟糕的是，他们像果箱里的烂苹果，如果你不及时处理，它会迅速传染，把果箱里其它苹果也弄烂，&ldquo;烂苹果&rdquo;的可怕之处在于它那惊人的破坏力。一个正直能干的人进入一个混乱的部门可能会被吞没，而一个人无德无才者能很快将一个高效的部门变成一盘散沙。组织系统往往是脆弱的，是建立在相互理解、妥协和容忍的基础上的，它很容易被侵害、被毒化。破坏者能力非凡的另一个重要原因在于，破坏总比建设容易。一个能工巧匠花费时日精心制作的陶瓷器，一头驴子一秒钟就能毁坏掉。如果拥有再多的能工巧匠，也不会有多少像样的工作成果。如果你的企业里有这样的一头驴子，你应该马上把它清除掉；如果你无力这样做，你就应该把它拴起来。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br /><strong><span style="color: #ff0000;">法则八：水桶定律</span></strong><br />&nbsp;&nbsp;&nbsp; 水桶定律是讲一只水桶能装多少水，这完全取决于它最短的那块木板。这就是说任何一个组织，可能面临的一个共同问题，即构成组织的各个部分往往是优劣不齐的，而劣势部分往往决定整个组织的水平。水桶定律与酒与污水定律不同，后者讨论的是组织中的破坏力量，最短的木板却是组织中有用的一个部分，只不过比其他部分差一些，你不能把它们当成烂苹果扔掉。强弱只是相对而言的，无法消除，问题在于你容忍这种弱点到什么程度，如果严重到成为阻碍工作的瓶颈，你就不得不有所动作。<br />　　如果你在一个企业中，你应该：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　1、确保你不是最薄弱的部分；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　2、避免或减少这一薄弱环节对你成功的影响；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　3、如果不幸，你正处在这一环节中，你还可以采取有效的方法改进，或者转职去谋另一份工作。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br /><strong><span style="color: #ff0000;">法则九：蘑菇管理</span></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br />&nbsp;&nbsp;&nbsp; 蘑菇管理是许多上司对待初出茅庐者的一种管理方法，初学者被置于阴暗的角落(不受重视的部门，或打杂跑腿的工作)，浇上一头大粪(无端的批评、指责、代人受过)，任其自生自灭(得不到必要的指导和提携)。相信很多人都有这样一段&ldquo;蘑菇&rdquo;的经历，但这不一定是什么坏事，尤其是当一切都刚刚开始的时候，当上几天&ldquo;蘑菇&rdquo;，能够消除我们很多不切实际的幻想，让我们更加接近现实，看问题也更加实际，而对一个企业而言，一般对新进的人员都是一视同仁，从起薪到工作都不会有大的差别。无论你是多么优秀的人才，在刚开始的时候都只能从最简单的事情做起，&ldquo;蘑菇&rdquo;的经历对于成长中的年轻人来说，是羽化前必须经历的一步。所以，如何高效率地走过生命中的这一段，从中尽可能吸取经验，成熟起来，并树立良好的值得信赖的个人形象，是每个刚入社会的年轻人必须面对的课题。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br /><strong><span style="color: #ff0000;">法则十：奥卡姆剃刀定律</span></strong><br /></span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 如果你认为只有焦头烂额、忙忙碌碌地工作才可能取得成功，那么，你错了。<br />&nbsp;&nbsp;&nbsp; 事情总是朝著复杂的方向发展，复杂会造成浪费，而效能则来自于单纯。在你做过的事情中可能绝大部分是毫无意义的，真正有效的活动只是其中的一小部分，而它们通常隐含于繁杂的事物中。找到关键的部分，去掉多余的活动，成功并不那么复杂。<br />&nbsp;&nbsp;&nbsp; 奥卡姆剃刀：如无必要，勿增实体。12世纪，英国奥卡姆的威廉对无休无止的关于&ldquo;共相&rdquo;、&ldquo;本质&rdquo;之类的争吵感到厌倦，主张唯名论，只承认确实存在的东西，认为那些空洞无物的普遍性要领都是无用的累赘，应当被无情地&ldquo;剃除&rdquo;。他主张，&ldquo;如无必要，勿增实体。&rdquo;这就是常说的&ldquo;奥卡姆剃刀&rdquo;。这把剃刀曾使很多人感到威胁，被认为是异端邪说，威廉本人也受到伤害。然而，这并未损害这把刀的锋利，相反，经过数百年越来越快，并早已超越了原来狭窄的领域而具有广泛的、丰富的、深刻的意义。<br />&nbsp;&nbsp;&nbsp; 奥卡姆剃刀定律在企业管理中可进一步深化为简单与复杂定律：把事情变复杂很简单，把事情变简单很复杂。这个定律要求，我们在处理事情时，要把握事情的主要实质，把握主流，解决最根本的问题。尤其要顺应自然，不要把事情人为地复杂化，这样才能把事情处理好。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br /><strong><span style="color: #ff0000;">法则十一：二八法则</span></strong><br />&nbsp;&nbsp;&nbsp; 你所完成的工作里80%的成果，来自于你20%的付出；而80%的付出，只换来20%的成果<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　<br /><strong><span style="color: #ff0000;">法则十二：钱的问题</span></strong><br />&nbsp;&nbsp;&nbsp; 当某人告诉你：&ldquo;不是钱，而是原则问题&rdquo;时，十有八九就是钱的问题。<br />&nbsp;&nbsp;&nbsp; 照一般的说法，金钱是价值的尺度，交换的媒介，财富的贮藏。但是这种说法忽略了它的另一面，它令人陶醉、令人疯狂、令人激动的一面，也撇开了爱钱的心理不谈。<br />&nbsp;&nbsp;&nbsp; 关于金钱的本质、作用和功过，从古到今，人们已经留下了无数精辟深刻的格言和妙语。我们常会看到，人们为钱而兴奋，努力赚钱，用财富的画面挑逗自己。金钱对世界的秩序以及我们的生活产生的影响是巨大的、广泛的，这种影响有时是潜在的，我们往往意识不到它的作用如此巨大，然而奇妙的是：它完全是人类自己创造的。致富的驱动力并不是起源于生物学上的需要，动物生活中也找不到任何相同的现象。它不能顺应基本的目标，不能满足根本的需求&hellip;&hellip;<br />&nbsp;&nbsp;&nbsp; 的确，&ldquo;致富&rdquo;的定义就是获得超过自己需要的东西。然而这个看起来漫无目标的驱动力却是人类最强大的力量，人类为金钱而互相伤害，远超过其他原因。</span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/189554#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Sun, 04 May 2008 23:21:36 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/189554</link>
        <guid>http://rainlife.javaeye.com/blog/189554</guid>
      </item>
      <item>
        <title>Rails生成Ext Tree</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/177501" style="color:red;">http://rainlife.javaeye.com/blog/177501</a>&nbsp;
          发表时间: 2008年03月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在Rails中使用has_one 、has_many 、belongs_to 和 has_and_belongs_to_may 来声明关系型数据库中的一对一，一对多和多对多的关系，但当想以树形的数据结构来表示分类的时候，这些基本的关联功能并不够，Rails在has_XXX关系的基础上，提供了acts as的扩展功能，如acts_as_list 、acts_as_tree 、 acts_as_nested_set。acts_as_tree就提供树状的结构来组织记录。(不知道为什么Rails2.0以后会取消掉，需要通过插件的方式来安装)</p><p>&nbsp;</p><p><strong>acts_as_nested_set的官方解释：</strong></p><div class="quote_div">A Nested Set is similar to a tree from ActsAsTree. However the nested set allows building of the entire hierarchy at once instead of querying each nodes children, and their children. When destroying an object, a before_destroy trigger prunes the rest of the branch of object under the current object.</div><p>上面是引用自rubyonrails.org上的对于acts_as_nested_set的描述，并提供了一个简单的示例：</p><p>&nbsp;</p><p><strong>SQL脚本：</strong>&nbsp;</p><pre name="code" class="sql">create table nested_objects (
  id int(11) unsigned not null auto_increment,
  parent_id int(11),
  lft int(11),
  rgt int(11),
  name varchar(32),
  primary key (id)
);</pre><p>&nbsp;</p><p><strong>Ruby Model:</strong></p><pre name="code" class="ruby">class NestedObject &lt; ActiveRecord::Base
  acts_as_nested_set
end</pre><p>&nbsp;</p><p><strong>acts_as_nested_set提供的方法：</strong></p><ul><li>root?() &ndash; <em>是否是根对象</em></li><li>child?() &ndash; <em>是否是子对象(拥有父对象)</em></li><li>unknown?() &ndash; <em>不知道该对象的状态(既不是根对象，也不是子对象)</em></li><li>add_child(child_object) &ndash; <em>为根对象添加一个子对象(如果child_object是一个根对象的话，则添加失败)</em></li><li>children_count() &ndash; <em>根对象的所有子对象的个数</em></li><li>full_set() &ndash; <em>重新找到所有对象</em></li><li>all_children() &ndash; <em>根对象的所有子对象</em></li><li>direct_children() &ndash;<em>根对象的直接子对象</em></li></ul><p>下面就使用acts_as_nested_set来生成一个Ext的Tree。</p><p>比如生成如下的树：</p><pre>root
    |_ Child 1
    |  |_ Child 1.1
    |  |_ Child 1.2
    |_ Child 2
       |_ Child 2.1
       |_ Child 2.2</pre><p>先来看一下对上面的树的一个图形化的解释：</p><p>&nbsp;<img src="../../../upload/attachment/18755/026a5252-7b94-3f5d-90b9-480df965eaf2.png" height="139" alt="" width="520" /></p><p>这图还是比较清除的，请理解横线中的1到14这些数字，对应这个树，我们可能会有下面的数据：</p><p>&nbsp;<img src="../../../upload/attachment/18761/e7d05fa6-5837-3127-8429-6e8cccb6e8b7.png" alt="" /></p><p><span style="color: #ff0000">这个也就是SQL脚本中的的lft和rgt的解释</span>。</p><p>&nbsp;</p><p>&nbsp;</p><p>1.创建Rails工程：</p><p> &nbsp;&nbsp;&nbsp;  rails ExtTree</p><p>2.安装act_as_nested_set:</p><p>&nbsp;&nbsp;&nbsp; ruby script/plugin install acts_as_nested_set</p><p>3.下载ext，解压下载后的压缩包并拷贝到ExtTree工程的public目录(public/ext)</p><p>&nbsp;</p><p>4.创建模型对象：</p><p> &nbsp;&nbsp;&nbsp; ruby script/generate resource Category parent_id:integer lft:integer rgt:integer text:string</p><p>5.给模型对象Category加入acts_as_nested_set:</p><pre name="code" class="ruby">class Category &lt; ActiveRecord::Base
  acts_as_nested_set
end</pre><p>6.下面在CategoriesController中加入index方法，让它来转到index.html页面，并且为EXT TREE来生成JSON数据：</p><pre name="code" class="ruby">class CategoriesController &lt; ApplicationController
  def index(id = params[:node])
    respond_to do |format|
      format.html # render static index.html.erb
      format.json { render :json =&gt; Category.find_children(id) }
    end
  end
end</pre><p>&nbsp;index方法有一个参数id,用来接收一个树的节点的id，我们就可以通过一个id来查找该节点的子节点。</p><p>7.实现CategoriesController中的find_children方法：</p><br /><pre name="code" class="ruby">#首先先得到树的根节点，再根据传过来的id找到根的子节点
def self.find_children(start_id = nil)
    start_id.to_i == 0 ? root_nodes : find(start_id).direct_children
end
#如果parent_id为空，则为树的根节点
def self.root_nodes
    find(:all, :conditions =&gt; 'parent_id IS NULL')
end</pre><p>&nbsp;</p><p>到这里，已经实现了基本的树形结构，但却还有一个问题，如果是树叶节点，既没有子节点的节点，图标应该显示为&quot;-&quot; ，不应该再能够伸展了，Ext Tree中提供的示例中给出的JSON数据中有一个leaf的属性，如果为true，则为树叶节点，如果为false，则为树枝节点，所以，我们还需要让我们生成的JSON数据用来leaf来标识树枝节点与树叶节点，在Category.rb中添加如下代码：</p><pre name="code" class="ruby">def leaf
    unknown? || children_count == 0
end

def to_json_with_leaf(options = {})
    self.to_json_without_leaf(options.merge(:methods =&gt; :leaf))
end

alias_method_chain :to_json, :leaf</pre><p>&nbsp;对于alias_method_chain，需要先说一下Ruby中的alias_method方法，在Ruby中有这样的用法：</p><p>&nbsp;</p><pre name="code" class="ruby">alias_method :old_method_name :new_method_name</pre><p>&nbsp;它同alias很类似，但只能用法方法。</p><p>在Ruby中，可以使用方法链的手段来实现mix-in，如果想要用new_method来override old_method方法，就可以这样使用：</p><pre name="code" class="ruby">alias_method :old_method_name :new_method_name
alias_method :new_method_name :old_method_name</pre>&nbsp;而在Rails中，提供了一个更强大的方法：alias_method_chain。 <br /> <p>&nbsp;</p><p>下面是index.html.erb文件：</p><pre name="code" class="html">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;
        &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html;charset=UTF-8&quot;/&gt;
    &lt;title&gt;Rails Ext Tree&lt;/title&gt;
    &lt;%= stylesheet_link_tag &quot;../ext/resources/css/ext-all.css&quot; %&gt;
    &lt;%= javascript_include_tag :defaults %&gt;
    &lt;%= javascript_include_tag &quot;../ext/adapter/prototype/ext-prototype-adapter.js&quot; %&gt;
    &lt;%= javascript_include_tag &quot;../ext/ext-all.js&quot; %&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;category-tree&quot; style=&quot;padding:20px&quot;&gt;&lt;/div&gt;
&lt;% javascript_tag do -%&gt;
    Ext.onReady(function(){     
        root = new Ext.tree.AsyncTreeNode({
        text: 'Invisible Root',
        id:'0'
    });
   
    new Ext.tree.TreePanel({
        loader: new Ext.tree.TreeLoader({
            url:'/categories',
            requestMethod:'GET',
            baseParams:{format:'json'}
        }),
        renderTo:'category-tree',
        root: root,
        rootVisible:false
    });
    
    root.expand();
    });
&lt;% end -%&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>&nbsp;<p>添加测试数据：</p><pre name="code" class="ruby">root = Category.create(:text =&gt; 'Root')

root.add_child(c1 = Category.create(:text =&gt; 'Child 1'))
c1.add_child(Category.create(:text =&gt; 'Child 1.1'))
c1.add_child(Category.create(:text =&gt; 'Child 1.2'))

root.add_child(c2 = Category.create(:text =&gt; 'Child 2'))
c2.add_child(c21 = Category.create(:text =&gt; 'Child 2.1'))
c2.add_child(c21 = Category.create(:text =&gt; 'Child 2.2'))</pre>&nbsp;<p>最后的显示效果：</p><p>&nbsp;<img src="../../../upload/attachment/18768/b81def72-7339-3630-a1c6-239771ddf96d.png" alt="" /></p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/177501#comments" style="color:red;">已有 <strong>11</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Sat, 29 Mar 2008 01:45:36 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/177501</link>
        <guid>http://rainlife.javaeye.com/blog/177501</guid>
      </item>
      <item>
        <title>Idea8试用</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/175204" style="color:red;">http://rainlife.javaeye.com/blog/175204</a>&nbsp;
          发表时间: 2008年03月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          刚刚在新闻频道看到关于Idea的新闻，对它的javascript的调试比较感兴趣，马上下载试用了一下，安装文件并不大，90来M，还算比较快，但当安装完启动时，发现还是慢（7.0的版本也已经很慢了，很怀念6.0以前的那种简洁）。<br />发现Idea可以说是集大部分流行开发语言及流行开源框架之大成者，提供了struts,hibernate,spring,struts2,jsf,webservices,flex,gwt等的支持，并可能通过插件机制提供ruby&rails,groovy&grails的支持，提供了一站式的开发平台。<br />一、JAVA方面的支持：还是保持了它一概的作风，开发体验相当的不错，智能化程度也相当高。<br />一、Grails方面的支持：正如山风小子所说，是现在开发平台中最好的一个(Grails开发小组用的开发平台也是Idea)。<br />二、Rails方面的支持：idea对rails方面的支持相当一般，只提供了一般的功能，代码编辑，rake等，相比NetBeans6.0来说，并没有功能上面的亮点，不提供ruby语言的debug功能(netbeans,radrails都支持debug)，但在代码的编写方面还是不错的。<br />三、Flex方面的支持：可以看我的别一篇翻译的BLOG。<br />四、spring,hibernate,struts方面的支持：Idea在这些主流的开源框架方面的支持还是不错的，特别是在XML配置文件方面，提供了智能感知功能，包括自定义的类，并且它的template功能。<br /><br />回到上面说到的javascript的调试上面，就我的试用感觉来说，支持的并不好，它只是在页面载入时提供debug，比如下面的代码：<br /><pre name="code" class="html">
&lt;script>
function sayHello(value) {
    if(value == "rainlife") {//我在这里添加了断点
        alert("Hello " + valie);
    } else {
        alert("Bye Bye");
    }
}
&lt;/script>

&lt;input type = "text" id="username" name="username">&lt;input type="button" value="test" onclick="sayHello(document.getElementById('username').value)">
</pre><br />这只是一个非常简单的JS，我想点击button后，查看value的值，但idea并不支持。<br /><br />Idea还是刚刚开始，相信等正式发布后，会提供相当好的支持。<br />另外，Idea从7.0版本后，速度相当的慢，内存占用也比较大。<br />个人感觉应该学习一下Eclipse,NetBeans，分开提供J2SE,J2EE,C/C++等不同的版本。
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/175204#comments" style="color:red;">已有 <strong>3</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Sun, 23 Mar 2008 21:56:02 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/175204</link>
        <guid>http://rainlife.javaeye.com/blog/175204</guid>
      </item>
      <item>
        <title>Rails表单</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/173203" style="color:red;">http://rainlife.javaeye.com/blog/173203</a>&nbsp;
          发表时间: 2008年03月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          User为和Address类是一个一对多的关系：<br />User.rb<br /><pre name="code" class="ruby">
class User &lt; ActiveRecord::Base
  validates_presence_of :name, :password  
  has_many :addresses
end
</pre><br />Address.rb:<br /><pre name="code" class="ruby">
class Address &lt; ActiveRecord::Base
  belongs_to :user
end
</pre><br />在创建Address的时候，指定某一个User，下面是两种Form的实现：<br />1.<br /><pre name="code" class="ruby">
&lt;%= form_tag :action => "create" %>
&lt;p>
  &lt;%= text_field "address", "street" %>
&lt;/p>
&lt;p>
  &lt;%= text_field "address", "country" %>
&lt;/p>
&lt;p>
    &lt;%= select_tag "address[user_id]", options_for_select(User.find(:all).collect {|u| [ u.name, u.id ] } )%>
&lt;/p>
&lt;%= submit_tag 'SAVE' %>
&lt;/form>
</pre><br /><br />2.这个是直接使用Scaffold生成的Form，然后添加select：<br /><pre name="code" class="ruby">
&lt;% form_for(@address) do |f| %>
  &lt;p>
    &lt;b>Street&lt;/b>&lt;br />
    &lt;%= f.text_field :street %>
  &lt;/p>

  &lt;p>
    &lt;b>Country&lt;/b>&lt;br />
    &lt;%= f.text_field :country %>
  &lt;/p>

  &lt;p>
    &lt;%= f.select( "user_id", User.find(:all).collect {|u| [ u.name, u.id ] }) %>
  &lt;/p>
  &lt;p>
    &lt;%= f.submit "Create" %>
  &lt;/p>

&lt;% end %>
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/173203#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Mon, 17 Mar 2008 22:47:24 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/173203</link>
        <guid>http://rainlife.javaeye.com/blog/173203</guid>
      </item>
      <item>
        <title>ruby操作WORD文档生成HTML</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/172213" style="color:red;">http://rainlife.javaeye.com/blog/172213</a>&nbsp;
          发表时间: 2008年03月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          通过ruby代码，将指定的WORD文档转换为HTML：<br /><pre name="code" class="ruby">
require 'win32ole'

module WordToHtml
    class WordToHtml
        def initialize(path)
            @path = path
        end

        def convertToHtml(outputPath)
            word = WIN32OLE.new('word.application')
            word.Visible = true
            word.Documents.Count

            # 打开指定的WORD文档
            word.Documents.Open(@path)

            #选择所有文本
            word.Selection.WholeStory
            #所以可以保存为的文档格式
            #   wdFormatDocument = 0 (no conversion)
            #   wdFormatTemplate = 1
            #   wdFormatText = 2
            #   wdFormatTextLineBreaks = 3
            #   wdFormatDOSText = 4
            #   wdFormatDOSTextLineBreaks = 5
            #   wdFormatRTF = 6
            #   wdFormatUnicodeText = 7  # it repeats!
            #   wdFormatEncodedText = 7
            #   wdFormatHTML = 8
            #   wdFormatWebArchive = 9
            #   wdFormatFilteredHTML = 10
            #   wdFormatXML = 11

            word.ActiveDocument.SaveAs outputPath, 10
            # 关闭文档
            word.ActiveDocument.Close

            # 关闭WORD
            word.Quit
        end
    end
end
</pre><br />测试代码：<br /><pre name="code" class="ruby">
require 'WordToHtml'
word = WordToHtml::WordToHtml.new("d:/test/5.doc")
word.convertToHtml("d:/test/5.html")
</pre><br />只有一句，就将WORD转换成为HTML，转换后的HTML与原WORD拥有同样的格式，包括图片(其实这部操作与在WORD中另存为HTML的效果一致)。<br />Ruby操作WORD主要是应用WIN32OLE，下面是一些常用的操作：<br /><pre name="code" class="ruby">
# 写入文本
word.Selection.TypeText("Hello World!\n")

#  查找文本  
word.Selection.Find.Text = 'search'
# 如果找到，则result为  true
result = word.Selection.Find.Execute

# 删除选择的文本  
word.selection.delete

# 读取选择的文本 
puts word.Selection.Text

# 可以通过word.Selection.Start 和 word.Selection.End 来查找选择的区域，上面则是
#通过word.Selection.WholeStory选中整个文档
puts word.Selection.Start
puts word.Selection.End

#也可以给 word.Selection.Start 和 word.Selection.End设值，指定选择的区域
#如：
word.Selection.Start ＝ 100
word.Selection.End ＝ 200
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/172213#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Sat, 15 Mar 2008 18:54:39 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/172213</link>
        <guid>http://rainlife.javaeye.com/blog/172213</guid>
      </item>
      <item>
        <title>HTML太老了？javascript已过盛年？</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/166778" style="color:red;">http://rainlife.javaeye.com/blog/166778</a>&nbsp;
          发表时间: 2008年03月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          刚刚在theserverside上面看到一篇文章“HTML: too old? Javascript passé? Should there be something new?”：<br /><div class="quote_title">引用</div><div class="quote_div"><br />难道我们没有感觉到HTML已经太老，我们在需要一种更适合浏览器的语言。什么是适当的语言，它如何处理，这并不十分清楚，但这却是一个很有意思的问题。<br /><br />近几年，围绕着创建富客户端应用，出现了许多新的想法，那么多的技术，那么多的框架，并且那么多的专业术语。但为什么不统一起来，为浏览器建立一种更适合的语言？<br />难道我们都不觉得HTML太老了，我们应该创造一个更加适合于客户端的语言？<br />我们为什么需要使用单独的语言来编写表示逻辑？带宽并不是一个主要的问题，因此可以在浏览器中下载更多的代码行。<br />我们应该扩散我们的思维，抛开HTML，DHTML，CSS，Javascript，基于上述技术的框架以及编码标准，我们需要考虑制造一种拥有上述技术全部的功能并更适合于浏览器的浏览器原生语言。<br /></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/166778#comments" style="color:red;">已有 <strong>4</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Sun, 02 Mar 2008 23:57:00 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/166778</link>
        <guid>http://rainlife.javaeye.com/blog/166778</guid>
      </item>
      <item>
        <title>HtmlUnit测试页面</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/166702" style="color:red;">http://rainlife.javaeye.com/blog/166702</a>&nbsp;
          发表时间: 2008年03月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>HtmlUnit简介：</strong></p><div class="quote_title">引自 www.open-open.com </div><div class="quote_div">HtmlUnit
是 JUnit 的扩展测试框架之一。HtmlUnit 将返回文档模拟成 HTML，这样您便可以直接处理这些文档了。HtmlUnit 使用例如
table、form 等标识符将测试文档作为 HTML 来处理。它同样需要遵循 JUnit 测试框架结构的 Java&trade; 测试程序。</div>&nbsp;<p>&nbsp;</p><p>我们可以在<a href="http://htmlunit.sourceforge.net/">http://htmlunit.sourceforge.net/</a>上面下载HtmlUnit，最新版本是1.4。</p><p>解压后将lib目录下面的jar文件放入工程的classpath就可以使用了。</p><p>&nbsp;</p><p><strong>基本套路</strong></p><p> 对于一些开源框架的使用，都有一定的基本套路，对于HtmlUnit，由于是对JUnit的扩展，当然，也需要继承自TestCase，并且也可以Override相应的setUp()和tearDown()方法。对于HtmlUnit的使用，也有着基本的套路，如下：</p><br /><pre name="code" class="java">public void testHomePage() throws Exception {
		// 新建一个WebClient对象，此对象相当于浏览器
		final WebClient webClient = new WebClient();
		// 构造一个URL,指向需要测试的URL，如http://www.javaeye.com
		URL url = new URL(&quot;http://www.javaeye.com&quot;);
		// 通过getPage()方法，返回相应的页面
		HtmlPage page = (HtmlPage) webClient.getPage(url);
		// System.out.println(page.getTitleText());
		assertEquals(
				&quot;JavaEye Java编程 Spring框架 AJAX技术 Agile敏捷软件开发 ruby on rails实践 - JavaEye做最棒的软件开发交流社区&quot;,
				page.getTitleText());
	}</pre><p>WebClient对象提供了一系列涉及到浏览器的方法，比如像</p><p>setThrowExceptionOnScriptError(false|true)－是否抛出页面javascript错误</p><p>setThrowExceptionOnFailingStatusCode(false|true)－是否抛出response的错误</p><p>&nbsp;</p><p>&nbsp;</p><p>HtmlPage对应页面，getTitleText()返回页面的title。</p><p>执行测试，就会看到我们所喜爱的绿条。</p><p>&nbsp;</p><p style="font-weight: bold">HtmlUnit的页面组件</p><p style="font-weight: bold"><span style="font-weight: normal">像
上面的HtmlPage，HtmlUnit中定义了许多页面组件对象，像HtmlForm对应Form表单，HtmlImage对应页面中的img标签，
HtmlInput对应页面中的input标签，HtmlAnchor对应页面中的超链接，页面中的每一个标签，HtmlUnit都会有相对应的对象，具
体的，可以参看随HtmlUnit下载的doc文档。</span></p><p style="font-weight: bold">&nbsp;</p><p style="font-weight: bold">超链接</p>
<pre name="code" class="java">// 或取一个&lt;a&gt;的超链接
//HtmlAnchor anchor = (HtmlAnchor) page.getAnchorByName(&quot;welcome&quot;);
		page = (HtmlPage) page.getAnchorByName(&quot;welcome&quot;).click();
		String pageContent = page.getWebResponse().getContentAsString();
		System.out.println(pageContent);</pre>
&nbsp;&nbsp;&nbsp;<br />
 <p style="font-weight: bold">&nbsp;Form提交&nbsp;</p><p>只是简单的测试一个页面的title,当然无法满足需求，对于WEB应用，有着大量的表单，所以HtmlUnit提供了HtmlForm这个对象，以及表单操作的相应方法：</p><p>&nbsp;</p><pre name="code" class="java">public void testHomePage() throws Exception {
	    final WebClient webClient = new WebClient();

	    // 获取首页
	    final HtmlPage page1 = (HtmlPage) webClient.getPage(&quot;http://htmlunit.sourceforge.net&quot;);

	    // 根据form的名字获取页面表单，也可以通过索引来获取：page.getForms().get(0)
	    final HtmlForm form = page1.getFormByName(&quot;myform&quot;);
	    final HtmlSubmitInput button 
	        = (HtmlSubmitInput) form.getInputByName(&quot;submitbutton&quot;);
	    final HtmlTextInput textField 
	        = (HtmlTextInput) form.getInputByName(&quot;userid&quot;);

	    // 设置表单域的值
	    textField.setValueAttribute(&quot;root&quot;);

	    // 提交表单，返回提交表单后跳转的页面
	    final HtmlPage page2 = (HtmlPage) button.click();
	}</pre>&nbsp;<p style="font-weight: bold">&nbsp;</p><p>表
单的提交，超链接的跳转，都是通过click()方法，既通过鼠标点击事件触发的。它们都可以返回相应的HtmlPage对象，然后通过HtmlPage
对象的相应方法来测试，其实，HtmlPage对象，就是包装了页面Html的一个对象，可以通过page.getWebResponse().
getContentAsString()直接返回页面的html代码，然后通过HTML代码来测试：</p>
<pre name="code" class="java">String pageContent = page.getWebResponse().getContentAsString();
		System.out.println(pageContent);
		int indexInt = pageContent.indexOf(WELCOME);

		// assert whether Login successful, using user and password
		assertTrue(indexInt != -1);</pre>
&nbsp;&nbsp;&nbsp;<br />
 <p style="font-weight: bold">页面中的javascript</p><p>对于页面中的javascript，HtmlUnit并没有太好的测试方法，也只能通过相应的ScriptEngine来处理。</p><p>&nbsp;</p><p>对于HtmlUnit，个人感觉实用性并不太大。当然，如果有专人写HtmlUnit测试代码，则可以作为自动化测试，不过不知道有没有公司这么干的。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/166702#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Sun, 02 Mar 2008 22:29:43 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/166702</link>
        <guid>http://rainlife.javaeye.com/blog/166702</guid>
      </item>
      <item>
        <title>《无极》－超强的预言电影？</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/162141" style="color:red;">http://rainlife.javaeye.com/blog/162141</a>&nbsp;
          发表时间: 2008年02月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天在某网上发现一个超强的回帖：<br /><div class="quote_title">引用</div><div class="quote_div">原来，《无极》是一部预言电影……<br /><br />戏里的雪国… - 目前全国南方雪灾严重<br />戏里张东健为了吃到肉说“跟着你，有肉吃。” - 国内猪肉价猛涨<br />戏里一个馒头引发了一场血案 - 后来国家开始对馒头的外形到颜色制定了标准<br />戏里张柏芝脱衣，上床后被骗 - 这几天曝光柏芝照片<br />戏里张东健、真田广之、谢霆锋的打斗，最后日本将军死了 - 近期中日韩关系紧张，9月安倍晋三辞职<br />戏里张昆仑的人肉风筝“把柏芝当风筝放” - 中国首次太空行走：采用脐带式<br />戏里张昆仑跑的速度飞一般 - 飞人刘翔<br />戏里张柏芝的黄金鸟笼 - 奥运鸟巢！<br /><br />戏里对白：<br />谢霆锋：“你毁了我做一个好人的机会！”<br />陈满神对柏芝说：“你永远也得不到男人真心的爱，得到了也会马上失去。”<br /><br />难怪陈凯歌说“过5年后再看无极”…囧rz </div><br /><br />转帖至此，纯属娱乐。
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/162141#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 13 Feb 2008 22:54:57 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/162141</link>
        <guid>http://rainlife.javaeye.com/blog/162141</guid>
      </item>
      <item>
        <title>使用IntelliJ_IDEA开发Flex应用</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/161854" style="color:red;">http://rainlife.javaeye.com/blog/161854</a>&nbsp;
          发表时间: 2008年02月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>使用IntelliJ_IDEA开发Flex应用</strong><br />在这个指南中，你将会：<br />1．	使用Flex模块来创建IntelliJ IDEA 工程<br />2．	使用ant来编译和运行Flex应用<br />3．	创建一个Flex应用<br />4．	代码补助与快速修复<br />5．	运行Flex应用<br /><br /><strong>先决条件：</strong><br />	使用IntelliJ IDEA,开发Flex，需要首先下载下列软件：<br />1.	IntelliJ IDEA EAP ：http://www.intellij.net/eap<br />2.	Flex SDK ：http://www.adobe.com/products/flex/downloads/<br />你可能还需要从http://www.adobe.com/support/documentation/en/flex/ 上查看关于Flex的最新消息，包括语言参考。<br /><br /><strong>开始</strong><br />首先你需要创建一个Flex模块的工程和ant文件来编译、运行及调试Flex应用。<br />1.	运行IntelliJ IDEA<br /><img src="http://rainlife.javaeye.com/upload/picture/pic/7764/f585befe-37e1-3edd-b200-4d8ac1ee51f2.jpg" /> <br />2.	打开”File”菜单，单击”New Project”，弹出”New Project”向导，选择”Next”。<br /><img src="http://rainlife.javaeye.com/upload/picture/pic/7766/74e75bb6-cea5-3bb2-b681-05b979678475.jpg" />  <br />3.	指定项目名称，例如：MyFlexProject。<br /><img src="http://rainlife.javaeye.com/upload/picture/pic/7768/fbe0a459-1967-36ec-81fc-c0ca8474537d.jpg" /> <br />4.	保留创建源目录的选项，并且选择”Next”。<br /><img src="http://rainlife.javaeye.com/upload/picture/pic/7770/eac14c4f-8e71-3082-b573-88542bd0e01f.jpg" /> <br />5.	选中”Flex”并且选择”…”指定Flex SDK的安装目录，然后选择”Finish”<br /><img src="http://rainlife.javaeye.com/upload/picture/pic/7772/3fdec34c-58a7-31b5-be8f-930c25741034.jpg" /> <br />现在，当Flex项目被创建后，我们需要添加Ant构建文件：<br />1.	在Src目录创建两个文件：Ant构建文件buildexml 和 Ant配置文件 local.build.properties 。	<br />2.	为Flex工程创建两个Ant的任务：打开build.xml文件，添加如下两个任务：”compile”和”run”。<br /><pre name="code" class="xml">&lt;project default="compile" basedir=".">
    &lt;property file="local.build.properties"/>
    &lt;property name="mxmlc.jar" location="${flex.sdk.dir}/lib/mxmlc.jar"/>
    &lt;property name="deployDirectory" value="${deploymentPath}"/>
    &lt;property name="testApplication" value="${testAppPath}"/>

    &lt;target name="compile">
        &lt;java
                jar="${mxmlc.jar}"
                fork="true"
                maxmemory="512m"
                failonerror="true">
            &lt;arg value="+flexlib=${flex.sdk.dir}/frameworks"/>
            &lt;arg line="-load-config+=flex-config.xml"/>
            &lt;arg line="-source-path ."/>
            &lt;arg line="-output='${deployDirectory}/${testAppFileName}'"/>
        &lt;/java>
    &lt;/target>

    &lt;target name="run" depends="compile">
        &lt;exec executable="${testApplication}" spawn="yes" dir="${deployDirectory}">
            &lt;arg line="'${testAppFileName}'"/>
        &lt;/exec>
    &lt;/target>
&lt;/project></pre><br />3.	定义构建Flex项目的properties配置。打开local.build.properties文件，添加如下的配置：<br /><pre name="code" class="xml">flex.sdk.dir=D:/Libraries/flex 
testAppPath=C:/Program Files/Mozilla Firefox/firefox.exe 
testAppFileName=application.swf 
deploymentPath=D:/myFlex</pre><br />说明：<br />	flex.sdk.dir   	 Flex SDK安装的路径<br />	testAppPath  	 指定运行Flex应用的浏览器路径<br />	testAppFileName  Flex应用的名称<br />	deploymentPath   发部Flex项目的目录路径。如果这个目录不存在，IntelliJ IDEA会在发布前创建。<br />关于Ant 的更多信息，请访问：http://ant.apache.org<br /><br />现在一切先决条件已经具备，让我们首先试一试下面的例子。<br /><br /><strong>经典示例</strong><br />	我们将采用一个非常经典的示例：Hello World，并且用Flex来实现它。<br />1.	在Src目录下创建Application.mxml文件，并且在编辑器中打开它。然后，拷贝下面的代码：<br /><pre name="code" class="xml">&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">  
    &lt;mx:Panel title="IntelliJ IDEA Sample Flex Application" height="20%" 
width="30%" paddingTop="10" paddingLeft="10" paddingRight="10" 
paddingBottom="10" id="mainPanel">  
        &lt;mx:Button label="Click Me" click=" mx.controls.Alert.show('Hello, 
World!')"/>  
    &lt;/mx:Panel>  
&lt;/mx:Application>  </pre><br />这段代码仅仅定义了一个面板(Panel)，并且仅包含这个”Click Me”的按钮(Button)，当你点击这个面板，将会弹出一个”Hello World”的消息框。<br />2.	现在，我们需要定义一个描述Flex程序结构的配置文件，在Src目录下创建文件flex-config.xml ，在编辑器中打开它，拷贝下面的代码：<br /><pre name="code" class="xml">&lt;flex-config xmlns="http://www.adobe.com/2006/flex-config">
    &lt;compiler>
        &lt;debug>true&lt;/debug>
    &lt;/compiler>
    &lt;file-specs>
        &lt;path-element>Application.mxml&lt;/path-element>
    &lt;/file-specs>
&lt;/flex-config></pre><br />它是如何工作的？单击Intellij IDEA右工具栏上的”Ant Build”按钮，打开Ant工具窗口，在工具条上单击”+”，然后选择我们刚才创建的build.xml文件。当Intellij IDEA加载build.xml文件后，右击”Run”这个任务并且在弹出右键菜单中选择”Run Target”。<br /><img src="http://rainlife.javaeye.com/upload/picture/pic/7774/7402042a-2d76-33de-a315-6044c1631066.jpg" /> <br />IntelliJ IDEA会自己编译Flex，并且在你指定的浏览器中显示它。<br /><img src="http://rainlife.javaeye.com/upload/picture/pic/7776/9af659fa-983b-3d2d-84e5-2254c9e15525.jpg" /> <br /><br />让我们稍微修改一个代码，看一下IntelliJ IDEA对于Flex代码的代码补助功能：<br />首先从添加一些控制开始。嗯，我们并不想要仅仅说一声”Hello World”，我们需要改成更具人性化的问候。为此，我们需要添加一些附加的控制。再次打加Application.mxml文件，在&lt;mx:panel>标签后试着输入下面的代码：<br /><pre name="code" class="xml">&lt;mx:Label text="Type your name:" top="15" left="15"/>
&lt;mx:TextInput id="myTextBox" width="150" top="15"/></pre><br />在输入这些代码的时候，你可以在任何时候通过”ctrl+space”快捷键来查看当然元素的代码提示。<br />IntelliJ IDEA能够正确地识别并且提供充分的提示，如标签、属性、值等。<br /><img src="http://rainlife.javaeye.com/upload/picture/pic/7784/0b62aec5-97b6-35bb-8fce-a1dae18a8b4e.jpg" /> <br />为了更好的实现控制，让我们使用HBox来包装它们。为此，选中我们刚才键入的代码，执行”Ctrl+Alt+J”或”Ctrl+Alt+T”快捷键，然后键入"mx:HBox"。<br /><img src="http://rainlife.javaeye.com/upload/picture/pic/7782/347178ca-bc83-341f-99bf-ac304c9b563b.jpg" /> <br />这将使用&lt;mx:HBox>标签来包裹我们刚才选中的代码。在代码补助的帮助下，你可以马上输入所有需要的属性。<br /><pre name="code" class="xml">&lt;mx:HBox>
        &lt;mx:Label text="Type your name:" top="15" left="15"/>
        &lt;mx:TextInput id="myTextBox" width="150" top="15"/>
/mx:HBox></pre><br /><br />让我们键入更多实现问候功能的代码，并且这将展示InteliiJ IDEA如何正确识别自定义包以及其它资源。<br /><br />	右击”Src”目录，选择”Package”，输入”MySamplePackage”，然后选择”OK”。<br />之后，在刚才创建的包中创建Greeter.as文件，并且在编辑器的打开它。类的名字与文件名必须相同，这点比较重要。在编辑框中输入下面的代码，并享受自动代码补助所带来的乐趣。<br /><pre name="code" class="java">package MySamplePackage {  
  public class Greeter {  
    public function createGreeting(name:String) {  
        var greetingText = 'Hello, ';  
        greetingText += (name.length &lt; 1) ? 'Anonymous' : name;  
        return greetingText; 
    }  
  }  
}</pre><br /><img src="http://rainlife.javaeye.com/upload/picture/pic/7780/530aab7b-67c8-3d48-8359-1057de9ecb4e.jpg" /> <br />注意InteliiJ IDEA高亮了代码中的一些错误：下划线。将鼠标移动在上面可以查看错误提示。在这个例子中，我们忘记了定义变量的类型和函数的返回类型。单击错误代码，并且使用”ALT+ENTER”快捷键，将会出现所有错误的解决方案的列表。<br />现在回到Application.mxml文件。首先，需要指定我们刚刚创建的包，这样就可以在mxml文件中使用Greeter.as文件中的代码：<br /><pre name="code" class="xml">&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:x="MySamplePackage.*"></pre><br />让我们在代码中添加Greeter类的一个实例。输入下面的代码：<br /><pre name="code" class="xml">&lt;x:Greeter id="myGreeter"/></pre><br />代码补助工具已经能够正确识别Greeter的实例。<br /><img src="http://rainlife.javaeye.com/upload/picture/pic/7778/05bc53eb-d573-38c8-9e78-a2fe0aec5d8f.jpg" /> <br />IntelliJ IDEA甚至可以在&lt;mx:Script>代码块中进行提示。在这里我们创建一个函数，这个函数将输入的值传递给createGreeting方法并且以字符串的形式返回结果。<br />   <pre name="code" class="xml"> &lt;mx:Script> 
    &lt;![CDATA[      
        function greetMe(name:String):String {
            return myGreeter.createGreeting(myTextBox.text);
        } 
    ]]&gt; 
    &lt;/mx:Script>
</pre><br />代码补助工具可以在script文件和mxml文件之间提供正确的提示，并且能够检查出各种不同的错误。这样，可以使用”ALT+ENTER”快速地解决错误。<br /><br />现在让我们稍微改动一个这个Button，它将会显示新的提示信息。要做在这一点，打开Application.mxml文件，并且修改&lt;mx:Button>的控制：<br /><pre name="code" class="xml">&lt;mx:Button label="Greet" click="mx.controls.Alert.show(greetMe())"/></pre><br />重新运行Ant的”Run”任务，现在我们可以看到我们修改后的结果。
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/161854#comments" style="color:red;">已有 <strong>7</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Mon, 11 Feb 2008 02:13:22 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/161854</link>
        <guid>http://rainlife.javaeye.com/blog/161854</guid>
      </item>
      <item>
        <title>javascript的消息资源国际化</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/161713" style="color:red;">http://rainlife.javaeye.com/blog/161713</a>&nbsp;
          发表时间: 2008年02月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>不知道大家对于javascript中的消息资源是如何做国际化的，对于页面文件来说，可以使用一些国际化的开源东东，像struts的〈bean:message〉，或者使用JSTL的fmt，但在js文件中，却无法使用这类的东西，一种变通的办法，就是在jsp中定义一些javascript的常量，这些常量的值为国际化资源文件中定义的信息，然后在js代码中去使用定义好的这些常量。</p><p>另一个方法，像FCKEditor这样，直接使用javascript来实现javascript的国际化。而这样的实现方法，也并不困难。</p><p>javascrip中的一个navigator的内置对象，包含了正在使用的 Navigator 的版本信息。</p><p><a name="1039116" title="1039116"></a>
</p><h4>属性概览</h4>
<a name="1010335" title="1010335"></a>

  <p>&nbsp;</p><table border="0"><tbody><tr><td align="left">appCodeName  
    </td><td align="left">指定浏览器的代码名称。
  </td></tr><tr><td align="left">appName  
    </td><td align="left"><a name="1010306" title="1010306"></a>指定浏览器的名称。
  </td></tr><tr><td align="left">appVersion  
    </td><td align="left"><a name="1010313" title="1010313"></a>指定 Navigator 的版本信息。
  </td></tr><tr><td align="left">language  
    </td><td align="left"><a name="1014748" title="1014748"></a>标明正在使用的 Navigator 的翻译语种。
  </td></tr><tr><td align="left">mimeTypes  
    </td><td align="left"><a name="1010320" title="1010320"></a>客户端支持的所有 MIME 类型数组。
  </td></tr><tr><td align="left">platform  
    </td><td align="left"><a name="1015594" title="1015594"></a>标明了 Navigator 编译适合的机器类型。
  </td></tr><tr><td align="left">plugins  
    </td><td align="left"><a name="1015586" title="1015586"></a>客户端已安装的所有插件数组。
  </td></tr><tr><td align="left">userAgent  
    </td><td align="left"><a name="1010334" title="1010334"></a>指定了用户代理头。</td></tr></tbody></table><p>这里的appName应该都比较熟悉，可以用它来判断不同的浏览器，像ie ,firefox等。</p><p>navigator还有一个language的属性，</p><p>IE代码：</p><pre name="code" class="js">navigator.userLanguage</pre>非IE代码：&nbsp;<pre name="code" class="js">navigator.language</pre><p>&nbsp;它的返回值为用户所在的语言环境，与java中的Locale类似，比如说我在中文环境下，则返回&quot;zh-CN&quot;。</p><p>这样，就可以根据返回的language的不同，来定位到不同的message_XXX.js资源文件中。</p><p>比如说定义两个js资源文件：</p><p>message_en.js</p><br /><pre name="code" class="js">var Lang = {
   hello : &quot;Hello World!&quot;
}</pre><p>message_zh-CN.js</p><pre name="code" class="js">var Lang = {
   hello : &quot;你好，世界!&quot;
}

</pre><p>我们就可以在js代码中直接使用Lang[key](这里的key为hello)实现资源信息的国际化。</p><p>另外，像FCKEditor，在HTML页面中，也使用javascript来做国际化，像下面的代码：</p><pre name="code" class="js">&lt;span fckLang=&quot;PlaceholderDlgName&quot;&gt;Placeholder Name&lt;/span&gt;&lt;br&gt;</pre><p>&nbsp;通过为span这个标签增加一个fckLang=&quot;XXX&quot;的属性，这里的&quot;XXX&quot;，就是定义在资源js文件中的(像上面的&quot;hello&quot;)。</p><p>这是如何实现的呢？</p><p>先定义一个TranslatePage(A)的方法，参数A为一个DOM对象：</p><pre name="code" class="js">function TranslatePage(A) {
            this.TranslateElements(A, 'SPAN', 'innerHTML', false);
}</pre><p>&nbsp;在TranslatePage方法内部，又调用了TranslateElements的方法：</p><pre name="code" class="js">/**
         * @param A   DOM对象
         * @param B   国际化的HTML标签
         * @param C   国际化标签的innerHTML或innerText
         * @param D   是否转换HTML的标签
         */
        var TranslateElements = function(A, B, C, D) {
            var e = A.getElementsByTagName(B);//实际上就是根据标签名取到这个标签的数据集合
            var E,s;
            for (var i = 0; i &lt; e.length; i++) {
                if (E = e[i].getAttribute('fckLang')) { //如果这个标签中有'fckLang'的属性的，说明它是要实现国际化的
                    if (s = Lang[E]) {
                        if (D) s = HTMLEncode(s);//是否处理HTML标签
                        eval('e[i].' + C + ' = s');//这个实际上就是执行XXX.innerHTML='XXXX'
                    }
                }
            }
        }</pre><p>&nbsp;下面这个是HTMLEncode方法的实现：</p><pre name="code" class="js">var HTMLEncode = function(A) {
            if (!A) return '';
            A = A.replace(/&amp;/g, '&amp;');
            A = A.replace(/&lt;/g, '&lt;');
            A = A.replace(/&gt;/g, '&gt;');
            return A;
}</pre><p>&nbsp;实际上就是将&quot;〈&quot;和&ldquo;〉&rdquo;这样的标签转换一下。</p><p>这样的实现，不禁让我想到了Tapestry，通过在HTML标签中增加一个&ldquo;jwcid&rdquo;的属性，这标识这个HTML标签是一个Tapestry的组件，通过Tapestry的处理，再将结果返回重新渲染由jwcid这个属性标识的HTML标签。</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/161713#comments" style="color:red;">已有 <strong>5</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 08 Feb 2008 19:59:22 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/161713</link>
        <guid>http://rainlife.javaeye.com/blog/161713</guid>
      </item>
      <item>
        <title>春晚 “北帝” “东邪”</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/161565" style="color:red;">http://rainlife.javaeye.com/blog/161565</a>&nbsp;
          发表时间: 2008年02月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp; 金庸的《射雕英雄传》，相信大家都耳目能详，东邪西毒，南帝北丐，相信也都在大家的记忆中。</p><p>&nbsp;</p><ul><li>中央电视台，就好似《射雕英雄传》中的南帝，但央视在北京，我称它为&ldquo;北帝&rdquo;：雍容华贵，稳沉厚重，胸怀博大，练的是纯正内功，春节晚会比较正统。但最近几年的央视春晚，却渐渐地加入了许多的娱乐元素，像去年杨臣刚的&ldquo;老鼠爱大米&rdquo;，但因其过于敦厚，不仅自己活的累，别人也为他感到累，春晚亮点不多。</li></ul><ul><li>上海东方卫士，就好似《射雕英雄传》中的东邪：玉树临风，俊朗潇洒，对敌招式繁多，机关重重，杀伐决断从不迟疑，为江湖第一机智聪明之人，春节晚会以娱乐为主，贴近现代大多数年轻人的心理，但因其心机太深，令人难以掌握，春晚节目花样繁多。</li></ul><p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/161565#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 06 Feb 2008 21:52:05 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/161565</link>
        <guid>http://rainlife.javaeye.com/blog/161565</guid>
      </item>
      <item>
        <title>都别装了，难道你们都喜欢看春节晚会？</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/161564" style="color:red;">http://rainlife.javaeye.com/blog/161564</a>&nbsp;
          发表时间: 2008年02月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          借robbin的帖子，发一个相反的主题，年年春节，年年春晚，如今的春晚，是一年不如一年，一年比一年的没看头。是人大了？品味变了？要求高了？怀念儿时那种过年的欢天喜地神情，怀念儿时那种拿着红包，放着鞭炮的心情，怀念儿时~~~~~~~~
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/161564#comments" style="color:red;">已有 <strong>15</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 06 Feb 2008 21:22:21 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/161564</link>
        <guid>http://rainlife.javaeye.com/blog/161564</guid>
      </item>
      <item>
        <title>过年吃花生</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/161560" style="color:red;">http://rainlife.javaeye.com/blog/161560</a>&nbsp;
          发表时间: 2008年02月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          又是一年的除夕，结束了一年的忙碌，结束了一年的劳累，一家人一起围坐在一起吃年夜饭。吃过年夜饭，我们这里有个习俗，就是会一起吃花生，花生，又名“长生果”，很吉利的小名－－－新年吃花生，有着其特殊的意义！<br /><div class="quote_title">引用</div><div class="quote_div"><br />花生，不少地方称它为“长生果”，这是不无道理的。这一方面是由于花生具有很高的营养价值，另一方面是因为它还具有一定的医疗作用。<br />　　花生仁中含蛋白质高达26%左右，相当于小麦的2倍、大米的3倍，而且容易被人体利用，消化系数约为90%。花生仁中还有丰富的脂肪，含量达40%左右，其中有较多的不饱和脂肪酸。此外，含有除维生素C以外的多种维生素，以及钙、磷、铁等多种矿物元素。<br />　　花生除了可以对人体滋补营养外，还具有广泛的医疗益寿作用。一是食用花生油可使人体肝内胆固醇分解为胆汁酸，并使其排泄增强，从而可降低胆固醇，对防止中老年人动脉粥样硬化和冠心病有明显效果；二是花生仁红衣能抑制纤维蛋白的溶解，促进血小板新生，加强毛细血管的收缩功能，因此可治疗血小板减少和肺结核咳血、泌尿道出血、齿龈出血等出血性疾病；三是用醋浸泡花生仁七日以上，每晚服7-10粒，连服七天为一疗程，可使一般高血压患者血压降至正常；四是花生全身都是宝，花生壳也有降低血压、调整血中胆固醇的作用，将果壳洗净泡水代茶喝，对于血压和血脂不正常者也有一定疗效。<br />　　因此，常食花生对人体养生保健是很有益处的。但是应注意，花生也有一弊——即容易受潮发霉，产生致敏性很强的黄曲霉菌毒素，故而，花生应妥善保存（以贮于低温、干燥处为好），经常检查。如发现有变质的，应及时消除。食用花生米前，应反复搓洗，然后经高温煮（炒）熟。还必须注意的是，有下述疾病患者不宜吃花生，或只能少量食用。<br />　　（1）高脂血症患者  花生含有大量脂肪，高脂血症患者食用花生后，会使血液中的脂质升高，而血脂升高是导致动脉硬化、冠心病等症的重要因素之一。<br />　　（2）割除胆囊者  花生里含有大量脂肪需大量胆汁去消化。胆囊切除后，贮存胆汁的功能丧失，这类病人如果食用花生，没有大量的胆汁来帮助消化，常会引起消化不良。另外，由于没有胆汁贮藏，还会增加肝脏分泌胆汁的负担，日久天长，将使肝脏的功能受到损伤。<br />　　（3）脾弱便溏者  花生含有大量的油脂，有缓泻作用。肠炎、痢疾、消化不良等脾弱者食用花生后，会加重腹泻，不利于疾病康复。<br />　　（4）内热上火者  花生味甘性燥，患有口腔炎、舌炎、口舌溃疡、唇疱疹、鼻出血等内热上火者，食用花生后会加重火气，使病情加重或久治不愈。<br />　　（5）跌扑瘀肿者  花生含有一种促凝血因子，经化学提纯，制成某些制剂，可用于凝血机能低下和血小板减少等疾病。跌打损伤、血脉瘀滞者食花生后，将会使血瘀不散，加重瘀肿。 <br /></div><br />在新的一年里，祝所有的JE友们，新年快乐，多吃花生。<br /><br />楼下的朋友，晒晒你们的新年习俗呢！
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/161560#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 06 Feb 2008 18:54:58 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/161560</link>
        <guid>http://rainlife.javaeye.com/blog/161560</guid>
      </item>
      <item>
        <title>简单的在线编辑器，处理JSSC ver2.0的一个缺点</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/161547" style="color:red;">http://rainlife.javaeye.com/blog/161547</a>&nbsp;
          发表时间: 2008年02月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近在JE论坛上面看到一位学生朋友实现的代码着色的JS代码，下载下来试用一下，先自己写了一个非常简单的简单的在线编辑器，类似于JE的&ldquo;BBCoce编辑器&rdquo;：</p><pre name="code" class="js">////////////////////////////////////////////////////////////////////////
// 简单的在线编辑器 (支持IE,OPERA,FIREFOX)                      //
// 参数说明：                                                                     //
//  htmlElement : 需要使用该在线编辑器的HTML元素             //
//  tagPrefix : 编辑器标签                                                  //
///////////////////////////////////////////////////////////////////////
function Tag(htmlElement, tagPrefix) {
    var element = document.getElementsByTagName(htmlElement)[0];
    var tagSuffix = tagPrefix.replace(/\[/ig, '[/');
            //IE
    if (document.selection &amp;&amp; document.selection.type == &quot;Text&quot;) {
        var sel = document.selection.createRange();
        if (sel.text.length &gt; 0) {
            code = tagPrefix + sel.text + tagSuffix;
            sel.text = code;
        }
    } else if (window.getSelection &amp;&amp; element.selectionStart &gt; -1) { //如果选择textarea编辑框的第一个字符开始选择，则element.selectionStart = 0
        //firefox  需要根据光标的位置来或取选择的文本
        var startP = element.selectionStart;
        var endP = element.selectionEnd;
        if (startP != endP) {
            element.value = element.value.substring(0, startP) + tagPrefix +
                   element.value.substring(startP, endP) + tagSuffix +
                   element.value.slice(endP);
        } else {
            element.value += tagPrefix + tagSuffix;
        }
    }
}</pre><p>如何使用：</p><pre name="code" class="js">&lt;input type=&quot;button&quot; value=&quot;Code&quot; onclick=&quot;Tag('textarea','[code]');&quot;&gt;
&lt;input type=&quot;button&quot; value=&quot;B&quot; style=&quot;font-weight:bold;&quot; onclick=&quot;Tag('textarea','[b]');&quot;&gt;</pre><p>&nbsp;通过button的onclick事件调用Tag函数。</p><p>JCC2这个着色工具在使用的时候，是匹配页面中〈textarea name=&quot;code&quot;〉或〈pre name=&quot;code&quot;〉这样的元素，然后再着色，所以在显示的页面，需要加上如下的javascript代码：</p><pre name="code" class="js">&lt;script type=&quot;text/javascript&quot;&gt;
    jssc.colorAll(&quot;code&quot;);
&lt;/script&gt;</pre><p>当然，由于页面中标签都是&ldquo;[&rdquo; ， &ldquo;]&rdquo;，首先需要在显示页面中将这些标签格式成HTML的标签：</p><pre name="code" class="js">function tagCode2html(str) {
    var searchArray = new Array(
            '\\\[b\\\]', '\\\[\\\/b\\\]',
            '\\\[i\\\]', '\\\[\\\/i\\\]', '\\\[u\\\]', '\\\[\\\/u\\\]',
            '\\\[code\\\]', '\\\[\\/code\\]'
            );
    var replaceArray = new Array(
             '&lt;b&gt;', '&lt;/b&gt;', '&lt;i&gt;','&lt;/i&gt;', '&lt;u&gt;', '&lt;/u&gt;',
            '&lt;textarea name=\&quot;code\&quot; class=\&quot;java\&quot;&gt;', '&lt;/textarea&gt;'
            );
    var len = searchArray.length;
    for (var i = 0; i &lt; len; i++) {
        re = new RegExp(searchArray[i], &quot;ig&quot;);
        str = str.replace(re, replaceArray[i]);
    }
    return str;
}</pre><p>&nbsp;这样，就可以实现代码的着色。</p><p>但JCC2这个着色工具有一个致命的弱点。</p><p>看这一段代码：</p><pre name="code" class="js">E[F].parentNode.appendChild(D);
E[F].parentNode.appendChild(A);
E[F].style.display = &quot;none&quot; 
</pre><p>&nbsp;将着过色后的代码，append到Node中去，这样造成的后果是：<strong>着过色后的代码，都会显示在输出文本的最后。</strong></p><p>所以，将着色引擎换成dp.SyntaxHighlighter：</p><pre name="code" class="js">dp.SyntaxHighlighter.HighlightAll(&quot;code&quot;);</pre><p>&nbsp;----------------------------------------------------------------------------------------------------------------------</p><p>解决JCCS的缺点：</p><p>将</p><pre name="code" class="js">E[F].parentNode.appendChild(D);
E[F].parentNode.appendChild(A);
E[F].style.display = &quot;none&quot;</pre><p>&nbsp;这三句代码改成：</p><pre name="code" class="js">E[F].parentNode.replaceChild(A,E[F]);</pre><p>&nbsp;使用节点A来替换E[F]节点，这样，就可以了，但还有一个问题，节点D无法append上去，暂时还没有想到解决的方法。</p><p>-----------------------------------------------------------------------------------------------------------------------</p><p>再次解决JCCS的缺点：</p><p>将colorList方法改成如下方法：</p><pre name="code" class="js">jssc.colorList = function(E) {
    for (var F in E) {
        var _ = E[F].firstChild.nodeValue,B = this.splitLine(_),C = E[F].className,$ = this.colorCode(_, B, C);
        E[F].id = &quot;jssc&quot; + F;
        var newNode = document.createElement(&quot;div&quot;);
        newNode.id = E[F].id
        var A = document.createElement(&quot;div&quot;),D = document.createElement(&quot;div&quot;);
        D.innerHTML = C.substr(0, 1).toUpperCase() + C.substr(1) + &quot; \u4ee3\u7801&quot;;
        D.innerHTML += &quot;&lt;span onclick='jssc.copyToClipboard(\&quot;&quot; + _ + &quot;\&quot;)'&gt;\u590d\u5236\u5230\u526a\u8d34\u677f&lt;/span&gt;&quot;;
        D.className = &quot;jssccodetitle&quot;;
        A.appendChild($);
        A.className = &quot;jssc&quot;;
        newNode.appendChild(D);
        newNode.appendChild(A);
        E[F].parentNode.replaceChild(newNode, E[F]);
    }
};</pre><p>&nbsp;主要是新建一个div的node ---- newNode，然后将A和D都append到新建的newNode上，再用newNode去replace掉E[F]这个node。</p><p>另外，对于</p><pre name="code" class="js">copyToClipboard</pre>
这个方法也做了一点小修改，直接将着色部分的文本作为参数传递过去，而不再是传递一个Node 的 id。<p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/161547#comments" style="color:red;">已有 <strong>7</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 06 Feb 2008 13:35:11 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/161547</link>
        <guid>http://rainlife.javaeye.com/blog/161547</guid>
      </item>
      <item>
        <title>Ubuntu中安装JDK6.0</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/155444" style="color:red;">http://rainlife.javaeye.com/blog/155444</a>&nbsp;
          发表时间: 2008年01月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1. 从SUN网站上下载jdk-6u4-linux-i586.bin这个文件 <br />2. 将下载的文件移动到/opt目录下：<br />    <pre name="code" class="java">sudo mv jdk-6u4-linux-i586.bin /opt</pre><br />3. 执行sh jdk-6u4-linux-i586.bin，安装jdk<br />4. 修改~/.bashrc文件：<br />    <pre name="code" class="java">sudo gedit ~/.bashrc</pre><br />~/.bashrc的最后加上这些： <br /><pre name="code" class="java">
# set jdk classpath
export JAVA_HOME=/opt/jdk1.6.0_04

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib 
</pre><br />设置jdk的classpath
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/155444#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Sun, 13 Jan 2008 21:34:06 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/155444</link>
        <guid>http://rainlife.javaeye.com/blog/155444</guid>
      </item>
      <item>
        <title>成功安装Ubuntu8.0.4，并启用3D桌面</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/155432" style="color:red;">http://rainlife.javaeye.com/blog/155432</a>&nbsp;
          发表时间: 2008年01月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          经过了不知道多少次的安装配置，今天成功安装好Ubuntu，以及ATI的显卡驱动(ATI的驱动，一直是一个大问题)，现在感觉compiz真的非常强大，特效足够让Vista所汗颜。今天一下子弄好了声卡，显卡驱动，并且安装好了视屏解码器，感觉很爽。
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/155432#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Sun, 13 Jan 2008 20:07:49 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/155432</link>
        <guid>http://rainlife.javaeye.com/blog/155432</guid>
      </item>
      <item>
        <title>Netbeans，无法承受之慢</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/143815" style="color:red;">http://rainlife.javaeye.com/blog/143815</a>&nbsp;
          发表时间: 2007年11月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Netbenas，现在已经是Beta2了，应该说，在功能上，已经有了很大的进步，已经具有了和Eclipse一较高下的本领，Netbeans在ruby on rails上的支持，也可以说是Eclipse,Idea这三个主流开发平台上面的佼佼者，javaeye3.0也使用Netbeans作来首选的开发平台，也足以见到Netbeans对ruby on rails的支持是非常好的，但在我这几天试用Netbeans的过程中，却发现(JDK6.0 ， Netbeans6.0Beta2)，Netbeans的速度非常慢，在编辑中来回滚动都能过发现很明显的拖动现象，每一步操作，都非常的迟缓，而这一点，或许会成为Netbeans的致命伤。
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/143815#comments" style="color:red;">已有 <strong>21</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Mon, 26 Nov 2007 20:29:42 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/143815</link>
        <guid>http://rainlife.javaeye.com/blog/143815</guid>
      </item>
      <item>
        <title>当 Hibernate 遇上 Spring</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/139784" style="color:red;">http://rainlife.javaeye.com/blog/139784</a>&nbsp;
          发表时间: 2007年11月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.ibm.com/developerworks/cn/java/wa-spring2/" target="_blank">http://www.ibm.com/developerworks/cn/java/wa-spring2/</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/139784#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Sun, 11 Nov 2007 19:08:15 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/139784</link>
        <guid>http://rainlife.javaeye.com/blog/139784</guid>
      </item>
      <item>
        <title>java的数据结构</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/139783" style="color:red;">http://rainlife.javaeye.com/blog/139783</a>&nbsp;
          发表时间: 2007年11月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          线性表，链表，哈希表是常用的数据结构，在进行Java开发时，JDK已经为我们提供了一系列相应的类来实现基本的数据结构。这些类均在java.util包中。本文试图通过简单的描述，向读者阐述各个类的作用以及如何正确使用这些类。<br />Collection<br />├ List<br />│├ LinkedList<br />│├ ArrayList<br />│└ Vector<br />│　└ Stack<br />└ Set<br /><br />Map<br />├ Hashtable<br />├ HashMap<br />└ WeakHashMap<br /><br />Collection接口:<br />    Collection是最基本的集合接口，一个Collection代表一组Object，即Collection的元素（Elements）。一些 Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类， Java SDK提供的类都是继承自Collection的“子接口”如List和Set。　　所有实现Collection接口的类都必须提供 两个标准的构造函数：无参数的构造函数用于创建一个空的Collection，有一个Collection参数的构造函数用于创建一个新的 Collection，这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。　　如何遍历Collection中的每一个元素？不论Collection的实际类型如何，它都支持一个iterator()的方法，该方法返回一个迭代子，使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下：<br /><pre name="code" class="java">
Iterator it = collection.iterator(); // 获得一个迭代子　　　　
while(it.hasNext()) {　　　　　　
  Object obj = it.next(); // 得到下一个元素　　　　
}
</pre><br />由Collection接口派生的两个接口是List和Set。主要方法:<br />boolean add(Object o)添加对象到集合<br />boolean remove(Object o)删除指定的对象<br />int size()返回当前集合中元素的数量<br />boolean contains(Object o)查找集合中是否有指定的对象<br />boolean isEmpty()判断集合是否为空<br />Iterator iterator()返回一个迭代器<br />boolean containsAll(Collection c)查找集合中是否有集合c中的元素<br />boolean addAll(Collection c)将集合c中所有的元素添加给该集合<br />void clear()删除集合中所有元素<br />void removeAll(Collection c)从集合中删除c集合中也有的元素<br />void retainAll(Collection c)从集合中删除集合c中不包含的元素<br /><br />List接口<br />    List是有序的Collection，使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引（元素在List中的位置，类似于数组下标）来访问List中的元素，这类似于Java的数组。和下面要提到的Set不同，List允许有相同的元素。　 　<br />    除了具有Collection接口必备的iterator()方法外，List还提供一个listIterator()方法，返回一个 ListIterator接口，和标准的Iterator接口相比，ListIterator多了一些add()之类的方法，允许添加，删除，设定元素， 还能向前或向后遍历。　　<br />    实现List接口的常用类有LinkedList，ArrayList，Vector和Stack。<br />    主要方法:<br />void add(int index,Object element)在指定位置上添加一个对象<br />boolean addAll(int index,Collection c)将集合c的元素添加到指定的位置<br />Object get(int index)返回List中指定位置的元素<br />int indexOf(Object o)返回第一个出现元素o的位置.<br />Object removeint(int index)删除指定位置的元素<br />Object set(int index,Object element)用元素<br />element取代位置index上的元素,返回被取代的元素<br /><br />LinkedList类<strong>(非同步的)</strong>　 　<br />     LinkedList实现了List接口，允许null元素。此外LinkedList提供额外的get，remove，insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈（stack），队列（queue）或双向队列（deque）。　　<br />     注意LinkedList没有同步方法。如果多个线程同时访问一个List，则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List：　　　　<br />     List list = Collections.synchronizedList(new LinkedList(...));<br /><br />ArrayList类<strong>(非同步的)　</strong>　<br />     ArrayList实现了可变大小的数组。它允许所有元素，包括null。ArrayList没有同步。size，isEmpty，get，set方法运行时间为常数。但是add方法开销为分摊的常数，添加n个元素需要O(n)的时间。其他的方法运行时间为线性。　 　<br />     每个ArrayList实例都有一个容量（Capacity），即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加，但是增长算法并 没有定义。当需要插入大量元素时，在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。　　<br />     和LinkedList一样，ArrayList也是非同步的（unsynchronized）。<br />     主要方法:<br />Boolean add(Object o)将指定元素添加到列表的末尾<br />Boolean add(int index,Object element)在列表中指定位置加入指定元素<br />Boolean addAll(Collection c)将指定集合添加到列表末尾<br />Boolean addAll(int index,Collection c)在列表中指定位置加入指定集合<br />Boolean clear()删除列表中所有元素Boolean clone()返回该列表实例的一个拷贝<br />Boolean contains(Object o)判断列表中是否包含元素<br />Boolean ensureCapacity(int m)增加列表的容量,如果必须,该列表能够容纳m个元素<br />Object get(int index)返回列表中指定位置的元素<br />Int indexOf(Object elem)在列表中查找指定元素的下标<br />Int size()返回当前列表的元素个数<br /><br />Vector类<strong>(同步的)　 　</strong><br />   Vector非常类似ArrayList，但是Vector是同步的。由Vector创建的Iterator，虽然和ArrayList创建的 Iterator是同一接口，但是，因为Vector是同步的，当一个Iterator被创建而且正在被使用，另一个线程改变了Vector的状态（例 如，添加或删除了一些元素），这时调用Iterator的方法时将抛出ConcurrentModificationException，因此必须捕获该异常。<br /><br />Stack 类<strong>（同步的）　</strong>　<br />     Stack继承自Vector，实现一个后进先出的堆栈。Stack提供5个额外的方法使得 Vector得以被当作堆栈使用。基本的push和pop方法，还有peek方法得到栈顶的元素，empty方法测试堆栈是否为空，search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。<br /><br />Set接口　　<br />      Set是一种不包含重复的元素的Collection，即任意的两个元素e1和e2都有e1.equals(e2)=false，Set最多有一个null元素。　　<br />      很明显，Set的构造函数有一个约束条件，传入的Collection参数不能包含重复的元素。　　<br />      请注意：必须小心操作可变对象（Mutable Object）。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。<br /><br />Map接口　 　<br />    请注意，Map没有继承Collection接口，Map提供key到value的映射。一个Map中不能包含相同的key，每个key只能映射一个 value。Map接口提供3种集合的视图，Map的内容可以被当作一组key集合，一组value集合，或者一组key-value映射。<br />    主要方法:<br />boolean equals(Object o)比较对象<br />boolean remove(Object o)删除一个对象<br />put(Object key,Object value)添加key和value<br /><br />Hashtable类<strong>(同步的)　</strong>　<br />     Hashtable继承Map接口，实现一个key-value映射的哈希表。任何非空（non-null）的对象都可作为key或者value。　　<br />    添加数据使用put(key, value)，取出数据使用get(key)，这两个基本操作的时间开销为常数。Hashtable 通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的 均衡。增大load factor可以节省空间但相应的查找时间将增大，这会影响像get和put这样的操作。使用Hashtable的简单示例如下，将1，2，3放到Hashtable中，他们的key分别是”one”，”two”， ”three”：<br /><pre name="code" class="java">
Hashtable numbers = new Hashtable();　　　　
numbers.put(“one”, new Integer(1));　　　　
numbers.put(“two”, new Integer(2));　　　　
numbers.put(“three”, new Integer(3));</pre><br />要取出一个数，比如2，用相应的key：<br /><pre name="code" class="java">　Integer n = (Integer)numbers.get(“two”);　　　　
System.out.println(“two = ” + n);</pre><br />    由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置，因此任何作为key的对象都必须实现hashCode和equals方 法。hashCode和equals方法继承自根类Object，如果你用自定义的类当作key的话，要相当小心，按照散列函数的定义，如果两个对象相 同，即obj1.equals(obj2)=true，则它们的hashCode必须相同，但如果两个对象不同，则它们的hashCode不一定不同，如 果两个不同对象的hashCode相同，这种现象称为冲突，冲突会导致操作哈希表的时间开销增大，所以尽量定义好的hashCode()方法，能加快哈希 表的操作。　　<br />    如果相同的对象有不同的hashCode，对哈希表的操作会出现意想不到的结果（期待的get方法返回null），要避免这种问题，只需要牢记一条：要同时复写equals方法和hashCode方法，而不要只写其中一个。　<strong>　Hashtable是同步的。</strong><br /><br />HashMap类<strong>(非同步的)</strong><br />    HashMap 和Hashtable类似，不同之处在于HashMap是非同步的，并且允许null，即null value和null key。，但是将 HashMap视为Collection时（values()方法可返回Collection），其迭代子操作时间开销和HashMap的容量成比例。因 此，如果迭代操作的性能相当重要的话，不要将HashMap的初始化容量设得过高，或者load factor过低。WeakHashMap类(非同步的)　　<br />     WeakHashMap是一种改进的HashMap，它对key实行“弱引用”，如果一个key不再被外部所引用，那么该key可以被GC回收。<br /><br />总结　　<br />   <strong> 如果涉及到堆栈，队列等操作，应该考虑用List，对于需要快速插入，删除元素，应该使用LinkedList，如果需要快速随机访问元素，应该使用ArrayList。</strong>　　<br />    如果程序在单线程环境中，或者访问仅仅在一个线程中进行，考虑非同步的类，其效率较高，如果多个线程可能同时操作一个类，应该使用同步的类。<br />同步的类：<br />Vector<br />Stack <br />Hashtable<br />不同步的类：<br />LinkedList<br />ArrayList<br />HashMap<br />　　要特别注意对哈希表的操作，作为key的对象要正确复写equals和hashCode方法。　　尽量返回接口而非实际的类型，如返回List而非ArrayList，这样如果以后需要将ArrayList换成LinkedList时，客户端代码不用改变。这就是针对抽象(接口)编程。
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/139783#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Sun, 11 Nov 2007 19:04:01 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/139783</link>
        <guid>http://rainlife.javaeye.com/blog/139783</guid>
      </item>
      <item>
        <title>P6SPY监控数据库性能</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/139780" style="color:red;">http://rainlife.javaeye.com/blog/139780</a>&nbsp;
          发表时间: 2007年11月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          P6SPY监控数据库性能<br /><br />P6SPY通过对JDBC API的包装截获应用程序对数据库的访问，P6SPY提供了如下几个功能：<br /><br />u u 记录SQL语句的执行时间戳。<br /><br />u u 记录SQL语句类型<br /><br />u u 记录SQL填入参数的和没有填入参数的SQL语句<br /><br />u u 根据配置的时间控制SQL语句的执行时间，对超出时间的SQL语句输出到日志文　　　　　　　　件中（该功能由P6Outage模块实现）<br /><br /><br />配置P6SPY<br /><br />(1) 下载P6SPY<br /><br />http://www.p6spy.com<br /><br />(2) 将p6spy.jar、commons-logging.jar、log4j.jar复制到应用的lib目录下<br /><br />(3) 将spy.properties复制到应用的classpath目录下<br /><br />(4) 修改应用的JDBC连接，JDBC驱动类更改为P6Spy的驱动com.p6spy.engine.spy.P6SpyDriver。<br /><br />(5) 修改spy.properties文件，增加实际的数据库驱动类和日志文件输出目录。<br /><br />#设置实际使用的JDBC驱动类<br /><br />realdriver = com.mysql.jdbc.Driver<br /><br /><br />#设置日志文件输出目录<br /><br />logfile = spy.log<br /><br /><br />默认的P6Spy日志文件输出6个域，用”|”分隔。<br /><br />第一个域为时间戳，其格式可以配置。<br /><br />第二个域为执行时间。<br /><br />第四个域为该记录类型，有info、commit、statement、resultset等。<br /><br />第五个域为没有填入参数值的SQL语句。<br /><br />第六个域为填入了参数值的SQL语句(最有价值)。<br /><br />P6Spy日志查看工具<br /><br />Jahia SQL Profiler: 一个统计ＳＱＬ查询，以便了解在哪里创建索引才是最有效的。<br /><br /><br />配置SQL Profiler<br /><br />(1) 下载SQL Profiler<br /><br />http://www.jahia.org/jahia/Jahia/devzone/pid/377中下载SQL Profiler的压缩包。<br /><br />(2) 解压，拷贝其中的spy.properties到项目中，覆盖原来的spy.properties文件，并且重新修改realdriver和logfile。<br /><br />(3) 在DOS下进入解压后的SQL Profiler目录，运行命令 java –jar sqlprofiler.jar，将会弹出如图所示界面：<br /><br /><br /><br />(注意按钮是灰色的，此时不可用，因为SQL Profiler一开始运行，它就处于运行状态)，如果发生内存溢出的情况，则需为JVM增加内存容量，使用：java –Xmx256m –jar sqlprofiler.jar。<br /><br /><br />查看SQL Profiler<br /><br />SQL Statement面板每一秒钟刷新一次，Details面板显示SQL语句的详细资料。当按下按钮后，Profile results栏中显示对SQL语句的分析结果，其中的Column列表是建议建立index(索引)的列名。如果为空，则表示没有必要建立索引。<br /><br />点击”Logger”标签，可以查看P2Spy的运行日志，如图：<br /><br /><br /><br /><br />点击”Analysis”标签，可以查看数据库操作的统计信息，包括查询的次数、数据流量(数据量越大，CPU和IO资源消耗越大)，如图：
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/139780#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Sun, 11 Nov 2007 18:51:16 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/139780</link>
        <guid>http://rainlife.javaeye.com/blog/139780</guid>
      </item>
      <item>
        <title>判断是否是IE的javascript代码</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/139779" style="color:red;">http://rainlife.javaeye.com/blog/139779</a>&nbsp;
          发表时间: 2007年11月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          //判断是否是IE的javascript代码   <br /><pre name="code" class="java">var navigatorName = "Microsoft Internet Explorer";
   var isIE = false;
   if( navigator.appName == navigatorName ){
    isIE = true;    
   }</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/139779#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Sun, 11 Nov 2007 18:50:37 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/139779</link>
        <guid>http://rainlife.javaeye.com/blog/139779</guid>
      </item>
      <item>
        <title>Apache Maven 2 简介</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/139777" style="color:red;">http://rainlife.javaeye.com/blog/139777</a>&nbsp;
          发表时间: 2007年11月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="https://www6.software.ibm.com/developerworks/cn/education/java/j-mavenv2/" target="_blank">https://www6.software.ibm.com/developerworks/cn/education/java/j-mavenv2/</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/139777#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Sun, 11 Nov 2007 18:49:25 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/139777</link>
        <guid>http://rainlife.javaeye.com/blog/139777</guid>
      </item>
      <item>
        <title>Idea7.0注册机</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/133872" style="color:red;">http://rainlife.javaeye.com/blog/133872</a>&nbsp;
          发表时间: 2007年10月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Idea7.0注册机
          <br/><br/>
          <span style="color:red;">
            <a href="http://rainlife.javaeye.com/blog/133872#comments" style="color:red;">已有 <strong>4</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Sat, 20 Oct 2007 22:55:57 +0800</pubDate>
        <link>http://rainlife.javaeye.com/blog/133872</link>
        <guid>http://rainlife.javaeye.com/blog/133872</guid>
      </item>
      <item>
        <title>[转]普元JS验证</title>
        <author>rainlife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rainlife.javaeye.com">rainlife</a>&nbsp;
          链接：<a href="http://rainlife.javaeye.com/blog/124591" style="color:red;">http://rainlife.javaeye.com/blog/124591</a>&nbsp;
          发表时间: 2007年09月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
*
-------------------------------------------------------------------------------
文件名称：check.js
说    明：JavaScript脚本，用于检查网页提交表单的输入数据
版    本：1.0
修改纪录:
---------------------------------------------------------------------------
时间  修改人  说明
2002-8-29 libo  创建
2004-03-08  xueyishan    修改,加入checkMobile()
2005-06-01  zhouming    修改了isDate()，支持格式
-------------------------------------------------------------------------------  
*/

/*
用途：校验ip地址的格式
输入：strIP：ip地址
返回：如果通过验证返回true,否则返回false； 
*/
function isIP(strIP) { 
        if (isNull(strIP)) return false;
 var re=/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/g //匹配IP地址的正则表达式
 if(re.test(strIP))
 {
  if( RegExp.$1 &lt;256 && RegExp.$2&lt;256 && RegExp.$3&lt;256 && RegExp.$4&lt;256) return true;
 }
 return false; 
} 

/*
用途：检查输入字符串是否为空或者全部都是空格
输入：str
返回：
 如果全是空返回true,否则返回false
*/
function isNull( str ){
 if ( str == "" ) return true;
 var regu = "^[ ]+$";
 var re = new RegExp(regu);
 return re.test(str);
}


/*
用途：检查输入对象的值是否符合整数格式
输入：str 输入的字符串
返回：如果通过验证返回true,否则返回false 
*/
function isInteger( str ){  
 var regu = /^[-]{0,1}[0-9]{1,}$/;
        return regu.test(str);
}

/*
用途：检查输入手机号码是否正确
输入：
 s：字符串
返回：
 如果通过验证返回true,否则返回false 
*/
function checkMobile( s ){   
 var regu =/^[1][3][0-9]{9}$/;
 var re = new RegExp(regu);
 if (re.test(s)) {
   return true;
 }else{
   return false;
 }
}
 
 
/*
用途：检查输入字符串是否符合正整数格式
输入：
 s：字符串
返回：
 如果通过验证返回true,否则返回false 
*/
function isNumber( s ){   
 var regu = "^[0-9]+$";
 var re = new RegExp(regu);
 if (s.search(re) != -1) {
    return true;
 } else {
    return false;
 }
}

/*
用途：检查输入字符串是否是带小数的数字格式,可以是负数
输入：
 s：字符串
返回：
 如果通过验证返回true,否则返回false 
*/
function isDecimal( str ){   
         if(isInteger(str)) return true;
 var re = /^[-]{0,1}(\d+)[\.]+(\d+)$/;
 if (re.test(str)) {
    if(RegExp.$1==0&&RegExp.$2==0) return false;
    return true;
 } else {
    return false;
 }
}

/*
用途：检查输入对象的值是否符合端口号格式
输入：str 输入的字符串
返回：如果通过验证返回true,否则返回false 
*/
function isPort( str ){  
 return (isNumber(str) && str&lt;65536);
}

/*
用途：检查输入对象的值是否符合E-Mail格式
输入：str 输入的字符串
返回：如果通过验证返回true,否则返回false 
*/
function isEmail( str ){  
 var myReg = /^[-_A-Za-z0-9]+@([_A-Za-z0-9]+\.)+[A-Za-z0-9]{2,3}$/; 
 if(myReg.test(str)) return true; 
 return false; 
}

/*
用途：检查输入字符串是否符合金额格式
 格式定义为带小数的正数，小数点后最多三位
输入：
 s：字符串
返回：
 如果通过验证返回true,否则返回false 
*/
function isMoney( s ){   
 var regu = "^[0-9]+[\.][0-9]{0,3}$";
 var re = new RegExp(regu);
 if (re.test(s)) {
    return true;
 } else {
    return false;
 }
}
/*
用途：检查输入字符串是否只由英文字母和数字和下划线组成
输入：
 s：字符串
返回：
 如果通过验证返回true,否则返回false 
*/
function isNumberOr_Letter( s ){    //判断是否是数字或字母
 var regu = "^[0-9a-zA-Z\_]+$";
 var re = new RegExp(regu);
 if (re.test(s)) {
   return true;
 }else{
   return false;
 }
}
/*
用途：检查输入字符串是否只由英文字母和数字组成
输入：
 s：字符串
返回：
 如果通过验证返回true,否则返回false 
*/
function isNumberOrLetter( s ){    //判断是否是数字或字母
 var regu = "^[0-9a-zA-Z]+$";
 var re = new RegExp(regu);
 if (re.test(s)) {
   return true;
 }else{
   return false;
 }
}
 /*
用途：检查输入字符串是否只由汉字、字母、数字组成
输入：
 value：字符串
返回：
 如果通过验证返回true,否则返回false 
*/
function isChinaOrNumbOrLett( s ){    //判断是否是汉字、字母、数字组成
 var regu = "^[0-9a-zA-Z\u4e00-\u9fa5]+$";   
 var re = new RegExp(regu);
 if (re.test(s)) {
   return true;
 }else{
   return false;
 }
}

/*
用途：判断是否是日期
输入：date：日期；fmt：日期格式
返回：如果通过验证返回true,否则返回false
*/
function isDate( date, fmt ) {
    if (fmt==null) fmt="yyyyMMdd";
    var yIndex = fmt.indexOf("yyyy");
    if(yIndex==-1) return false;
   var year = date.substring(yIndex,yIndex+4);
   var mIndex = fmt.indexOf("MM");
    if(mIndex==-1) return false;
   var month = date.substring(mIndex,mIndex+2);
   var dIndex = fmt.indexOf("dd");
    if(dIndex==-1) return false;
   var day = date.substring(dIndex,dIndex+2);
    if(!isNumber(year)||year>"2100" || year&lt; "1900") return false;
    if(!isNumber(month)||month>"12" || month&lt; "01") return false;
    if(day>getMaxDay(year,month) || day&lt; "01") return false;
    return true;
}

function getMaxDay(year,month) {
 if(month==4||month==6||month==9||month==11)
  return "30";
 if(month==2)
  if(year%4==0&&year%100!=0 || year%400==0)
   return "29";
  else
   return "28";
 return "31";
}

/*
用途：字符1是否以字符串2结束
输入：str1：字符串；str2：被包含的字符串
返回：如果通过验证返回true,否则返回false 
*/
function isLastMatch(str1,str2)
{  
   var index = str1.lastIndexOf(str2);
   if(str1.length==index+str2.length) return true;
   return false;
}


/*
用途：字符1是否以字符串2开始
输入：str1：字符串；str2：被包含的字符串
返回：如果通过验证返回true,否则返回false 
*/
function isFirstMatch(str1,str2)
{  
   var index = str1.indexOf(str2);
   if(index==0) return true;
   return false;
}

/*
用途：字符1是包含字符串2
输入：str1：字符串；str2：被包含的字符串
返回：如果通过验证返回true,否则返回false 
*/
function isMatch(str1,str2)
{  
   var index = str1.indexOf(str2);
   if(index==-1) return false;
   return true;
}


/*
用途：检查输入的起止日期是否正确，规则为两个日期的格式正确，
 且结束如期>=起始日期
输入：
 startDate：起始日期，字符串
 endDate：结束如期，字符串
返回：
 如果通过验证返回true,否则返回false 
*/
function checkTwoDate( startDate,endDate ) {
 if( !isDate(startDate) ) {
  alert("起始日期不正确!");
  return false;
 } else if( !isDate(endDate) ) {
  alert("终止日期不正确!");
  return false;
 } else if( startDate > endDate ) {
  alert("起始日期不能大于终止日期!");
  return false;
 }
 return true;
}

/*
用途：检查输入的Email信箱格式是否正确
输入：
 strEmail：字符串
返回：
 如果通过验证返回true,否则返回false 
*/
function checkEmail(strEmail) { 
 //var emailReg =