<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title></title>
    <description></description>
    <link>http://harrison2010.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>回忆07年对几个词的诠释</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/236183" style="color:red;">http://harrison2010.javaeye.com/blog/236183</a>&nbsp;
          发表时间: 2008年09月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1.居安思危</p>
<p>2.知足常乐</p>
<p>3.与时俱进</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/236183#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>Wed, 03 Sep 2008 16:06:55 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/236183</link>
        <guid>http://harrison2010.javaeye.com/blog/236183</guid>
      </item>
      <item>
        <title>别在前进的途中迷失自己【转载天堂小工的感悟】</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/236180" style="color:red;">http://harrison2010.javaeye.com/blog/236180</a>&nbsp;
          发表时间: 2008年09月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>下面是陈总给的一些建议。因为自己是个笨人，先记录下来，以防忘记。待以后慢慢细咂。</p>
<p><span style="color: #3366ff;">1.专注_沉淀_成长_收获</span>
</p>
<p>羊一处吃一根草，到处吃草，最终没有长成牛。牛吃一片草，非常专注。</p>
<p>老总以同学和自己的成长历程作比。老总是1999年到北京的。第一份工资800，同学的第一份工资1500，1年后老总的工资涨到1500，而他的
同学经过几次跳槽后到了1800，第二年的时候老总的工资略提，而他的同学再次跳槽，工资也长到了4000.第三年的时候老总工资涨到了3000，而他的
同学的工资涨到了7000，开始进入金融领域，做了二年后，居然跳到了GIS领域，而工资则在7000-8000见碰到了瓶颈。老总第四年的时候工资开始
和同学持平，并在第五年开始担任总经理，在收入和地位上与他的同学相比也远非他的同学能比。现在老总在奥运村附近买了房，有自己的车，他在北京已经做出了
一番了不起的事业。而他的同学只是在回龙观(五环)附近贷款买了房。<span style="color: #ff0000;"><span>8年的时间，差距显而易见。</span>
<span>专注于一个公司，专注于一个领域。</span>
</span>
</p>
<p>&nbsp;</p>
<p><span style="color: #3366ff;">2.事业为重_扛压是关键</span>
</p>
<p>来北京就不要给自己打退堂鼓，来就是做一番事业的。来北京意味着吃苦，如果只是来混日子，确实罔度时间。陈总如斯对我说，当我说出几年后要回青岛的话后。我也不明白自己无论什么事情都喜欢给子自己留后路，也许是因为自己太过胆小，承压力和胆识永远没有超人之处。<span style="color: #ff0000;">扛压是关键，在IT行业里只有能承压的人才能获得晋升机会。</span>
<span style="color: #000000;">老
实的说一句，目前我是不能承压的。自己习惯了逃跑，习惯了在别人的伞里过安逸的生活。这也是自己离职的根本原因吧。我是不能承压的，而老总是洞若观火的。
记得面试时老总说给我一个产品，能不能用Java实现C#已经实现的东西，我回答说能；然后老总又问，能不能在项目迁移的同时对项目做一些升级和创新，结
果我又说能。而实际上，我没有实现我的话，因为在还没有尝试之前，我已经退回了自己划定的一个安全圈。愧对老总的伯乐之恩德。</span>
</p>
<p><span style="color: #808080;">一个人只有能承压，才能收获。如果不能立时收获，付出的努力肯定会转换为其他的东西，比如晋升的筹码等。</span>
</p>
<p>&nbsp;</p>
<p><span style="color: #808080;"><span style="color: #3366ff;">3.执着_主见_坚持<br />
</span>
<span style="color: #000000;">做事是需要主见的。听风即是雨，永远没有方向。对一个自己兴趣所在的东西，执着是必须的素质。坚持的是信念，判断。收获的是能力和回报。坚持的是孤独。方法是忍耐。</span>
</span>
</p>
<p>&nbsp;</p>
<p><span style="color: #3366ff;">4能力背后_成长空间_机遇</span>
</p>
<p><span style="color: #000000;">目前的岗位是缺人的，这不单纯是一个项目的问题，牵扯到公司的产品布局和
战略远景。能在1年内把项目从C#上迁移到Java上，手底下就会有3-4人；第二年如果能对项目进行升级和优化，有可能手下就会升级到10人左右。能管
10人左右就不再单纯是一个Coder了。当然所有的一切美好远景是你能承受住压力，做出成绩，付注了大量的热情。</span>
</p>
<p>&nbsp;</p>
<p><span style="color: #3366ff;">5红海战略与蓝海战略</span>
</p>
<p>&nbsp;红海是血腥的，无论是金融还是OA等传统软件行业领域。而Gis作为一个新起步的行业，无疑是身处蓝海的。人均产值能到100万元，好恐怖的数字。而普通的软件行业，只有人均30万的产值。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/236180#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, 03 Sep 2008 15:59:53 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/236180</link>
        <guid>http://harrison2010.javaeye.com/blog/236180</guid>
      </item>
      <item>
        <title>工作失败杀手</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/236177" style="color:red;">http://harrison2010.javaeye.com/blog/236177</a>&nbsp;
          发表时间: 2008年09月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>一、不要认为停留在心灵的舒适区域内是可以原谅的。【以后的简单就不解释了】</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个人都有一个舒适区域，在这个区域内是很自我的，不愿意被打扰，不愿意被push，不愿意和陌生的面孔交谈，不愿意被人指责，不愿意按照规定的时限做
事，不愿意主动的去关心别人，不愿意去思考别人还有什么没有想到。这在学生时代是很容易被理解的，有时候这样的同学还跟&ldquo;冷酷&rdquo;&ldquo;个性&rdquo;这些字眼沾边，算
作是褒义。然而相反，在工作之后，你要极力改变这一现状。否则，你会很快变成鸡尾酒会上唯一没有人理睬的对象，或是很快因为压力而内分泌失调。但是，如果
你能很快打破之前学生期所处的舒适区域，比别人更快的处理好业务、人际、**之间的关系，那就能很快的脱颖而出。
<br />
　　在会议上，一个停留在心灵舒适区域的人会消极的听取领导的话语，消极的待命，很死的完成上级交给的事情，但从来不关心此事以外的任何事情，更
不会想到多做一步，让接下来的别人的工作更加容易上手。而敢于打破这个舒适区域的人，敢于在适当的时候提出自己的看法和不理解，并在得到上级认可和指点之
后把手头的工作尽快的完成，并随时接受别人的批评和调整。（注意：永远不要等待别人把你的想法说出来，这是典型的前者）
<br />
　　在工作上，当前者遇到一名新的同事，他会装作没有看见，继续自己的工作。殊不知新来的同事不久就变成了自己的上司。而后者则大方客气的自我介绍，并了解对方和自己的关系。
<br />
　　在聚会上，前者总是等待别人发言，并喜欢私下里评论对方的言语；如果这个桌子上没有人发言，那直到用餐结束，也没有人认识你。而后者是勇敢的和一同吃饭的开始介绍和闲谈，这看起来很困难，有时候会有失面子，但往往你会发现，对方是多么希望能和你说几句话。
<br />
　　以上只是很小的几个例子，但是要说明的是，大学生在走出校园的同时就要在工作上把校园中的&ldquo;随意性&rdquo;从身边赶走，尽早的冲出自己的舒适区域，开始做好和这个社会交流的准备。</p>
<p>&nbsp;</p>
<p>二、不要把&ldquo;好像&rdquo;；&ldquo;有人会&hellip;&hellip;&rdquo;；&ldquo;大概&rdquo;；&ldquo;晚些时候&rdquo;；&ldquo;或者&rdquo;；&ldquo;说不定&rdquo;之类放在嘴边。尤其是和上级谈论工作的时候。</p>
<p>&nbsp;</p>
<p>三、不要拖延工作</p>
<p>四、不要认为理论上可以实施就大功告成了！</p>
<p>五、不要让别人等你</p>
<p>六、不要认为细节不重要</p>
<p>七、不要表现得消极，仅仅因为你所做的事情不是你的兴趣所在。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/236177#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, 03 Sep 2008 15:54:25 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/236177</link>
        <guid>http://harrison2010.javaeye.com/blog/236177</guid>
      </item>
      <item>
        <title>前途渺茫</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/233718" style="color:red;">http://harrison2010.javaeye.com/blog/233718</a>&nbsp;
          发表时间: 2008年08月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          好久没有来这里了，公司一直不能光明正大的上网，家里也不能上网.......<br />奥运结束了，感觉身边人的生活还是那样，没有发生过什么的变化.....<br />工作不是那么累了，可是总感觉自己知道的东西越来越少..年龄的增长记忆力也不好了<br /><br />一个人的日子就这样的过着，上班，下班，睡觉<br />前途有些渺茫，不知道应该怎么走.......<br />马上农历8.15了，异国他乡也不能回家
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/233718#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>Thu, 28 Aug 2008 09:59:47 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/233718</link>
        <guid>http://harrison2010.javaeye.com/blog/233718</guid>
      </item>
      <item>
        <title>字符，字节和编码 （转载太好了的东西）</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/182593" style="color:red;">http://harrison2010.javaeye.com/blog/182593</a>&nbsp;
          发表时间: 2008年04月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          级别：中级<br /><br />摘要：本文介绍了字符与编码的发展过程，相关概念的正确理解。举例说明了一些实际应用中，编码的实现方法。然后，本文讲述了通常对字符与编码的几种误解，由于这些误解而导致乱码产生的原因，以及消除乱码的办法。本文的内容涵盖了“中文问题”，“乱码问题”。<br /><br />掌握编码问题的关键是正确地理解相关概念，编码所涉及的技术其实是很简单的。因此，阅读本文时需要慢读多想，多思考。<br /><br />引言<br />“字符与编码”是一个被经常讨论的话题。即使这样，时常出现的乱码仍然困扰着大家。虽然我们有很多的办法可以用来消除乱码，但我们并不一定理解这些办法的内在原理。而有的乱码产生的原因，实际上由于底层代码本身有问题所导致的。因此，不仅是初学者会对字符编码感到模糊，有的底层开发人员同样对字符编码缺乏准确的理解。<br /><br /> <br />  <br /> <br /><br />1. 编码问题的由来，相关概念的理解<br />1.1 字符与编码的发展<br />从计算机对多国语言的支持角度看，大致可以分为三个阶段：<br /><br />　 系统内码 说明 系统 <br />阶段一 ASCII 计算机刚开始只支持英语，其它语言不能够在计算机上存储和显示。 英文 DOS <br />阶段二 ANSI编码<br />（本地化） 为使计算机支持更多语言，通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如：汉字 '中' 在中文操作系统中，使用 [0xD6,0xD0] 这两个字节存储。<br /><br />不同的国家和地区制定了不同的标准，由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式，称为 ANSI 编码。在简体中文系统下，ANSI 编码代表 GB2312 编码，在日文操作系统下，ANSI 编码代表 JIS 编码。<br /><br />不同 ANSI 编码之间互不兼容，当信息在国际间交流时，无法将属于两种语言的文字，存储在同一段 ANSI 编码的文本中。 中文 DOS，中文 Windows 95/98，日文 Windows 95/98 <br />阶段三 UNICODE<br />（国际化） 为了使国际间信息交流更加方便，国际组织制定了 UNICODE 字符集，为各种语言中的每一个字符设定了统一并且唯一的数字编号，以满足跨语言、跨平台进行文本转换、处理的要求。 Windows NT/2000/XP，Linux，Java <br /><br />字符串在内存中的存放方法：<br /><br />在 ASCII 阶段，单字节字符串使用一个字节存放一个字符（SBCS）。比如，"Bob123" 在内存中为：<br /><br />42 6F 62 31 32 33 00 <br />       <br />B o b 1 2 3 \0 <br /><br />在使用 ANSI 编码支持多种语言阶段，每个字符使用一个字节或多个字节来表示（MBCS），因此，这种方式存放的字符也被称作多字节字符。比如，"中文123" 在中文 Windows 95 内存中为7个字节，每个汉字占2个字节，每个英文和数字字符占1个字节：<br /><br />D6 D0 CE C4 31 32 33 00 <br />      <br />中 文 1 2 3 \0 <br /><br />在 UNICODE 被采用之后，计算机存放字符串时，改为存放每个字符在 UNICODE 字符集中的序号。目前计算机一般使用 2 个字节（16 位）来存放一个序号（DBCS），因此，这种方式存放的字符也被称作宽字节字符。比如，字符串 "中文123" 在 Windows 2000 下，内存中实际存放的是 5 个序号：<br /><br />2D 4E 87 65 31 00 32 00 33 00 00 00      ← 在 x86 CPU 中，低字节在前 <br />       <br />中 文 1 2 3 \0 　 <br /><br />一共占 10 个字节。<br /><br /> <br />  <br /> <br /><br />1.2 字符，字节，字符串<br />理解编码的关键，是要把字符的概念和字节的概念理解准确。这两个概念容易混淆，我们在此做一下区分：<br /><br />　 概念描述 举例 <br />字符 人们使用的记号，抽象意义上的一个符号。 '1', '中', 'a', '$', '￥', …… <br />字节 计算机中存储数据的单元，一个8位的二进制数，是一个很具体的存储空间。 0x01, 0x45, 0xFA, …… <br />ANSI<br />字符串 在内存中，如果“字符”是以 ANSI 编码形式存在的，一个字符可能使用一个字节或多个字节来表示，那么我们称这种字符串为 ANSI 字符串或者多字节字符串。 "中文123"<br />（占7字节） <br />UNICODE<br />字符串 在内存中，如果“字符”是以在 UNICODE 中的序号存在的，那么我们称这种字符串为 UNICODE 字符串或者宽字节字符串。 L"中文123"<br />（占10字节） <br /><br />由于不同 ANSI 编码所规定的标准是不相同的，因此，对于一个给定的多字节字符串，我们必须知道它采用的是哪一种编码规则，才能够知道它包含了哪些“字符”。而对于 UNICODE 字符串来说，不管在什么环境下，它所代表的“字符”内容总是不变的。<br /><br /> <br />  <br /> <br /><br />1.3 字符集与编码<br />各个国家和地区所制定的不同 ANSI 编码标准中，都只规定了各自语言所需的“字符”。比如：汉字标准（GB2312）中没有规定韩国语字符怎样存储。这些 ANSI 编码标准所规定的内容包含两层含义：<br /><br />使用哪些字符。也就是说哪些汉字，字母和符号会被收入标准中。所包含“字符”的集合就叫做“字符集”。 <br />规定每个“字符”分别用一个字节还是多个字节存储，用哪些字节来存储，这个规定就叫做“编码”。 <br />各个国家和地区在制定编码标准的时候，“字符的集合”和“编码”一般都是同时制定的。因此，平常我们所说的“字符集”，比如：GB2312, GBK, JIS 等，除了有“字符的集合”这层含义外，同时也包含了“编码”的含义。<br /><br />“UNICODE 字符集”包含了各种语言中使用到的所有“字符”。用来给 UNICODE 字符集编码的标准有很多种，比如：UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig 等。<br /><br /> <br />  <br /> <br /><br />1.4 常用的编码简介<br />简单介绍一下常用的编码规则，为后边的章节做一个准备。在这里，我们根据编码规则的特点，把所有的编码分成三类：<br /><br />分类 编码标准 说明 <br />单字节字符编码 ISO-8859-1 最简单的编码规则，每一个字节直接作为一个 UNICODE 字符。比如，[0xD6, 0xD0] 这两个字节，通过 iso-8859-1 转化为字符串时，将直接得到 [0x00D6, 0x00D0] 两个 UNICODE 字符，即 "ÖÐ"。<br /><br />反之，将 UNICODE 字符串通过 iso-8859-1 转化为字节串时，只能正常转化 0~255 范围的字符。 <br />ANSI 编码 GB2312,<br />BIG5,<br />Shift_JIS,<br />ISO-8859-2 …… 把 UNICODE 字符串通过 ANSI 编码转化为“字节串”时，根据各自编码的规定，一个 UNICODE 字符可能转化成一个字节或多个字节。<br /><br />反之，将字节串转化成字符串时，也可能多个字节转化成一个字符。比如，[0xD6, 0xD0] 这两个字节，通过 GB2312 转化为字符串时，将得到 [0x4E2D] 一个字符，即 '中' 字。<br /><br />“ANSI 编码”的特点：<br />1. 这些“ANSI 编码标准”都只能处理各自语言范围之内的 UNICODE 字符。<br />2. “UNICODE 字符”与“转换出来的字节”之间的关系是人为规定的。 <br />UNICODE 编码 UTF-8,<br />UTF-16, UnicodeBig …… 与“ANSI 编码”类似的，把字符串通过 UNICODE 编码转化成“字节串”时，一个 UNICODE 字符可能转化成一个字节或多个字节。<br /><br />与“ANSI 编码”不同的是：<br />1. 这些“UNICODE 编码”能够处理所有的 UNICODE 字符。<br />2. “UNICODE 字符”与“转换出来的字节”之间是可以通过计算得到的。 <br /><br />我们实际上没有必要去深究每一种编码具体把某一个字符编码成了哪几个字节，我们只需要知道“编码”的概念就是把“字符”转化成“字节”就可以了。对于“UNICODE 编码”，由于它们是可以通过计算得到的，因此，在特殊的场合，我们可以去了解某一种“UNICODE 编码”是怎样的规则。<br /><br /> <br />  <br /> <br /><br />2. 字符与编码在程序中的实现<br />2.1 程序中的字符与字节<br />在 C++ 和 Java 中，用来代表“字符”和“字节”的数据类型，以及进行编码的方法：<br /><br />类型或操作 C++ Java <br />字符 wchar_t char <br />字节 char byte <br />ANSI 字符串 char[] byte[] <br />UNICODE 字符串 wchar_t[] String <br />字节串→字符串 mbstowcs(), MultiByteToWideChar() string = new String(bytes, "encoding") <br />字符串→字节串 wcstombs(), WideCharToMultiByte() bytes = string.getBytes("encoding") <br /><br />以上需要注意几点：<br /><br />Java 中的 char 代表一个“UNICODE 字符（宽字节字符）”，而 C++ 中的 char 代表一个字节。 <br />MultiByteToWideChar() 和 WideCharToMultiByte() 是 Windows API 函数。 <br /> <br />  <br /><br />2.2 C++ 中相关实现方法<br />声明一段字符串常量：<br /><br />// ANSI 字符串，内容长度 7 字节<br />char     sz[20] = "中文123";<br /><br />// UNICODE 字符串，内容长度 5 个 wchar_t（10 字节）<br />wchar_t wsz[20] = L"\x4E2D\x6587\x0031\x0032\x0033"; <br /><br />UNICODE 字符串的 I/O 操作，字符与字节的转换操作：<br /><br />// 运行时设定当前 ANSI 编码，VC 格式<br />setlocale(LC_ALL, ".936");<br /><br />// GCC 中格式<br />setlocale(LC_ALL, "zh_CN.GBK");<br /><br />// Visual C++ 中使用小写 %s，按照 setlocale 指定编码输出到文件<br />// GCC 中使用大写 %S<br />fwprintf(fp, L"%s\n", wsz);<br /><br />// 把 UNICODE 字符串按照 setlocale 指定的编码转换成字节<br />wcstombs(sz, wsz, 20);<br />// 把字节串按照 setlocale 指定的编码转换成 UNICODE 字符串<br />mbstowcs(wsz, sz, 20); <br /><br />在 Visual C++ 中，UNICODE 字符串常量有更简单的表示方法。如果源程序的编码与当前默认 ANSI 编码不符，则需要使用 #pragma setlocale，告诉编译器源程序使用的编码：<br /><br />// 如果源程序的编码与当前默认 ANSI 编码不一致，<br />// 则需要此行，编译时用来指明当前源程序使用的编码<br />#pragma setlocale(".936")<br /><br />// UNICODE 字符串常量，内容长度 10 字节<br />wchar_t wsz[20] = L"中文123"; <br /><br />以上需要注意 #pragma setlocale 与 setlocale(LC_ALL, "") 的作用是不同的，#pragma setlocale 在编译时起作用，setlocale() 在运行时起作用。<br /><br /> <br />  <br /><br />2.3 Java 中相关实现方法<br />字符串类 String 中的内容是 UNICODE 字符串：<br /><br />// Java 代码，直接写中文<br />String string = "中文123";<br /><br />// 得到长度为 5，因为是 5 个字符<br />System.out.println(string.length()); <br /><br />字符串 I/O 操作，字符与字节转换操作。在 Java 包 java.io.* 中，以“Stream”结尾的类一般是用来操作“字节串”的类，以“Reader”，“Writer”结尾的类一般是用来操作“字符串”的类。<br /><br />// 字符串与字节串间相互转化<br /><br />// 按照 GB2312 得到字节（得到多字节字符串）<br />byte [] bytes = string.getBytes("GB2312");<br /><br />// 从字节按照 GB2312 得到 UNICODE 字符串<br />string = new String(bytes, "GB2312");<br /><br />// 要将 String 按照某种编码写入文本文件，有两种方法：<br /><br />// 第一种办法：用 Stream 类写入已经按照指定编码转化好的字节串<br />OutputStream os = new FileOutputStream("1.txt");<br />os.write(bytes);<br />os.close();<br /><br />// 第二种办法：构造指定编码的 Writer 来写入字符串<br />Writer ow = new OutputStreamWriter(new FileOutputStream("2.txt"), "GB2312");<br />ow.write(string);<br />ow.close();<br /><br />/* 最后得到的 1.txt 和 2.txt 都是 7 个字节 */ <br /><br />如果 java 的源程序编码与当前默认 ANSI 编码不符，则在编译的时候，需要指明一下源程序的编码。比如：<br /><br />E:\>javac -encoding BIG5 Hello.java <br /><br />以上需要注意区分源程序的编码与 I/O 操作的编码，前者是在编译时起作用，后者是在运行时起作用。<br /><br /> <br />  <br /> <br /><br />3. 几种误解，以及乱码产生的原因和解决办法<br />3.1 容易产生的误解<br />　 对编码的误解 <br />误解一 在将“字节串”转化成“UNICODE 字符串”时，比如在读取文本文件时，或者通过网络传输文本时，容易将“字节串”简单地作为单字节字符串，采用每“一个字节”就是“一个字符”的方法进行转化。<br /><br />而实际上，在非英文的环境中，应该将“字节串”作为 ANSI 字符串，采用适当的编码来得到 UNICODE 字符串，有可能“多个字节”才能得到“一个字符”。<br /><br />通常，一直在英文环境下做开发的程序员们，容易有这种误解。 <br />误解二 在 DOS，Windows 98 等非 UNICODE 环境下，字符串都是以 ANSI 编码的字节形式存在的。这种以字节形式存在的字符串，必须知道是哪种编码才能被正确地使用。这使我们形成了一个惯性思维：“字符串的编码”。<br /><br />当 UNICODE 被支持后，Java 中的 String 是以字符的“序号”来存储的，不是以“某种编码的字节”来存储的，因此已经不存在“字符串的编码”这个概念了。只有在“字符串”与“字节串”转化时，或者，将一个“字节串”当成一个 ANSI 字符串时，才有编码的概念。<br /><br />不少的人都有这个误解。 <br /><br />第一种误解，往往是导致乱码产生的原因。第二种误解，往往导致本来容易纠正的乱码问题变得更复杂。<br /><br />在这里，我们可以看到，其中所讲的“误解一”，即采用每“一个字节”就是“一个字符”的转化方法，实际上也就等同于采用 iso-8859-1 进行转化。因此，我们常常使用 bytes = string.getBytes("iso-8859-1") 来进行逆向操作，得到原始的“字节串”。然后再使用正确的 ANSI 编码，比如 string = new String(bytes, "GB2312")，来得到正确的“UNICODE 字符串”。<br /><br /> <br />  <br /> <br /><br />3.2 非 UNICODE 程序在不同语言环境间移植时的乱码<br />非 UNICODE 程序中的字符串，都是以某种 ANSI 编码形式存在的。如果程序运行时的语言环境与开发时的语言环境不同，将会导致 ANSI 字符串的显示失败。<br /><br />比如，在日文环境下开发的非 UNICODE 的日文程序界面，拿到中文环境下运行时，界面上将显示乱码。如果这个日文程序界面改为采用 UNICODE 来记录字符串，那么当在中文环境下运行时，界面上将可以显示正常的日文。<br /><br />由于客观原因，有时候我们必须在中文操作系统下运行非 UNICODE 的日文软件，这时我们可以采用一些工具，比如，南极星，AppLocale 等，暂时的模拟不同的语言环境。<br /><br /> <br />  <br /> <br /><br />3.3 网页提交字符串<br />当页面中的表单提交字符串时，首先把字符串按照当前页面的编码，转化成字节串。然后再将每个字节转化成 "%XX" 的格式提交到 Web 服务器。比如，一个编码为 GB2312 的页面，提交 "中" 这个字符串时，提交给服务器的内容为 "%D6%D0"。<br /><br />在服务器端，Web 服务器把收到的 "%D6%D0" 转化成 [0xD6, 0xD0] 两个字节，然后再根据 GB2312 编码规则得到 "中" 字。<br /><br />在 Tomcat 服务器中，request.getParameter() 得到乱码时，常常是因为前面提到的“误解一”造成的。默认情况下，当提交 "%D6%D0" 给 Tomcat 服务器时，request.getParameter() 将返回 [0x00D6, 0x00D0] 两个 UNICODE 字符，而不是返回一个 "中" 字符。因此，我们需要使用 bytes = string.getBytes("iso-8859-1") 得到原始的字节串，再用 string = new String(bytes, "GB2312") 重新得到正确的字符串 "中"。<br /><br /> <br />  <br /><br />3.4 从数据库读取字符串<br />通过数据库客户端（比如 ODBC 或 JDBC）从数据库服务器中读取字符串时，客户端需要从服务器获知所使用的 ANSI 编码。当数据库服务器发送字节流给客户端时，客户端负责将字节流按照正确的编码转化成 UNICODE 字符串。<br /><br />如果从数据库读取字符串时得到乱码，而数据库中存放的数据又是正确的，那么往往还是因为前面提到的“误解一”造成的。解决的办法还是通过 string = new String( string.getBytes("iso-8859-1"), "GB2312") 的方法，重新得到原始的字节串，再重新使用正确的编码转化成字符串。<br /><br /> <br />  <br /> <br /><br />3.5 电子邮件中的字符串<br />当一段 Text 或者 HTML 通过电子邮件传送时，发送的内容首先通过一种指定的字符编码转化成“字节串”，然后再把“字节串”通过一种指定的传输编码（Content-Transfer-Encoding）进行转化得到另一串“字节串”。比如，打开一封电子邮件源代码，可以看到类似的内容：<br /><br />Content-Type: text/plain;<br />        charset="gb2312"<br />Content-Transfer-Encoding: base64<br /><br />sbG+qcrQuqO17cf4yee74bGjz9W7+b3wudzA7dbQ0MQNCg0KvPKzxqO6uqO17cnnsaPW0NDEDQoNCg== <br /><br />最常用的 Content-Transfer-Encoding 有 Base64 和 Quoted-Printable 两种。在对二进制文件或者中文文本进行转化时，Base64 得到的“字节串”比 Quoted-Printable 更短。在对英文文本进行转化时，Quoted-Printable 得到的“字节串”比 Base64 更短。<br /><br />邮件的标题，用了一种更简短的格式来标注“字符编码”和“传输编码”。比如，标题内容为 "中"，则在邮件源代码中表示为：<br /><br />// 正确的标题格式<br />Subject: =?GB2312?B?1tA=?= <br /><br />其中，<br /><br />第一个“=?”与“?”中间的部分指定了字符编码，在这个例子中指定的是 GB2312。 <br />“?”与“?”中间的“B”代表 Base64。如果是“Q”则代表 Quoted-Printable。 <br />最后“?”与“?=”之间的部分，就是经过 GB2312 转化成字节串，再经过 Base64 转化后的标题内容。 <br />如果“传输编码”改为 Quoted-Printable，同样，如果标题内容为 "中"：<br /><br />// 正确的标题格式<br />Subject: =?GB2312?Q?=D6=D0?= <br /><br />如果阅读邮件时出现乱码，一般是因为“字符编码”或“传输编码”指定有误，或者是没有指定。比如，有的发邮件组件在发送邮件时，标题 "中"：<br /><br />// 错误的标题格式<br />Subject: =?ISO-8859-1?Q?=D6=D0?= <br /><br />这样的表示，实际上是明确指明了标题为 [0x00D6, 0x00D0]，即 "ÖÐ"，而不是 "中"。<br /><br /> <br />  <br /> <br /><br />4. 几种错误理解的纠正<br />误解：“ISO-8859-1 是国际编码？”<br />非也。iso-8859-1 只是单字节字符集中最简单的一种，也就是“字节编号”与“UNICODE 字符编号”一致的那种编码规则。当我们要把一个“字节串”转化成“字符串”，而又不知道它是哪一种 ANSI 编码时，先暂时地把“每一个字节”作为“一个字符”进行转化，不会造成信息丢失。然后再使用 bytes = string.getBytes("iso-8859-1") 的方法可恢复到原始的字节串。<br /><br />误解：“Java 中，怎样知道某个字符串的内码？”<br />Java 中，字符串类 java.lang.String 处理的是 UNICODE 字符串，不是 ANSI 字符串。我们只需要把字符串作为“抽象的符号的串”来看待。因此不存在字符串的内码的问题。<br /><br /><br /><br />原创文章，转载请保留或注明出处：http://www.regexlab.com/zh/encoding.htm]
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/182593#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, 14 Apr 2008 15:26:56 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/182593</link>
        <guid>http://harrison2010.javaeye.com/blog/182593</guid>
      </item>
      <item>
        <title>Javascript中暂停功能的实现</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/181561" style="color:red;">http://harrison2010.javaeye.com/blog/181561</a>&nbsp;
          发表时间: 2008年04月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &lt;script language="javascript"><br />/*Javascript中暂停功能的实现<br />Javascript本身没有暂停功能（sleep不能使用）同时 vbscript也不能使用doEvents，故编写此函数实现此功能。<br />javascript作为弱对象语言，一个函数也可以作为一个对象使用。<br />比如：<br />function Test(){<br /> alert("hellow");<br /> this.NextStep=function(){<br />  alert("NextStep");<br /> }<br />}<br />我们可以这样调用 var myTest=new Test();myTest.NextStep();<br /><br />我们做暂停的时候可以吧一个函数分为两部分，暂停操作前的不变，把要在暂停后执行的代码放在this.NextStep中。<br />为了控制暂停和继续，我们需要编写两个函数来分别实现暂停和继续功能。<br />暂停函数如下：<br />*/<br />function Pause(obj,iMinSecond){<br /> if (window.eventList==null) window.eventList=new Array();<br /> var ind=-1;<br /> for (var i=0;i&lt;window.eventList.length;i++){<br />  if (window.eventList[i]==null) {<br />   window.eventList[i]=obj;<br />   ind=i;<br />   break;<br />  }<br /> }<br /> <br /> if (ind==-1){<br />  ind=window.eventList.length;<br />  window.eventList[ind]=obj;<br /> }<br /> setTimeout("GoOn(" + ind + ")",1000);<br />}<br />/*<br />该函数把要暂停的函数放到数组window.eventList里，同时通过setTimeout来调用继续函数。<br /><br />继续函数如下：<br />*/<br /><br />function GoOn(ind){<br /> var obj=window.eventList[ind];<br /> window.eventList[ind]=null;<br /> if (obj.NextStep) obj.NextStep();<br /> else obj();<br />}<br />/*<br />该函数调用被暂停的函数的NextStep方法，如果没有这个方法则重新调用该函数。<br /><br /><br />函数编写完毕，我们可以作如下册是：<br />*/<br />function Test(){<br /> alert("hellow");<br /> Pause(this,1000);//调用暂停函数<br /> this.NextStep=function(){<br />  alert("NextStep");<br /> }<br />}<br />&lt;/script>
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/181561#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>Fri, 11 Apr 2008 10:00:03 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/181561</link>
        <guid>http://harrison2010.javaeye.com/blog/181561</guid>
      </item>
      <item>
        <title> JS中的sleep 、顺序执行 </title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/181550" style="color:red;">http://harrison2010.javaeye.com/blog/181550</a>&nbsp;
          发表时间: 2008年04月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>最近升级BLOG，需要在JS里实现暂停功能，还是小有些扰人，总达不到预期的效果，要么是将函数拆分为几个部分，要么采用事件机制，其实单线程是没有多线程的sleep功能，所以也只能这样过程Check了！</strong><br />除了Narrative JS，jwacs(Javascript With Advanced Continuation Support) 也致力于通过扩展JavaScript语法来避免编写让人头痛的异步调用的回调函数。用jwacs 实现的sleep，代码是这样： <br /> <br /><br />function sleep(msec) {    var k = function_continuation;    setTimeout(function() { resume k &lt;- mesc; }, msec);    suspend;}<br />这个语法更吓人了，而且还是java里不被推荐使用的线程方法名。坦白说我倾向于 Narrative JS。 <br /><br />同Narrative JS一样，jwacs也需要预编译，预编译器是用 LISP 语言编写。目前也是 Alpha 的版本。两者的更多介绍和比较可以参阅 SitePoint 上的新文章： Eliminating async Javascript callbacks by preprocessing <br /><br />编写复杂的JavaScript脚本时，有时会有需求希望脚本能停滞指定的一段时间，类似于 java 中的 Thread.sleep 或者 sh 脚本中的 sleep 命令所实现的效果。 <br /><br />众所周知，JavaScript 并没有提供类似于 Java 的线程控制的功能， 虽然有 setTimeout 和 setInterval 两个方法可以做一些定时执行控制，但并不能满足所有的要求。一直以来，都有很多人问如何在JavaScript中实现 sleep/pause/wait ，也确实有些很蹩脚的解决方案: <br /><br />最简单也最糟糕的方法就是写一个循环，代码可能如下： <br /><br />function sleep(numberMillis) {    var now = new Date();    var exitTime = now.getTime() + numberMillis;    while (true) {        now = new Date();        if (now.getTime() > exitTime)            return;    }}<br />如上的代码其实并没有让脚本解释器sleep下来，而且有让CPU迅速上到高负荷的附作用。浏览器甚至会在该段时间内处于假死状态。 <br /><br />其二有聪明人利用IE特殊的对话框实现来曲径通幽，代码可能如下： <br /><br />function sleep(timeout) {	window.showModalDialog("javascript:document.writeln('&lt;script>window.setTimeout(function () { window.close(); }, " + timeout + ");&lt;\/script>');");}window.alert("before sleep ...");sleep(2000);window.alert("after sleep ...");<br />缺点不用多说，只有IE支持(IE7因为安全限制也而不能达到目的)。 <br /><br />除上之外，还有利用Applet或者调用Windows Script Host的WScript.Sleep()等等鬼点子，这些都是万不得已的权宜之计。 <br /><br />终于有了更聪明的人，开发出了也许是最佳的方案，先看代码： <br /><br />function sleep(millis) {    var notifier = NjsRuntime.createNotifier();    setTimeout(notifier, millis);    notifier.wait->();}<br />没错，看到 ->() 这样的语法，就象刚看到Prototype的 $() 函数一样让我惊为天人。不过直接在浏览器中这段脚本是会报告语法错误的。实际上它们需要经过预编译成客户端浏览器认可的JavaScript。编译后的脚本如下： <br /><br />function sleep(millis){var njf1 = njen(this,arguments,"millis");nj:while(1) {try{switch(njf1.cp) { case 0:njf1._notifier=NjsRuntime.createNotifier();setTimeout(njf1._notifier,njf1._millis);njf1.cp = 1;njf1._notifier.wait(njf1);return;case 1:break nj; }} catch(ex) { if(!njf1.except(ex,1)) return; }} njf1.pf();}<br />我看不懂，也不想去看懂了。这些工作全部会由 Narrative JavaScript ———— 一个提供异步阻塞功能的JS扩展帮我们实现。我们只需要编写之前那个怪异的 ->() 语法， 然后通过后台预先静态编译或者前台动态编译后执行就可以实现 sleep 的效果。 <br /><br />Narrative JavaScript 宣称可以让你从头昏眼花的回调函数中解脱出来，编写清晰的Long Running Tasks。目前还是 alpha 的版本，在 Example 页面上有一个移动的按钮的范例。首页上也提供了源码下载。以我薄弱的基础知识，我只能勉强的看出代码中模拟了状态机的实现，希望有精通算法的朋友能为我们解析。 <br /><br />最后，还是我一直以来的观点： 除非很必要，否则请保持JavaScript的简单。在JavaScript 能提供原生的线程支持之前，或许我们可以改变设计以避免异步阻塞的应用。 <br /><br />参考文章： <br /><br />Agile Ajax - Narrative Javascript - Cleaner Code for Long Running Tasks <br />FAQTs - How do I pause execution in JavaScript? <br /> ==========有bug的曲折实现<br /><br />&lt;script language="javascript"><br />/*Javascript中暂停功能的实现<br />Javascript本身没有暂停功能（sleep不能使用）同时 vbscript也不能使用doEvents，故编写此函数实现此功能。<br />javascript作为弱对象语言，一个函数也可以作为一个对象使用。<br />比如：<br />function Test(){<br /> alert("hellow");<br /> this.NextStep=function(){<br />  alert("NextStep");<br /> }<br />}<br />我们可以这样调用 var myTest=new Test();myTest.NextStep();<br /><br />我们做暂停的时候可以吧一个函数分为两部分，暂停操作前的不变，把要在暂停后执行的代码放在this.NextStep中。<br />为了控制暂停和继续，我们需要编写两个函数来分别实现暂停和继续功能。<br />暂停函数如下：<br />*/<br />function Pause(obj,iMinSecond){<br /> if (window.eventList==null) window.eventList=new Array();<br /> var ind=-1;<br /> for (var i=0;i&lt;window.eventList.length;i++){<br />  if (window.eventList[i]==null) {<br />   window.eventList[i]=obj;<br />   ind=i;<br />   break;<br />  }<br /> }<br /> <br /> if (ind==-1){<br />  ind=window.eventList.length;<br />  window.eventList[ind]=obj;<br /> }<br /> setTimeout("GoOn(" + ind + ")",1000);<br />}<br />/*<br />该函数把要暂停的函数放到数组window.eventList里，同时通过setTimeout来调用继续函数。<br /><br />继续函数如下：<br />*/<br /><br />function GoOn(ind){<br /> var obj=window.eventList[ind];<br /> window.eventList[ind]=null;<br /> if (obj.NextStep) obj.NextStep();<br /> else obj();<br />}<br />/*<br />该函数调用被暂停的函数的NextStep方法，如果没有这个方法则重新调用该函数。<br /><br /><br />函数编写完毕，我们可以作如下册是：<br />*/<br />function Test(){<br /> alert("hellow");<br /> Pause(this,1000);//调用暂停函数<br /> this.NextStep=function(){<br />  alert("NextStep");<br /> }<br />}<br />&lt;/script><br /><br /><br />    Javascript顺序执行的实现：<br />http://www.cnlei.org/blog/article.asp?id=297<br />JavaScript系列-同步还是异步:<br />http://blog.iecn.net/blog/html/do-showone-tid-966.html<br />Javascript中暂停功能的实现 :<br />http://blog.csdn.net/snakegod/archive/2004/09/22/112810.aspx<br />JavaScript Sleep函数 ：<br />http://blog.csdn.net/gaooo/archive/2007/02/25/1514096.aspx <br />该文章转载自脚本之家：http://www.jb51.net/html/200703/23/7505.htm<br />可暂停的滚动公告板<br />http://www.codebit.cn/pub/html/javascript/tip/pausing_up_down_scroller/<br /><br />二、A函数调用B函数，B不仅能控制自身，也可以让A来控制它<br /><br /><br />function funcA(){ <br />       funcB();<br />       //other code<br /> }<br /> 怎么定义函数B,让B在运行的时候不仅能终止B本身,而且能终止函数A的运行?<br /><br /> 这是个非常规的问题,我们分两大部分讨论. (1.为什么一定这样做 2.怎么实现) <br /><br />1. 显然,这种编码方式已经打乱了正规的程序编写原则,我们编写函数的目的就是为了封装,为了实现代码的模块化. 如果B能让A退出返回, 那这种编码方式肯怕比滥用 goto 语句还滥了. <br /><br />这样做有必要吗?为什么一定要这样做....??<br /><br />    答案如下: <br />   假如我们要扩展Array的prototype.  比方说:定义一个  find方法,用来返回第一个让 执行函数为真的数组元素.<br /><br /> 1 &lt;script><br /> 2 // by go_rush(阿舜) @ http://ashun.cnblogs.com<br /> 3 <br /> 4 Array.prototype.each=function(f){<br /> 5     for(var i=0;i&lt;this.length;i++) f(this[i],i,this)<br /> 6 }<br /> 7 <br /> 8 Array.prototype.find=function(f){   <br /> 9     var result;<br />10     this.each(function(value,index,arr){<br />11         if (f(value,index,arr)) result=value<br />12     })<br />13     return result<br />14 }<br />15 <br />16 var arr=[1,2,3,4,5,7,9]<br />17 <br />18 function foo(v){    //检测是不是偶数<br />19     return v%2==0<br />20 }<br />21 alert(arr.find(foo))<br />22 <br />23 &lt;/script><br /><br />结果另我们大失所望. <br />首先: 在逻辑上,程序是错误的,因为我们期望返回第一个偶数,但是程序却返回的是最后一个偶数.<br />其次: 程序的效率是低下的,那怕是找最后一个偶数,他在找到偶数4后,仍然检测了4后面的所有元素.这个动作<br />是多余的.  <br /><br />怎么办呢? 请看代码中的第11行,如果检测到 f(value,index,arr)  为真的时候,能够直接中断函数 this.each()该多好啊.  效率,结果,双赢的局面. <br /><br />所以对于问题一 "为什么一定这样做"  , 在这里,具体到这个应用上,有足够的理由让函数 B()来中断函数A()<br /><br />看到这里,你可能会问: 你的 find 方法为什么不这样写?<br /><br />Array.prototype.find=function(f){   <br /> for(var i=0;i&lt;this.length;i++){<br />     if (f(this[i],i,this)) return this[i]<br /> }<br />}<br /><br />这样不整个世界都清净了吗.<br /><br />是的,如果我只是简单的写一个find 这样写肯定没问题,但是如果现在我正在写一个复杂的应用,或一个写一个js框架呢<br /><br />我要实现一系列的<br />Array.prototype.all<br />Array.prototype.any<br />Array.prototype.each<br />Array.prototype.map<br />Array.prototype.find<br />Array.prototype.findAll<br />Array.prototype.grep<br />Array.prototype.inject<br />......  详细请参见 prototype.js v1.4 有上十种方法等着实现呢,我怎不可能每个方法都用 for循环一个一个的<br />遍历数组把.  我肯定要实现一个 each 方法作为统一入口吧.<br /><br />闲话少说,我们来看怎么解决问题:<br /> 要在 B函数中终止A函数,并返回结果, 目前我能想到的办法就是用异常 try{}catch(x){}<br /><br /><br />实现代码<br /> 1 &lt;script><br /> 2 // by go_rush(阿舜) @ http://ashun.cnblogs.com<br /> 3 <br /> 4 var $break=new Object()<br /> 5 <br /> 6 Array.prototype.each=function(f){<br /> 7     try{<br /> 8     for(var i=0;i&lt;this.length;i++){<br /> 9         try{<br />10              f(this[i],i,this)<br />11         }catch(e){<br />12             if (e==$break) throw e<br />13         }<br />14     }<br />15     }catch(e){            <br />16     }<br />17 }<br />18 <br />19 Array.prototype.find=function(f){   <br />20      var result;<br />21      this.each(function(value,index,arr){<br />22          if (f(value,index,arr)){<br />23              result=value<br />24             throw $break<br />25         }    <br />26      })<br />27      return result<br />28  }<br />29 <br />30 var arr=[1,2,3,4,5,7,9]<br />31 <br />32 function foo(v){    //检测是不是偶数<br />33     return v%2==0<br />34 }<br />35 alert(arr.find(foo))<br />36 <br />37 &lt;/script><br />在第24行,如果程序已经找到第一个满足函数返回值为真的元素,那么就抛出一个自定义异常,终止 this.each()的<br />运行..   注意第12行,只有确保函数抛出的是自定义异常才继续向上抛出异常,从而终止函数的运行.<br /><br />在上面的代码中,我用的 try---catch方法完全是用来解决本贴所提出的问题的,并未进行任何其他错误处理.<br /><br />在这方面,prototype.js ,通过定义两个自定义异常对象 $break 和 $continue ,既照顾到了异常处理,又解决了本贴<br />提出的问题. Enumerable 对象实现得很优雅, 大家不妨再去体会体会 prototype.js 中Enumerable的妙处.<br /><br />我们看看prototype.js 是怎么做的,我还是贴出来把<br /><br />prototype.js的代码片段摘取<br />var $break    = new Object();<br />var $continue = new Object();<br /><br />var Enumerable = {<br />  each: function(iterator) {<br />    var index = 0;<br />    try {<br />      this._each(function(value) {<br />        try {<br />          iterator(value, index++);<br />        } catch (e) {<br />          if (e != $continue) throw e;<br />        }<br />      });<br />    } catch (e) {<br />      if (e != $break) throw e;<br />    }<br />  },<br /><br />  all: function(iterator) {<br />    var result = true;<br />    this.each(function(value, index) {<br />      result = result && !!(iterator || Prototype.K)(value, index);<br />      if (!result) throw $break;<br />    });<br />    return result;<br />  },<br /><br />  any: function(iterator) {<br />    var result = true;<br />    this.each(function(value, index) {<br />      if (result = !!(iterator || Prototype.K)(value, index))<br />        throw $break;<br />    });<br />    return result;<br />  },
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/181550#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>Fri, 11 Apr 2008 09:51:42 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/181550</link>
        <guid>http://harrison2010.javaeye.com/blog/181550</guid>
      </item>
      <item>
        <title>HTml dhtml xhtml dom javascript</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/181321" style="color:red;">http://harrison2010.javaeye.com/blog/181321</a>&nbsp;
          发表时间: 2008年04月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          HTML是一种基本的WEB网页设计语言，XHTML是一个基于XML的置标语言，看起来与HTML有些相象，只有一些小的但重要的区别，XHTML就是一个扮演着类似HTML的角色的XML，所以，本质上说， XHTML是一个过渡技术，结合了XML(有几分)的强大功能及HTML(大多数)的简单特性。 <br /><br />XHTML是一种为适应XML而重新改造的HTML。当 XML越来越成为一种趋势，就出现了这样一个问题:如果我们有了XML，我们是否依然需要HTML?为了回答这个问题，1998年5月我们在旧金山开了两天的工作会议，会议的结论是:需要。我们依然需要使用HTML。因为大量的人们已经习惯使用HTML来作为他们的设计语言，而且，已经有数以百万计的页面是采用HTML编写的。 <br /><br />XHTML解决HTML语言所存在的严重制约其发展的问题。 HTML发展到今天存在三个主要缺点:不能适应现在越多的网络设备和应用的需要，比如手机、PDA、信息家电都不能直接显示HTML;由于HTML代码不规范、臃肿，浏览器需要足够智能和庞大才能够正确显示HTML;数据与表现混杂，这样你的页面要改变显示，就必须重新制作HTML。因此HTML需要发展才能解决这个问题，于是W3C又制定了XHTML，XHTML是HTML向XML过度的一个桥梁。 <br /><br /><br /><br /><br />简单点说DHTML可以让网页上的内容移动、变化、消失、出现……，总之DHTML是很一直被认为是网页设计中比较酷的东西。 <br /><br />DHTML 是Dynamic HTML的缩写，意思就是动态的HTML。它并不是某一门独立的语言，事实上任何可以实现页面动态改变的方法都可以称为DHTML。 Javascript、DOM和DHTML是比较容易混淆的。通常来说，DHTML实际实际上是Javascript、HTML DOM、CSS以及HTML/XHTML的结合应用。而HTML DOM和Javascript则是分别独立的。 <br />学习DHTML的建议 <br /><br />学习DHTML最好的办法就是阅读别人的代码。在阅读这些DHTML之前您最好已经掌握了HTML/XHTML、CSS，有一定的Javascript基础和HTML DOM基础。
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/181321#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>Thu, 10 Apr 2008 15:59:16 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/181321</link>
        <guid>http://harrison2010.javaeye.com/blog/181321</guid>
      </item>
      <item>
        <title>鼠标实现表格内容拖动到下拉列表框</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/176688" style="color:red;">http://harrison2010.javaeye.com/blog/176688</a>&nbsp;
          发表时间: 2008年03月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          鼠标按下事件<br />拖动事件<br />释放事件（垃圾处理，拖动未成功，内容返回）<br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><br />&lt;HTML><br />&lt;HEAD><br />&lt;TITLE> New Document &lt;/TITLE><br />&lt;META NAME="Generator" CONTENT="EditPlus"><br />&lt;META NAME="Author" CONTENT=""><br />&lt;META NAME="Keywords" CONTENT=""><br />&lt;META NAME="Description" CONTENT=""><br />&lt;SCRIPT LANGUAGE="JavaScript"><br />&lt;!--<br />	var tmpDragObj;<br />	function dragStart(){<br />		tmpDragObj = event.srcElement;<br />		tdiv = document.createElement("div");<br />		tdiv.innerHTML = tmpDragObj.outerHTML;<br />		tdiv.style.display = "block";<br />		tdiv.style.position = "absolute";<br />		tdiv.style.filter = "alpha(opacity=100)";<br />		tdiv.style.cursor = "move";<br />		tdiv.style.width = tmpDragObj.offsetWidth;<br />		tdiv.style.height = tmpDragObj.offsetHeight;<br />		tdiv.style.top = getInfo(tmpDragObj).top;<br />		tdiv.style.left = getInfo(tmpDragObj).left;<br /><br />		document.body.appendChild(tdiv);<br />		lastX = event.clientX;<br />		lastY = event.clientY;<br />		lastLeft = tdiv.style.left;<br />		lastTop = tdiv.style.top;<br />		try<br />		{<br />			 tmpDragObj.dragDrop(); <br />		}catch(e)<br />		{<br />		<br />		}<br />	}<br />	function draging()<br />	{<br />		var tX = event.clientX;<br />		var tY = event.clientY;<br /><br />		tdiv.style.left = parseInt(lastLeft) + tX-lastX;<br />		tdiv.style.top = parseInt(lastTop) + tY-lastY;<br />	}<br /><br />	function getInfo(o)//取得坐标<br />	{<br />		var to=new Object();<br />		to.left=to.right=to.top=to.bottom=0;<br />		var twidth=o.offsetWidth;<br />		var theight=o.offsetHeight;<br />		while(o!=document.body)<br />		{<br />			 to.left+=o.offsetLeft;<br />			 to.top+=o.offsetTop;<br />			 o=o.offsetParent;<br />		}<br />		to.right=to.left+twidth;<br />	    to.bottom=to.top+theight;<br />		return to;<br />	}<br />	function dragEnd()<br />	{<br />       if (true)<br />	   {<br />			var tX=event.clientX;<br />			var tY=event.clientY;<br />		    var parentCell=getInfo(ejej);<br />			if(tX>=parentCell.left&&tX&lt;=parentCell.right&&tY>=parentCell.top&&tY&lt;=parentCell.bottom)<br />			{<br />			   if (tmpDragObj.innerHTML == "") return;<br />			   var tempoption = document.createElement("option");<br />			   tempoption.value=tmpDragObj.innerHTML;<br />			   tempoption.text=tmpDragObj.innerHTML;<br />			   ejej.options.add(tempoption);<br />			   tmpDragObj.style.backgroundColor = "red";<br />			   tdiv.innerHTML = "33333";<br />			   document.body.removeChild(tdiv);<br />			  <br />			   return;<br />			}<br /><br />	   }<br />       mm = ff(150,15);<br />	}<br /><br />	function ff(aa,ab)//从GOOGLE网站来,用于恢复位置<br />	{<br />		var ac=parseInt(getInfo(tdiv).left);<br />		var ad=parseInt(getInfo(tdiv).top);<br />		var ae=(ac-getInfo(tmpDragObj).left)/ab;<br />		var af=(ad-getInfo(tmpDragObj).top)/ab;<br />		return setInterval(function()<br />		{<br />			if(ab&lt;1)<br />			{<br />			  clearInterval(mm);<br />			  tdiv.removeNode(true);<br />			  tmpDragObj=null;<br />			  return<br />			}<br />			ab--;<br />			ac-=ae;<br />			ad-=af;<br />			tdiv.style.left=parseInt(ac)+"px";<br />			tdiv.style.top=parseInt(ad)+"px"<br />	   }, aa/ab)<br />	}<br /><br />	function createTable(){<br />		var table_1 = document.createElement("table");<br />		var table_2 = document.createElement("tbody");<br />		for(i=0;i&lt;3;i++){<br />			var row_temp = document.createElement("tr");<br />			for(j=0;j&lt;5;j++){<br />				var td_temp = document.createElement("td");<br />				td_temp.setAttribute("width","100");<br />				td_temp.onmousedown = dragStart;<br />				td_temp.ondrag = draging;<br />				td_temp.ondragend = dragEnd;<br />				td_temp.appendChild(document.createTextNode(i*5+j));<br />				row_temp.appendChild(td_temp);<br />			}<br />			table_2.appendChild(row_temp);<br />		}<br />		table_1.setAttribute("border","1");<br />		table_1.appendChild(table_2);<br />		document.body.appendChild(table_1);<br /><br />	}<br />//--><br />&lt;/SCRIPT><br />&lt;/HEAD><br /><br />&lt;BODY><br />&lt;TABLE border="1" width="300"><br />&lt;TR><br />	&lt;TD onmousedown="dragStart();" ondrag="draging();" ondragend="dragEnd();" >sdfasdfas&lt;/TD><br />&lt;/TR><br />&lt;TR><br />	&lt;TD onmousedown="dragStart();" ondrag="draging();" ondragend="dragEnd();" >34535345&lt;/TD><br />&lt;/TR><br />&lt;/TABLE><br />&lt;input type="text" name="cmbLevel1"/><br /><br />&lt;SELECT NAME="ejej" style="width:220px;"><br />&lt;/SELECT><br />&lt;div id="xx">&lt;/div><br />&lt;SCRIPT LANGUAGE="JavaScript"><br />&lt;!--<br />createTable();<br />//--><br />&lt;/SCRIPT><br />&lt;/BODY><br />&lt;/HTML>
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/176688#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>Thu, 27 Mar 2008 11:52:20 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/176688</link>
        <guid>http://harrison2010.javaeye.com/blog/176688</guid>
      </item>
      <item>
        <title>ie的bug让我头疼（tbody）</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/176433" style="color:red;">http://harrison2010.javaeye.com/blog/176433</a>&nbsp;
          发表时间: 2008年03月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          想想自己辛辛苦苦写的动态创建table竟然不能得到自己想要的结果<br />上网要查才发现说ie有bug，现在总结下，网上说能用insert的地方就不要用<br />appendchild。<br />createElement("table");<br />createElement("tr");<br />createElement("td");<br />tr-appendchild-td<br />table-appendchild-tr<br /><br />发现不能出现自己想要的结果<br />原来需要在table和tr之间许需要一个tbody<br />createElement("tbody");<br />tr-appendchild-td<br />tbody-appendchild-tr<br />table-appendchild-tbody<br /><br />最后document.body.appendchild(table);<br /><br />ok搞定了<br />而且以后尽量使用insertrow这样要比那样轻松了啊
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/176433#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, 26 Mar 2008 17:32:28 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/176433</link>
        <guid>http://harrison2010.javaeye.com/blog/176433</guid>
      </item>
      <item>
        <title>自己写的一个用js实现选择年月日（耦合性有点高，有待调整）</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/173668" style="color:red;">http://harrison2010.javaeye.com/blog/173668</a>&nbsp;
          发表时间: 2008年03月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &lt;head><br />    &lt;title>显示年月日任你选择！&lt;/title><br />    &lt;SCRIPT language="JavaScript"><br />		function addYear(ojb){<br />			for(i=2000;i&lt;=2050;i++){<br />				temp = document.createElement("option");<br />				temp.text=i;<br />				temp.value=i;<br />				ojb.options.add(temp);<br />			}<br />		}<br />		function addMonth(ojb){<br />			for(i=1;i&lt;=12;i++){<br />				temp = document.createElement("option");<br />				temp.text=i;<br />				temp.value=i;<br />				ojb.options.add(temp);<br />			}<br />		}<br /><br />		function addDay(year,month,day){<br />			//judge year is 闰年<br />			if(month.value == '' || year.value == ''){<br />				return;<br />			}<br />			var isYear;<br />			if(year.value % 4 == 0 && year.value % 100 != 0){<br />				isYear = true;<br />			}else{<br />				isYear = false;<br />			}<br />			if(month.value == 1 || month.value == 3 || month.value == 5 || month.value == 7 || month.value == 8 ||<br />				month.value == 10 || month.value == 12){<br />					for(i=1;i&lt;=31;i++){<br />						temp = document.createElement("option");<br />						temp.text=i;<br />						temp.value=i;<br />						day.options.add(temp);<br />					}<br />				}else if(month.value == 2){<br />					if(isYear == true){<br />						for(i=1;i&lt;=29;i++){<br />							temp = document.createElement("option");<br />							temp.text=i;<br />							temp.value=i;<br />							day.options.add(temp);<br />						}<br />					}else{<br />						for(i=1;i&lt;=28;i++){<br />							temp = document.createElement("option");<br />							temp.text=i;<br />							temp.value=i;<br />							day.options.add(temp);<br />						}<br />					}<br />				}else{<br />					for(i=1;i&lt;=30;i++){<br />							temp = document.createElement("option");<br />							temp.text=i;<br />							temp.value=i;<br />							day.options.add(temp);<br />						}<br />				}<br />		}<br /><br /><br />	&lt;/SCRIPT><br />	&lt;/head><br />  &lt;body onload="addYear(year);"><br />	显示年月日任你选择！&lt;hr><br />	&lt;select name="year" onchange="addMonth(month);addDay(year,month,day);"><br />		&lt;option>请选择<br />		&lt;/option><br />	&lt;/select><br /><br />	&lt;select name="month" onchange="addDay(year,month,day);"><br />		&lt;option>请选择<br />		&lt;/option><br />	&lt;/select><br /><br />	&lt;select name="day"><br />		&lt;option>请选择<br />		&lt;/option><br />	&lt;/select><br /><br />  &lt;/body><br />&lt;/html>
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/173668#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>Wed, 19 Mar 2008 11:05:40 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/173668</link>
        <guid>http://harrison2010.javaeye.com/blog/173668</guid>
      </item>
      <item>
        <title>理解JavaScript函数（3）</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/173455" style="color:red;">http://harrison2010.javaeye.com/blog/173455</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &lt;SCRIPT language="JavaScript"><br /><br />	&lt;!-- Hide from older browsers<br />	function Person(name, age, colour) {<br />	 this.name = name;<br />	 this.age = age;<br />	 this.colour = colour;<br />	 this.birthYear = (new Date()).getYear() - this.age;<br />	 this.toString = printPerson; // 这里定义the Person.toString() 方法<br />	 this.isOlder = aisOlder; // 这里定义Person.isOlder(Person) 方法<br />	}<br /><br /><br />	function printPerson() {<br />	 var text = this.name + " was born in " + this.birthYear +"&lt;br>";<br />	 text += "and is " + this.age + " years old.&lt;p>";<br />	 return text;<br />	}<br /><br />	function aisOlder(otherPerson) { // 这里定义是否第一个人是更老的<br />	 return (this.age > otherPerson.age); // 返回布尔型数值<br />	}<br /><br /><br />	//下面的代码用于测试我们的函数<br /><br />	var body1 = new Person("Patrick", 22, "red");<br />	var body2 = new Person("Betty", 21, "green");<br />	document.write(body1); //这里为Person.toString()创建一个调用<br />	document.write(body2);<br />	document.write(body1.name);<br /> &lt;SCRIPT language="JavaScript"><br /><br />	&lt;!-- Hide from older browsers<br />	function Person(name, age, colour) {<br />	 this.name = name;<br />	 this.age = age;<br />	 this.colour = colour;<br />	 this.birthYear = (new Date()).getYear() - this.age;<br />	 this.toString = printPerson; // 这里定义the Person.toString() 方法<br />	 this.isOlder = aisOlder; // 这里定义Person.isOlder(Person) 方法<br />	}<br /><br /><br />	function printPerson() {<br />	 var text = this.name + " was born in " + this.birthYear +"&lt;br>";<br />	 text += "and is " + this.age + " years old.&lt;p>";<br />	 return text;<br />	}<br /><br />	function aisOlder(otherPerson) { // 这里定义是否第一个人是更老的<br />	 return (this.age > otherPerson.age); // 返回布尔型数值<br />	}<br /><br /><br />	//下面的代码用于测试我们的函数<br /><br />	var body1 = new Person("Patrick", 22, "red");<br />	var body2 = new Person("Betty", 21, "green");<br />	document.write(body1); //这里为Person.toString()创建一个调用<br />	document.write(body2);<br />	document.write(body1.name);<br />	document.write(body1.isOlder(body2));//====这里的这种方式也可以的<br />	//document.write(body1.toString);<br />	// Stop hiding --><br />&lt;/SCRIPT><br />	//document.write(body1.toString);<br />	// Stop hiding --><br />&lt;/SCRIPT>
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/173455#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>Tue, 18 Mar 2008 16:57:24 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/173455</link>
        <guid>http://harrison2010.javaeye.com/blog/173455</guid>
      </item>
      <item>
        <title>理解JavaScript函数（函数和对象的区别和联系）</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/173446" style="color:red;">http://harrison2010.javaeye.com/blog/173446</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          函数对象和其他内部对象的关系<br /><br /><br />　　除了函数对象，还有很多内部对象，比如：Object、Array、Date、RegExp、Math、Error。这些名称实际上表示一个类型，可以通过new操作符返回一个对象。然而函数对象和其他对象不同，当用typeof得到一个函数对象的类型时，它仍然会返回字符串“function”，而typeof一个数组对象或其他的对象时，它会返回字符串“object”。下面的代码示例了typeof不同类型的情况：<br /><br />以下是引用片段：<br />alert(typeof(Function))); <br />alert(typeof(new Function())); <br />alert(typeof(Array)); <br />alert(typeof(Object)); <br />alert(typeof(new Array())); <br />alert(typeof(new Date())); <br />alert(typeof(new Object())); <br /><br /><br />　　运行这段代码可以发现：前面4条语句都会显示“function”，而后面3条语句则显示“object”，可见new一个function实际上是返回一个函数。这与其他的对象有很大的不同。其他的类型Array、Object等都会通过new操作符返回一个普通对象。尽管函数本身也是一个对象，但它与普通的对象还是有区别的，因为它同时也是对象构造器，也就是说，可以new一个函数来返回一个对象，这在前面已经介绍。所有typeof返回“function”的对象都是函数对象。也称这样的对象为构造器（constructor），因而，所有的构造器都是对象，但不是所有的对象都是构造器。<br /><br />　　既然函数本身也是一个对象，它们的类型是function，联想到C++、Java等面向对象语言的类定义，可以猜测到Function类型的作用所在，那就是可以给函数对象本身定义一些方法和属性，借助于函数的prototype对象，可以很方便地修改和扩充Function类型的定义，例如下面扩展了函数类型Function，为其增加了method1方法，作用是弹出对话框显示"function"：<br /><br />以下是引用片段：<br />Function.prototype.method1=function(){ <br />      alert("function"); <br />} <br />function func1(a,b,c){ <br />      return a+b+c; <br />} <br />func1.method1(); <br />func1.method1.method1(); <br /><br /><br />　　注意最后一个语句：func1.method1.mehotd1()，它调用了method1这个函数对象的method1方法。虽然看上去有点容易混淆，但仔细观察一下语法还是很明确的：这是一个递归的定义。因为method1本身也是一个函数，所以它同样具有函数对象的属性和方法，所有对Function类型的方法扩充都具有这样的递归性质。<br /><br />　　Function是所有函数对象的基础，而Object则是所有对象（包括函数对象）的基础。在JavaScript中，任何一个对象都是Object的实例，因此，可以修改Object这个类型来让所有的对象具有一些通用的属性和方法，修改Object类型是通过prototype来完成的：<br /><br />以下是引用片段：<br />Object.prototype.getType=function(){ <br />       return typeof(this); <br />} <br />var array1=new Array(); <br />function func1(a,b){ <br />      return a+b; <br />} <br />alert(array1.getType()); <br />alert(func1.getType()); <br /><br /><br />　　上面的代码为所有的对象添加了getType方法，作用是返回该对象的类型。两条alert语句分别会显示“object”和“function”。<br /><br />      将函数作为参数传递<br /><br />　　在前面已经介绍了函数对象本质，每个函数都被表示为一个特殊的对象，可以方便的将其赋值给一个变量，再通过这个变量名进行函数调用。作为一个变量，它可以以参数的形式传递给另一个函数，这在前面介绍JavaScript事件处理机制中已经看到过这样的用法，例如下面的程序将func1作为参数传递给func2：<br /><br />以下是引用片段：<br />function func1(theFunc){ <br />      theFunc(); <br />} <br />function func2(){ <br />      alert("ok"); <br />} <br />func1(func2); <br /><br />　　在最后一条语句中，func2作为一个对象传递给了func1的形参theFunc，再由func1内部进行theFunc的调用。事实上，将函数作为参数传递，或者是将函数赋值给其他变量是所有事件机制的基础。<br /><br />例如，如果需要在页面载入时进行一些初始化工作，可以先定义一个init的初始化函数，再通过window.onload=init;语句将其绑定到页面载入完成的事件。这里的init就是一个函数对象，它可以加入window的onload事件列表。
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/173446#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>Tue, 18 Mar 2008 16:36:52 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/173446</link>
        <guid>http://harrison2010.javaeye.com/blog/173446</guid>
      </item>
      <item>
        <title>理解JavaScript函数（两种方式）</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/173442" style="color:red;">http://harrison2010.javaeye.com/blog/173442</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          需要注意的是，尽管下面两种创建函数的方法是等价的：<br /><br /> <br /><br />以下是引用片段：<br />function funcName(){ <br />       //函数体 <br />} <br />//等价于 <br />var funcName=function(){ <br />       //函数体 <br />} <br /><br />　　但前面一种方式创建的是有名函数，而后面是创建了一个无名函数，只是让一个变量指向了这个无名函数。在使用上仅有一点区别，就是：对于有名函数，它可以出现在调用之后再定义；而对于无名函数，它必须是在调用之前就已经定义。例如：<br /><br />以下是引用片段：<br />＜script language="JavaScript" type="text/javascript"＞ <br />＜!-- <br />func(); <br />var func=function(){ <br />       alert(1) <br />} <br />//--＞ <br />＜/script＞ <br /><br />　　这段语句将产生func未定义的错误，而：<br /><br />以下是引用片段：<br />＜script language="JavaScript" type="text/javascript"＞ <br />＜!-- <br />func(); <br />function func(){ <br />      alert(1) <br />} <br />//--＞ <br />＜/script＞ <br /><br />　　则能够正确执行，下面的语句也能正确执行：<br /><br />以下是引用片段：<br />＜script language="JavaScript" type="text/javascript"＞ <br />＜!-- <br />func(); <br />var someFunc=function func(){ <br />      alert(1) <br />} <br />//--＞ <br />＜/script＞ <br /><br />　　由此可见，尽管JavaScript是一门解释型的语言，但它会在函数调用时，检查整个代码中是否存在相应的函数定义，这个函数名只有是通过function funcName()形式定义的才会有效，而不能是匿名函数。
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/173442#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>Tue, 18 Mar 2008 16:34:31 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/173442</link>
        <guid>http://harrison2010.javaeye.com/blog/173442</guid>
      </item>
      <item>
        <title>javascirpt 在textarea中运行（自己学习）</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/170539" style="color:red;">http://harrison2010.javaeye.com/blog/170539</a>&nbsp;
          发表时间: 2008年03月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          下载就可以了。复制别的功能大家自己搞吧，(*^__^*) 嘻嘻……<br />而且里面的一个实例是实现了一个qq类似菜单的功能
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/170539#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>Wed, 12 Mar 2008 15:02:27 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/170539</link>
        <guid>http://harrison2010.javaeye.com/blog/170539</guid>
      </item>
      <item>
        <title>weblogic启动时不用输用户名和密码的方法-(转载）</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/170348" style="color:red;">http://harrison2010.javaeye.com/blog/170348</a>&nbsp;
          发表时间: 2008年03月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          weblogic启动时不用输用户名和密码的方法- -                                       <br /><br />      用weblogic做为web服务器。其启动的时候会提示输入用户名和密码。能不能不用输入用户名和密码就可以登陆呢？或者做到自动话。回答上肯定的。<br /><br />      分两种情况：<br />      7.1版本.在startWeblogic.sh文件中增加两个变量WLS_USER和WLS_PW分别保存用户名和密码。此时再运行startWeblogic.sh命令就可以不用输入用户名和密码了<br /><br />      8.1版本。虽然它的startWeblogic.sh文件中也写明了上述两个变量是用来保存用户名和密码的。但是实际证明，这样并不能自动登陆并启动weblogic。我想可能是该文件的最后一句话（即启动weblogic的）可能和7。1相比缺了参数吧（应该是这样吧，要不为什么7。1可以而8。1不可以呢，当时也没有仔细看）。不过可在startWeblogic.sh文件的同级目录下建立一文件boot.properties，内容如下：<br />     <br /><br />      username=weblogic<br />      password=weblogic #这里的用户名和密码和安装时设定的要一致<br /><br />　　运行startweblogic.sh命令时会自动读取boot.properties文件中的内容，并在第一启动时对其进行加密
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/170348#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>Wed, 12 Mar 2008 09:38:27 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/170348</link>
        <guid>http://harrison2010.javaeye.com/blog/170348</guid>
      </item>
      <item>
        <title>制作Javascript弹出窗口技巧九则</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/168952" style="color:red;">http://harrison2010.javaeye.com/blog/168952</a>&nbsp;
          发表时间: 2008年03月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          经常上网的朋友可能会到过这样一些网站，一进入首页立刻会弹出一个窗口，或者按一个连接或按钮弹出，通常在这个窗口里会显示一些注意事项、版权信息、警告、欢迎光顾之类的话或者作者想要特别提示的信息。其实制作这样的页面效果非常的容易，只要往该页面的HTML里加入几段Javascript代码即可实现。下面俺就带您剖析它的奥秘。<br /><br />1、最基本的弹出窗口代码<br /><br />　　其实代码非常简单：<br /><br />　　&lt; SCRIPT LANGUAGE="javascript"><br /><br />　　&lt; !--<br /><br />　　window.open ("page.html")<br /><br />　　--<br />><br /><br />　　&lt; /SCRIPT><br /><br />　　因为这是一段Javascript代码，所以它们应该放在&lt; SCRIPT LANGUAGE="javascript">之间。 &lt; !-- 和 -->是对一些版本低的浏览器起作用，在这些老浏览器中不会将标签中的代码作为文本显示出来。要养成这个好习惯啊。<br /><br />　　window.open ("page.html") 用于控制弹出新的窗口page.html，如果page.html不与主窗口在同一路径下，前面应写明路径，绝对路径(http://)和相对路径(../)均可。<br /><br />　　用单引号和双引号都可以，只是不要混用。<br /><br />　　这一段代码可以加入HTML的任意位置，&lt; head>和&lt; /head>之间可以，&lt; body>间&lt; /body>也可以，越前越早执行，尤其是页面代码长，又想使页面早点弹出就尽量往前放。 也可以，越前越早执行，尤其是页面代码长，又想使页面早点弹出就尽量往前放。<br /><br />2、经过设置后的弹出窗口<br /><br />　　下面再说一说弹出窗口的设置。只要再往上面的代码中加一点东西就可以了。我们来定制这个弹出的窗口的外观，尺寸大小，弹出的位置以适应该页面的具体情况。<br /><br />　　&lt; SCRIPT LANGUAGE="javascript"><br /><br />　　&lt; !--<br /><br />　　window.open ("page.html", "newwindow", "height=100, width=400, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no")<br /><br />　　//写成一行<br /><br />　　--><br /><br />　　&lt; /SCRIPT><br /><br />　　参数解释：<br /><br />　　&lt; SCRIPT LANGUAGE="javascript"> js脚本开始；<br /><br />　　window.open 弹出新窗口的命令；<br /><br />　　"page.html" 弹出窗口的文件名；<br /><br />　　"newwindow" 弹出窗口的名字（不是文件名），非必须，可用空"代替；<br /><br />　　height=100 窗口高度；<br /><br />　　width=400 窗口宽度；<br /><br />　　top=0 窗口距离屏幕上方的象素值；<br /><br />　　left=0 窗口距离屏幕左侧的象素值；<br /><br />　　toolbar=no 是否显示工具栏，yes为显示；<br /><br />　　menubar，scrollbars 表示菜单栏和滚动栏。<br /><br />　　resizable=no 是否允许改变窗口大小，yes为允许；<br /><br />　　location=no 是否显示地址栏，yes为允许；<br /><br />　　status=no 是否显示状态栏内的信息（通常是文件已经打开），yes为允许；<br /><br />　　&lt; /SCRIPT> js脚本结束<br /><br />3、用函数控制弹出窗口<br /><br />　　下面是一个完整的代码：<br /><br />　　&lt; html><br /><br />　　&lt; head><br /><br />　　&lt; script LANGUAGE="JavaScript"><br /><br />　　&lt; !--<br /><br />　　function openwin() {<br /><br />　　window.open ("page.html", "newwindow", "height=100, width=400, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")<br /><br />　　//写成一行<br /><br />　　}<br /><br />　　//--><br /><br />　　&lt; /script><br /><br />　　&lt; /head><br /><br />　　&lt; body onload="openwin()"><br /><br />　　...任意的页面内容...<br /><br />　　&lt; /body><br /><br />　　&lt; /html><br /><br />　　这里定义了一个函数openwin(),函数内容就是打开一个窗口。在调用它之前没有任何用途。<br /><br />　　怎么调用呢？<br /><br />　　方法一：&lt; body onload="openwin()"> 浏览器读页面时弹出窗口；<br /><br />　　方法二：&lt; body onunload="openwin()"> 浏览器离开页面时弹出窗口；<br /><br />　　方法三：用一个连接调用：&lt; a href="#" onclick="openwin()">打开一个窗口&lt; /a><br /><br />　　注意：使用的"#"是虚连接。<br /><br />　　方法四：用一个按钮调用：&lt; input type="button" onclick="openwin()" value="打开窗口"><br /><br />4、同时弹出2个窗口<br /><br />　　对源代码稍微改动一下：<br /><br />　　&lt; script LANGUAGE="JavaScript"><br /><br />　　&lt; !--<br /><br />　　function openwin() {<br /><br />　　window.open ("page.html", "newwindow", "height=100, width=100, top=0, left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")<br /><br />　　//写成一行<br /><br />　　window.open ("page2.html", "newwindow2", "height=100, width=100, top=100, left=100,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")<br /><br />　　//写成一行<br /><br />　　}<br /><br />　　//--><br /><br />　　&lt; /script><br /><br />　　为避免弹出的2个窗口覆盖，用top和left控制一下弹出的位置不要相互覆盖即可。最后用上面说过的四种方法调用即可。<br /><br />　　注意：2个窗口的name(newwindows和newwindow2)不要相同，或者干脆全部为空。OK？<br /><br />5、主窗口打开文件1.htm，同时弹出小窗口page.html<br /><br />　　如下代码加入主窗口&lt; head>区：<br /><br />　　&lt; script language="javascript"><br /><br />　　&lt; !--<br /><br />　　function openwin() {<br /><br />　　window.open("page.html","","width=200,height=200")<br /><br />　　}<br /><br />　　//--><br /><br />　　&lt; /script><br /><br />　　加入&lt; body>区：<br /><br />　　&lt; a href="1.htm" onclick="openwin()">open&lt; /a>即可<br /><br />6、弹出的窗口之定时关闭控制<br /><br />　　下面我们再对弹出的窗口进行一些控制，效果就更好了。如果我们再将一小段代码加入弹出的页面(注意是加入到page.html的HTML中，可不是主页面中，否则...)，让它10秒后自动关闭是不是更酷了？<br /><br />　　首先，将如下代码加入page.html文件的&lt; head>区：<br /><br />　　&lt; script language="JavaScript"><br /><br />　　function closeit() {<br /><br />　　setTimeout("self.close()",10000) //毫秒<br /><br />　　}<br /><br />　　&lt; /script><br /><br />　　然后，再用&lt; body onload="closeit()"> 这一句话代替page.html中原有的&lt; BODY>这一句就可以了。(这一句话千万不要忘记写啊！这一句的作用是调用关闭窗口的代码，10秒钟后就自行关闭该窗口。)<br /><br />7、在弹出窗口中加上一个关闭按钮<br /><br />　　&lt; FORM><br /><br />　　&lt; INPUT TYPE="BUTTON" VALUE="关闭" onClick="window.close()"><br /><br />　　&lt; /FORM><br /><br />　　呵呵，现在更加完美了！<br /><br />8、内包含的弹出窗口-－－一个页面两个窗口<br /><br />　　上面的例子都包含两个窗口，一个是主窗口，另一个是弹出的小窗口。通过下面的例子，你可以在一个页面内完成上面的效果。<br /><br />　　&lt; html><br /><br />　　&lt; head><br /><br />　　&lt; SCRIPT LANGUAGE="JavaScript"><br /><br />　　function openwin()<br /><br />　　{<br /><br />　　OpenWindow=window.open("", "newwin", "height=250, width=250,toolbar=no,scrollbars="+scroll+",menubar=no");<br /><br />　　//写成一行<br /><br />　　OpenWindow.document.write("&lt; TITLE>例子&lt; /TITLE>")<br /><br />　　OpenWindow.document.write("&lt; BODY BGCOLOR=#ffffff>")<br /><br />　　OpenWindow.document.write("&lt; h1>Hello!&lt; /h1>")<br /><br />　　OpenWindow.document.write("New window opened!")<br /><br />　　OpenWindow.document.write("&lt; /BODY>")<br /><br />　　OpenWindow.document.write("&lt; /HTML>")<br /><br />　　OpenWindow.document.close()<br /><br />　　}<br /><br />　　&lt; /SCRIPT><br /><br />　　&lt; /head><br /><br />　　&lt; body><br /><br />　　&lt; a href="#" onclick="openwin()">打开一个窗口&lt; /a><br /><br />　　&lt; input type="button" onclick="openwin()" value="打开窗口"><br /><br />　　&lt; /body><br /><br />　　&lt; /html><br /><br />　　看看OpenWindow.document.write()里面的代码不就是标准的HTML吗？只要按照格式写更多的行即可。千万注意多一个标签或少一个标签就会出现错误。记得用OpenWindow.document.close()结束啊。<br /><br />9、终极应用--弹出的窗口之Cookie控制<br /><br />　　回想一下，上面的弹出窗口虽然酷，但是有一点小毛病(沉浸在喜悦之中，一定没有发现吧？)比如你将上面的脚本放在一个需要频繁经过的页面里(例如首页)，那么每次刷新这个页面，窗口都会弹出一次，是不是非常烦人？:-(<br /><br />　　有解决的办法吗？当然有！我们使用cookie来控制一下就可以了。首先，将如下代码加入主页面HTML的&lt; HEAD>区：<br /><br />　　&lt; script><br /><br />　　function openwin(){<br /><br />　　window.open("page.html","","width=200,height=200")<br /><br />　　}<br /><br />　　function get_cookie(Name) {<br /><br />　　var search = Name + "=" var returnvalue = "";<br /><br />　　if (document.cookie.length > 0) {<br /><br />　　offset = document.cookie.indexOf(search)<br /><br />　　if (offset != -1) {<br /><br />　　offset += search.length<br /><br />　　end = document.cookie.indexOf(";", offset);<br /><br />　　if (end == -1)<br /><br />　　end = document.cookie.length;<br /><br />　　returnvalue=unescape(document.cookie.substring(offset, end))<br /><br />　　}<br /><br />　　}<br /><br />　　return returnvalue;<br /><br />　　}<br /><br />　　function loadpopup(){<br /><br />　　if (get_cookie("popped")=="){<br /><br />　　openwin()<br /><br />　　document.cookie="popped=yes"<br /><br />　　}<br /><br />　　}<br /><br />　　&lt; /script><br /><br />　　然后，用&lt; body onload="loadpopup()">（注意不是openwin而是loadpop啊！）替换主页面中原有的&lt; BODY>这一句即可。你可以试着刷新一下这个页面或重新进入该页面，窗口再也不会弹出了。真正的Pop-Only-Once！<br /><br />　　写到这里弹出窗口的制作和应用技巧基本上算是完成了，俺也累坏了，一口气说了这么多，希望对正在制作网页的朋友有所帮助俺就非常欣慰了。<br /><br />　　需要注意的是，JS脚本中的的大小写最好前后保持一致。
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/168952#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>Fri, 07 Mar 2008 09:41:45 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/168952</link>
        <guid>http://harrison2010.javaeye.com/blog/168952</guid>
      </item>
      <item>
        <title>chm 文件打不开解决方法总结</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/165796" style="color:red;">http://harrison2010.javaeye.com/blog/165796</a>&nbsp;
          发表时间: 2008年02月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          chm 文件打不开解决方法总结<br />by admin<br /><br />最近经常听到朋友说chm文件打不开，自己也经常遇到，网上搜索后把方法总结：<br /><br />一.如果不能打开，可这样恢复文件关联：<br />1、开始运行，输入：regsvr32 C:\windows\system32\hhctrl.ocx ，确定，重新关联文件。<br />2、执行一下windows目录里的hh.exe 。<br />有时候chm文件放在中文目录就不行。包括中文chm名字。试着把文件考出来.中文名字一改.<br /><br />二.1.在微软网站上下载hhupd.exe,安装hh.exe后并运行。<br />2.实际上,下载hhupd.exe后,运行后就可以了。这个东西大小为461kb 3.在c:\windows\system32里找到“Hhctrl.ocx”文件,然后运行:“regsvr32“c:\windows\system32\hhctrl.ocx…<br />网上的解决方法不可行，下载不了hhupd.exe.我直接执行regsvr32 c:\windows\system32\hhctrl.ocx就ok了。<br /><br />解决方法2是：<br />1，右键关联chm文件的“打开方式”到\Windows\HH.exe<br />2，在命令行运行regsvr32 itss.dll<br />3，在命令行运行regsvr32 hhctrl.ocx<br /><br />三.也许是 HH.EXE 所必需的某个组件出了问题。但是不知道 HH.EXE 会用到些什么组件，所以上网查了一下，有人建议重新注册 hhctrl.ocx。我在系统目录下找到了 hhctrl.ocx，重新注册一下 hhctrl.ocx 试试：regsvr32 hhctrl.ocx。依然不能正常阅读 CHM。<br /><br />既然如此，很有可能是协议出了问题。HH.EXE 用的是 ms-its 等协议，这些协议应该是由某个 DLL 文件提供服务的。问题是，是什么 DLL 呢？于是再用 Google 搜索 ms-its 协议。终于找到了，原来是一个 itss.dll 在做服务。不过网上查到的解决方案是修改注册表。<br /><br />要修改 ItssRestrictions 注册表项以启用特定的安全区域，请按照下列步骤操作：<br />1. 单击“开始”，单击“运行”，键入 regedit，然后单击“确定”。<br />2. 找到并单击下面的子项：<br />HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\HTMLHelp\1.x\ItssRestrictions<br />注意：如果该注册表子项不存在，则使用方法 1 中的步骤 2a 和 2b 创建该子项。<br />3. 右键单击“ItssRestrictions”子项，指向“新建”，然后单击“DWORD 值”。<br />4. 键入 MaxAllowedZone，然后按 Enter 键。<br />5. 右键单击“MaxAllowedZone”值，然后单击“修改”。<br />6. 在“数值数据”框中，键入 0 至 4 之间的一个数字，然后单击“确定”。<br />7. 退出注册表编辑器。<br />注意：默认情况下，“MaxAllowedZone”值设置为 0。下表摘要列出了“MaxAllowedZone”值对各个项的解释。 MaxAllowedZone 本地计算机区域 本地 Intranet 区域 受信任的站点区域 Internet 区域 受限站点区域<br />0 允许 阻止 阻止 阻止 阻止<br />1 允许 允许 阻止 阻止 阻止<br />2 允许 允许 允许 阻止 阻止<br />3 允许 允许 允许 允许 阻止<br />4 允许 允许 允许 允许 允许<br /><br />注册表修改之后还是不能打开！<br />试试偷懒的办法吧——重新注册DLL：regsvr32 itss.dll。<br /><br />四.操作系统的语言不是中文（经常出现这种情况）<br />1.看看你的 OS 是不是中文的 OS ？ 如果你的 OS 不是 中文的，那么到 Control Pane 中看看那个“语言和区域” 的option，打开看看“区域选项” 是不是中国，这个选项对一些软件还是有一些影像的。<br />2.如果你的CHM文件是中文的，可能存在缺省语言设置问题。可能你用是的英文版的WINDOWS，把RAGIONAL AND LANGUAGE OPTIONS中的LANGUAGE 和ADVANCED 中的语言和国家选项都设置成中文（PRC）。就可以了<br /><br />五.可以试试改变此文件的名字.比如去掉多余的符号<br /><br />六.如果都不能，最后一招就是，把电子书CHM格式转换为PDF文件：<br />CHM Converter是一个专门转换CHM格式的文件，它可以把CHM文件转换成PDF、TXT、DOC等常用的格式。<br />http://dl.pconline.com.cn/html/1/6/dlid=11896&dltypeid=1&pn=0&.html<br /><br />下载后运行软件，软件默认是英文界面，点击菜单“Tools-Language”，在弹出的对话框中选择“Chinese_Simplified”就可以换成中文了，软件还支持其他很多语言。<br /><br />选好语言后点击左上角的“打开”按钮来选择要转换的CHM文件，如果CHM文件是英文版的，那么在旁边的下拉菜单中就选择 “DEFAILT_CHARSET”，如果是中文的，那需要在下拉菜单中选择“GB2312_CHARSET”，否则会产生乱码，然后在右面的“导出”中来选择要转换的文件类型，软件支持很多格式的文件，如这里选择“Word97-2003”，最后点击“另存数据库为”按钮，选择保存的文件夹后就开始进行转换了。<br /><br />PS: Window2K中不能打开*.chm文件的解决办法<br />这个问题的发生，是由于hhctrl.ocx的版本号出现错误或未正确注册。原因在于安装的其他软件用hhctrl.ocx的旧版本替换了原来的版本。<br />IE6SP1中，这个文件的版本号应为5.2.3735.0。可以看看你的系统这个文件的版本号。<br />位于winnt/system32这个文件夹。大小504K（英文版本）从其他相同的系统（IE版本也相同）中COPY一份<br />粘贴到你的系统相应文件夹中。然后注册一下。<br /><br />注意：<br />1、先替换winnt/system32/dllcache文件夹的这个文件<br />后替换winnt/system32文件夹里的这个文件<br />2、如果看不到这个文件，<br />先工具–文件夹选项中，设置显示隐藏文件<br />并设置显示系统文件<br />3、注册的方法是<br />开始–运行，输入regsvr32 hhctrl.ocx<br />之后出来一个注册成功的对话框，确定然后重启系统。
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/165796#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>Thu, 28 Feb 2008 15:37:18 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/165796</link>
        <guid>http://harrison2010.javaeye.com/blog/165796</guid>
      </item>
      <item>
        <title>加密程序</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/162744" style="color:red;">http://harrison2010.javaeye.com/blog/162744</a>&nbsp;
          发表时间: 2008年02月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          package com.cybookstore.struts.action;<br /><br />import java.io.UnsupportedEncodingException;<br />import java.util.ArrayList;<br /><br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import javax.servlet.http.HttpSession;<br /><br />import org.apache.log4j.Logger;<br />import org.apache.struts.action.Action;<br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionForward;<br />import org.apache.struts.action.ActionMapping;<br /><br />import com.cybookstore.db.dao.User;<br />import com.cybookstore.db.dao.UserCart;<br />import com.cybookstore.db.dao.UserDAO1;<br />import com.cybookstore.db.dao.UserInfo;<br />import com.cybookstore.db.dao.UserLoginDAO;<br />import com.cybookstore.db.dao.UserManager;<br />import com.cybookstore.db.dao1.Userinfo;<br /><br />/** <br /> * MyEclipse Struts<br /> * Creation date: 01-05-2008<br /> * <br /> * XDoclet definition:<br /> * @struts.action validate="true"<br /> * @struts.action-forward name="successfully" path="/suc.jsp"<br /> * @struts.action-forward name="failure" path="/fail.jsp"<br /> */<br />public class LoginAction1 extends Action {<br />	private static final Logger log = Logger.getLogger(LoginAction1.class);<br />	<br />	public ActionForward execute(ActionMapping mapping, ActionForm form,<br />			HttpServletRequest request, HttpServletResponse response) {<br />	       String name=request.getParameter("textfield");<br />	       String password=request.getParameter("textfield2");<br />	       try {<br />			String temp=new String(name.getBytes("ISO-8859-1"),"gb2312");<br />			 log.info("user:  "+temp+"  :  "+password);<br />		       Userinfo user=new  Userinfo(temp,"","","","","","");<br />		        Userinfo user2= UserDAO1.Login(user);<br />		     <br />//		    	 UserLogin.Login(name,password);<br />		    <br />		   <br />		     UserInfo user1= UserManager.getUser(1);<br />		   <br />//		     ArrayList ss=user1.getUserlist();<br />		     HttpSession session=request.getSession();<br />		     session.setAttribute("user", user1);<br />		    <br />		     <br />		     if(password!=null&&user2!=null&&!password.equals("")&&password.equals(user2.getPassword())){<br />		    	   UserCart c=new UserCart();<br />			 	     session.setAttribute("cart", c);<br />			 	   	 System.out.println(user); <br />			 	    return  mapping.findForward("successful");<br />	       }else {<br />	    	   return  mapping.findForward("failure");<br />	    	    }<br />		} catch (UnsupportedEncodingException e) {<br />			// TODO Auto-generated catch block<br />			e.printStackTrace();<br />		}<br />		 return  mapping.findForward("failure");<br />	      <br />	}        <br />	      <br /><br />}
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/162744#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, 17 Feb 2008 10:30:58 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/162744</link>
        <guid>http://harrison2010.javaeye.com/blog/162744</guid>
      </item>
      <item>
        <title>企业基础信息共享系统介绍</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/162742" style="color:red;">http://harrison2010.javaeye.com/blog/162742</a>&nbsp;
          发表时间: 2008年02月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          企业基础信息共享系统:<br /><br />  在企业基础信息共享系统中负责需求调研、数据库设计，并独立开发了信息共享国税服务管理子系统，整个信息共享系统实现了工商、质监、国税和地税的信息交互和数据交换。<br /><br />一、系统介绍：<br />	石嘴山市企业基础信息共享系统，由市政府组织，实现了工商、质监、国税和地税的信息交互和数据交换，主要是将工商及质监部门注册企业基础信息共享给国地税，目的是为了打击偷税漏税以及向外提供一个企业信息的平台。<br /><br />二、系统组成：<br />	数据交换中心：实现几个地方的数据交换功能，用的购买别人的软件（使用delphi开发）<br />        国税服务管理子系统：管理工商、质监、地税传过来的企业信息数据，统计纳税人信息，统计偷税漏税的纳税人信息，（国税主要统计的是企业所得税和增值税）。使用jsp+struts开发。<br />        地税服务管理子系统：跟国税的软件功能相仿（地税主要统计的增值税、个人所得税、教育附加费等等这些情况）<br /><br />三、国税服务管理子系统详细说明：<br />	功能模块：<br />	基础信息查询模块<br />		企业基础信息查看（主要来自工商和质监部门）<br />	信息统计模块：<br />		企业年检信息统计<br />		正常户、非正常户信息统计<br />		吊销信息统计<br />		漏管户信息统计<br />		新增户信息统计<br />		无照经营信息统计<br />		地税偷税漏水情况统计<br />		国税偷税漏税情况统计<br />	权限管理模块<br />		<br /><br />你可以说一下自己的学习及进步历程：<br /><br />第一个程序：jsp+javabean实现，没有分层的概念<br />第二个程序：使用jsp+servlet+javabean实现，开始理解使用分层<br />第二个程序：使用jsp+struts实现，开始使用一些框架<br /><br />同时强调自己在自学，使用jsp+struts+spring+heibnate结合开发程序<br /><br />你可以说这是你的第一个使用框架自己开发的程序，中间遇到了不少struts的问题，以及代码分层实现，<br />主要给他说些这些东西，说些自己学习是的收获，以及对程序设计分层的理解。<br /><br /><br />强调几点：<br />1、首先说明自己是外专业的，但是自己对编程十分感兴趣于是就参加类培训并自学这一行。<br />2、强调自己的自学能力，谈谈自己学习的历程、收获、感受，尽量要真实一些
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/162742#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, 17 Feb 2008 10:27:24 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/162742</link>
        <guid>http://harrison2010.javaeye.com/blog/162742</guid>
      </item>
      <item>
        <title>有必要使用dao时候使用工厂模式和接口吗？</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/162739" style="color:red;">http://harrison2010.javaeye.com/blog/162739</a>&nbsp;
          发表时间: 2008年02月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          先说明下是怎么使用dao的接口和工厂模式的（甚至包含抽象工厂模式）<br />1.当我们建立一个系统的时候，我们并不知道将要要用到什么样子的数据库，而且有可能随着<br />变化我们用到的数据库也有可能就被别的好的数据库代替。这个是使用dao接口及抽象工厂模式的前提<br />2.比如我们有一个user对象，我么对其操作要建立uerdao，我们仅仅知道对其操作，但是具体的做要要在数据库里面实现，不同的数据库操作不要一样，因此我们分成多种dao。但是这些别的人员并不一定要知道，别人用的是dao，没有必要去知道我用什么数据库来操作。因此uerDAo是个接口<br />诞生了userMySQLDAO，userOracleDAO等等。有了这些以后，使用者仅仅用个到userDAo的方法就可以<br />但是新的问题又出现了<br />3.userdao是一个接口我怎么去使用，我不能new我怎么使用<br />于是就出来了factory工厂可以魏你建立一个你自己想要的DAO就可以了。factory.getUserMySQLDAO。如果factory是一个一般的类，那么我们必须知道是什么样子的工厂，是mysql的工厂还是oracle的 工厂。<br />因此要使用抽象工厂模式<br /><br /><br /><br />辩论：<br />这样好吗？<br />这样的factory每次都在用new来创建对象。会不会造成资源的浪费那？<br />为什么我们不能用一个静态的办法来代替那？<br />比如我仅仅定义一个userdao的类
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/162739#comments" style="color:red;">已有 <strong>20</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, 17 Feb 2008 10:23:21 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/162739</link>
        <guid>http://harrison2010.javaeye.com/blog/162739</guid>
      </item>
      <item>
        <title>spring大体概念学习复习1</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/162737" style="color:red;">http://harrison2010.javaeye.com/blog/162737</a>&nbsp;
          发表时间: 2008年02月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          spring之父：Rod Jhonson<br />spring背景：一个实际的项目提炼出来<br />spring精髓：工厂模式+单例模式<br />spring好处：<br />	1.降低开发成本，是开发人员更专注业务逻辑，不比为一些难以实现而头痛，可维护性更强<br />	2.更容易扩展，spring遵循面向接口的编程，可以让可以人员定制自己的类<br />	3.非入侵性，让开发人员写的东西，随意转移到别的地方均可使用<br />	4.集成框架，比如hibernate，ibatis，jdo，等<br />	5.统一配置，灵活配置而且统一，不要自制的singleton and factory，从中间层到web控制器，所有配置需求可以统一的方式满足。<br />	6.方便使用，j2ee的复杂度太高，使用spring可以简化（注：spring很多不是j2ee的标准）<br />	7.方便测试，可以很轻松使用伪对象模拟整个资源。<br />	8.易于选择，允许用户单独实现某个功能，而不是把自己的整个架构强加给用户，可以单独使用其中的特性，比如aop，jdbc等
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/162737#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>Sun, 17 Feb 2008 10:21:20 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/162737</link>
        <guid>http://harrison2010.javaeye.com/blog/162737</guid>
      </item>
      <item>
        <title>myeclipse目录结构探究</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/162735" style="color:red;">http://harrison2010.javaeye.com/blog/162735</a>&nbsp;
          发表时间: 2008年02月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          假设根目录就是myeclipse<br /><br />1.myeclipse目录<br /> |<br /> |-----必须包含eclipse目录<br /> |		|<br /> |		|----包含features目录以及plugins目录<br />（这个目录总体是安装了myeclipse插件的目录，而且这个大的myeclipse插件实际是由很多小的插件组成的，比如tomacat插件，spring插件等等）<br /><br />2.数据库操作目录dbexplorer（应该是一个插件吧）---	|<br />3.htmldesigner目录（是编写web开发的目录）-------- |<br />4.imageeditor目录（是编写图像的目录）	 ------	|----感觉这些都是一些编辑器的插件<br />5.texteditor目录（文本编辑器目录）	-------	|<br />6.xmleditor目录（xml文件编辑使用目录）	-------	|<br /><br />7.ecplise目录（是纯eclipse的目录吧）<br />8.jre目录（可以使用myeclipse自己待的jvm，这个目录纯的eclipse也有的，这里面没有源代码）<br /><br /><br />9.uninstallerResorece(卸载myeclipse)目录<br /><br /><br />再来看看eclipse下面的目录结构<br />configuration<br />features<br />plugins<br />readme<br /><br />可以看做仅仅是一个含有自己eclipse的插件，包含自己的根目录就相当于myeclipse里面eclipse目录<br />纯的eclipse没有jre目录，因此要配合jdk来使用<br /><br />如果想在纯的eclipse下面安装插件，可以参照（eclipse下的插件管理文章）<br /><br />以上自己总结，如果有不对的地方敬请指导！！！！<br />-------------------------------------------------------<br />互相学习，共同进步
          <br/><br/>
          <span style="color:red;">
            <a href="http://harrison2010.javaeye.com/blog/162735#comments" style="color:red;">已有 <strong>1</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, 17 Feb 2008 10:15:16 +0800</pubDate>
        <link>http://harrison2010.javaeye.com/blog/162735</link>
        <guid>http://harrison2010.javaeye.com/blog/162735</guid>
      </item>
      <item>
        <title>iBatis（另一种映射）</title>
        <author>harrison2010</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://harrison2010.javaeye.com">harrison2010</a>&nbsp;
          链接：<a href="http://harrison2010.javaeye.com/blog/162020" style="color:red;">http://harrison2010.javaeye.com/blog/162020</a>&nbsp;
          发表时间: 2008年02月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          iBatis是又一个O/R Mapping解决方案，j2ee的O/R方案真是多，和Hibernate相比，iBatis最大的特点就是小巧，上手很快。然后注意到这个配置文件还引用了一个Account.xml，没错，iBatis把每个需要O/R Mapping的Java对象关联到一个xml配置文件，我们需要把一个Account表映射到一个Account类：try { Account accout = (Account)sqlMap.try { Account account = new Account();需要注意的是使用iBatis 2.0和1.0有较大区别，主要体现在配置文件上，iBatis 2.0