<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>snowmanjy</title>
    <description></description>
    <link>http://snowmanjy.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>snowmanjy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://snowmanjy.javaeye.com">snowmanjy</a>&nbsp;
          链接：<a href="http://snowmanjy.javaeye.com/blog/41815" style="color:red;">http://snowmanjy.javaeye.com/blog/41815</a>&nbsp;
          发表时间: 2006年12月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>早上来就看了几个帖子</p>
<p>都是年底开始关心理财了</p>
<p>这是好事</p>
<p>个人建议可以买基金</p>
<p>术业有专攻</p>
<p>买基金就属于把钱交给专业的基金经理去打理投资</p>
<p>我们可以继续安心coding等着钱变多</p>
<p>最好是做定期定额投资</p>
<p>但是无论做什么都要做足研究</p>
<p>没有不花心思就来钱的好事</p>
<p>而且对自己可怜的钱包要负责任</p>
<p>推荐看laok的博客：</p>
<p><a href="http://laok2.blog.sohu.com/">laok2.blog.sohu.com/</a></p>
<p>基金本身就比股票的风险低</p>
<p>把他的所有文章都看一遍我想你的风险就又减少了许多</p>
          <br/>
          <span style="color:red;">
            <a href="http://snowmanjy.javaeye.com/blog/41815#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 31 Dec 2006 10:25:48 +0800</pubDate>
        <link>http://snowmanjy.javaeye.com/blog/41815</link>
        <guid>http://snowmanjy.javaeye.com/blog/41815</guid>
      </item>
      <item>
        <title>【转】如何干掉qq宠物</title>
        <author>snowmanjy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://snowmanjy.javaeye.com">snowmanjy</a>&nbsp;
          链接：<a href="http://snowmanjy.javaeye.com/blog/36826" style="color:red;">http://snowmanjy.javaeye.com/blog/36826</a>&nbsp;
          发表时间: 2006年12月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <img src="http://17668.gs.chinavnet.com/asp/bbs/UserUpImages/2006165343195.jpg" alt="" />
          <br/>
          <span style="color:red;">
            <a href="http://snowmanjy.javaeye.com/blog/36826#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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, 01 Dec 2006 14:30:01 +0800</pubDate>
        <link>http://snowmanjy.javaeye.com/blog/36826</link>
        <guid>http://snowmanjy.javaeye.com/blog/36826</guid>
      </item>
      <item>
        <title>赞美我国伟大的信息化建设</title>
        <author>snowmanjy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://snowmanjy.javaeye.com">snowmanjy</a>&nbsp;
          链接：<a href="http://snowmanjy.javaeye.com/blog/35182" style="color:red;">http://snowmanjy.javaeye.com/blog/35182</a>&nbsp;
          发表时间: 2006年11月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>周末去建行交房贷，居然发现帐户里面剩余的几百块钱被划走了。打电话一问建行，系统升级导致错误，真是晕死。。。</p>
<p>想起这几年来经常听报道有人卡上莫名其妙多了钱少了钱，没想到普及的这么快，自己也有中奖的时候。不由得感慨起我国信息化建设的伟大成果，高喊信息化建设这么多年了，银行系统竟然还不时出错，真是不知道该说些什么好。</p>
<p>还有一个领域－电信，本来就是做这个的，在圈里看到的烂帐就更多了。这不，上个月北京移动boss三期升级刚完事，这个月动感地带大量客户立马被多扣钱停机，打电话一问1860，人家mm也很无奈－系统升级故障，什么时候正常我们也得等通知。。。</p>
<p>我一朋友问的好，系统出故障也就罢了，可是为什么每次都是多扣钱而不是多给钱呢？谁知道。。。</p>
          <br/>
          <span style="color:red;">
            <a href="http://snowmanjy.javaeye.com/blog/35182#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 20 Nov 2006 12:31:00 +0800</pubDate>
        <link>http://snowmanjy.javaeye.com/blog/35182</link>
        <guid>http://snowmanjy.javaeye.com/blog/35182</guid>
      </item>
      <item>
        <title>找不到com.sun.jdmk.comm.HtmlAdaptorServer的同学看过来</title>
        <author>snowmanjy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://snowmanjy.javaeye.com">snowmanjy</a>&nbsp;
          链接：<a href="http://snowmanjy.javaeye.com/blog/34382" style="color:red;">http://snowmanjy.javaeye.com/blog/34382</a>&nbsp;
          发表时间: 2006年11月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          很多jmx教程的例子里面都会用到com.sun.jdmk.comm.HtmlAdaptorServer这个类，不知道怎么去找到，其实这是sun的一个产品包里面的，获得方法：到<a href="http://www.sun.com/software/jdmk/" target="_blank">http://www.sun.com/software/jdmk/</a>，选择右边的Trial Download链接，输入sun download center的帐号（没有就注册一个，很快的）就可以下载了，sun-jdmk-runtime-5.1-b34.2.zip/SUNWjdmk/5.1/lib/jdmkrt.jar 就是需要的包，引到classpath里面就可以了。
          <br/>
          <span style="color:red;">
            <a href="http://snowmanjy.javaeye.com/blog/34382#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 15 Nov 2006 15:40:19 +0800</pubDate>
        <link>http://snowmanjy.javaeye.com/blog/34382</link>
        <guid>http://snowmanjy.javaeye.com/blog/34382</guid>
      </item>
      <item>
        <title>是不是老了，总是怀念过去的岁月</title>
        <author>snowmanjy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://snowmanjy.javaeye.com">snowmanjy</a>&nbsp;
          链接：<a href="http://snowmanjy.javaeye.com/blog/33980" style="color:red;">http://snowmanjy.javaeye.com/blog/33980</a>&nbsp;
          发表时间: 2006年11月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前几天梦中，回到了大学宿舍，醒来愣神半天。回忆起那些逃课独自徜徉在阳光灿烂校园的日子；想起了宿舍窗外的海，在晴朗的日子里，波光粼粼，悬于远方天际。<br /><br />  周末和原来在秦皇岛东软的同事聚了聚，大家聊起那时的事情和同事们都非常开心。我们讨论了下为什么也都经历了好几个公司了，最怀念的还是那段日子。得出结论大概是因为那是我们的第一个单位吧，大家都是在经历着从学生到程序员的转变，还一起跟着公司搬了一次家，然后又一起住进了公司的单身宿舍，此后聚餐串门无数^_^<br /><br />  有时在安静的时候，会想起那时，周末一群同事相约去海边玩上一天，海风、海滩、阳光总是让人感到愉快。没有那么多烦恼，没有那么多压力。而现在，我们来到北京的一群自不必说，便是留在秦皇岛的那些，也已经因为成了家，或是在公司慢慢的想职位高些，渐渐的有些关系不那么好了。<br /><br />  有些时光，有些岁月，怕是一生只有那么一次，无法重现。只有在悠闲之时，从记忆中慢慢浮现，使人如饮甘露，轻轻微笑，便也足够了。
          <br/>
          <span style="color:red;">
            <a href="http://snowmanjy.javaeye.com/blog/33980#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 13 Nov 2006 10:43:21 +0800</pubDate>
        <link>http://snowmanjy.javaeye.com/blog/33980</link>
        <guid>http://snowmanjy.javaeye.com/blog/33980</guid>
      </item>
      <item>
        <title>[转]关于Java栈与堆的思考</title>
        <author>snowmanjy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://snowmanjy.javaeye.com">snowmanjy</a>&nbsp;
          链接：<a href="http://snowmanjy.javaeye.com/blog/32033" style="color:red;">http://snowmanjy.javaeye.com/blog/32033</a>&nbsp;
          发表时间: 2006年11月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          关于Java栈与堆的思考 <br />作者：zdmilan    来自：CSDN<br /><br />　　1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同，Java自动管理栈和堆，程序员不能直接地设置栈或堆。<br /><br />　　2. 栈的优势是，存取速度比堆要快，仅次于直接位于CPU中的寄存器。但缺点是，存在栈中的数据大小与生存期必须是确定的，缺乏灵活性。另外，栈数据可以共享，详见第3点。堆的优势是可以动态地分配内存大小，生存期也不必事先告诉编译器，Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是，由于要在运行时动态分配内存，存取速度较慢。<br /><br />　　3. Java中的数据类型有两种。<br />　　一种是基本类型(primitive types), 共有8种，即int, short, long, byte, float, double, boolean, char(注意，并没有string的基本类型)。这种类型的定义是通过诸如int a = 3; long b = 255L;的形式来定义的，称为自动变量。值得注意的是，自动变量存的是字面值，不是类的实例，即不是类的引用，这里并没有类的存在。如int a = 3; 这里的a是一个指向int类型的引用，指向3这个字面值。这些字面值的数据，由于大小可知，生存期可知(这些字面值固定定义在某个程序块里面，程序块退出后，字段值就消失了)，出于追求速度的原因，就存在于栈中。<br />　　另外，栈有一个很重要的特殊性，就是存在栈中的数据可以共享。假设我们同时定义<br /><br /><pre name="code" class="java">　　int a = 3; 
　　int b = 3；
</pre><br />　　编译器先处理int a = 3；首先它会在栈中创建一个变量为a的引用，然后查找有没有字面值为3的地址，没找到，就开辟一个存放3这个字面值的地址，然后将a指向3的地址。接着处理int b = 3；在创建完b的引用变量后，由于在栈中已经有3这个字面值，便将b直接指向3的地址。这样，就出现了a与b同时均指向3的情况。<br />　　特别注意的是，这种字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象，如果一个对象引用变量修改了这个对象的内部状态，那么另一个对象引用变量也即刻反映出这个变化。相反，通过字面值的引用来修改其值，不会导致另一个指向此字面值的引用的值也跟着改变的情况。如上例，我们定义完a与 b的值后，再令a=4；那么，b不会等于4，还是等于3。在编译器内部，遇到a=4；时，它就会重新搜索栈中是否有4的字面值，如果没有，重新开辟地址存放4的值；如果已经有了，则直接将a指向这个地址。因此a值的改变不会影响到b的值。<br />　　另一种是包装类数据，如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据全部存在于堆中，Java用new()语句来显示地告诉编译器，在运行时才根据需要动态创建，因此比较灵活，但缺点是要占用更多的时间。<br /><br />　　4. String是一个特殊的包装类数据。即可以用String str = new String("abc");的形式来创建，也可以用String str = "abc"；的形式来创建(作为对比，在JDK 5.0之前，你从未见过Integer i = 3;的表达式，因为类与字面值是不能通用的，除了String。而在JDK 5.0中，这种表达式是可以的！因为编译器在后台进行Integer i = new Integer(3)的转换)。前者是规范的类的创建过程，即在Java中，一切都是对象，而对象是类的实例，全部通过new()的形式来创建。Java 中的有些类，如DateFormat类，可以通过该类的getInstance()方法来返回一个新创建的类，似乎违反了此原则。其实不然。该类运用了单例模式来返回类的实例，只不过这个实例是在该类内部通过new()来创建的，而getInstance()向外部隐藏了此细节。那为什么在String str = "abc"；中，并没有通过new()来创建实例，是不是违反了上述原则？其实没有。<br /><br />　　5. 关于String str = "abc"的内部工作。Java内部将此语句转化为以下几个步骤：<br />　　(1)先定义一个名为str的对String类的对象引用变量：String str；<br />　　(2)在栈中查找有没有存放值为"abc"的地址，如果没有，则开辟一个存放字面值为"abc"的地址，接着创建一个新的String类的对象o，并将o 的字符串值指向这个地址，而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"abc"的地址，则查找对象o，并返回o的地址。<br />　　(3)将str指向对象o的地址。<br />　　值得注意的是，一般String类中字符串值都是直接存值的。但像String str = "abc"；这种场合下，其字符串值却是保存了一个指向存在栈中数据的引用！<br />  <br />　　为了更好地说明这个问题，我们可以通过以下的几个代码进行验证。<br /><br /><pre name="code" class="java">　　String str1 = "abc";
　　String str2 = "abc";
　　System.out.println(str1==str2);  //true</pre><br />  <br />　　注意，我们这里并不用str1.equals(str2)；的方式，因为这将比较两个字符串的值是否相等。==号，根据JDK的说明，只有在两个引用都指向了同一个对象时才返回真值。而我们在这里要看的是，str1与str2是否都指向了同一个对象。<br />　　结果说明，JVM创建了两个引用str1和str2，但只创建了一个对象，而且两个引用都指向了这个对象。<br /><br />　　我们再来更进一步，将以上代码改成：<br /><pre name="code" class="java">
　　String str1 = "abc";
　　String str2 = "abc";
　　str1 = "bcd";
　　System.out.println(str1 + "," + str2);  //bcd, abc
　　System.out.println(str1==str2);  //false
</pre><br />　　这就是说，赋值的变化导致了类对象引用的变化，str1指向了另外一个新对象！而str2仍旧指向原来的对象。上例中，当我们将str1的值改为"bcd"时，JVM发现在栈中没有存放该值的地址，便开辟了这个地址，并创建了一个新的对象，其字符串的值指向这个地址。<br />　　事实上，String类被设计成为不可改变(immutable)的类。如果你要改变其值，可以，但JVM在运行时根据新值悄悄创建了一个新对象，然后将这个对象的地址返回给原来类的引用。这个创建过程虽说是完全自动进行的，但它毕竟占用了更多的时间。在对时间要求比较敏感的环境中，会带有一定的不良影响。<br /><br />　　再修改原来代码：<br /><pre name="code" class="java">
　　String str1 = "abc";
　　String str2 = "abc";
  
　　str1 = "bcd";
  
　　String str3 = str1;
　　System.out.println(str3);  //bcd

　　String str4 = "bcd";
　　System.out.println(str1 == str4);  //true
    </pre><br />　　str3 这个对象的引用直接指向str1所指向的对象(注意，str3并没有创建新对象)。当str1改完其值后，再创建一个String的引用str4，并指向因str1修改值而创建的新的对象。可以发现，这回str4也没有创建新的对象，从而再次实现栈中数据的共享。<br /><br />　　我们再接着看以下的代码。<br /><pre name="code" class="java">
　　String str1 = new String("abc");
　　String str2 = "abc";
　　System.out.println(str1==str2);  //false</pre><br /><br />　　创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。<br /><br /><pre name="code" class="java">　　String str1 = "abc";
　　String str2 = new String("abc");
　　System.out.println(str1==str2);  //false</pre><br /><br />　　创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。<br /><br />　　以上两段代码说明，只要是用new()来新建对象的，都会在堆中创建，而且其字符串是单独存值的，即使与栈中的数据相同，也不会与栈中的数据共享。<br /><br />　　6. 数据类型包装类的值不可修改。不仅仅是String类的值不可修改，所有的数据类型包装类都不能更改其内部的值。<br /><br />　　7. 结论与建议：<br /><br />　　(1)我们在使用诸如String str = "abc"；的格式定义类时，总是想当然地认为，我们创建了String类的对象str。担心陷阱！对象可能并没有被创建！唯一可以肯定的是，指向 String类的引用被创建了。至于这个引用到底是否指向了一个新的对象，必须根据上下文来考虑，除非你通过new()方法来显要地创建一个新的对象。因此，更为准确的说法是，我们创建了一个指向String类的对象的引用变量str，这个对象引用变量指向了某个值为"abc"的String类。清醒地认识到这一点对排除程序中难以发现的bug是很有帮助的。<br /><br />　　(2)使用String str = "abc"；的方式，可以在一定程度上提高程序的运行速度，因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc")；的代码，则一概在堆中创建新对象，而不管其字符串值是否相等，是否有必要创建新对象，从而加重了程序的负担。这个思想应该是享元模式的思想，但JDK的内部在这里实现是否应用了这个模式，不得而知。<br /><br />　　(3)当比较包装类里面的数值是否相等时，用equals()方法；当测试两个包装类的引用是否指向同一个对象时，用==。<br /><br />　　(4)由于String类的immutable性质，当String变量需要经常变换其值时，应该考虑使用StringBuffer类，以提高程序效率。
          <br/>
          <span style="color:red;">
            <a href="http://snowmanjy.javaeye.com/blog/32033#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Nov 2006 18:43:14 +0800</pubDate>
        <link>http://snowmanjy.javaeye.com/blog/32033</link>
        <guid>http://snowmanjy.javaeye.com/blog/32033</guid>
      </item>
      <item>
        <title>[转]转两篇有关接口和抽象类的好文章以备忘</title>
        <author>snowmanjy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://snowmanjy.javaeye.com">snowmanjy</a>&nbsp;
          链接：<a href="http://snowmanjy.javaeye.com/blog/32032" style="color:red;">http://snowmanjy.javaeye.com/blog/32032</a>&nbsp;
          发表时间: 2006年11月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          snowmanjy @ 2006年06月30日, 10:08:48 下午 CST<br /><br /><br /><br /><br /><br />抽象类与接口的区别<br /><br />abstract<br /><br />class和interface是Java语言中对于抽象类定义进行支持的两种机制，正是由于这两种机制的存在，才赋予了Java强大的面向对象能力。<br /><br />abstract<br /><br />class和interface之间在对于抽象类定义的支持方面具有很大的相似性，甚至可以相互替换，因此很多开发者在进行抽象类定义时对于<br /><br />abstract class和interface的选择显得比较随意。<br />其实，两者之间还是有很大的区别的，对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析，试图给开发者提供一个在二者之间进行选择的依据。<br />一、理解抽象类<br />abstract<br /><br />class和interface在Java语言中都是用来进行抽象类（本文中的抽象类并非从abstract<br /><br />class翻译而来，它表示的是一个抽象体，而abstract<br /><br />class为Java语言中用于定义抽象类的一种方法，请读者注意区分）定义的，那么什么是抽象类，使用抽象类能为我们带来什么好处呢？<br />在面向对<br /><br />象的概念中，我们知道所有的对象都是通过类来描绘的，但是反过来却不是这样。并不是所有的类都是用来描绘对象的，如果一个类中没有包含足够的信息来描绘一<br /><br />个具体的对象，这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念，是对一系列看上去不同，但是本质上相同的具体概<br /><br />念的抽象。<br />比如：如果我们进行一个图形编辑软件的开发，就会发现问题领域存在着圆、三角形这样一些具体概念，它们是不同的，但是它们又都属于形状<br /><br />这样一个概念，形状这个概念在问题领域是不存在的，它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念，所以用以表征抽象概念的抽象类<br /><br />是不能够实例化的。<br />在面向对象领域，抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述，但是这组行为却能够有任意个可能<br /><br />的具体实现方式。这个抽象描述就是抽象类，而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽<br /><br />象体，因此它可以是不允许修改的；同时，通过从这个抽象体派生，也可扩展此模块的行为功能。熟悉OCP的读者一定知道，为了能够实现面向对象设计的一个最<br /><br />核心的原则OCP(Open-Closed Principle)，抽象类是其中的关键所在。<br />二、从语法定义层面看abstract class和interface<br />在语法层面，Java语言对于abstract class和interface给出了不同的定义方式，下面以定义一个名为Demo的抽象类为例来说明这种不同。使用abstract class的方式定义Demo抽象类的方式如下：<br /><br />abstract class Demo ｛<br />abstract void method1();<br />abstract void method2();<br />…<br />｝<br /><br /><br />使用interface的方式定义Demo抽象类的方式如下：<br /><br />interface Demo {<br />void method1();<br />void method2();<br />…<br />}<br /><br /><br />在abstract<br /><br />class方式中，Demo可以有自己的数据成员，也可以有非abstarct的成员方法，而在interface方式的实现中，Demo只能够有静态的<br /><br />不能被修改的数据成员（也就是必须是static<br /><br />final的，不过在interface中一般不定义数据成员），所有的成员方法都是abstract的。从某种意义上说，interface是一种特殊<br /><br />形式的abstract class。<br />从编程的角度来看，abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。<br />首先，abstract class在Java语言中表示的是一种继承关系，一个类只能使用一次继承关系。但是，一个类却可以实现多个interface。也许，这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。<br />其次，在abstract class的定义中，我们可以赋予方法的默认行为。但是在interface的定义中，方法却不能拥有默认行为，为了绕过这个限制，必须使用委托，但是这会 增加一些复杂性，有时会造成很大的麻烦。<br />在<br /><br />抽象类中不能定义默认行为还存在另一个比较严重的问题，那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面（一般通过abstract<br /><br />class或者interface来表示）以适应新的情况（比如，添加新的方法或者给已用的方法中添加新的参数）时，就会非常的麻烦，可能要花费很多的时<br /><br />间（对于派生类很多的情况，尤为如此）。但是如果界面是通过abstract class来实现的，那么可能就只需要修改定义在abstract<br /><br />class中的默认行为就可以了。<br />同样，如果不能在抽象类中定义默认行为，就会导致同样的方法实现出现在该抽象类的每一个派生类中，违反了<br /><br />“one rule，one place”原则，造成代码重复，同样不利于以后的维护。因此，在abstract<br /><br />class和interface间进行选择时要非常的小心。<br />三、从设计理念层面看abstract class和interface<br />上<br /><br />面主要从语法定义和编程的角度论述了abstract<br /><br />class和interface的区别，这些层面的区别是比较低层次的、非本质的。本文将从另一个层面：abstract<br /><br />class和interface所反映出的设计理念，来分析一下二者的区别。作者认为，从这个层面进行分析才能理解二者概念的本质所在。<br />前面<br /><br />已经提到过，abstarct class在Java语言中体现了一种继承关系，要想使得继承关系合理，父类和派生类之间必须存在”is<br /><br />a”关系，即父类和派生类在概念本质上应该是相同的。对于interface<br /><br />来说则不然，并不要求interface的实现者和interface定义在概念本质上是一致的，仅仅是实现了interface定义的契约而已。为了使<br /><br />论述便于理解，下面将通过一个简单的实例进行说明。<br />考虑这样一个例子，假设在我们的问题领域中有一个关于Door的抽象概念，该Door具有执行两个动作open和close，此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型，定义方式分别如下所示：<br /><br />使用abstract class方式定义Door：<br /><br />abstract class Door {<br />abstract void open();<br />abstract void close()；<br />}<br /><br />使用interface方式定义Door：<br /><br />interface Door {<br />void open();<br />void close();<br />}<br /><br /><br />其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。<br />如<br /><br />果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢（在本例中，主要是为了展示abstract<br /><br />class和interface反映在设计理念上的区别，其他方面无关的问题都做了简化或者忽略）下面将罗列出可能的解决方案，并从设计理念层面对这些不<br /><br />同的方案进行分析。<br />解决方案一：<br />简单的在Door的定义中增加一个alarm方法，如下：<br /><br />abstract class Door {<br />abstract void open();<br />abstract void close()；<br />abstract void alarm();<br />}<br /><br /><br />或者<br /><br />interface Door {<br />void open();<br />void close();<br />void alarm();<br />}<br /><br /><br />那么具有报警功能的AlarmDoor的定义方式如下：<br /><br />class AlarmDoor extends Door {<br />void open() { … }<br />void close() { … }<br />void alarm() { … }<br />}<br /><br /><br />或者<br /><br />class AlarmDoor implements Door ｛<br />void open() { … }<br />void close() { … }<br />void alarm() { … }<br />｝<br /><br /><br />这<br /><br />种方法违反了面向对象设计中的一个核心原则ISP（Interface Segregation<br /><br />Priciple），在Door的定义中把Door概念本身固有的行为方法和另外一个概念“报警器”的行为方法混在了一起。这样引起的一个问题是那些仅仅<br /><br />依赖于Door这个概念的模块会因为“报警器”这个概念的改变（比如：修改alarm方法的参数）而改变，反之依然。<br />解决方案二：<br />既<br /><br />然open、close和alarm属于两个不同的概念，根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有：这两个概念都使用<br /><br />abstract class方式定义；两个概念都使用interface方式定义；一个概念使用abstract<br /><br />class方式定义，另一个概念使用interface方式定义。<br />显然，由于Java语言不支持多重继承，所以两个概念都使用abstract class方式定义是不可行的。后面两种方式都是可行的，但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。<br />如果两个概念都使用interface方式来定义，那么就反映出两个问题：<br />1、我们可能没有理解清楚问题领域，AlarmDoor在概念本质上到底是Door还是报警器？<br />2、<br /><br />如果我们对于问题领域的理解没有问题，比如：我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的，那么我们在实现时就没有<br /><br />能够正确的揭示我们的设计意图，因为在这两个概念的定义上（均使用interface方式定义）反映不出上述含义。<br />如果我们对于问题领域的理<br /><br />解是：AlarmDoor在概念本质上是Door，同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢？前面已经说过，<br /><br />abstract class在Java语言中表示一种继承关系，而继承关系在本质上是”is<br /><br />a”关系。所以对于Door这个概念，我们应该使用abstarct<br /><br />class方式来定义。另外，AlarmDoor又具有报警功能，说明它又能够完成报警概念中定义的行为，所以报警概念可以通过interface方式定<br /><br />义。如下所示：<br /><br />abstract class Door {<br />abstract void open();<br />abstract void close()；<br />}<br />interface Alarm {<br />void alarm();<br />}<br />class AlarmDoor extends Door implements Alarm {<br />void open() { … }<br />void close() { … }<br />void alarm() { … }<br />}<br /><br /><br />这<br /><br />种实现方式基本上能够明确的反映出我们对于问题领域的理解，正确的揭示我们的设计意图。其实abstract class表示的是”is<br /><br />a“关系，interface表示的是”like<br /><br />a”关系，大家在选择时可以作为一个依据，当然这是建立在对问题领域的理解上的，比如：如果我们认为AlarmDoor在概念本质上是报警器，同时又具有<br /><br />Door的功能，那么上述的定义方式就要反过来了。<br />abstract<br /><br />class和interface是Java语言中的两种定义抽象类的方式，它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概<br /><br />念本质的理解、对于设计意图的反映是否正确、合理，因为它们表现了概念间的不同的关系（虽然都能够实现需求的功能）。这其实也是语言的一种的惯用法，希望<br /><br />读者朋友能够细细体会<br /><br /><br />转自<br />http://www.54bk.com/user1/4073/archives/2005/9209.html<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />Java语言的接口与类型安全<br /><br /><br /> 接口是实现构件可插入性的关键，可插入构件的关键在于存在一个公用的接口，以及每个构件实现了这个接口。<br /><br /><br /><br /><br /><br />  什么是接口？<br /><br /><br /><br /><br /><br />      Java中的接口是一系列方法的声明，是一些方法特征的集合，一个接口只有方法的特征没有方法的实现，因此这些方法可以在不同的地方被不同的类实现，而这些实现可以具有不同的行为（功能）。<br /><br /><br /><br /><br /><br />接口的两种含义：一，Java接口，Java语言中存在的结构，有特定的语法和结构；二，一个类所具有的方法的特征集合，是一种逻辑上的抽象。前者叫做“Java接口”，后者叫做“接口”。<br /><br /><br /><br /><br /><br />在Java语言规范中，一个方法的特征仅包括方法的名字，参数的数目和种类，而不包括方法的返回类型，参数的名字以及所抛出来的异常。在Java编译器检<br /><br />查方法的重载时，会根据这些条件判断两个方法是否是重载方法。但在Java编译器检查方法的置换时，则会进一步检查两个方法（分处超类型和子类型）的返还<br /><br />类型和抛出的异常是否相同。<br /><br /><br /><br /><br /><br />接口继承和实现继承的规则不同，一个类只有一个直接父类，但可以实现多个接口。<br /><br /><br /><br /><br /><br />Java接口本身没有任何实现，因为Java接口不涉及表象，而只描述public行为，所以Java接口比Java抽象类更抽象化。<br /><br /><br /><br /><br /><br />Java接口的方法只能是抽象的和公开的，Java接口不能有构造器，Java接口可以有public,静态的和final属性。<br /><br /><br /><br /><br /><br />接口把方法的特征和方法的实现分割开来。这种分割体现在接口常常代表一个角色，它包装与该角色相关的操作和属性，而实现这个接口的类便是扮演这个角色的演员。一个角色由不同的演员来演，而不同的演员之间除了扮演一个共同的角色之外，并不要求其它的共同之处。<br /><br /><br /><br /><br /><br />  <br /><br /><br /><br /><br /><br />为什么使用接口？<br /><br /><br /><br /><br /><br />    两个类中的两个类似的功能，调用他们的类动态的决定一种实现，那他们提供一个抽象父类，子类分别实现父类所定义的方法。<br /><br /><br /><br /><br /><br />问题的出现：Java是一种单继承的语言，一般情况下，哪个具体类可能已经有了一个超类，解决是给它的父类加父类，或者给它父类的父类加父类，只到移动到类等级结构的最顶端。这样一来，对一个具体类的可插入性的设计，就变成了对整个等级结构中所有类的修改。<br /><br /><br /><br /><br /><br />接口是可插入性的保证。<br /><br /><br /><br /><br /><br />在一个等级结构中的任何一个类都可以实现一个接口，这个接口会影响到此类的所有子类，但不会影响到此类的任何超类。此类将不得不实现这个接口所规定的方<br /><br />法，而其子类可以从此类自动继承这些方法，当然也可以选择置换掉所有的这些方法，或者其中的某一些方法，这时候，这些子类具有了可插入性（并且可以用这个<br /><br />接口类型装载，传递实现了他的所有子类）。<br /><br /><br /><br /><br /><br />我们关心的不是那一个具体的类，而是这个类是否实现了我们需要的接口。<br /><br /><br /><br /><br /><br />接口提供了关联以及方法调用上的可插入性，软件系统的规模越大，生命周期越长，接口使得软件系统的灵活性和可扩展性，可插入性方面得到保证。<br /><br /><br /><br /><br /><br />  <br /><br /><br /><br /><br /><br />类型<br /><br /><br /><br /><br /><br />   使用Java接口将软件单位与内部和外部耦合起来。使用Java接口不是具体的类进行变量的类型声明，方法的返还类型声明，参量的类型声明，以及数据类型的转换。<br /><br /><br /><br /><br /><br />   在理想的情况下，一个具体的Java类应当只实现Java接口和抽象Java类中声明的方法，而不应当给多余方法。<br /><br /><br /><br /><br /><br />类型等级结构<br /><br /><br /><br /><br /><br />Java接口（以及抽象类）一般用来作为一个类型的等级结构的起点。<br /><br /><br /><br /><br /><br />如果一个类已经有了一个主要的超类型，那么通过实现一个接口，这个类可以拥有另一个次要的超类型，这种次要的超类型叫做混合类型。<br /><br /><br /><br /><br /><br />  <br /><br /><br /><br /><br /><br />Java接口常用方法<br /><br /><br /><br /><br /><br />单方法接口<br /><br /><br /><br /><br /><br />   public interface Actionlistener(){<br /><br /><br /><br /><br /><br />      public abstract void actionPerformed(ActionEvent event);<br /><br /><br /><br /><br /><br />   }<br /><br /><br /><br /><br /><br />  仅且只有一个方法，只有实现了这个接口（重写这个接口中的唯一一个方法），你才有资格去事件监听器列表里注册（参数为Actionlistener类型），当事件源变动时，自动调用这个唯一的actionPerformed方法.<br /><br /><br /><br /><br /><br />标识接口<br /><br /><br /><br /><br /><br />是没有任何方法和属性的接口。标识接口不对实现它的类有任何语意上的要求，它仅仅表明了实现它的类属于一个特定的类型（传递）。<br /><br /><br /><br /><br /><br />不推荐过多的使用标识接口。<br /><br /><br /><br /><br /><br />常量接口<br /><br /><br /><br /><br /><br />用Java接口来声明一些常量，然后由实现这个接口的类使用这些常量（以前在做画板的时候这么干过）。建议不要模仿这种常量接口的做法。<br /><br /><br /><br /><br /><br />  <br /><br /><br /><br /><br /><br />Java语言类型安全问题<br /><br /><br /><br /><br /><br />Java是强类型的语言。这意味着Java编译器会对代码进行检查，以确定没一次赋值，每一次方法的调用是符合类型的。如果有任何不相符合的情况，Java编译器就会给出错误。<br /><br /><br /><br /><br /><br />类型检查是基于这样一个简单的事实：每一变量的声明都给这个变量一个类型；每一个方法包括构造器的声明都给这个方法的特征。这样一来，Java编译器可以对任何的表达式推断出一个明显类型，Java编译器可以基于明显类型对类型进行检查。<br /><br /><br /><br /><br /><br />Java语言是类型安全的。这就是说，任何被Java编译器接受的合法的Java类保证是类型安全的。换言之，在程序运行期间，不会有任何类型的错误。一个Java程序根本不可能将一个本来属于一个类型的变量当作另一个类型处理，因此也就不会产生由此而引起的错误。<br /><br /><br /><br /><br /><br />简单的说，Java语言依靠三种机制做到了类型安全：编译期间的类型检查，自动的存储管理，数组的边界检查。
          <br/>
          <span style="color:red;">
            <a href="http://snowmanjy.javaeye.com/blog/32032#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Nov 2006 18:39:22 +0800</pubDate>
        <link>http://snowmanjy.javaeye.com/blog/32032</link>
        <guid>http://snowmanjy.javaeye.com/blog/32032</guid>
      </item>
      <item>
        <title>整合struts到opencms的步骤</title>
        <author>snowmanjy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://snowmanjy.javaeye.com">snowmanjy</a>&nbsp;
          链接：<a href="http://snowmanjy.javaeye.com/blog/32031" style="color:red;">http://snowmanjy.javaeye.com/blog/32031</a>&nbsp;
          发表时间: 2006年11月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          snowmanjy @ 2006年06月17日, 06:00:20 下午 CST<br /><br /><br /><br />前一段时间的工作研究成果，希望能够对要做相应整合的人有所帮助：<br /><br />1.    对opencms webapp的文件修改：<br /><br />    1.1.    添加必要的jar文件：将struts发行版本的lib目录（比如：D:\struts-1.2.9-bin\lib）下的所有jar包拷贝到 opencms项目的lib目录（比如：D:\jakarta_tomcat_5_0_30\webapps\opencms\WEB-INF\lib）下面；<br />    1.2.    添加必要的tld文件：将struts发行版本的lib目录（比如：D:\struts-1.2.9-bin\lib）下的所有tld文件拷贝到 opencms项目的WEB-INF目录（比如：D:\jakarta_tomcat_5_0_30\webapps\opencms\WEB-INF）下面；<br />    1.3.    修改web.xml文件添加struts ActionServlet声明和tld文件声明：<br /><br />        1.3.1 struts ActionServlet声明部分：<br /><br />             <div class="quote_title">引用</div><div class="quote_div"> &lt;!-- Struts Action Servlet Configuration  -><br />              &lt;servlet><br />                &lt;servletname>action&lt;/servlet-name><br />                &lt;servlet-class>org.apache.struts.action.ActionServlet&lt;/servlet-class><br />                &lt;init-param><br />                  &lt;param-name>config&lt;/param-name><br />                  &lt;param-value>/WEB-INF/struts-config.xml&lt;/param-value><br />                &lt;/init-param><br />                &lt;init-param><br />                  &lt;param-name>debug&lt;/param-name><br />                  &lt;param-value>2&lt;/param-value><br />                &lt;/init-param><br />                &lt;init-param><br />                  &lt;param-name>detail&lt;/param-name><br />                  &lt;param-value>2&lt;/param-value><br />                &lt;/init-param><br /><br />                 &lt;load-on-startup>1&lt;/load-on-startup><br />              &lt;/servlet><br /><br />              &lt;!-- struts action mapping--><br />              &lt;servlet-mapping><br />                &lt;servlet-name>action&lt;/servlet-name><br />                &lt;url-pattern>*.do&lt;/url-pattern><br />              &lt;/servlet-mapping></div><br /><br />        1.3.2 struts tld文件声明部分：<br /><br />        <br />       <div class="quote_title">引用</div><div class="quote_div">       &lt;!-- Struts Tag Library Descriptors -><br />              &lt;taglib><br />                &lt;tagliburi>/WEB-INF/struts-bean.tld&lt;/taglib-uri><br />                &lt;taglib-location>/WEB-INF/struts-bean.tld&lt;/taglib-location><br />              &lt;/taglib><br /><br />              &lt;taglib><br />                &lt;taglib-uri>/WEB-INF/struts-html.tld&lt;/taglib-uri><br />                &lt;taglib-location>/WEB-INF/struts-html.tld&lt;/taglib-location><br />              &lt;/taglib><br /><br />              &lt;taglib><br />                &lt;taglib-uri>/WEB-INF/struts-logic.tld&lt;/taglib-uri><br />                &lt;taglib-location>/WEB-INF/struts-logic.tld&lt;/taglib-location><br />              &lt;/taglib></div><br /><br /><br />    1.4.    添加struts-config.xml文件：将struts项目的配置文件拷贝到opencms项目的WEB-INF目录（比如：D:\jakarta_tomcat_5_0_30\webapps\opencms\WEB-INF）下面；<br />    1.5.    将struts项目中用到的jsp、html等页面纳入opencms的vfs统一管理；<br /><br /><br />2.    对相应struts项目文件链接内容的修改：<br /><br />    2.1.    含有链接内容的jsp、html等页面文件内容修改：在原来的链接前面加上/opencms（比如：&lt;a href="/jump.do">写法变成&lt;a href="/opencms/jump.do">）；<br />    2.2.    struts-config.xml文件内容修改：将原来的jsp文件链接写法改成opencms中相应的vfs路径（比如：原来的&lt;action path="/jump" forward="success.jsp">变成&lt;action path="/jump" forward="/opencms/strutsTest/success.jsp">）；<br /> <br /> <br />    以上只是在opencms中实现了简单的跳转，至于具有action和form类的较复杂结构struts程序，应该采用opencms module的形式来组织和部署代码，等以后涉及到在座研究吧。
          <br/>
          <span style="color:red;">
            <a href="http://snowmanjy.javaeye.com/blog/32031#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Nov 2006 18:37:41 +0800</pubDate>
        <link>http://snowmanjy.javaeye.com/blog/32031</link>
        <guid>http://snowmanjy.javaeye.com/blog/32031</guid>
      </item>
      <item>
        <title>[转]Stay Hungry Stay Foolish</title>
        <author>snowmanjy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://snowmanjy.javaeye.com">snowmanjy</a>&nbsp;
          链接：<a href="http://snowmanjy.javaeye.com/blog/32030" style="color:red;">http://snowmanjy.javaeye.com/blog/32030</a>&nbsp;
          发表时间: 2006年11月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          snowmanjy @ 2006年06月14日, 06:07:07 下午 CST<br />很不错的文章<br />转自好友兔八哥的blog<br /><br />                                 <br /><br /><br /><br />      本文是苹果电脑总裁Steve Jobs在2005年斯坦佛大学毕业典礼上的演讲，这位苹果电脑公司（Apple Computer）和皮克斯动画公司（Pixar Animation Studios）首席执行官在演讲中谈到了他生活中的三次体验，这三次体验不仅在斯坦福大学的毕业生、也在硅谷乃至其他地方的技术同行中引起了巨大反响。他们将他的演讲登在互联网上，在博客上展开讨论，通过电子邮件互相发送，在全球传阅。<br /><br />如要读原文请google "Stay Hungry Stay Foolish"。<br /><br /><br />      斯坦福是世界上最好的大学之一，今天能参加各位的毕业典礼，我深感荣幸。（尖叫声）我大学没毕业，说句实话，此时算是我离大学毕业最近的一刻。（笑声）今天，我想和各位分享我生命中的三个故事，并非什么了不得的大事，仅仅是三个小故事而已。<br /><br />第一个故事 串起生命的点滴　　<br /><br />      我在里德大学呆了6个月就退学了，但之后仍作为旁听生混了18个月后才最终离开。我为什么要退学呢？ 　　<br /><br />      故事要从我出生之前开始说起。我的生母是一名年轻的未婚妈妈，当时她还是一所大学的在读研究生，于是决定把我送给其他人收养。她坚持我应该被一对念过大学的夫妇收养，所以在我出生的时候，她已经为我被一个律师和他的太太收养做好了所有的准备。但在最后一刻，这对夫妇改了主意，决定收养一个女孩。侯选名单上的另外一对夫妇，也就是我的养父母，在一天午夜接到了一通电话：“有一个不请自来的男婴，你们想收养吗？”他们回答：“当然想。”事后，我的生母才发现我的养母根本就没有从大学毕业，而我的养父甚至连高中都没有毕业，所以她拒绝签署最后的收养文件，直到几个月后，我的养父母保证会把我送到大学，她的态度才有所转变。 　　<br /><br />      17年之后，我真上了大学。但因为年幼无知，我选择了一所和斯坦福一样昂贵的大学，（笑声）我的父母都是工人阶级，他们倾其所有资助我的学业。在6 个月之后，我发现自己完全不知道这样念下去究竟有什么用。当时，我的人生漫无目标，也不知道大学对我能起到什么帮助，为了念书，还花光了父母毕生的积蓄，所以我决定退学。我相信车到山前必有路。当时作这个决定的时候非常害怕，但现在回头去看，这是我这一生所作出的最正确的决定之一。（笑声）从我退学那一刻起，我就再也不用去上那些我毫无兴趣的必修课了，我开始旁听那些看来比较有意思的科目。 　　<br /><br />      这件事情做起来一点都不浪漫。因为没有自己的宿舍，我只能睡在朋友房间的地板上；可乐瓶的押金是5分钱，我把瓶子还回去好用押金买吃的；在每个周日的晚上，我都会步行7英里穿越市区，到Hare Krishna教堂去吃我一周里唯一的一顿大餐。那顿餐的味道美极了。我跟随好奇心和直觉所遇见的和做的事情，事后证明大多数都是极其珍贵的经验。 　　<br /><br />      我举一个例子：那个时候，里德大学提供了全美国最好的字体学课程。整个校园的每一张海报，每一个抽屉上的标签，都是漂亮的字体。由于已经退学，不用再去上那些常规的课程，于是我选择了一个字体学班，想学学如何能够做的到。在这个班上，我学习了各种衬线和无衬线字体，如何改变不同字体组合之间的字间距，以及如何做出漂亮的版式。那是一种科学永远无法捕捉的充满美感、历史感和艺术感的微妙，我发现这太有意思了。 　　<br /><br />      当时，我压根儿没想到这些知识会在我的生命中有什么实用价值；但是10年之后，当我们的设计第一款Macintosh电脑的候，这些东西全派上了用场。我把它们全部设计进了 Mac，这是第一台可以排出好看版式的电脑。如果当时我大学里没有旁听这门课程的话，Mac就不会提供各种字体和等间距字体。自从Windows抄袭了 Mac以后，（鼓掌大笑）所有的个人电脑都有了这些东西。如果我没有退学，我就不会去字体班旁听，而今天的个人电脑大概也就不会有出色的版式功能。当然我在念大学的那会儿，不可能有先见之明，把那些生命中的点点滴滴都串起来；但10年之后再回头看，生命的轨迹变得非常清晰。<br /><br />      再强调一次，你不可能充满预见地将生命的点滴串联起来；只有在你回头看的时候，你才会发现这些点点滴滴之间的联系。所以，你要坚信，你现在所经历的将在你未来的生命中串联起来。你不得不相信某些东西，你的直觉，命运，生活，因缘际会……正是这种信仰让我不会失去希望，它让我的人生变得与众不同。 　　<br /><br />第二个故事 关于爱与失去。 　　<br /><br />      我是幸运的，在年轻的时候就知道了自己爱做什么。在我20岁的时候，就和沃兹在我父母的车库里开创了苹果电脑公司。我们勤奋工作，只用了10年的时间，苹果电脑就从车库里的两个小伙子扩展成拥有4000名员工，价值达到20亿美元的企业。而在此之前的一年，我们刚推出了我们最好的产品 Macintosh电脑，当时我刚过而立之年。然后，我就被炒了鱿鱼。一个人怎么可以被他所创立的公司解雇呢？（笑声）这么说吧，随着苹果的成长，我们请了一个原本以为很能干的家伙和我一起管理这家公司，在头一年左右，他干得还不错，但后来，我们对公司未来的前景出现了分歧，于是我们之间出现了矛盾。由于公司的董事会站在他那一边，所以在我30岁的时候，就被踢出了局。我失去了一直贯穿在我整个成年生活的重心，打击是毁灭性的。 　　<br /><br />      在头几个月，我真不知道要做些什么。我觉得我让企业界的前辈们失望了，我失去了传到我手上的指挥棒。我遇到了戴维·帕卡德（惠普的创办人之一——译注）和鲍勃·诺伊斯（英特尔的创办人之一——译注），我向他们道歉，因为我把事情搞砸了。我成了人人皆知的失败者，我甚至想过逃离硅谷。但曙光渐渐出现，我还是喜欢我做过的事情。在苹果电脑发生的一切丝毫没有改变我，一个比特（bit）都没有。虽然被抛弃了，但我的热忱不改。我决定重新开始。 　　<br /><br />      我当时没有看出来，但事实证明，我被苹果开掉是我这一生所经历过的最棒的事情。成功的沉重被凤凰涅槃的轻盈所代替，每件事情都不再那么确定，我以自由之躯进入了我整个生命当中最有创意的时期。 　　<br /><br />      在接下来的5年里，我开创了一家叫做NeXT的公司，接着是一家名叫Pixar的公司，并且接识了后来成为我妻子的曼妙女郎。Pixar制作了世界上第一部全电脑动画电影《玩具总动员》，现在这家公司是世界上最成功的动画制作公司之一。（掌声）后来经历一系列的事件，苹果买下了NeXT，于是我又回到了苹果，我们在NeXT研发出的技术在推动苹果复兴的核心动力。我和劳伦斯也拥有了美满的家庭。 　　<br /><br />      我非常肯定，如果没有被苹果炒掉，这一切都不可能在我身上发生。对于病人来说，良药总是苦口。生活有时候就像一块板砖拍向你的脑袋，但不要丧失信心。热爱我所从事的工作，是一直支持我不断前进的惟一理由。你得找出你的最爱，对工作如此，对爱人亦是如此。工作将占据你生命中相当大的一部分，从事你认为具有非凡意义的工作，方能给你带来真正的满足感。而从事一份伟大工作的惟一方法，就是去热爱这份工作。如果你到现在还没有找到这样一份工作，那么就继续找。不要安于现状，当万事了于心的时候，你就会知道何时能找到。如同任何伟大的浪漫关系一样，伟大的工作只会在岁月的酝酿中越陈越香。所以，在你终有所获之前，不要停下你寻觅的脚步。不要停下。 　　<br /><br />第三个故事 关于死亡　　<br /><br />      在17 岁的时候，我读过一句格言，好像是：“如果你把每一天都当成你生命里的最后一天，你将在某一天发现原来一切皆在掌握之中。”（笑声）这句话从我读到之日起，就对我产生了深远的影响。在过去的33年里，我每天早晨都对着镜子问自己：“如果今天是我生命中的末日，我还愿意做我今天本来应该做的事情吗？”当一连好多天答案都否定的时候，我就知道做出改变的时候到了。 　　<br /><br />      提醒自己行将入土是我在面临人生中的重大抉择时，最为重要的工具。 　　<br /><br />      因为所有的事情——外界的期望、所有的尊荣、对尴尬和失败的惧怕——在面对死亡的时候，都将烟消云散，只留下真正重要的东西。在我所知道的各种方法中，提醒自己即将死去是避免掉入畏惧失去这个陷阱的最好办法。人赤条条地来，赤条条地走，没有理由不听从你内心的呼唤。 　　<br /><br />      大约一年前，我被诊断出癌症。在早晨7：30我做了一个检查，扫描结果清楚地显示我的胰脏出现了一个肿瘤。我当时甚至不知道胰脏究竟是什么。医生告诉我，几乎可以确定这是一种不治之症，顶多还能活3至6个月。大夫建议我回家，把诸事安排妥当，这是医生对临终病人的标准用语。这意味着你得把你今后10 年要对你的子女说的话用几个月的时间说完；这意味着你得把一切都安排妥当，尽可能减少你的家人在你身后的负担；这意味着向众人告别的时间到了。 　　<br /><br />      我整天都想着诊断结果。那天晚上做了一个切片检查，医生把一个内诊镜从我的喉管伸进去，穿过我的胃进入肠道，将探针伸进胰脏，从肿瘤上取出了几个细胞。我打了镇静剂，但我的太太当时在场，她后来告诉我说，当大夫们从显微镜下观察了细胞组织之后，都哭了起来，因为那是一非常罕见的，可以通过手术治疗的胰脏癌。我接受了手术，现在已经康复了。 　　<br /><br />      这是我最接近死亡的一次，我希望在随后的几十年里，都不要有比这一次更接近死亡的经历。在经历了这次与死神擦肩而过的经验之后，死亡对我来说只是一项有效的判断工具，并且只是一个纯粹的理性概念时相比，我能够更肯定地告诉你们以下事实：没人想死；即使想去天堂的人，也是希望能活着进去。（笑声）死亡是我们每个人的人生终点站，没人能够成为例外。生命就是如此，因为死亡很可能是生命最好的造物，它是生命更迭的媒介，送走耋耄老者，给新生代让路。现在你们还是新生代，但不久的将来你们也将逐渐老去，被送出人生的舞台。很抱歉说得这么富有戏剧性，但生命就是如此。 　　<br /><br />      你们的时间有限，所以不要把时间浪费在别人的生活里。不要被条条框框束缚，否则你就生活在他人思考的结果里。不要让他人的观点所发出的噪音淹没你内心的声音。最为重要的是，要有遵从你的内心和直觉的勇气，它们可能已知道你其实想成为一个什么样的人。其他事物都是次要的。 　　<br /><br />      在我年轻的时候，有一本非常棒的杂志叫《全球目录》（The Whole Earth Catalog），它被我们那一代人奉为圭臬。这本杂志的创办人是一个叫斯图尔特·布兰德的家伙，他住在Menlo Park，距离这儿不远。他把这本杂志办得充满诗意。那是在60年代末期，个人电脑、桌面发排系统还没有出现，所以出版工具只有打字机、剪刀和宝丽来相机。这本杂志有点像印在纸上的Google，但那是在Google出现的35年前；它充满了理想色彩，内容都是些非常好用的工具和了不起的见解。 　　<br /><br />      斯图尔特和他的团队做了几期《全球目录》，快无疾而终的时候，他们出版了最后一期。那是在70年代中期，我当时处在你们现在的年龄。在最后一期的封底有一张清晨乡间公路的照片，如果你喜欢搭车冒险旅行的话，经常会碰到的那种小路。在照片下面有一排字：Stay Hungry. Stay Foolish.这是他们停刊的告别留言Stay Hungry. Stay Foolish.。我总是以此自诩。现在，在你们毕业开始新生活的时候，我把这句话送给你们！
          <br/>
          <span style="color:red;">
            <a href="http://snowmanjy.javaeye.com/blog/32030#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Nov 2006 18:34:29 +0800</pubDate>
        <link>http://snowmanjy.javaeye.com/blog/32030</link>
        <guid>http://snowmanjy.javaeye.com/blog/32030</guid>
      </item>
      <item>
        <title>近几日的郁闷总结－－想玩弄struts却被tomcat玩弄：（</title>
        <author>snowmanjy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://snowmanjy.javaeye.com">snowmanjy</a>&nbsp;
          链接：<a href="http://snowmanjy.javaeye.com/blog/32029" style="color:red;">http://snowmanjy.javaeye.com/blog/32029</a>&nbsp;
          发表时间: 2006年11月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          snowmanjy @ 2006年06月12日, 04:51:42 下午 <br /><br /><br />总以为自己做coder也有四五年了，也该有点水平了，结果这两天却接连被两个疏忽的地方连续折磨，真是欲哭无泪。只好简单记录一下，一方面聊做发泄，另一方面也给同志们点警示，表犯和我一样的错误-.-<br /><br />开始就是在调opencms＋struts，结果明明是简单的跳转，却怎么也调不通，其间修改链接写法无数次，重启tomcat无数次，傻乎乎看着启动 dos窗口无数分钟。。。然后在浪费了一天后偶然修改链接的文字才发现页面根本没更新。。然后自以为是的开始试图改opencms的缓存机制，在又浪费了很多时间后终于发现原来问题出在tomcat的缓存上，总结一下解决方法如下：1。让JSP不缓存方法网页头部加上<br /><pre name="code" class="java">&lt;%  
response.setHeader("Pragma","No-cache");//HTTP 1.1
response.setHeader("Cache-Control","no-cache");//HTTP 1.0
response.setHeader("Expires","0");//防止被proxy
%></pre><br />2。偏激点删除%CATALINA_HOME%\work目录下的缓存文件<br />3。修改%CATALINA_HOME%\conf\server.xml 文件 Context path 中间加上 reloadable="true"<br /><br />例如：<pre name="code" class="java">&lt;Context path="/strutsProject" docBase="/strutsProject" debug="0" reloadable="true" /></pre><br /><br /><br /><br />缓存问题解决后页面的跳转也就ok了，然后试着加入action类进行mapping控制，结果从eclipse里export出来的war包部署后启动时老是报错，开始简单一看报错信息是Parsing error processing resource path /WEB-INF/struts-config.xml，感觉就是配置文件写的有问题了，于是把本就不大的struts-config文件上上下下折腾了半天，未遂。。后来注意到报错信息中有这样的信息：Caused by: java.lang.UnsupportedClassVersionError: hello/LoginForm (Unsupported major.minor version 49.0)上网一查，真相大白，jdk版本问题，eclipse编译项目用的jdk1.5，而tomcat5运行用的是jdk1.4.2，真是郁闷。。，改下project用的jdk版本，问题解决。<br /><br />结论：万能的google；还有，发现国内同行的问题解决能力似乎还是不如老外，上述问题都能看到有人问，可是很少有准确完整的解答，最后还是在国外论坛找到的答案，看来还要努力啊。。。
          <br/>
          <span style="color:red;">
            <a href="http://snowmanjy.javaeye.com/blog/32029#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Nov 2006 18:30:13 +0800</pubDate>
        <link>http://snowmanjy.javaeye.com/blog/32029</link>
        <guid>http://snowmanjy.javaeye.com/blog/32029</guid>
      </item>
      <item>
        <title>picocontainer用户指南学习笔记</title>
        <author>snowmanjy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://snowmanjy.javaeye.com">snowmanjy</a>&nbsp;
          链接：<a href="http://snowmanjy.javaeye.com/blog/32028" style="color:red;">http://snowmanjy.javaeye.com/blog/32028</a>&nbsp;
          发表时间: 2006年11月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          snowmanjy @ 2006年04月16日, 11:49:40 上午<br /><br /> <br /><br /><br />    最近辞了职在家休息+整理学习下技术，这两天在看picocontainer，一方面在刚作完的项目中使用过，再深入了解一下，另一方面为学习spring打打底。英文文档看得还是有点费劲，简单记录下知识点：<br /><br /><br />  指南摘要：<br /><br /><br />    picocontainer基本特点：ioc(di-主要是constructor injection) 生命周期管理（start,stop,dispose 被管理组件必须实现相应接口，是否会造成依赖？），容器的组织和管理（比较高级的特性，包括容器之间的关系、查找顺序（在本容器找不到的组件将向父级容器递归查找）以及销毁容器的顺序（关闭时先销毁没有被依赖的容器，按顺序销毁））<br /><br /><br />  提到的模式与反模式：<br /><br /><br />    模式：<br /><br /><br />      good citizen?；ioc ；di；接口与实现分离；<br /><br /><br /><br />    反模式（包括对pico的错误用法）:<br /><br /><br />      依赖类而不是接口；依赖容器（通过改变代码可以消除依赖）；container instantiation(容器实例化？在类中创建容器并注册组件，这种反模式经常出现在test中)；instance registration(registerComponentInstance(Object key, Object componentInstance)方法使用过多)；构造函数中过多的参数（通常是由于一个类实现了过多的功能造成的，或者是由于下一个模式造成的）； Propagating Dependency（依赖传染？解释不好，还是看文档。。）；Singleton（gof 23 之一，pico团队指出这是一个反模式：造成程序混乱且不易测试）
          <br/>
          <span style="color:red;">
            <a href="http://snowmanjy.javaeye.com/blog/32028#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Nov 2006 18:27:32 +0800</pubDate>
        <link>http://snowmanjy.javaeye.com/blog/32028</link>
        <guid>http://snowmanjy.javaeye.com/blog/32028</guid>
      </item>
      <item>
        <title>2005,我曾为BOSS狂</title>
        <author>snowmanjy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://snowmanjy.javaeye.com">snowmanjy</a>&nbsp;
          链接：<a href="http://snowmanjy.javaeye.com/blog/32027" style="color:red;">http://snowmanjy.javaeye.com/blog/32027</a>&nbsp;
          发表时间: 2006年11月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          snowmanjy @ 2006年04月18日, 12:46:18<br /><br />  题目看起来八卦么？本来想叫做“我和BOSS不得不说的故事”来着：P 。解释一下，此BOSS不是老板的意思，是Business Operation  Support System业务支撑运营系统的缩写。这套系统基本囊括了电信运营商大部分的业务软件，比如营帐、计费、资源管理、客户管理、渠道管理、跨省业务等等，可谓大而全吧。国内做BOSS的也就那么几家厂商：亚信、联创、思特奇、神州数码（似乎现在应该叫神奇了？）还有已经被Amdocs收购的朗新，华为也可以算是硬生生挤了进来，至于东软大唐一类的恐怕就上不得台面了。这几家公司做的如何，业内也都各有评说，我也就不老话重提了，不过在网上见到了一番妙论，引用一下：<br />   亚信 年轻的时候我也曾经风流过<br />   神奇 看上去很美的黄昏恋<br />   朗新 一片即将凋零的黄叶<br />   华为 因为你不快乐所以我快乐<br />   联创 钱路在何方？<br />   创智 选择离开是一种勇气<br />  （引自：Jackyding 一句话点评国内BOSS厂商 http://forums.cweek.com.cn/showthread.php?t=749）<br /><br />   2004年底，我有幸进入了上述其中一家公司。前后一年，转战三省移动，也算是为电信BOSS事业做了点微薄的贡献，期间的酸甜苦辣以及种种体会，今天以千千万万忙碌于修补BOSS系统的工蜂－程序员的角度记录一下。<br /><br />   第一个感觉：大！相信提到BOSS，这一定是首位的印象。就像上面提到的，包括了这么多功能模块，再想想一个省移动用户的数量，相信BOSS系统怎么也胜任这一好评。<br /><br />   第二个感觉：乱！其实也可以叫做：看上去很美。想象一下大多数程序员的梦想，当然代表人物是老盖：让很多的人用上自己开发的软件。毫无疑问，BOSS可以圆你这个梦。作为一个省级的软件系统，用户上千万，操作员上万，并发访问上千，就连开发人员都数以百计（单就一家厂商来说），是不是感觉很爽呢？再想象一下这样的场景：某省移动BOSS升级项目启动，一周内七八十人挎着本本，飞往现场，飞机几乎成了包机，是不是看上去很美呢？可是在现场开发测试的时候，你就会时时感觉到一种乱：测试环境乱（主机几十台，数据库几十个，appserver更是多到数不清，今天切库，明天备份，后天倒数据，大后天又要预演，很多时候测试出错找了半天却发现原来是数据库被初始化了：（   还遇到过正在给客户演示时别的部门新手把我们的weblogic进程kill掉了。。）、程序乱（很多时候都是赶鸭子上架，有的刚招来的新手就直接派往前线，至于水平，天知道！程序又怎么能不乱）、项目进度乱（几十个模块各自为政，却又剪不断理还乱，往往要停下进度等别的部门提供相关服务接口）、工作时间就更乱（加班是常事了，连局方的人员也要加班，经常披星戴月的后半夜走出机房，好在还可以欣赏下换班的1860mm们，早上赶回来基本还都能看到系统工程师们兔子般的双眼）。<br /><br /><br />   第三个感觉：累！加班加班，晚上加周末加，去了趟成都，呆了一个多月，却连附近的青城山峨眉山也没空去玩玩。周末晚饭时多耽搁一两个小时去电子科大门口几个人吃上一顿串串香就是最大的快乐了。某个周日，手头有新加的业务模块要实现，还要找用户签字确认功能，要向项目经理报告模块进度，要掌握组里人员进度，要搭新的测试环境，还要跟别的部门人员要接口。。几近崩溃。干脆本本一合，全都去他的，打车去春熙路看美女去(￣ˇ￣)。坐在春熙路看着悠闲到走路都懒洋洋的成都市民，整个人才放松下来，才意识到生活也可以如此不同。<br /><br /><br />   第四个感觉：悬！上面也提到过，项目进度的紧张，代码的混乱，人员的良莠不齐，呆的久了，感觉如此庞大的系统真是危机四伏，bug乱窜，有时候真有这样的感叹：就这样的系统就要上线。。可是又能怎样，如此功能庞大高实时高并发的系统，怕是神仙也难做到完美。无怪每个月的数据patch大家都见怪不怪了，无他，造成的问题别超过运营商容忍限度就是好系统了。<br /><br />  2005年，为这样大的系统折腾了许久，有过很多成就感，责任感，也有过危机感。一路走来，学到很多，成熟很多，虽然忙碌，但是忙的无怨无悔。回首2005，一年的汗水青春只为一个目标。2005，我曾为BOSS狂：）
          <br/>
          <span style="color:red;">
            <a href="http://snowmanjy.javaeye.com/blog/32027#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Nov 2006 18:17:45 +0800</pubDate>
        <link>http://snowmanjy.javaeye.com/blog/32027</link>
        <guid>http://snowmanjy.javaeye.com/blog/32027</guid>
      </item>
      <item>
        <title>有关TDD(Test-Driven Development)和持续集成（Continuous Integration）</title>
        <author>snowmanjy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://snowmanjy.javaeye.com">snowmanjy</a>&nbsp;
          链接：<a href="http://snowmanjy.javaeye.com/blog/32026" style="color:red;">http://snowmanjy.javaeye.com/blog/32026</a>&nbsp;
          发表时间: 2006年11月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在最近的工作中接触到了TDD，其实严格的说也不能算纯粹的TDD，不过test已经覆盖了大部分的代码功能点，持续集成方面采用的软件是anthill，当然还有CruiseControl可以选择。<br /><br /><br />   有关TDD和持续集成都足够独立成文，也有很多相关的介绍文章，这里只是简单描述下我们的做法：<br />     1。保证大部分功能点都有相关的test（因为某些原因，我们没有做到TDD要求的测试先行，有待以后改进）<br />     2。在ant脚本中加入JUnit test部分，目的是达到自动执行批量test并且能够test fail->build fail。<br />     3。在版本控制器（svn）上加上anthill的支持<br /> <br />    这样协作开发的步骤就是：从svn update 代码->首先进行cleanbuild确保修改前的代码是无错的->进行代码及相应test的修改（按照TDD这里的顺序应该是反过来）- >再次cleanbuild确保修改后的代码是无错的->svn commit->通过anthill web界面进行build查看结果<br /> 全部正确就算完成了一次修改，可以看出test和持续集成的作用，既保证了代码实时的正确性，又保证了trouble shooting的准确快速。<br /><br /><br />   无怪spring和pico的作者都提到TDD从某种程度上讲是致瘾的，习惯了它的开发者很难再回到原来的开发模式。想来一定是会感到缺乏安全感吧：）回想以前总是担忧自己项目中bug横行却无计可施的日子，恐怕真的离不开test了。<br /><br /><br /><br /> 必要的软件：<br />  Eclipse－最重要的了，提供了对Junit和Refactoring的良好支持<br />  JUnit－使test细致到function一级，以清晰的红绿灯显示测试的结果<br />  Ant－支持自动化的test过程<br />  EasyMock－如果你使用MockObject协助test<br />  anthill（CruiseControl）－持续集成软件<br /><br /><br /><br />推荐的参考读物：<br /> http://news.csdn.net/news/newstopic/21/21164.shtml Martin Fowler：持续集成<br /> Test-Driven Development A Practical Guide 测试驱动开发实用指南（中国电力出版社）jolt大奖得主哦
          <br/>
          <span style="color:red;">
            <a href="http://snowmanjy.javaeye.com/blog/32026#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Nov 2006 18:14:45 +0800</pubDate>
        <link>http://snowmanjy.javaeye.com/blog/32026</link>
        <guid>http://snowmanjy.javaeye.com/blog/32026</guid>
      </item>
      <item>
        <title>我的技术编年史</title>
        <author>snowmanjy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://snowmanjy.javaeye.com">snowmanjy</a>&nbsp;
          链接：<a href="http://snowmanjy.javaeye.com/blog/32024" style="color:red;">http://snowmanjy.javaeye.com/blog/32024</a>&nbsp;
          发表时间: 2006年11月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天偶尔想起，整理下自己这几年中先后都学到些什么计算机技术，也是一个很有意思的回顾。<br /><br />  高中及以前：忙于应试，计算机方面什么都不了解：（ <br /><br />  97年（大一）：有了上机课程，学习了计算机基础。那时候的关键字：386、486、DOS、UCDOS、WPS、仙剑奇侠传。。<br /><br />  98年（大二）：跟睡在我上铺的兄弟一起攒了一台机器，CPU是K6 II－350的。关键字：WIN32、WIN95、C语言（Turbo C）、英雄无敌2<br /><br />  99年（大三）：似乎终于找到了方向傻乎乎的自学，然后跑清华，考MCSE。关键字：WIN NT、MCSE、英雄无敌3<br /><br />  2k年（大四）：这个阶段似乎一切都轻松下来了，决定了不考研，继续自学计算机，考计算机三级fail，找工作，签约东软，然后更加轻松的做毕业设计，学习数据库等知识为工作做准备。关键字：C语言、三级B、找工作、毕业设计、Borland C++ Builder、SQL Server、SQL、星际争霸-_-<br /><br />  2001年：工作了，发现在学校学的很多用不到，要用的东西却很多没有学过，学习的时期，适应社会的开始。关键字：PowerBuilder、Oracle、HIS<br /><br />  2002年：感觉PB没前途也没什么兴趣，开始学习java。关键字：java、Servlet、JSP、Oracle、Weblogic<br /><br />  2003年：工作两年，合同期满决定不再续签，离开秦皇岛来到北京，一切靠自己闯了。关键字：JSP、JavaBean、Ondemand、Websphere、DB2<br /><br />  2004年：开始做BOSS，项目压力很大，能力提高的也很快。关键字：JSP、JavaBean、Oracle、Weblogic、Struts、BOSS<br /><br />  2005年：软件工程的各个阶段都做过了，跑了三个省会做BOSS升级，厌倦了劳累。又是一次跳槽，结果陷入了产品的封闭开发-_- 不过在产品结构方面学到了很多东西。关键字：JSP、JavaBean、Oracle、Weblogic、Struts、BOSS、TDD、 Spring、PicoContainer、Hibernate、收房、装修（这两个不是it技术，不过对我很重要）<br /><br />  2006年：节奏慢下来点的一年，离职后休息了一个多月。HP机试失败，发现需要补补基本功了。后来做起了外包，生活稳定了下来，不出差了，加班也比较少。技术在积累，量变还未引起质变。。。关键字：Struts、WebWork、Velocity、Spring、Hibernate、TDD、Websphere、DB2、JVM<br /><br />  接下来计划学习的：JVM知识、Reflect相关、多线程相关、数据结构及算法（是时候补补基本功了）。希望接下来在技术和职业生涯上能够达到新的境界。
          <br/>
          <span style="color:red;">
            <a href="http://snowmanjy.javaeye.com/blog/32024#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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, 01 Nov 2006 18:09:35 +0800</pubDate>
        <link>http://snowmanjy.javaeye.com/blog/32024</link>
        <guid>http://snowmanjy.javaeye.com/blog/32024</guid>
      </item>
  </channel>
</rss>