<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>trace</title>
    <description>上帝给我们最好的礼物，就是我们阳光灿烂的笑脸！</description>
    <link>http://trace.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>ubuntu字体设置</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/191349" style="color:red;">http://trace.javaeye.com/blog/191349</a>&nbsp;
          发表时间: 2008年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这篇文章写得不错，很有道理：<a href="http://blog.chinaunix.net/u/7654/showart_157477.html" target="_blank">http://blog.chinaunix.net/u/7654/showart_157477.html</a>
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/191349#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 May 2008 11:23:02 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/191349</link>
        <guid>http://trace.javaeye.com/blog/191349</guid>
      </item>
      <item>
        <title>玩转MySql（一）</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/189738" style="color:red;">http://trace.javaeye.com/blog/189738</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ubuntu8下安装mysql可以使用apt，顺便也可以把query browser也装上。安装过程中会提示你输入root用户的密码，安装完毕后，系统就恢复平静了，呵呵。于是有人就疑惑：如何启动mysql？<br /><br />其实，此时的mysql就是启动状态的。可以在终端中输入：mysql -u root -p来登录一下。<br /><br />由此推断，这个mysql-server是安装成ubuntu的一个服务了，于是到“服务”中去找（系统->系统管理->服务），果然找到了mysql。<br /><br />其实，mysql的启动与停止，不管是在winidows还是linux上，都是一样的（如果你钟爱命令行的话）。有关linux下的mysql启动与停止，这位网友写得不错。<a href="http://zhangwenjun8045.javaeye.com/blog/156099" target="_blank">http://zhangwenjun8045.javaeye.com/blog/156099</a><br /><br />网上有位同学，略写了一下mysql的备份：<br /><div class="quote_title">引用</div><div class="quote_div">数据库的备份很重要，通常可以用mysqldump命令。<br /><br />mysqldump dbname –u username –p > backupfilename<br /><br />由于通常备份的文件相当大，用gzip可以将文件压缩到原来的1/10。<br /><br />gzip backupfilename<br /><br />如果恢复数据的话，可以用source命令。<br /><br />mysql>source backupfilename; </div>
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/189738#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 May 2008 15:16:58 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/189738</link>
        <guid>http://trace.javaeye.com/blog/189738</guid>
      </item>
      <item>
        <title>强悍的辩论</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/188740" style="color:red;">http://trace.javaeye.com/blog/188740</a>&nbsp;
          发表时间: 2008年05月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          摘录一位网友的言论：<br /><br /><div class="quote_title">引用</div><div class="quote_div">迟到5分钟就扣100块，半小时就算旷工一天，当天工资就没了。</div><br /> 晚下班5分钟奖励100块，加班半小时算加班一天，给发两天的工资——如果这样的话，上面的要求也不过分。
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/188740#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 01 May 2008 23:55:06 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/188740</link>
        <guid>http://trace.javaeye.com/blog/188740</guid>
      </item>
      <item>
        <title>ubuntu连接锐捷之实践</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/188566" style="color:red;">http://trace.javaeye.com/blog/188566</a>&nbsp;
          发表时间: 2008年04月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          校园网的用户大多会碰上锐捷认证的问题。在ubuntu 7.10中，我使用xgrsu成功地进行了认证，在ubuntu 8中，我将自己的实践记录如下：<br /><br />在使用xgrsu之前，要解决两个库的问题。<br />1、libstdc++.so.5<br />这个库可以在新立得中找到，直接安装就是了。没有新立得的同学，可以在附件中下载。<br />2、libpcap.so.0.6.2 <br />这个库可以用软连接的方式得到，命令如下：<br />sudo ln -s /usr/lib/libpcap.so.0.9.7 /usr/lib/libpcap.so.0.6.2 <br />也就是说，将这个库链到现有的库上面 :-)<br /><br />然后，把xrgsu拷贝到/usr/bin中，就可以使用了，xrgsu就在附件中。
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/188566#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 Apr 2008 21:45:22 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/188566</link>
        <guid>http://trace.javaeye.com/blog/188566</guid>
      </item>
      <item>
        <title>Ubuntu美化相关文章</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/188412" style="color:red;">http://trace.javaeye.com/blog/188412</a>&nbsp;
          发表时间: 2008年04月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这篇应该是作者的原创了[url＝http://luckiss.blogcn.com/diary,15195236.shtml]Ubuntu8.04系列四－－系统美化篇 [/url]<br />介绍得很详细
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/188412#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 Apr 2008 14:41:17 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/188412</link>
        <guid>http://trace.javaeye.com/blog/188412</guid>
      </item>
      <item>
        <title>Linux的根目录下各个文件夹的作用</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/187809" style="color:red;">http://trace.javaeye.com/blog/187809</a>&nbsp;
          发表时间: 2008年04月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          有两篇文章介绍得很详细：<br /><a href="http://hi.baidu.com/liyanyan_love/blog/item/5cd81ffa236ca61ba9d311be.html" target="_blank">http://hi.baidu.com/liyanyan_love/blog/item/5cd81ffa236ca61ba9d311be.html</a><br /><a href="http://blog.chinaunix.net/u/12110/showart_497414.html" target="_blank">http://blog.chinaunix.net/u/12110/showart_497414.html</a>
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/187809#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 Apr 2008 00:09:37 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/187809</link>
        <guid>http://trace.javaeye.com/blog/187809</guid>
      </item>
      <item>
        <title>一户人家安不安全</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/187801" style="color:red;">http://trace.javaeye.com/blog/187801</a>&nbsp;
          发表时间: 2008年04月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="quote_title">引用</div><div class="quote_div">一户人家安不安全，不是看他用什么牌子的防盗门，而是看有没有小偷盯上他家。</div><br /><br />形象地说出了“道高一尺，魔高一丈”的辩证关系。同时，也说明了，我们看问题，不要被次要的表象遮盖了主要的真相。
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/187801#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 Apr 2008 23:25:04 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/187801</link>
        <guid>http://trace.javaeye.com/blog/187801</guid>
      </item>
      <item>
        <title>“文”“理”的差异，我们的努力</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/187798" style="color:red;">http://trace.javaeye.com/blog/187798</a>&nbsp;
          发表时间: 2008年04月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我这里说的“文”和“理”，并不是指的文科和理科，而是指一个道理的两个方面：逻辑与表达。逻辑即是“理”，表达即是“文”。<br /><br />我认为“理”和“文”是工科同学或多或少有些缺乏的能力。工科的同学往往埋头钻研技术，而忽略了论述与表达，日后是要吃嘴巴亏的。<br /><br />但是在工科同学身上，有着难得的两种品质：谨慎细心的作风以及创新大胆的想象，这是“理”和“文”的绝佳载体。因此，作为工科同学的我们，完全可以“不鸣则已，一鸣惊人”。<br /><br />这种飞跃如何实现？其实是个很简单的道理：量变引起质变！语言这个东西，靠的就是积累。有人强调“创作靠灵感”，而我则坚信“灵感靠积累”。<br /><br />这个分类里的文章，主要记录日常生活中，浅显易懂的表述，对应哪些深奥难懂的逻辑，或是简单明了的逻辑，对应哪些繁琐冗长的描述。<br /><br />Enjoy yourself!
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/187798#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 Apr 2008 23:16:45 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/187798</link>
        <guid>http://trace.javaeye.com/blog/187798</guid>
      </item>
      <item>
        <title>ubuntu8中将cdrom添加到软件源中</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/187495" style="color:red;">http://trace.javaeye.com/blog/187495</a>&nbsp;
          发表时间: 2008年04月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ubuntu8的默认设置好像没有把cdrom放到软件源中去，用下面的办法可以在源中添加cdrom：<br /><br />运行 sudo apt-cdrom add<br />按提示操作（也就是要你把光盘放进光驱，然后回车）<br /><br />运行 sudo apt-get update<br /><br />这样就可以了。
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/187495#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 Apr 2008 12:23:07 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/187495</link>
        <guid>http://trace.javaeye.com/blog/187495</guid>
      </item>
      <item>
        <title>如果有两处分页……</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/156736" style="color:red;">http://trace.javaeye.com/blog/156736</a>&nbsp;
          发表时间: 2008年01月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          will_paginate是很好的分页工具，当时，如果在同一个页面中，有两处分页，用这样的代码：<br /><pre name="code" class="ruby">&lt;%= will_paginate @all %>
&lt;%= will_paginate @my_favorites %></pre><br />这样两个分页会产生“关联”。正确的是应该指定不同的param参数名称，如：<br /><pre name="code" class="ruby">will_paginate(@comments)
will_paginate(@web_comments,param_name=>'wpage')</pre><br />在controller中，也要相应地写成：<br /><pre name="code" class="ruby">@web_comments = WebComment.paginate :page => params[:wpage], :per_page => 10</pre><br />在railscasts上有一段关于will_paginate的<a href="http://railscasts.com/episodes/51" target="_blank">视频</a>，讲得很详细，可以下载下来看看（英语不好的就凑合一下吧<img src="/images/smiles/icon_lol.gif"/>）。
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/156736#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Jan 2008 20:33:14 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/156736</link>
        <guid>http://trace.javaeye.com/blog/156736</guid>
      </item>
      <item>
        <title>如何本地化模型验证报错信息</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/156347" style="color:red;">http://trace.javaeye.com/blog/156347</a>&nbsp;
          发表时间: 2008年01月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          deopt这个教程，已经跑了两遍。但由于种种原因，两遍都没有跑完。现在，又一个新的deopt工程又建好了，准备跑第三遍，因为有一个项目，必须用RoR来做了。不过，这次与以前不同，我是在Rails2.0上面跑depot，因此，也可以顺便吧Rails2.0熟悉一下吧。今后，这一系列的文章（跑depot和那个项目的开发），就叫做：Rails2.0蹒跚上路。（别指望创新了，基本上都是转贴了，只是记录一下）<br /><br />在Rails2.0里面建工程，一开头就遇到了两个问题：数据库不是Mysql了，以及scaffold变了。本来应该记录一下的，但走过之后，觉得那都是小case，还是记一下眼前的发现吧。<br /><br />如何本地化验证错误信息：<br />1、在验证函数，如validates_presence_of的参数中，有一个:message，可以给它指定具体的错误信息。<br /><pre name="code" class="ruby">validates_presence_of :title, :message => "标题内容您忘了填写"</pre><br />2、页面上，错误信息框的标题的修改：<br />可以参考这篇帖子：<a href="http://cvu.javaeye.com/blog/78066" target="_blank">http://cvu.javaeye.com/blog/78066</a><br />按照上面的做了调整之后，就可以看到全中文的信息提示了。<br /><br />当然，i18n/l10n的问题，也是有插件可以解决的，比如globalite。插件中可能解决得更细致，但也导致了性能的开销。如果要搞国际化，倒可以参考一下这些插件。
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/156347#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Jan 2008 01:09:17 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/156347</link>
        <guid>http://trace.javaeye.com/blog/156347</guid>
      </item>
      <item>
        <title>背后的故事：One-Click Ruby Installer</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/154566" style="color:red;">http://trace.javaeye.com/blog/154566</a>&nbsp;
          发表时间: 2008年01月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在windows平台上开发RoR工程，可以使用方便的One-Click Ruby Installer进行ruby以及gem的安装。然而近日，在cygwin上安装ruby开发环境时，才开始明白这个One-Click背后的故事。</p><p>&nbsp;</p><p>我的cygwin本地安装包是cygwin-release-20061108.iso，其中的ruby是1.8.5版的。在它下面安装好RoR环境后，启动mongrel时会提示ruby版本过低。因此有必要将它升级到1.8.6版。到ruby官网上一看，没有cygwin上的安装包（当然，可以去cygwin的镜像上面下载，但那速度真让人抓狂），只有自己动手，编译源码了。还好，源码中有详尽的readme，让我这个第一次做本地编译的人，也很快就搞定ruby的安装了。</p><p>&nbsp;</p><p>装完ruby，接着就要装gem了，也就是去gem的官网，下载安装压缩包。但是在运行 ruby setup.rb 时，硬是有loadError。搜了一下，说要把一个RUBYOPT的windows环境变量删掉。这个变量不是我手动添上去的，看来是One-Click Ruby Installer自作主张了。删掉之后，果然一切OK。</p><p>&nbsp;</p><p>装好必要的gem包之后，运行一个以前的RoR程序，打开server时，硬是说找不到rails这个gem。无语，明明装好了。在irb中 require 'active_record' 同样也说找不到gem。怎么回事呢？</p><p>&nbsp;</p><p>终于，在gem的官网文档中找到了答案：gem的安装路径，是不在ruby的库搜索路径中的，直接require当然找不到了。解决办法嘛，要么先 require 'rubygems'，要么&hellip;&hellip;加上RUBYOPT的环境变量，其值为rubygems。这一删一加，够无语的。</p><p>&nbsp;</p><p>故事还没有完。当我用 ri Array 时，竟然没有文档信息显示出来。这说明ri文档没有安装。于是又搜了半天，终于得知需要在源码文件夹下运行 RDoc -Y来安装系统文档。试了一下，果然正解。</p><p>&nbsp;</p><p>OK，这下可算是在cygwin中把ruby装好了。可能有人觉得这是画蛇添足，放着好好的windows中的ruby不用，干嘛要到cygwin中折腾。但我看来，用过cygwin之后，windows中的ruby就可以弃之不用了，或者说完全不想用了。这cgywin的好处，谁用谁知道。</p>
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/154566#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Jan 2008 20:46:53 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/154566</link>
        <guid>http://trace.javaeye.com/blog/154566</guid>
      </item>
      <item>
        <title>db:migrate时，Table already exist 的解决办法</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/143152" style="color:red;">http://trace.javaeye.com/blog/143152</a>&nbsp;
          发表时间: 2007年11月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 在运行rake db:migrate时，有时会发现 rake abort 的错误，rake说某个表已经存在，因此这个migrate的工作它干不了。这个表确实是已经存在的，那么如何让rake跳过这个表，或是强制覆写这个表呢？有一处需要修改：<br />
<br />
原migrate文件：
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;CreateProducts&nbsp;&lt;&nbsp;ActiveRecord::Migration&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;</span><span class="keyword">self</span><span>.up&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;create_table&nbsp;<span class="symbol">:products</span><span>&nbsp;</span><span class="keyword">do</span><span>&nbsp;</span><span class="variable">|t</span><span>|&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.column&nbsp;<span class="symbol">:title</span><span>,&nbsp;</span><span class="symbol">:string</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.column&nbsp;<span class="symbol">:description</span><span>,&nbsp;</span><span class="symbol">:text</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.column&nbsp;<span class="symbol">:image_url</span><span>,&nbsp;</span><span class="symbol">:string</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;</span><span class="keyword">self</span><span>.down&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;drop_table&nbsp;<span class="symbol">:products</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
<br />
<br />
修改后的migrate文件：
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb" start="1">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;CreateProducts&nbsp;&lt;&nbsp;ActiveRecord::Migration&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;</span><span class="keyword">self</span><span>.up&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;create_table&nbsp;<span class="symbol">:products</span><span>,&nbsp;</span><span class="symbol">:force</span><span>&nbsp;=&gt;&nbsp;</span><span class="keyword">true</span><span>&nbsp;</span><span class="keyword">do</span><span>&nbsp;</span><span class="variable">|t</span><span>|&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.column&nbsp;<span class="symbol">:title</span><span>,&nbsp;</span><span class="symbol">:string</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.column&nbsp;<span class="symbol">:description</span><span>,&nbsp;</span><span class="symbol">:text</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.column&nbsp;<span class="symbol">:image_url</span><span>,&nbsp;</span><span class="symbol">:string</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;</span><span class="keyword">self</span><span>.down&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;drop_table&nbsp;<span class="symbol">:products</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
看出来了吗，在create_table的参数中，加上 :force =&gt; true即可。
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/143152#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 23 Nov 2007 20:59:39 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/143152</link>
        <guid>http://trace.javaeye.com/blog/143152</guid>
      </item>
      <item>
        <title>利用YUI创建简单的右键菜单</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/125106" style="color:red;">http://trace.javaeye.com/blog/125106</a>&nbsp;
          发表时间: 2007年09月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;在页面上实现右键菜单（ContextMenu），效果明显，用途广泛，并且，利用YUI，实现起来也不复杂。我参考了YUI的文档之后，设计了一个简单的实现右键菜单的页面。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  首先，看一看没有写js的页面代码：<br />
<br />
<div class="dp-highlighter">
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">html</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;http://www.w3.org/1999/xhtml&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">&quot;Content-Type&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;text/html;&nbsp;charset=gb2312&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>ContextMenuTest</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comments">&lt;!--&nbsp;CSS&nbsp;for&nbsp;Menu&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comments">&lt;!--具体链接需自己修改--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">link</span><span>&nbsp;</span><span class="attribute">rel</span><span>=</span><span class="attribute-value">&quot;stylesheet&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/css&quot;</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;../javascripts/yui/menu/assets/skins/sam/menu.css&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">style</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/css&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>#Workbench&nbsp;{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;position:absolute;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;left:124px;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;top:57px;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;width:597px;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;height:278px;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;z-index:1;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;border:#0000FF&nbsp;solid&nbsp;1px;&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>#TestContextMenu&nbsp;{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;position:relative;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;width:400px;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;height:100px;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;border:#FF0000&nbsp;solid&nbsp;1px;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;left:&nbsp;10px;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;top:&nbsp;10px;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;background-color:#99CC00;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>body&nbsp;{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;font-size:&nbsp;13px;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} <span class="tag"></span><span><br />
    </span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">style</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">body</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;yui-skin-sam&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;Workbench&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;TestContextMenu&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
可以看到，只有两个div和一些CSS样式。下面，开始写js，首先，导入一些要用到的js文件：<br />
<br />
<div class="dp-highlighter">
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="comments">&lt;!--具体链接需自己修改--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comments">&lt;!--&nbsp;Namespace&nbsp;source&nbsp;file&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;../javascripts/yui/yahoo/yahoo.js&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comments">&lt;!--&nbsp;Dependency&nbsp;source&nbsp;files&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;../javascripts/yui/event/event.js&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;../javascripts/yui/dom/dom.js&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;../javascripts/yui/animation/animation.js&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comments">&lt;!--&nbsp;Container&nbsp;source&nbsp;file&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;../javascripts/yui/container/container_core.js&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comments">&lt;!--&nbsp;Menu&nbsp;source&nbsp;file&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;../javascripts/yui/menu/menu.js&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
在这个页面中，可能不会用到上面所有的文件，但都写在这了。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  接着，编写页面中的js脚本。先设计一个函数，并让页面加载完成后调用它：<br />
<br />
<div class="dp-highlighter">
<ol class="dp-c" start="1">
    <li class="alt"><span><span>YAHOO.example.testContextMenu_init&nbsp;=&nbsp;</span><span class="keyword">function</span><span>(p_sType)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;当载入了yahoo.js之后，就自动产生了YAHOO.example这个名称空间。</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;p_sType&nbsp;目前还不知道是干什么用的，只是照抄文档上的。</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>YAHOO.util.Event.addListener(window,&nbsp;<span class="string">&quot;load&quot;</span><span>,&nbsp;YAHOO.example.testContextMenu_init);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
这样就完成了这个功能。接下来，就该写这个函数里面的内容了。首先，产生一个ContextMenu对象：<br />
<br />
<div class="dp-highlighter">
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;target&nbsp;=&nbsp;document.getElementById(</span><span class="string">&quot;TestContextMenu&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;aMenuItems&nbsp;=&nbsp;[&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;text:&nbsp;<span class="string">&quot;编辑&quot;</span><span>,&nbsp;helptext:&nbsp;</span><span class="string">&quot;Shift&nbsp;+&nbsp;E&quot;</span><span>&nbsp;},&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;text:&nbsp;<span class="string">&quot;复制&quot;</span><span>,&nbsp;helptext:&nbsp;</span><span class="string">&quot;Shift&nbsp;+&nbsp;C&quot;</span><span>&nbsp;},&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;text:&nbsp;<span class="string">&quot;删除&quot;</span><span>,&nbsp;helptext:&nbsp;</span><span class="string">&quot;Shift&nbsp;+&nbsp;D&quot;</span><span>&nbsp;}&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;];&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;aContextMenu&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;YAHOO.widget.ContextMenu(&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;myContextMenu&quot;</span><span>,&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trigger:&nbsp;target,&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itemdata:&nbsp;aMenuItems,&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lazyload:&nbsp;<span class="keyword">true</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;effect:&nbsp;{&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;effect:YAHOO.widget.ContainerEffect.FADE,&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;duration:0.1&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp; <br />
    </span></li>
</ol>
</div>
<br />
其中的target就是需要响应右键菜单的区域。aMenuItems是菜单项，aContextMenu就是构造的ContextMenu函数。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  接着，设计一些事件响应函数：<br />
<br />
<div class="dp-highlighter">
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;onContextMenuClick(p_sType,&nbsp;p_aArgs)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;oItem&nbsp;=&nbsp;p_aArgs[1]&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(oItem)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">switch</span><span>(oItem.index)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;0:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;This&nbsp;is&nbsp;the&nbsp;first&nbsp;Item&quot;</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;1:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(oItem)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;2:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(p_aArgs[1])&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;onContextMenuRender(p_sType,&nbsp;p_aArgs)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.clickEvent.subscribe(onContextMenuClick);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>aContextMenu.renderEvent.subscribe(onContextMenuRender);&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
这里的函数布置顺序也是一般的事件注册顺序。现在，就可以跑跑看了。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  ps：在YUI的文档中，有一个GetListItemFromEventTarget()函数，可以从触发右键菜单的元素开始向上追溯到指定的父元素，在一般的页面设计中，都是用得到的。另外，菜单的自定义CSS，也可参考<a href="http://developer.yahoo.com/yui/menu/">YUI的Menu文档</a>。
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/125106#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Sep 2007 20:35:56 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/125106</link>
        <guid>http://trace.javaeye.com/blog/125106</guid>
      </item>
      <item>
        <title>YUI中logger的用法</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/123932" style="color:red;">http://trace.javaeye.com/blog/123932</a>&nbsp;
          发表时间: 2007年09月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  前不久，从Java转到了Ruby，前几天，又从Ruby转到了页面UI。为什么？因为老板的这个项目就我一个人做，苦不堪言。不过还是苦中有乐的，这不，发现了YUI这个好东西。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  可以去<a href="http://developer.yahoo.com/yui/">这里</a>访问YUI的主页，YUI的一个特定就是漂亮，再一个就是文档详细，看得出来Yahoo花的功夫。我认为在那一堆UI中，Logger是首先应该掌握的，因为它在一定程度上解决了js不好调试的问题。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  使用步骤：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  1、将必要文件导入到页面中：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">link</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/css&quot;</span><span>&nbsp;</span><span class="attribute">rel</span><span>=</span><span class="attribute-value">&quot;stylesheet&quot;</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;../javascripts/yui/logger/assets/skins/sam/logger.css&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;../javascripts/yui/yahoo/yahoo-min.js&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;../javascripts/yui/yahoo-dom-event/yahoo-dom-event.js&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;../javascripts/yui/dragdrop/dragdrop-min.js&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;../javascripts/yui/logger/logger-min.js&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
前面那个是要用到的CSS，后面是必要的js文件。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  2、在页面中设计一个div，用来&ldquo;装&rdquo;调试信息：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">'debug'</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
它不需要任何样式，定位也不需要。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  3、然后，使用已定义的CSS样式来美化它。注意，这个样式应该写在此div的父元素上，此处，父元素为body：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">body</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;yui-skin-sam&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 4、接着在此div后加上这样一段代码：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>var&nbsp;<span class="attribute">myLogReader</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;YAHOO.widget.LogReader(&quot;debug&quot;);&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
这样，这个Logger就可以用了，预览页面，有一个漂亮的信息框。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  那么，如何记录调试信息呢？我这里有两个方法，其一，在任意一个js函数调用中，使用类似如下的语句：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>YAHOO.log(</span><span class="string">&quot;My&nbsp;log&nbsp;message&quot;</span><span>,&nbsp;</span><span class="string">&quot;warn&quot;</span><span>);&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
这样记录的信息属于Global。其二，在某个js函数的调用中，构造LogWriter对象：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>var&nbsp;myLogWriter&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;YAHOO.widget.LogWriter(</span><span class="string">&quot;myLogWriter&quot;</span><span>);&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>myLogWriter.log(<span class="string">&quot;This&nbsp;is&nbsp;the&nbsp;'myLogWriter'&nbsp;info&quot;</span><span>,&nbsp;</span><span class="string">&quot;info&quot;</span><span>)&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
这样记录的信息就专属于一个LogWriter。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  在YUI的介绍上，还有LogReader的初始化参数介绍。这里就不写了。
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/123932#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 14 Sep 2007 21:08:34 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/123932</link>
        <guid>http://trace.javaeye.com/blog/123932</guid>
      </item>
      <item>
        <title>在dojo框架下实现js的面向对象编程</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/106202" style="color:red;">http://trace.javaeye.com/blog/106202</a>&nbsp;
          发表时间: 2007年07月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 《JavaScript权威指南》中说到：&ldquo;JavaScript是面向对象的语言&rdquo;。这句话固然权威，但实现起来却缺少指南。究其原因，是JavaScript中含有Java这个单词（^_^开个玩笑）。不过，将js与Java对比后就可以发现，js没有直接提供名称空间（也就是包）的机制，同时，类的创建与Java也大相径庭，加之平常对js的使用，也就局限在一些function的定义和触发调用上，因此对js面向对象的性能不感冒，直到dojo这个js框架的出现，就像黑夜中的萤火虫，让人看到了js开发的新局面。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我在参考了dojo book中的相关章节后，写下这篇介绍在dojo中实现js面向对象编程的帖子。如果您对js的面向对象的说法不理解，还请您先参考附件中的《JavaScript权威指南（第五版）》（En），相信这对您学习JavaScript有极大的帮助。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好了，废话说了很多了。先新建一个工程（我用的是Eclipse3.2＋MyEclipse5.5＋JSEclipse插件）：DojoOO<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后将dojo资源加入到工程文件中，现在看起来就像这样：<br />
<br />
<div align="center"><img src="file:///C:/DOCUME~1/trace/LOCALS~1/Temp/moz-screenshot-1.jpg" alt="" /></div>
<div align="center"><img src="file:///C:/DOCUME~1/trace/LOCALS~1/Temp/moz-screenshot.jpg" alt="" /></div>
<div align="center"><img src="http://trace.javaeye.com/upload/picture/pic/4457/2398950a-117a-40f4-977c-525f6029ffbd.png" alt="工程初始结构" /><br />
</div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在，在dojo文件夹的旁边，建一个自己的文件夹：trace，用来存放自己写的js包和类。<br />
<br />
<div align="center"><img src="http://trace.javaeye.com/upload/picture/pic/4459/a975ce63-8219-4b2e-867d-2384d57407d0.png" alt="" /></div>
<div align="center">
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本来，按照Java的规矩，我应该搞个org.trace.***的目录结构的，但是在js中，每一个类我们都得写全称，所以包名就尽量简写了。现在，在trace文件夹下建立util文件夹。注意：dojo的二级文件夹名称是src，自定义的就不需要了，直接把dojo中的三级文件夹提到二级就对了。<br />
<br />
<div align="center"><img src="http://trace.javaeye.com/upload/picture/pic/4460/260f9638-fa9b-433e-bc0b-5a15fd872f4a.png" alt="" /></div>
<div align="center">
<div align="center"> </div>
<div align="left">
<div align="left"> </div>
<div align="center">
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在，就是创建一个类了~~，别忙，在js中，由于没有包的机制，所以我们先得自己建个&rdquo;包文件&ldquo;：<br />
</div>
<br />
<img src="http://trace.javaeye.com/upload/picture/pic/4461/e2caeda0-f644-4ee6-83cd-8d75e32f5ed2.png" alt="" /><br />
</div>
<div align="center">
<div align="left">注意，这个&rdquo;包文件&ldquo;的名字一律都是：__package__.js。内容如下：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>dojo.kwCompoundRequire({common:[</span><span class="string">&quot;trace.util.Person&quot;</span><span>,&nbsp;</span><span class="string">&quot;trace.util.Employee&quot;</span><span>]});&nbsp;&nbsp;</span></span></li>
    <li class=""><span>dojo.provide(<span class="string">&quot;trace.util.*&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
可以看到，用到了dojo的函数。解释一下，第一行是把包内所有的文件进行&rdquo;注册&ldquo;，照上面看来，这个util包内应该有Person.js和Employee.js两个文件。第二行就是产生这个包了。至于dojo具体是怎么做的&hellip;&hellip;，咱不care，能用就行。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 顺便说一说，如果你要写注释，最&rdquo;安全&ldquo;的办法就是将dojo中的某个__package__.js的注释代码段拷过来，再修改其中的内容。我曾经在js代码中遍地开花地写了很多注释，结果在firefox中可以运行，在ie中就报错了（鄙视它），删掉注释后就好了。所以，dojo怎么写，咱最好就怎么写。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在，来写Person.js，内容如下：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>dojo.provide(</span><span class="string">&quot;trace.util.Person&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>trace.util.Person&nbsp;=&nbsp;<span class="keyword">function</span><span>(name,age)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.name&nbsp;=&nbsp;name;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.age&nbsp;=&nbsp;age;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>trace.util.Person.prototype.sayWaoo&nbsp;=&nbsp;<span class="keyword">function</span><span>()&nbsp;{alert(</span><span class="string">&quot;Waooooo~~&quot;</span><span>);}&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
这就是《JavaScript权威指南》中最权威的js类定义了。第一行要解释一下，这是在dojo中定义一个类或模块（带包名）的模板语句。Employee.js暂时不写了。现在看起来就像这样：<br />
<br />
<div align="center"><img src="http://trace.javaeye.com/admin/picture/4462" height="1" alt="写完Person" width="1" /><img src="http://trace.javaeye.com/upload/picture/pic/4462/00dd6d64-f90b-4599-ab7f-d425300783cc.png" alt="" />
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在，可以在index.jsp中写入测试代码了。内容如下：<span><span class="tag"></span><span></span><span class="attribute"></span><span></span><span class="attribute-value"></span><span></span><span class="attribute"></span><span></span><span class="attribute-value"></span><span></span><span class="tag"></span><span>&nbsp; </span></span><br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span>%@&nbsp;page&nbsp;</span><span class="attribute">language</span><span>=</span><span class="attribute-value">&quot;java&quot;</span><span>&nbsp;</span><span class="attribute">pageEncoding</span><span>=</span><span class="attribute-value">&quot;UTF-8&quot;</span><span>%</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&lt;!DOCTYPE&nbsp;HTML&nbsp;PUBLIC&nbsp;&quot;-//W3C//DTD&nbsp;HTML&nbsp;4.01&nbsp;Transitional//EN&quot;<span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>测试页面</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">&quot;pragma&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;no-cache&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">&quot;cache-control&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;no-cache&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">&quot;expires&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;0&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">&quot;keywords&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;keyword1,keyword2,keyword3&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">meta</span><span>&nbsp;</span><span class="attribute">http-equiv</span><span>=</span><span class="attribute-value">&quot;description&quot;</span><span>&nbsp;</span><span class="attribute">content</span><span>=</span><span class="attribute-value">&quot;This&nbsp;is&nbsp;my&nbsp;page&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<span class="attribute">djConfig</span><span>&nbsp;=&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isDebug:&nbsp;true,&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debugContainerId:&nbsp;&quot;dojodebug&quot;,&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bindEncoding:&nbsp;'UTF-8'&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;/DojoOO/js/dojo/dojo.js&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;dojo.require(&quot;trace.util.Person&quot;);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;<span class="attribute">trace</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;trace.util.Person(&quot;AKai&quot;,23);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;document.write(trace.name);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;dojodebug&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
说明几点：1、不可以有base标签；2、dojo的配置一定要按照这个脚本段出现的顺序来；3、最好加上debug属性和一个装载debug信息的容器，不然在ie中很不好调试。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行一下，看看效果吧：）</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 刚才在写Person时，用的是一般的js类定义。在dojo中，有它设计的更&rdquo;亲切&ldquo;的定义方法，如下：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>dojo.declare(</span><span class="string">&quot;trace.util.Person&quot;</span><span>,</span><span class="keyword">null</span><span>,{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;initializer&nbsp;:&nbsp;<span class="keyword">function</span><span>(name,&nbsp;age){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.name&nbsp;=&nbsp;name;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.age&nbsp;=&nbsp;age;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;sayWaoo:&nbsp;<span class="keyword">function</span><span>()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;Waoooo~~~&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp; statics&nbsp;{counter:&nbsp;0,&nbsp;somethingElse:&nbsp;<span class="string">&quot;hello&quot;</span><span>}&nbsp;&nbsp;</span></span></li>
    <li class=""><span>});&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
initializer就相当于构造函数，静态方法，实例方法的定义一目了然。可以注意到，其中有一个null，这表示Person类不继承于其他类，否则，这个null就换成它的父类，就实现了继承功能。（具体做法，参见dojo book中的<a href="http://www.dojotoolkit.com/book/dojo-book-0-4/part-3-dojo-programming-model/object-oriented-concepts-and-inheritance">相关章节</a>）。本文同时也参考了<a href="http://www.nirvanastudio.org/javascript/%E7%BC%96%E5%86%99%E8%87%AA%E5%B7%B1%E7%9A%84dojo%E6%89%A9%E5%B1%95.html">这篇文章</a>，在此，一并感谢原作者。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/106202#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Jul 2007 22:15:00 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/106202</link>
        <guid>http://trace.javaeye.com/blog/106202</guid>
      </item>
      <item>
        <title>搞定dojo引起的ie6“无法打开”的问题</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/106084" style="color:red;">http://trace.javaeye.com/blog/106084</a>&nbsp;
          发表时间: 2007年07月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一直觉得dojo是个好东西，也一直是在firefox里面用dojo，前天，把含有dojo调用的页面在ie6里面打开，结果，它弹出个error：Internet Explorer无法打开Internet站点，具体信息没有显示。猴急+无奈&hellip;&hellip;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 经过&hellip;&hellip;&hellip;&hellip;（省去惊心动魄的捉虫历程），终于找到原因：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">base</span><span>&nbsp;</span><span class="attribute">href</span><span>=</span><span class="attribute-value">&quot;&lt;%=basePath%&gt;&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
base标签就是罪魁祸首，<font color="#ff0000">删掉它就一切OK了</font>。具体原因，可能是dojo对namespace的实现和模拟的import机制，与base标签的功能有冲突（哈，猜测而已）。
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/106084#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Jul 2007 13:16:29 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/106084</link>
        <guid>http://trace.javaeye.com/blog/106084</guid>
      </item>
      <item>
        <title>自定义Struts的JSP模板和Hibernate的DAO模板</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/102703" style="color:red;">http://trace.javaeye.com/blog/102703</a>&nbsp;
          发表时间: 2007年07月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 这一阵子在MyEclipse里做项目，用到了Struts和hibernate功能，起初，对自动生成赞不绝口，但后来，发现自动生成的代码也有不方便的地方，比如：<br />
<br />
一、Struts<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; 当new一个JSP，使用Standard JSP using Struts 1.2时，生成的页面代码中只包含了Struts标签。但很多时候，我们需要在页面中使用到JSTL标签，我们应该把常用的几个JSTL标签加到JSP页 面中，就像这样：<br />
<br />
<div class="dp-highlighter">
<ol class="dp-j" start="1">
    <li class="alt"><span><span>&lt;%@&nbsp;taglib&nbsp;uri=</span><span class="string">&quot;http://struts.apache.org/tags-bean&quot;</span><span>&nbsp;prefix=</span><span class="string">&quot;bean&quot;</span><span>%&gt;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;%@&nbsp;taglib&nbsp;uri=<span class="string">&quot;http://struts.apache.org/tags-html&quot;</span><span>&nbsp;prefix=</span><span class="string">&quot;html&quot;</span><span>%&gt;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&lt;%@&nbsp;taglib&nbsp;uri=<span class="string">&quot;http://struts.apache.org/tags-logic&quot;</span><span>&nbsp;prefix=</span><span class="string">&quot;logic&quot;</span><span>%&gt;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;%@&nbsp;taglib&nbsp;uri=<span class="string">&quot;http://struts.apache.org/tags-tiles&quot;</span><span>&nbsp;prefix=</span><span class="string">&quot;tiles&quot;</span><span>%&gt;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&lt;%@&nbsp;taglib&nbsp;uri=<span class="string">&quot;http://java.sun.com/jsp/jstl/core&quot;</span><span>&nbsp;prefix=</span><span class="string">&quot;c&quot;</span><span>%&gt;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;%@&nbsp;taglib&nbsp;uri=<span class="string">&quot;http://java.sun.com/jsp/jstl/functions&quot;</span><span>&nbsp;prefix=</span><span class="string">&quot;fn&quot;</span><span>%&gt;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&lt;%@&nbsp;taglib&nbsp;uri=<span class="string">&quot;http://java.sun.com/jsp/jstl/fmt&quot;</span><span>&nbsp;prefix=</span><span class="string">&quot;fmt&quot;</span><span>%&gt;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  其次，Struts1.2的
<div class="dp-highlighter">
<ol class="dp-xml" start="1">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">html:base</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<html:base>
<html:base>
似乎有些问题，它表示的地址是当前页面的地址，而不是应用程序的根目录，因此，这个base我们还是得用内嵌的Java代码得到，就像这样：<br />
<br />
</html:base>
</html:base>
<div class="dp-highlighter">
<ol class="dp-j" start="1">
    <li class="alt"><span><span>&lt;%&nbsp;&nbsp;</span></span></li>
    <li class=""><span>String&nbsp;path&nbsp;=&nbsp;request.getContextPath();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>String&nbsp;basePath&nbsp;=&nbsp;request.getScheme()+<span class="string">&quot;://&quot;</span><span>+request.getServerName()+</span><span class="string">&quot;:&quot;</span><span></span></span></li>
    <li class="alt"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +request.getServerPort()+path+</span><span class="string">&quot;/&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>%&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  然后在之间加入base标签：<br />
<br />
<div class="dp-highlighter">
<ol class="dp-j" start="1">
    <li class="alt"><span><span></span><span class="string">&quot;&lt;%=basePath%&gt;&quot;</span><span>&gt;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  这样，用起来才比较方便一点。但每次都改页面，显然做了很多重复的劳动，我想MyEclipse在生成这样的页面时，肯定用到了模板。那么到底是那个模板呢？我们来搜搜看。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; 首先说明一下，我用的不是MyEclipse的All-In-One安装，所以有两个目录，一个是Eclipse的解压目录，另一个才是 MyEclipse的安装目录：MyEclipse 5.5.1 GA。如果用的All-In-One安装，可能只有一个目录，就是MyEclipse 5.5.1 GA。这里，我就把这个目录称为安装目录了。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  在安装目录下搜索：Struts-1_2.vtl，可以得到这个文件，打开看看，其头部结构与生成的页面很相似，因此，我们只需要在适当的地方添上自己的代码即可。修改前还是要注意备份。<br />
<br />
二、hibernate<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; 使用Hibernate Reverse Engineering最大的好处就是它可以自动生成PO和DAO的源码，以及映射配置文件。但是看看DAO的代码，才发现里面的数据库操作方法都是实例 方法，用起来还必须先new一个DAO，个人觉得没有这个必要，使用静态方法就可以了，但我不可能给每个DAO的每个方法都加一个static吧。于是， 跟上面一样，改模板。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; 首先得分析一下，生成的DAO是继承的BaseHibernateDAO，而BaseHibernateDAO是扩展的 IBaseHibernateDAO接口，在这个接口中，定义了getSession方法。要把数据库操作方法改成static，这个 getSession方法也必须是static，但是在接口中不能定义是static的方法，那么唯一的办法就是不管IBaseHibernateDAO 接口，在BaseHibernateDAO类中自己实现一个静态的getSession方法。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; BaseHibernateDAO有模板文件，但是没有必要改它，因为一个工程只用得到一个BaseHibernateDAO。我们要改的模板文件是用于 生成具体DAO类的。然而在安装目录下用hibernate关键字搜一搜，并没有发现哪个文件与我们的DAO有关，难道MyEclipse把生成规则写死 在代码里了吗？<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; 我不相信MyEclipse的开发人员那么糊涂，于是用templates关键字搜索了一下，发现了这个： myeclipse_templates_5.5GA.zip，打开一点，发现里面全部是有关hibernate的模板文件，另外有一个readme的说 明，关键部分如下：<br />
<br />
<div class="dp-highlighter">
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="number">2</span><span>)&nbsp;Edit&nbsp;the&nbsp;velocity&nbsp;templates&nbsp;you&nbsp;wish&nbsp;to&nbsp;customize.&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Note:&nbsp;POJO&nbsp;templates&nbsp;are&nbsp;present&nbsp;in&nbsp;the&nbsp;pojo&nbsp;folder&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DAO&nbsp;template&nbsp;in&nbsp;the&nbsp;dao&nbsp;folder&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HBM&nbsp;templates&nbsp;in&nbsp;the&nbsp;hbm&nbsp;folder&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="number">3</span><span>)&nbsp;Optional:&nbsp;Though&nbsp;not&nbsp;necessary,&nbsp;it&nbsp;is&nbsp;recommended&nbsp;that&nbsp;you&nbsp;delete&nbsp;the&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;velocity&nbsp;templates&nbsp;you&nbsp;<span class="keyword">do</span><span>&nbsp;not&nbsp;plan&nbsp;to&nbsp;customize.&nbsp;This&nbsp;will&nbsp;prevent&nbsp;future&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;confusion&nbsp;over&nbsp;which&nbsp;templates&nbsp;are&nbsp;being&nbsp;processed&nbsp;by&nbsp;MyEclipse.&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="number">4</span><span>)&nbsp;Invoke&nbsp;the&nbsp;JPA/EJB3/Hibernate&nbsp;Reverse-Engineering&nbsp;wizard&nbsp;and&nbsp;select&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;<span class="string">&quot;Use&nbsp;custom&nbsp;templates&quot;</span><span>.&nbsp;Manually&nbsp;enter&nbsp;or&nbsp;click&nbsp;the&nbsp;browse&nbsp;button&nbsp;to&nbsp;select&nbsp;the&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;myeclipse_templates_5.5GA&nbsp;folder.&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp; 上面的意思是：把解压之后的文件夹放在一个方便的地方（不需要放在原目录下，那样找起来很不方便），修改它，然后删掉其他你没有修改的文件，以免发生可能的冲突，最后，在<span><span>Hibernate&nbsp;Reverse-Engineering的对话框中，钩选</span></span><span><span class="string">Use&nbsp;custom&nbsp;templates，输入你解压后的文件夹（</span></span><span>myeclipse_templates_5.5GA</span><span><span class="string">）路径，就可以使用到自定义的模板了。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; 照这个意思，我修改了DAO文件夹下的daohome.vm和facadeif.vm，在其中所有的public标识后加上了static（我也不知道哪 些是hibernatet真正用到的，反正我不用EJB和JPA）。然后照它的意思试 了一把，果然，DAO方法全变成了static。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; 目前，我还没有充分的证据证明DAO中使用静态方法比实例方法要好，只是觉得使用静态方法方便一些，运用到工程中也没有出错。我想，MyEclipse自 动生成的DAO，使用实例方法，可能有他们的考虑，这就有可能是我没有考虑到的。所以，各位高手如果有充分的经验证明静态方法比实例方法好，那么请给小弟 一个sp，也好让我信心十足地写程序；如果有充分的道理证明实例方法比静态方法好，也请毫不吝惜地拍砖。</span></span>
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/102703#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 19 Jul 2007 10:24:00 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/102703</link>
        <guid>http://trace.javaeye.com/blog/102703</guid>
      </item>
      <item>
        <title>HibernateException——我要抓到你！</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/98850" style="color:red;">http://trace.javaeye.com/blog/98850</a>&nbsp;
          发表时间: 2007年07月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  MyEclipse有一个Hibernate的插件，用它可以快速地生成与Hibernate操作有关的代码，十分方便。初学Hibernate时，调<br />
<br />
用着这些自动生成的代码，看着数据库中一行行操作成功的数据，喜悦之情溢于言表。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 但是，今天，当我将hibernate用于项目，在Servlet环境下调用时，我需要的ServletExcpetion竟然无从产生。难道当数据<br />
<br />
库操作失败时，Servlet容器就放过这个错吗？显然不能。然而看看自己的代码，我找不到一处强制抛出错误的地方（Eclipse会<br />
<br />
在强制处理Exception的地方提示你）。再看看Hibernate自动生成的DAO类，果然没有一个方法抛出异常：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;save(Employee&nbsp;transientInstance)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;log.debug(<span class="string">&quot;saving&nbsp;Employee&nbsp;instance&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getSession().save(transientInstance);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(<span class="string">&quot;save&nbsp;successful&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(RuntimeException&nbsp;re)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(<span class="string">&quot;save&nbsp;failed&quot;</span><span>,&nbsp;re);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;re;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;delete(Employee&nbsp;persistentInstance)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;log.debug(<span class="string">&quot;deleting&nbsp;Employee&nbsp;instance&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getSession().delete(persistentInstance);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(<span class="string">&quot;delete&nbsp;successful&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(RuntimeException&nbsp;re)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(<span class="string">&quot;delete&nbsp;failed&quot;</span><span>,&nbsp;re);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;re;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;Employee&nbsp;findById(java.lang.String&nbsp;id)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;log.debug(<span class="string">&quot;getting&nbsp;Employee&nbsp;instance&nbsp;with&nbsp;id:&nbsp;&quot;</span><span>&nbsp;+&nbsp;id);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Employee&nbsp;instance&nbsp;=&nbsp;(Employee)&nbsp;getSession().get(&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;apqp.hbm.admin.employee.Employee&quot;</span><span>,&nbsp;id);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;instance;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(RuntimeException&nbsp;re)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(<span class="string">&quot;get&nbsp;failed&quot;</span><span>,&nbsp;re);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;re;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>///......省去其他方法 <br />
    </span></li>
</ol>
</div>
<br />
这些方法在内部处理的是RuntimeException。可是save()等一些数据库操作方法应该是会抛出异常的啊，按照Hibernate API，<br />
<br />
这些方法都会抛出HibernateException。但是（看看，多曲折啊），当我在API中将HibernateException找到时，发现它竟然是<br />
<br />
RuntimeException的子类，难怪抓不住它的！<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  现在我搞清楚了，操作hibernate时，该抛出异常的地方你得自己抓异常，比如：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>DepartmentDAO&nbsp;dao&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;DepartmentDAO();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Transaction&nbsp;t&nbsp;=&nbsp;dao.getSession().beginTransaction();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>dao.save(<span class="keyword">new</span><span>&nbsp;Department(</span><span class="string">&quot;采购部&quot;</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>t.commit();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>dao.getSession().close();&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
这里不写异常也能运行，但是不符合业务逻辑的需要。因此，在可能出现异常的地方，要catch HibernateExcpetion。可是，那<br />
<br />
些地方时可能出现异常的地方呢？参照了一些高手的代码，综合了一下他们的特点，我决定：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>DepartmentDAO&nbsp;dao&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;DepartmentDAO();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>Transaction&nbsp;t&nbsp;=&nbsp;<span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; t&nbsp;=&nbsp;dao.getSession().beginTransaction();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; dao.save(<span class="keyword">new</span><span>&nbsp;Department(</span><span class="string">&quot;采供部&quot;</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; t.commit();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; dao.getSession().close();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;<span class="keyword">catch</span><span>&nbsp;(HibernateException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; <span class="comment">//&nbsp;Do&nbsp;Some&nbsp;Exception&nbsp;Handler&nbsp;Operate</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; <span class="keyword">if</span><span>&nbsp;(t!=</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.rollback();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;<span class="keyword">finally</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; dao.getSession().close();&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
这样，我就抓到HibernateExcpetion了。
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/98850#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 07 Jul 2007 21:59:32 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/98850</link>
        <guid>http://trace.javaeye.com/blog/98850</guid>
      </item>
      <item>
        <title>认识session</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/96490" style="color:red;">http://trace.javaeye.com/blog/96490</a>&nbsp;
          发表时间: 2007年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以往我们认为在servlet中通request.getSessioin()就可以得到session，设置一些属性，就是session的功能；当客户端关闭浏览器时，session就&ldquo;消失&rdquo;了。这些看上去都很合理，但有些细节必须搞清楚。<br />
<br />
1、会话跟踪的原理。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java Servlet API通过Session技术来跟踪会话和管理会话内容。当客户第一次连接到服务器的时候，服务器为其建立一个session（通过session.isNew()方法可以判断客户端是不是&ldquo;第一次&rdquo;），并分配给客户一个唯一的标识（Session ID），以后客户的每次提交请求，都要将标识一起提交（提交该标识的方法有多种），服务器根据标识找到特定的Session，用这个Session记录客户的状态。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么，在S与B之间，是如何传送这个Session ID的呢？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有三种机制：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）SSL会话。（略）<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2）Cookies<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 服务器利用响应报头 Set-Cookies来发送Cookies信息。RFC2109规范中的Set-Cookies报头格式为：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>Set-Cookies:&nbsp;NAME=VALUE;&nbsp;Comment=value;&nbsp;Domain=value;&nbsp;Max-Age=value;&nbsp;Path=value; <br />
    </span></span></li>
    <li class="alt"><span><span>Secure;&nbsp;Version=</span><span class="number">1</span><span>*DIGIT&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
如果是用于会话跟踪的Cookies，NAME的值必须是JSESSIONID。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当浏览器接受到含有这个报头的response后，就会在内存中构建一个cookies。当它给特定的服务器（由Domain和Path值来区别）发送请求时，就会在请求报头中加入这样的信息：<br />
<div class="dp-highlighter">
<ol class="dp-j" start="1">
    <li class="alt"><span><span>Cookies:&nbsp;JSESSIONID=*****************************************&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
那么服务器就能找到对应的session，来跟踪用户了。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3）URL重写<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当浏览器禁用了Cookies后，就只能借助URL重写了。URL重写就是在请求地址中直接加入JSESSIONID信息，如：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>http:</span><span class="comment">//www.hust.edu.cn/clxy/index.jsp;&nbsp;jsessionid=******************************</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
这样，服务器也能找到对应的session，来跟踪用户。<br />
<br />
2、具体使用。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 平常在编程的时候，似乎并没有刻意地去用Cookies，更没有使用URL重写了。那么session是怎么工作的呢？请看续篇：<a href="http://trace.javaeye.com/blog/96494">认识session（续）&mdash;&mdash;自己动手做试验</a>
          <br/>
          <span style="color:red;">
            <a href="http://trace.javaeye.com/blog/96490#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 02 Jul 2007 09:21:00 +0800</pubDate>
        <link>http://trace.javaeye.com/blog/96490</link>
        <guid>http://trace.javaeye.com/blog/96490</guid>
      </item>
      <item>
        <title>重新认识Session（续）——自己动手做试验</title>
        <author>trace</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://trace.javaeye.com">trace</a>&nbsp;
          链接：<a href="http://trace.javaeye.com/blog/96494" style="color:red;">http://trace.javaeye.com/blog/96494</a>&nbsp;
          发表时间: 2007年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们可以设计一个Servlet，来看一看session到底是怎么工作的。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Servlet中，可以设计这样的代码：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="comment">//打印出sessionid，用来判断session是否新建</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>HttpSession&nbsp;session&nbsp;=&nbsp;request.getSession();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>System.out.println(<span class="string">&quot;::SESSION&nbsp;ID&nbsp;IS&nbsp;:&nbsp;&quot;</span><span>&nbsp;+&nbsp;session.getId());&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//打印出请求报头中的内容</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>Enumeration&nbsp;enu_req_headers&nbsp;=&nbsp;request.getHeaderNames();&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">while</span><span>(enu_req_headers.hasMoreElements())&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;headerName&nbsp;=&nbsp;(String)enu_req_headers.nextElement();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(!headerName.equals(</span><span class="string">&quot;cookie&quot;</span><span>))&nbsp;{</span><span class="comment">//非Cookie报头</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(headerName);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;{</span><span class="comment">//Cookie报头</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;content&nbsp;=&nbsp;request.getHeader(<span class="string">&quot;cookie&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">&quot;::cookie&nbsp;:&nbsp;&quot;</span><span>&nbsp;+&nbsp;content);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">//响应中是否含有Set-Cookie，浏览器的下次提交将会受此影响</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">boolean</span><span>&nbsp;containCookie&nbsp;=&nbsp;response.containsHeader(</span><span class="string">&quot;Set-Cookie&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>System.out.println(<span class="string">&quot;::If&nbsp;The&nbsp;Response&nbsp;Contain&nbsp;Header:Set-Cookie?&nbsp;:&nbsp;&quot;</span><span>+containCookie);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">//判断此session是否是新创建的</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>System.out.println(<span class="string">&quot;::If&nbsp;The&nbsp;Session&nbsp;is&nbsp;NEW&nbsp;:&nbsp;&quot;</span><span>&nbsp;+&nbsp;request.getSession().isNew());&nbsp;&nbsp;</span></span></li>
    <li class=""><span>System.out.println();&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
来查看session的工作情况。<br />
<br />
1、session是在何种情况下创建的？<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 重启服务器，重新打开浏览器（这里就用IE了）。输入地址，得到输出为：<br />
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>::SESSION&nbsp;ID&nbsp;IS&nbsp;:&nbsp;42DE852FBD9E23C5CA5E06E883D6F466&nbsp;&nbsp;</span></span></li>
    <li class=""><span>accept&nbsp;&nbsp;</span></li>
    <li class="alt"><span>accept-language&nbsp;&nbsp;</span></li>
    <li class=""><span>accept-encoding&nbsp;&nbsp;</span></li>
    <li class="alt"><span>user-agent&nbsp;&nbsp;</span></li>
    <li class=""><span>host&nbsp;&nbsp;</span></li>
    <li class="alt"><span>connection&nbsp;&nbsp;</span></li>
    <li class=""><span>::If&nbsp;The&nbsp;Response&nbsp;Contain&nbsp;Header:Set-Cookie?&nbsp;:&nbsp;<span class="keyword">true</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>::If&nbsp;The&nbsp;Session&nbsp;is&nbsp;NEW&nbsp;:&nbsp;<span class="keyword">true</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
注意到，在请求报头中，没有cookie的内容。但在response响应中，有Set-Cookie的要求，这将影响到下一次浏览器的请求。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  刷新一下，得到的输出为：<br />
<div class="bar"><span><span class="keyword"></span><span>&nbsp;
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>::SESSION&nbsp;ID&nbsp;IS&nbsp;:&nbsp;42DE852FBD9E23C5CA5E06E883D6F466&nbsp;&nbsp;</span></span></li>
    <li class=""><span>accept&nbsp;&nbsp;</span></li>
    <li class="alt"><span>accept-language&nbsp;&nbsp;</span></li>
    <li class=""><span>accept-encoding&nbsp;&nbsp;</span></li>
    <li class="alt"><span>user-agent&nbsp;&nbsp;</span></li>
    <li class=""><span>host&nbsp;&nbsp;</span></li>
    <li class="alt"><span>connection&nbsp;&nbsp;</span></li>
    <li class=""><span>::cookie&nbsp;:&nbsp;JSESSIONID=42DE852FBD9E23C5CA5E06E883D6F466&nbsp;&nbsp;</span></li>
    <li class="alt"><span>::If&nbsp;The&nbsp;Response&nbsp;Contain&nbsp;Header:Set-Cookie?&nbsp;:&nbsp;<span class="keyword">false</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>::If&nbsp;The&nbsp;Session&nbsp;is&nbsp;NEW&nbsp;:&nbsp;<span class="keyword">false</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
可以看到，浏览器向服务器提交了cookie，使用的是原来的session。由于这里并没有新建session，因此也没有了Set-Cookie的要求。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  关闭浏览器的接受cookie功能，重启浏览器，并刷新一次页面，可以得到以下输出：<br />
<br />
<div class="dp-highlighter">
<ol class="dp-j" start="1">
    <li class="alt"><span><span>::SESSION&nbsp;ID&nbsp;IS&nbsp;:&nbsp;5BF9763193E7E6FAF959B4224ED18977&nbsp;&nbsp;</span></span></li>
    <li class=""><span>accept&nbsp;&nbsp;</span></li>
    <li class="alt"><span>accept-language&nbsp;&nbsp;</span></li>
    <li class=""><span>accept-encoding&nbsp;&nbsp;</span></li>
    <li class="alt"><span>user-agent&nbsp;&nbsp;</span></li>
    <li class=""><span>host&nbsp;&nbsp;</span></li>
    <li class="alt"><span>connection&nbsp;&nbsp;</span></li>
    <li class=""><span>::If&nbsp;The&nbsp;Response&nbsp;Contain&nbsp;Header:Set-Cookie?&nbsp;:&nbsp;<span class="keyword">true</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>::If&nbsp;The&nbsp;Session&nbsp;is&nbsp;NEW&nbsp;:&nbsp;<span class="keyword">true</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>::SESSION&nbsp;ID&nbsp;IS&nbsp;:&nbsp;EB216E0FE7FAD5CAF9C6A472F0D72195&nbsp;&nbsp;</span></li>
    <li class=""><span>accept&nbsp;&nbsp;</span></li>
    <li class="alt"><span>accept-language&nbsp;&nbsp;</span></li>
    <li class=""><span>accept-encoding&nbsp;&nbsp;</span></li>
    <li class="alt"><span>user-agent&nbsp;&nbsp;</span></li>
    <li class=""><span>host&nbsp;&nbsp;</span></li>
    <li class="alt"><span>connection&nbsp;&nbsp;</span></li>
    <li class=""><span>::If&nbsp;The&nbsp;Response&nbsp;Contain&nbsp;Header:Set-Cookie?&nbsp;:&nbsp;<span class="keyword">true</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>::If&nbsp;The&nbsp;Session&nbsp;is&nbsp;NEW&nbsp;:&nbsp;<span class="keyword">true</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
可以看到，每次的请求都会创建一个session，并且每次都会有Set-Cookie的要求。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp; 我在地址栏的地址后面加上 ;jsessionid=</span></span><span><span><span>EB216E0FE7FAD5CAF9C6A472F0D72195，再次刷新页面，可以看到这样的输出：<br />
<br />
<div class="dp-highlighter">
<ol class="dp-j" start="1">
    <li class="alt"><span><span>::SESSION&nbsp;ID&nbsp;IS&nbsp;:&nbsp;EB216E0FE7FAD5CAF9C6A472F0D72195&nbsp;&nbsp;</span></span></li>
    <li class=""><span>accept&nbsp;&nbsp;</span></li>
    <li class="alt"><span>accept-language&nbsp;&nbsp;</span></li>
    <li class=""><span>accept-encoding&nbsp;&nbsp;</span></li>
    <li class="alt"><span>user-agent&nbsp;&nbsp;</span></li>
    <li class=""><span>host&nbsp;&nbsp;</span></li>
    <li class="alt"><span>connection&nbsp;&nbsp;</span></li>
    <li class=""><span>::If&nbsp;The&nbsp;Response&nbsp;Contain&nbsp;Header:Set-Cookie?&nbsp;:&nbsp;<span class="keyword">false</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>::If&nbsp;The&nbsp;Session&nbsp;is&nbsp;NEW&nbsp;:&nbsp;<span class="keyword">false</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
可以看到，没有新建session，也没有Set-Cookie的要求。这里就是使用URL重写来实现的会话跟踪。但若</span></span></span><span><span>jsessionid的值在现有session中找不到，servlet容器还是会创建一个新的session。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  现在，将浏览器的接收cookie功能打开，验证最后一个特征。<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp;&nbsp;  先重启一下浏览器，刷新一下，得到的输出如下：<br />
<br />
<div class="dp-highlighter">
<ol class="dp-j" start="1">
    <li class="alt"><span><span>::SESSION&nbsp;ID&nbsp;IS&nbsp;:&nbsp;8DAB8217CC9EB70BD0194D4E76C2A805&nbsp;&nbsp;</span></span></li>
    <li class=""><span>accept&nbsp;&nbsp;</span></li>
    <li class="alt"><span>accept-language&nbsp;&nbsp;</span></li>
    <li class=""><span>accept-encoding&nbsp;&nbsp;</span></li>
    <li class="alt"><span>user-agent&nbsp;&nbsp;</span></li>
    <li class=""><span>host&nbsp;&nbsp;</span></li>
    <li class="alt"><span>connection&nbsp;&nbsp;</span></li>
    <li class=""><span>::If&nbsp;The&nbsp;Response&nbsp;Contain&nbsp;Header:Set-Cookie?&nbsp;:&nbsp;<span class="keyword">true</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>::If&nbsp;The&nbsp;Session&nbsp;is&nbsp;NEW&nbsp;:&nbsp;<span class="keyword">true</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>::SESSION&nbsp;ID&nbsp;IS&nbsp;:&nbsp;8DAB8217CC9EB70BD0194D4E76C2A805&nbsp;&nbsp;</span></li>
    <li class=""><span>accept&nbsp;&nbsp;</span></li>
    <li class="alt"><span>accept-language&nbsp;&nbsp;</span></li>
    <li class=""><span>accept-encoding&nbsp;&nbsp;</span></li>
    <li class="alt"><span>user-agent&nbsp;&nbsp;</span></li>
    <li class=""><span>host&nbsp;&nbsp;</span></li>
    <li class="alt"><span>connection&nbsp;&nbsp;</span></li>
    <li class=""><span>::cookie&nbsp;:&nbsp;JSESSIONID=8DAB8217CC9EB70BD0194D4E76C2A805&nbsp;&nbsp;</span></li>
    <li class="alt"><span>::If&nbsp;The&nbsp;Response&nbsp;Contain&nbsp;Header:Set-Cookie?&nbsp;:&nbsp;<span class="keyword">false</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>::If&nbsp;The&nbsp;Session&nbsp;is&nbsp;NEW&nbsp;:&nbsp;<span class="keyword">false</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
现在，重启服务器，但不要关闭浏览器。待服务器重启完毕，再刷新一下页面，可以看到这样的输出：<br />
<br />
<div class="dp-highlighter">
<ol class="dp-j" start="1">
    <li class="alt"><span><span>::SESSION&nbsp;ID&nbsp;IS&nbsp;:&nbsp;8DAB8217CC9EB70BD0194D4E76C2A805&nbsp;&nbsp;</span></span></li>
    <li class=""><span>accept&nbsp;&nbsp;</span></li>
    <li class="alt"><span>accept-language&nbsp;&nbsp;</span></li>
    <li class=""><span>accept-encoding&nbsp;&nbsp;</span></li>
    <li class="alt"><span>user-agent&nbsp;&nbsp;</span></li>
    <li class=""><span>host&nbsp;&nbsp;</span></li>
    <li class="alt"><span>connection&nbsp;&nbsp;</span></li>
    <li class=""><span>::cookie&nbsp;:&nbsp;JSESSIONID=8DAB8217CC9EB70BD0194D4E76C2A805&nbsp;&nbsp;</span></li>
    <li class="alt"><span>::If&nbsp;The&nbsp;Response&nbsp;Contain&nbsp;Header:Set-Cookie?&nbsp;:&nbsp;<span class="keyword">false</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>::If&nbsp;The&nbsp;Session&nbsp;