<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>rmn190</title>
    <description></description>
    <link>http://rmn190.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>自写的一个JavaScript小小工具</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/216021" style="color:red;">http://rmn190.javaeye.com/blog/216021</a>&nbsp;
          发表时间: 2008年07月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p style="padding-left: 30px;">&nbsp;&nbsp; 由于项目需要,写了一个JavaScript的工具,专门来根据指定Value来锁定Select中的相应Option.代码粘在这里,一是为了日后便于自己查找,二是希望能对别人有所帮助并提出宝贵意见. </p>
<pre name="code" class="js">/*
  * id, the element of select.
  * value, whose option would be selected.
  */
 function lockSelect(id, value){
         var el = document.getElementById(id);
         var optionsNumbers = el.length;
         
         for(var i=0;i&lt;optionsNumbers;i++){
                 if(el.options[i].value == value){
                         el.options[i].selected=true;
                         return;
                 }
         }
 }</pre>
&nbsp;
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/216021#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, 18 Jul 2008 10:03:41 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/216021</link>
        <guid>http://rmn190.javaeye.com/blog/216021</guid>
      </item>
      <item>
        <title>Acegi系列(一), 配置出问题了...</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/210720" style="color:red;">http://rmn190.javaeye.com/blog/210720</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Acegi的配置出问题了:</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1, 登录后所有连接都能访问. --&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2, 同样的IP,同样的浏览器中可以在不Logout情况下连续登录.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3, 即使不登录也能访问里面的连接. <br />
<br />
找到Acegi的配置文件看了又看,那么长的配置,那么多的Bean,又是那么长的类名,一头雾水,这可从哪下手呢?Google,Baidu里搜索了一番也没有找到合适的答案.倒是找到以前写的博客,这让我想起以前为了解决登录类型问题时就多多少少研究过Acegi,不过当时也只是单独从配置文件来看的,根本没没接触它背后的实现.那个问题(登录类型)解决后就把Acegi又放下了.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看来现在又到了跟Acegi交手的时候了.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与上次不同,这次交手更多地是从其背后的实现上来理解它的配置.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Acegi是解决Java里提供安全保护的开源框架,它的核心内容就是认证(Authentication)与授权(Authorization).那认证是什么授权又是什么?第一次听到认证这人词,就不由自主地想到了现在四六级证,毕业证学位证啥的,这里的认证与我们常的证有什么联系?一点点的联系也没有?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 结合自己以前的理解再好好的搜了下后,得出如下的认识:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安全(Security)保护是为系统提供一套机制,以便让系统的功能只让一部分人操作.这个生活中有很多的实例,比如说我们给门加锁,加了锁后就只能是有钥匙的人才能正常的进去.而认证与授权正是安全保护所应用的两个手段(一时想不到什么更贴切的词,就先用&quot;手段&quot;吧),JavaEE里有个专门的缩写JAAS就是说这个事儿,其中认证是围绕&quot;你是谁?&quot;这个问题展开的,而授权是围绕&quot;你可以做什么&quot;展开的.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生活中有什么形象的例子来帮助我们理解认证与授权两个有些怪怪的词儿呢?当然有的,以我们用ATM取钱为例,我们插入银行卡,输入密码,密码正确后我们才可以进行像查询,取钱,转帐这样的操作.对密码的验证就是看看你是不是银行卡的Owner,这个&quot;看看&quot;的动作在安全保护里就叫作&quot;认证&quot;了,认证成功后,系统记下你的信息,这样我们就可以做实打实的事了,这个实打实的事的操作是有权限的,我们肯定不希望别人来取我们的钱,只能通过&quot;认证&quot;这一关的人才可能取钱.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面的例子有些简化或者说一些步骤合在一起了.大家都认为&quot;取钱&quot;这一操作是需要保护,也没有对用户是否登录的验证(因为我们取钱时与AMT的Session很短,也就是取完一次后就退出了).而在软件里做安全保护时,这两个虽然不是最重要的,但也是必须的.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 于是有了下面示意图:<img src="http://www.javaeye.com/upload/attachment/29729/c83f4a77-1c45-3f7d-ae6e-eaf5a5c185fd.jpg" alt="AcegiProcess" />
</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)处的&quot;Is secure resource&quot;对应着我们取钱时默认的规则,也就是对每一个请求Acegi先判断下要访问的Resource是否是受保护的.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)处的Principal exists也就是的取钱时对用户是否登录的验证.若没有登录就到(3)处的Login.若是已登录的,就直接到(4)处的Principal has authorized role判断.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3)处的Login OK对应着取钱时的输入密码及对其的验证,若成功就到(4)处的判断.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (4)处的判读是看当前用户是否有操作的授权,在取钱时,ATM机会自动地把那些没权操作的选项隐藏起来,可选的操作当然也都是有权的了.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样经过这么一系列的筛选,我们终于可以取到钱了.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是对Acegi的一个大致了解,但上图所示的四步具体是怎么实现的以及可以通过什么配置来达到这种层层设防的效果呢?在下篇博客中我将试着做些解释.</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/210720#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, 02 Jul 2008 17:25:25 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/210720</link>
        <guid>http://rmn190.javaeye.com/blog/210720</guid>
      </item>
      <item>
        <title>IE与FireFox在显示远程图片上的一点不同</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/210245" style="color:red;">http://rmn190.javaeye.com/blog/210245</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>项目中要用浏览器访问远程电脑上的图片,最终要在浏览器中显示的HTML如下:<br />
<br />
&nbsp;<br />
<br /></p>
<pre name="code" class="html">&lt;a href=&quot;\\file01\MCMrep\MMTTest\Target\{E3D891D5-1C51-4021-B533-67E7A0A5E501}.JPG&quot;&gt;
                &lt;img width=&quot;150&quot; height=&quot;118&quot; alt=&quot;&quot; src=&quot;\\file01\MCMrep\MMTTest\Target\{E3D891D5-1C51-4021-B533-67E7A0A5E501}.JPG&quot;/&gt;
 &lt;/a&gt;</pre>
&nbsp;
<p><br />
&nbsp;<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里的file01是通过在WindowsOS里C:\WINDOWS\system32\drivers\etc\hosts文件加了如下一行配置得到的:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.1.**.*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file01</p>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 刚开始时用FireFox来做实验调试,可那个图片一直不能显示出来,如图所显:</p>
<p><img src="http://www.javaeye.com/upload/attachment/29619/e22ff299-d275-35b5-8d33-6ade05f8cfb7.jpg" height="300" alt="FireFox里的显示效果" style="vertical-align: middle;" width="300" />
 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最终生成HTML没什么问题,但一直显示不出来.通过与同事交流知道这是FireFox不支持远程图片的原因.<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 后来改用IE来显示那段HTML代码时,没问题了,显示如下:</p>
<p><img src="http://www.javaeye.com/upload/attachment/29617/7002201e-882d-3068-8f27-276016f3a67d.jpg" alt="IE里的显示效果" style="vertical-align: middle;" />
<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原来浏览器在处理远程图片时还是有不同的,现在记下来,为以后用.</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/210245#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, 01 Jul 2008 18:05:14 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/210245</link>
        <guid>http://rmn190.javaeye.com/blog/210245</guid>
      </item>
      <item>
        <title>精雕细刻:用户交互的Message反馈</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/210063" style="color:red;">http://rmn190.javaeye.com/blog/210063</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 随着做Coder的日子一天天多了起来,自己对软件的理解也渐渐有所加深,按一般瓜熟蒂落的思路,在这篇的Blog里记录一下用户交互时的Validation和Message反馈的重要性.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 记得刚学Java时,自己的注意力都放在软件真正要做的事上,例如一个网上付费的操作,自己能想的(或想的最多的)就是业务层如何操作,怎么来配置事务控制,怎么在DAO层完成这个付费所涉及的小功能块.现在日子久了,也能更多地从用户的角度来考虑问题并考虑用户的感受了.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 软件是用来做事的,这没什么可说的,但这个做事是通过的用户的操作来完成的,用户的操作就是与软件系统的一次交互,交互时用户就得知道后台系统处理的结果怎样,而后台所需的数据也该在处理前通过某种规则的验证. 这样就有了交互时所需要的做的Validation和Message反馈.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Validation这个不必多说,关键是反馈回的Message的显示,以及显示后在什么情况下disable掉或hidden起来.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在的B/S结构中的不少运用Ajax来改善用户交互,有了Ajax(再加上一些JavaScript的framework),B/S越来越接近于C/S的富功能表现与交互.另一方面,由于有了Ajax的灵活性,Message的管理也更加方便,在这个方便的基础上,如果处理不当也就很是混乱了.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面试着从最根儿上的用户交互出发来一步步引出Message的考虑点. 用户的一次交互的组成部分有:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,提交前的Validation(JavaScript在Browse端验证及其验证信息的反馈),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2,提交到后台的验证及真正的业务处理,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3,处理结果以Message的形式反馈给用户.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Validation和后台的处理都有具体的业务规则来处理,这里不必多说.重点说说Message的显示.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message在Browse里反馈给用户时,可能最容易想到的就是采用Alert的方式.不过这种alert的方式虽然能达到朴素的效果,但总是不够优雅.于是就用了通过JavaScript在DOM动态显示Message的新方法.在具体操作上我们可以在整个页面中定义一个id为messageDisplay的DIV,再写一个名为displayMessage的JavaScript Function.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 采用DIV的方式显示Message与那种很原始的Alert相比有它优雅的好处,不过有些不足或者说是需要我们再在具体操作中加以弥补的是要视情况来决定这个div是否要隐藏起来.比如说页面中有如下的一个input:</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type = "text" id = "username" /&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用户输入UserName,Browse这边也做非语义的验证,这时(为了说明问题)我们在此反馈给用户一个信息:User name is OK.现在的问题是这条信息显示给用户后它会一直在这呆着的,我们在什么时候把它隐藏起来?若不采取任何有效的措施的话,这条信息会被新的Message覆盖掉,这显然不是我们最想要的结果,毕竟这个Message是很被动地消失了的.有没有什么更的方式来让它以"很情愿"的方式disappear呢?</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在能想到的是:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1, 当用户在做其它操作时(如鼠标点别的按钮)也触发一个事件,通过这个事件响应把Message隐藏起来.是有些复杂.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2, 给这个Message点下时,让它在指定时间(比如说30秒)后自动disappear.这也不是很容易实现.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个小小的Message居然牵涉到这么多麻烦事,不由的想起IBM的Lotus产品了,人家那才就世界级的.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面是以动态的角度来看如何处理那个DIV的显示与否,下面的这点相对来说容易些: 以红绿来显示Message的性质,也就是当Message时成功类型时就以绿色来显示,若是失败类型的Message时就以红色来显示.这个就是小Case了,具体的实现也就不再多说了.</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/210063#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, 01 Jul 2008 10:32:55 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/210063</link>
        <guid>http://rmn190.javaeye.com/blog/210063</guid>
      </item>
      <item>
        <title>英语学习A计划(二)</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/209612" style="color:red;">http://rmn190.javaeye.com/blog/209612</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上篇博客主要说是从读(泛读和精读两方面)来看日常生活中都有哪些可利用的资源,这篇咱们看下听这个方面都有什么资源可用以及如何来听.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语言是以"听说读写"为基本内容的活动,"听说读写"四个字的无意间也表达了我们学母语时的过程: 从懵懂时无意识的听,再到简单的说,再到上学后有老师指导下的读,最后是用文字表达的写.听位于这四个字的No1位置从一方面也突显出听的重要性.想想我们生活中的情景,一天当中的大多数时间都是在听.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 语无伦次的扯的有些远了,语言是对周围事物的描述,这个描述有表现形式就我们的一般人的情况来说有两种:文字展现和声音传达.读(在此更准备地说是"看")是处理文字展现这一块的.声音传达一大块就是用听来处理了.&nbsp;&nbsp; (写的是什么呀? 自己就看不懂了.... 唉自己的表达太差了.怎么能条理清楚地表达出来呢?)</p>
<p>就学英语来看,听这方面的,我最推崇钟道隆学英语的方法.他的方法是以听为主的,也就是对一段材料反复地听,边听边写,听清楚一个词后就写下来,若有一个词没听懂就反复地听,也就是死扣着一个词不放只到听的这个词在头脑中有了很深刻的印象为止.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面以一个句子为例来看钟道隆学习法是什么样的.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 假如材料中有这样的一句话:"A web application is a dynamic extension of a web or application server. There are two types of web applications: Presentation-oriented and Service-oriented".一般语速这句话最多也就是五秒钟就说完了,而我们第一次听(若听力不是很强的放)估计也就只能听出来这句话里有个web....is...server...two...and.. 天哪!这么长一个句子,就只能听出这么五个词儿来?我还是别学了.呵呵,这也是我当除的想法,补充下我现在也不怎么样,不过还好对英语的读写都一直没有放弃过. 又说的有些远了.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一遍听出来五个词(web,is,server,two,and)后,写下来,再回过头来听,这时就要死扣了,application这个词大多数人都能认识,可听时就不一定能很好地辨别出来了,前几次听这个词我们可能就只能听出来个...tion. 把这个...tion记下来,再扣着这个词不放,死听! 在听的过程中调用一切,想着自己认识的词中都有什么以...tion结尾的. 如此反复.十有八九,这个Application就被我们拿下了.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们常用词的个数也就那么两三千,现在这个Application再加上前面我已经听出来的web...is...server...two...and五个词我们就掌握了6/3000了.如此反复,胜利肯定是我们的了.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面我们说了钟式学习法,哪都有什么可听的话?可听的太多了,那我们怎么选择呢?与第一篇中的读类似,我们也要选择那些熟悉或感兴趣的主题.下面结合我选择听力材料的过程来说说都有哪些注意点.</p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当初下定决心要练听力时,与大多数学英语的一样,我也雄心勃勃地从听VOA和BBC开始.结果可想而知,几乎是啥也听不懂,现在想起来当时也就只听懂了个一个词Clinton.毕竟那些话题离咱们太远了.而且全是政治经济词汇,一定也激发不了自己学英语的兴趣.</p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 放弃,消沉一段时间...</p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;听中央人民广播电台经济之声的EnglishEvening.能听懂的单词是比听VOA或BBC多了些,可仍然是不知道人家在说什么,从他们谈话的声音来判断有家很兴奋,时不时地还有笑声,可俺仍然是一头雾水. 这些材料只能听一遍,由于没有MP3,过后也就听不到了.</p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以后有了MP3,上网也方便了,开始下VOA.因为当时还不知道有什么别的可以下载下来听...听了没多久自然又是放弃了.</p>
<p>&nbsp;...........</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;后来在网上遛哒着看英语方面的新鲜事时找到了CRI,发现里面有不少听的,而且还可以下载,更重要的是有相应的文字记录.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;于是就下载下来用钟式学习法听,听个七七八八后再对照网站上文字来验证.刚开始时也是听News这块儿的,虽说大多是说中国的事,可那全是大事,自己很少能感兴趣,后来发现了FrontLine这个节目.这个节目不错.一周播出一次,说的也都是身边的事,用的词也都是那种很daily的.</p>
<p>&nbsp;.....................</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;越写越郁闷了,把自己也绕迷糊了,都是因为写前没有做准备,写时也没有分门别类地列出个一二三来.希望大家在抱怨时能提出建设性意见.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thanks a lot.(写的这么难看,肯定得好好地谢谢了.)</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/209612#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, 30 Jun 2008 10:01:26 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/209612</link>
        <guid>http://rmn190.javaeye.com/blog/209612</guid>
      </item>
      <item>
        <title>Tomcat源码&quot;历险&quot;之protected关键字理解</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/209577" style="color:red;">http://rmn190.javaeye.com/blog/209577</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>周末了有大块时间,我又忍不住地想鼓捣下Tomcat的源码,像往常一样又是从头看起:org.apache.catalina.startup.Bootstrap类.顾名思义，这个类是Tomcat启动时的main方法所在类.这个类本身没什么特别的,可看着看着,发现有点不对:怎么这个类里ClassLoader类型的三个属性是用protected来修饰的,而这个类本身又是不能再被extends的(也就是用final来修饰的)?</p>
<p>&nbsp;</p>
<p>不对呀,这不自绝后路吗?用protected修饰的属性只能在本类或子类中访问,而这个类又给final掉了,protected在此不就多此一举了么?难道说protected修饰的成员可以让本package中的其它类访问?</p>
<p>&nbsp;</p>
<p>是Tomcat作者写错了?还是自己对protected关键字的理解有问题?</p>
<p>&nbsp;</p>
<p>这种情况下我是不怎么相信自己的,于是先用代码试了下.</p>
<p>&nbsp;</p>
<p>1, 验证protected修饰的成员可以让本package中的其它类访问,我用如下的两个类:</p>
<pre name="code" class="java">package accessControl;

public class ProtectedAccess {
	protected int aNumber;
}</pre>
<p>&nbsp;..........</p>
<pre name="code" class="java">package accessControl;

import accessControl.innerPackage.AnotherProtectedAccess;

public class LabClass {
	private ProtectedAccess pa= new ProtectedAccess();
	
	
	public void printProtectedAccess() {
		System.out.println("Result: "+pa.aNumber);		
	}
}</pre>
<p>&nbsp;.........</p>
<p>当在LabClass类里写了上面的pa.aNumber时,Eclipse没有报错.</p>
<p>&nbsp;</p>
<p>2,验证protected修饰的成员不能被本package外的类访问,我用了如下个类:</p>
<p>&nbsp;</p>
<pre name="code" class="java">package accessControl.innerPackage;

public class AnotherProtectedAccess {
 	protected int bNumber;
}

</pre>
<p>&nbsp;..........</p>
<p>&nbsp;</p>
<pre name="code" class="java">package accessControl;

import accessControl.innerPackage.AnotherProtectedAccess;

public class LabClass {
	private ProtectedAccess pa= new ProtectedAccess();
	private AnotherProtectedAccess apa = new AnotherProtectedAccess();
	
	public void printProtectedAccess() {
		System.out.println("Result: "+pa.aNumber);
		// System.out.println("Result of apa: "+apa.bNumber); 
		// The field AnotherProtectedAccess.bNumber is not visible		
	}
}</pre>
<p>&nbsp;写下apa.bNumber后,Eclipse报错了:The field AnotherProtectedAccess.bNumber is not visible.</p>
<p>&nbsp;</p>
<p>以上实验纠正了我的一个认识:protected修饰的成员可以被本package里的其它类访问的,而不是只能被子类和本类访问.</p>
<p>再看Thinking In Java,这本书里有如下的描述:</p>
<p><br />&nbsp;1, The levels of access control from "most access" to "least access" are public,protected,package access(which has no keyword), and private.</p>
<p><br />&nbsp;2,&nbsp; protected also gives package access - that ism other classes in the same package may access protected elements.</p>
<p>&nbsp;</p>
<p>这样也就进一步证实了实验结果.</p>
<p>&nbsp;</p>
<p><br />上面的这个实验是验证了protected修饰的成员除了被子类访问外,还可以被本package里的类访问.不错.但这里的Bootstrap类是final了,这样就没有子类而只剩下同package里其它的类访问了.可不写岂不更好?难道说是Tomcat项目组的疏忽?还是另有别的我现在还没接触到的东东?</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/209577#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, 30 Jun 2008 09:17:11 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/209577</link>
        <guid>http://rmn190.javaeye.com/blog/209577</guid>
      </item>
      <item>
        <title>待人接物方面的一些积累(1)</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/208596" style="color:red;">http://rmn190.javaeye.com/blog/208596</a>&nbsp;
          发表时间: 2008年06月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1,晚上吃饭后给钱时,应该给的钱是4块,由于钱包里的钱都是零钱,我先拿出三个一块的给了服务员,接着又掏出另一个一块的.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 值得改进的地方是,我在掏那三块钱的同时也该说下"这是三块,我再拿一块的."</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然服务员也没说什么,我是觉得这有不足容易引起误会的地方,需要改进.</p>
<p>&nbsp;</p>
<p>2,昨晚一块聊天时,另外一个不怎么熟的人说给我们名片,为了认识.他给我名片时我很注意地站起来用双手去接,而且拿到手后也礼貌地认真看那些基本介绍.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不过值得改进的地方是,接到名片后,我应该主动的告诉他我的电话和姓名,或更自然的做法是,照着他名片上的打电话号码,边说"我给你打下,我的名字是rmn190".</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/208596#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 Jun 2008 12:11:55 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/208596</link>
        <guid>http://rmn190.javaeye.com/blog/208596</guid>
      </item>
      <item>
        <title>小说下theory这个英文词</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/208595" style="color:red;">http://rmn190.javaeye.com/blog/208595</a>&nbsp;
          发表时间: 2008年06月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp; 记得前些天与同事聊天时我不小心说出"理论"这个词了,当时给人的感觉就是我这个人很"理论",有点苦恼.确实,在中文里一说"理论",给人的感觉是"有些不着调,不切合实际,净拿些文字性的东西来应付差事".</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天我又查了下theory这个词的英文解释,它是这样说的"(statement of the) principles on which a subject is based".注意这个"based",因为这个词就表明了theory所涉及的问题以前早就在别人身上发生过,先人早就有这方面的经验总结,而现在咱们要做的是在把先人所做那些经验拿来看看,找出最适合当前的部分,以更高效地解决困扰我们的问题.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个Theory也正是采用了"站在巨人肩上来解决问题"的理念.</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/208595#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 Jun 2008 12:06:47 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/208595</link>
        <guid>http://rmn190.javaeye.com/blog/208595</guid>
      </item>
      <item>
        <title>四个用前写的点东西:关于Ant以及由此联想到自己为什么喜欢编程 </title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/208587" style="color:red;">http://rmn190.javaeye.com/blog/208587</a>&nbsp;
          发表时间: 2008年06月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>2008-2-19 9:41:06</p>
<p><br />我为什么喜欢编程?</p>
<p><br />这些天又再一次地思考这个问题了,今天在学Ant时又给了这个问题增添了一新的补充.</p>
<p><br />&nbsp;以前听说过Ant这个工具,知道给通过写个配置文件就可以自动地对所写的Java源文件进行编译,打包什么的,不过由于一直在用Eclipse也没有拿出大块时间来系统地学它.</p>
<p>&nbsp;</p>
<p>&nbsp;前些天做PushTool时,Jerry说整个项目是用Ant来统一部署的.是吧,对于项目管理来说根本就用不着再装一个Eclispe.昨天看F有本书,很厚的,内容是用Ant来进行Java开发的.竟然有专门这样的书!这些天也总给看到别人在写Ant的配置文件什么的.这样就感觉我也得专门来学下这个了.</p>
<p>&nbsp;</p>
<p>&nbsp;从昨天下午开始学到现在,以前所知道的那些知识都过了一遍.对Ant的感觉也越来越强.今天来的学的这些更是让我对Ant另眼相看,它很有Spring的味道嘛.</p>
<ol>
<li>&nbsp;可以写Property定义变量来避免重复写些String,这样很是便于以后的更改.</li>
<li>&nbsp;可以写depends属性,这样就不必来记住命令的先后顺序而直接执行最终想要那个命令.</li>
<li>&nbsp;可以用default来设置,很智能嘛!</li>
<li>&nbsp;&nbsp;现在竟然还可单独写一个execute方法而不写main就可以用Ant来执行,这已经与当初的compile-&gt;jar-&gt;run又高出一大步了.<br />&nbsp;&nbsp;可以在自写的类中通过Project这个类来访问build.xml中的配置.<br />&nbsp;&nbsp;......................</li>
</ol>
<p>&nbsp;有了这些新奇地发现,现在对编程的喜爱就又深了一步,这个Ant现在不单单是做为项目管理给我帮助,它又从另一个方面给我启示.在这方面很像下棋,看似没法补救的棋局经高手分析后就能迅速找出破绽,从而出奇致胜.</p>
<p><br />&nbsp;再深一步说,这也是一种生活状态,有坚定的信念.不气馁,不放弃!</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/208587#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 Jun 2008 11:57:08 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/208587</link>
        <guid>http://rmn190.javaeye.com/blog/208587</guid>
      </item>
      <item>
        <title>在Java里不用Socket而直接操作远程计算机里的文件.</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/207981" style="color:red;">http://rmn190.javaeye.com/blog/207981</a>&nbsp;
          发表时间: 2008年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天上班时偶然发现在Java里可以在不用Socket情况下操作远程电脑机的文件,有点惊喜,记下来.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 工作中的电脑在C:\WINDOWS\system32\drivers\etc\hosts这个文件里做了如下一行配置:</p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.1.**.*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file01</p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在我用如下的代码来给file01这个电脑里加一个目录:</p>
<pre name="code" class="java">String fileNameRemotelyDir = "\\\\file01\\MCMrep\\MMTTest\\Target\\TestDir";
new File(fileNameRemotelyDir).mkdirs();</pre>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 代码运行前file01指定目录下的情况是这样的:</p>
<p>&nbsp;</p>
<p>&nbsp;<img src="http://www.javaeye.com/upload/attachment/28992/474acad2-d19f-37f1-94c1-450881f1b81c.jpg" alt="before" style="vertical-align: middle;" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 执行上述代码后,file01的目录结构如下所示:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.javaeye.com/upload/attachment/28990/3694d8d0-2486-3e43-abfb-740f88cf1526.jpg" alt="after" style="vertical-align: middle;" /></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 刚发现时是有些惊讶,不过想想这也是完全可以做的:Java虚拟机直接调用操作系统的相关功能就可以"类本地化"地操作指定的文件了.这也正是Java平台独立性的一个体现吧?<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c++在不改代码情况下可以做到吗?</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/207981#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, 25 Jun 2008 18:27:43 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/207981</link>
        <guid>http://rmn190.javaeye.com/blog/207981</guid>
      </item>
      <item>
        <title>about  @SuppressWarnings.</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/207458" style="color:red;">http://rmn190.javaeye.com/blog/207458</a>&nbsp;
          发表时间: 2008年06月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>about&nbsp; @SuppressWarnings.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项目组来了个很Picky的头,看到Eclipse里有大量的Warning小发了下脾气后,让用@SuppressWarnings这个标注来把Warning去掉.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了去掉由于泛型的Warning,我们用了@SuppressWarnings("unchecked"),为了去掉那些由于deprecation而引起的Warning,用了@SuppressWarnings("deprecation").但一个类中既有unchecked又有deprecation时,怎么办?于是用了一个很权宜之计:在类声明那用@SuppressWarnings("deprecation"),而在相应的方法声明里用@SuppressWarnings("unchecked").</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用了效果当然也达到了,可就想问在一个单独的@SuppressWarnings里既去掉deprecation又去掉unchecked呢?觉得应该可以达到的.于是就用下面的方式来试.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,@SuppressWarnings("deprecation","unchecked"),不行,Eclipse报错.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2,@SuppressWarnings("deprecation,unchecked"),不行,还是报错.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3,看@SuppressWarnings的源码,只有一个String[]类型的value.就想用@SuppressWarnings(new String[]{"deprecation","unchecked"}),还是不行,报错.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4, Google了下后,发现了这个@SuppressWarnings(value={"deprecation"}),于是就想起来了@SuppressWarnings(value={"deprecation","unchecked"}).呵呵,成了.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好久没用接触过标注了,快忘了. 现在记下来.</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/207458#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, 24 Jun 2008 13:50:05 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/207458</link>
        <guid>http://rmn190.javaeye.com/blog/207458</guid>
      </item>
      <item>
        <title>英语学习A计划(一)</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/206895" style="color:red;">http://rmn190.javaeye.com/blog/206895</a>&nbsp;
          发表时间: 2008年06月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>英语学习A计划<br />
<br />
&nbsp; &nbsp;&nbsp;&nbsp; 可能是由于&quot;久病成医&quot;的缘故吧,这些天我收到些朋友同学问我怎样来学好英语这样的问题.自己也就充大尾巴狼地把自己学英语过程中的一些收获整理了下来,以期待能有较好的沟通效果,毕竟若让自己口头来说现在还没这个能力来说的这么详细.<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 写到这想起一个笑话,说: 现在大学女生很想回到唐朝,那样的话一是不用再减肥,二是根本不用学英语.<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 呵呵,在此不再多费口舌来讨论英语对咱们有没有意义这个层面的话题,只是直入主题地说下学英语时都有什么值得注意的,或者说能对自己有所帮助的.好了,闲话少说,转入正题.<br />
<br />
&nbsp;&nbsp;&nbsp; 鄙人觉得学英语过程中最为重要的是培养用英语的思维能力,也就是能用英语来思考问题.这样个问题解决了,其它像词汇量不足,听力不行,写作太差,口语结巴这样问题也就迎刃而解了,借用俗话咱们把这样的分析叫&quot;蛇打七寸&quot;,这也跟今天凌晨俄罗斯打败强大的荷兰队有点相似.</p>
<p><br />
&nbsp;&nbsp;&nbsp; 有点扯远了,下面围绕这个目标来看咱们的现实生活中都有哪些资源可用,以及都有什么方案来围绕这些资源展开.<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 1,尽量活学活用:</p>
<p><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 这样的活学活用又分为如下几种情况:</p>
<p><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 1.1 &quot;没英语也行&quot;状态下自觉地用英语,这方面的例子相对来说好找些,比如电脑里尽量安装全英文的软件,或者说干脆把OS也装成英文的,这个一般都能想到,也会自觉地去做.再往下扩展下,咱们能不能看网页看新闻时也能看英语的呢?比如说前段时间的四川大地震,围绕这方面的报道,国外当然都是英文,国内也有不少网站有英文版面的,如:中国国际广播电台的英文网站:http://english.cri.cn/index.htm, 中国日报的英文网站:http://www.chinadaily.cn/,新浪的英语版:http://english.sina.com/index.html.看这些英文报道的一个好处就是能有效地利用自己的好奇心来来扩大自己的阅读量,再有即使有看了后也不懂的报道,在网络上就可能很方便地找与之类似的中文报道,从而有一种双语阅读的优势.这方面的材料太多了,可以接合自身的兴趣选一两个站点做为自己每天的阅读材料.</p>
<p><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 1.2 还有一种就是自觉地找些活动来锻炼英语思维:具体找什么就完全是由爱好来决定了,以我为例吧.我从小就喜欢下象棋(虽说是个臭棋篓子),后来上网方便后就想着能不能找些怎么下棋这方面的材料来使自己又能练棋艺又能学英语呢?Google了下后,找了一大把这方面的材料.自己也常打乒乓球,跟下象棋一样由于工作忙杂事多,很长一段时间里乒乓球也就放下了,后来也是因为学英语时找相关的材料才把乒乓球又捡起来.这种情况下的学英语也上一种还不一样,如果说上一种是判读为的话,那么这种方式算是英语学习里的精说了.这个精说在我用英语玩魔方时最能体现出来.我开始玩玩魔方很晚了也是在毕业后,当时就想找些材料来指导,自然而然地就想找英文方面的.现在回想起来,英语的精读体现在如下的环节中:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 1.2.1 面对复杂又复杂的魔方,自己鼓捣半天也弄不出来,正想把它扔了不玩时看到解魔方的秘籍. --&gt; 自己有强烈的阅读欲望<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 1.2.2 找来魔方的解法,(当然是英语写的了)阅读几遍,这时肯定是精读的,这种兴趣驱动下的精读可要比为了完成作业的精读效率更高.</p>
<p><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 1.2.3 阅读几遍后有了大致地思路,从而把用英语学来的知识在自己动手玩魔方中加以锻炼验证.</p>
<p><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 1.2.4 在玩时又发现了新问题,再去找材料来验证.<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 这样,整个玩魔方的过程就是用英语来思考问题,解决问题的过程.而且是在强烈兴趣驱动下的实践.用魔方来学英语,久而久之,随着自己玩魔方能力的地提高,英语思维能力也势必会有提高并会以魔方情景的形式固定下来.<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 2, 程序员学英语时的活学活用.上面两所说的活学活用更多是从兴趣或好奇心出发的,我们再从程序员的角度来看,都有哪些能学英语练英语的地方.</p>
<p><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2.1 对自己熟悉知识用英语材料来加强记忆:像Java中的四种访问控制,内部类的几种情景,这些很熟的知识.当我们用英语材料来强化这方面知识时有一个很明显的好处:即使不认识的单词或复杂一些的句式我们不能理解,不过我们能据自己对Java的理解可以很方便地推断是所说的意思.还有对自己理解Java本身的帮助也是很明显的,书读百遍其意自现,我们现在虽然用的是英语来学来强化的,其效果也是有的.</p>
<p><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2.2 对自己不熟悉的材料或问题: 尽量去看英文材料,这个跟上面说的玩魔方的过程很相似.在这方面还有一点我觉得很重要,我们写程序的难免会遇到些问题自己不知从哪下手,这时我们就可以通过用英语跟别人(也就外国人)交流的方式来寻求解决方案.我们可以在BBS上发贴,直接给一些牛人用英语写Email来提问.<br />
<br />
&nbsp;&nbsp;&nbsp; (to be continued)</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/206895#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>Sun, 22 Jun 2008 19:40:00 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/206895</link>
        <guid>http://rmn190.javaeye.com/blog/206895</guid>
      </item>
      <item>
        <title>对浏览器中的context menu的认识.</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/206874" style="color:red;">http://rmn190.javaeye.com/blog/206874</a>&nbsp;
          发表时间: 2008年06月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>对浏览器中的context menu的认识.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一直以为在浏览器中不能像在Desk Application里那样方便地定义context menu, 前些天项目的里有人提出能不能通过context Menu的方式来改善下UI的布局,我虽然没说什么,但心里有个疑问:在B/S架构的项目中能定义context Menu吗?后来由于手头有其它方面的工作,也没再多像B/S项目中能不能自定义,什么因素制约,如何来解决.<br />
&nbsp;&nbsp;&nbsp; 前天在Google的Document里无意间右击了下鼠标,天哪!Context Menu出现了,跟C/S中自定义的Context menu没什么不同!<br />
&nbsp;&nbsp;&nbsp; 以下截图:<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <img src="http://www.javaeye.com/upload/attachment/28611/824a38cd-5303-3a9e-bb0c-a7072d3c5a08.jpg" alt="contextMenu" style="vertical-align: middle;" />
<br />
<br />
&nbsp;&nbsp;&nbsp; &quot;嘲笑&quot;了下自己的无知后,赶紧在Google里搜看看现用用的JavaScript框架jQuery里有没有相应的实现,有:http://www.trendskitchens.co.nz/jquery/contextmenu/这个连接里有详细的描述和示例.<br />
&nbsp;&nbsp;&nbsp; 回头再看自己为什么会固执地认为在浏览器里一般的B/S开发者不可能自定义context menu.<br />
&nbsp;&nbsp;&nbsp; 1, 浏览器自身就是一个软件,它有自己的context menu,除非浏览器自己的程序员别人几乎不可能来改变.<br />
&nbsp;&nbsp;&nbsp; 2, 对JavaScript的能力与威力认识还不够.虽说可以通过Ajax可以达到C/S那样与Server端灵活地交互,但没像倒它竟然也可以做出像context menu这样高级别的操作.<br />
&nbsp;&nbsp;&nbsp; 3, 以前也一直没见过B/S中自定义context menu的实例.<br />
<br />
&nbsp;&nbsp;&nbsp; 在此感谢Google给我开眼界的这个机会,也感谢我的好奇心能使我迅速地捕捉到这个context menu!</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/206874#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>Sun, 22 Jun 2008 18:02:30 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/206874</link>
        <guid>http://rmn190.javaeye.com/blog/206874</guid>
      </item>
      <item>
        <title>老掉牙的话题</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/206870" style="color:red;">http://rmn190.javaeye.com/blog/206870</a>&nbsp;
          发表时间: 2008年06月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>老掉牙的话题<br />
<br />
&nbsp;&nbsp;&nbsp; 周末了就想看些像欧洲杯这样轻松点的东西,看了没几个,后来找到一个叫&lt;上班那些事&gt;的节目,呵呵不错,于是挑了个 点开看看.也真是的老掉牙的话题,因为这些话题市面上有太多太多的书来描述,也给出N多的建议,不过当时我的生活工作情景使的我没心思去想,久而久之习惯思维形成了,见了这样话题我也就懒的去想.<br />
&nbsp; <br />
&nbsp;&nbsp; 现在,在新的工作环境中已有半年多了,今天再看到这样话题,总觉得自己该静下心来好好想想了.<br />
<br />
<br />
&nbsp;&nbsp; &quot;说的是什么呀?&quot;怎么一堆事说不清了, --- 这么自责.先简单地记下来,再从长计议吧.<br />
<br />
1. 我想升职的几个话题:<br />
&nbsp;&nbsp; &nbsp;1.1,业务力与管理力: 彼得原理.<br />
&nbsp;&nbsp; &nbsp;1.2, 学习能力,领导能力,团队合作精神.<br />
&nbsp;&nbsp; &nbsp;1.3, 有哪些要素制约着你的升职:工作能力,人脉关系,老板知道你了解你.<br />
&nbsp;&nbsp; &nbsp;1.4, 世界卫生组织关于健康的定义: 身体,精神,人际关系.<br />
<br />
2, 亚健康的预防和治疗<br />
&nbsp;&nbsp; &nbsp;2.1 叩头: 用手敲头,每天早上或晚上用手轻敲头部大概50次.<br />
&nbsp;&nbsp; &nbsp;2.2 梳头: 每天一次,每次三到五分钟.<br />
&nbsp;&nbsp; &nbsp;2.3:击掌: 越响越好,二十次.<br />
&nbsp;&nbsp; &nbsp;2.4:浴手: 心静神凝,耳不旁听,目不远视,意守肚脐,由慢到快搓热.</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/206870#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>Sun, 22 Jun 2008 17:33:46 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/206870</link>
        <guid>http://rmn190.javaeye.com/blog/206870</guid>
      </item>
      <item>
        <title>记录下来以备日后往深地追: 父类构造器里的多态.</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/206838" style="color:red;">http://rmn190.javaeye.com/blog/206838</a>&nbsp;
          发表时间: 2008年06月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          下面这段代码:<pre name="code" class="java">
public class Qdb extends Depend
{
    int i = 30;
    public Qdb()
    {
        print();
        super.print();
        i = 40;
    }

    void print()
    {
        System.out.println("Target=> " + i);
    }


    public static void main(String[] args)
    {
        new Qdb();
    }
}

class Depend
{
    int i = 10;
    public Depend()
    {
        print();
        i = 20;
    }

    void print()
    {
        System.out.println("Depend=> " + i);
    }
}
</pre><br />我的预期结果:<br />	Depend=> 10<br />	Target=>30<br />	Depend=>20<br /><br />而最终结果是:<br />	Target=> 0<br />	Target=> 30<br />	Depend=> 20<br /><br />这里面涉及到的Java知识点有:<br />	1, 方法的覆盖.<br />	2, 属性在整个类初始化时的赋值时机.<br />	3, 子类初始化时先执行父类的构造方法.<br />	4, 当子类里有父类里同名的属性时,怎么处理?<br /><br />所得到的是:子类在初始化时在先执行父类的的构造方法这不假,但当在父类的构造方法里要调用有覆盖嫌疑的方法时(也就是本例中的print方法)要调用子类里的方法.<br />	....<br />后来多想想后,觉得出现"Target=> 0"很正常的: 毕竟现在是要初始一个子类的实例,JVM在背后要先调用父类里的构造方法,但这是为子类做前期准备的,在这个构造方法里要调用的方法也应该是子类自身的--也就是子类的print方法.<br /><br />但上面这是演义型的解释,没有官方的正式解释.为以后的正式研究做前期的感性积累.
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/206838#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>Sun, 22 Jun 2008 15:21:05 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/206838</link>
        <guid>http://rmn190.javaeye.com/blog/206838</guid>
      </item>
      <item>
        <title>记录下来以备日后往深地追: 浮点型转为整型</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/206834" style="color:red;">http://rmn190.javaeye.com/blog/206834</a>&nbsp;
          发表时间: 2008年06月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          同学在学PHP时注意到一个实现细节,他也在Java里试了下,发现有些意思也发给我,我发现也挺有意思,代码如下:<br /><pre name="code" class="java">
public class Test{
	public static void main(String args){
		System.out.println((int)(0.1 * 10));	
		System.out.println((int)(0.7 * 10));	
		System.out.println((int)((0.1 + 0.7) * 10));
	}
}
</pre><br />在运行前,我也没多想,认为结果是: 1,7,8. 而运行后的结果是1,7,7.<br /><br />有些纳闷,后来试了下,<br />		System.out.println(((0.1 + 0.7) * 10));<br /><br />也就是没有转变整型,结果成了: 1,7,7.999999999.<br /><br />现在明白了,简而言之,是Java在把浮点型数转为整型时就一刀切地抹出了小数点后信息.而PHP里就给出了更符合常人处理.<br /><br />现在想问或想再往深地钻研的是计算机是怎么来表示浮点型数据的,以及怎么来处理它与整型数的转化.
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/206834#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>Sun, 22 Jun 2008 14:25:05 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/206834</link>
        <guid>http://rmn190.javaeye.com/blog/206834</guid>
      </item>
      <item>
        <title>与JSON的第一次亲密接触</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/206659" style="color:red;">http://rmn190.javaeye.com/blog/206659</a>&nbsp;
          发表时间: 2008年06月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          字符串型的Date转化为JavaBean的问题终于解决了,现在回过头来整理下贴在博客里以备将来查询,若对别人能所帮助那就甚是欣慰了.<br /><br />1, 情景再现.<br /><br />     问题是这样的,浏览器那边要Ajax地传来一些数据,其中包含的Date格式为"mm/dd/yyyy hh:mm:ss".Server与Client的数据传送用JSON来封装.JSON的优点在此就不用多说了,数据从Client传到Server端后就要用JSON来自动生成相应的JavaBean.对于primitive和String类型的数据在转化时没什么问题,可在当处理字符串表示的Date信息时麻烦就来了.<br />   为了简化谈论,我采用了一个只包含Date类型属性的Person类来做实验.Person类的定义如下:<br /><br />	<pre name="code" class="java">

 public class Person{     
    private java.util.Date birthday;     
     
    // settor and gettor methods.....     
 }
</pre><br /><br />   在Main方法中采用能想到的方法来把JSON格式的字符串转为JavaBean.<br /><pre name="code" class="java">
import net.sf.json.JSONObject;     
       
   public class PersonTest {     
            
       public static Person getInstance(String jsonVale) {     
           return (Person)JSONObject.toBean(JSONObject.fromObject(jsonVale),Person.class);     
       }     
            
       public static void main(String[] args) {     
           String personJson = "{birthday:\"06/28/2008 17:00:00\"}";     
                
           Person p = getInstance(personJson);     
                
           System.out.println("Person's brithday: "+ p.getBirthday());     
       }     
   }   
</pre><br /><br />  可一运行,问题就出来,下面是所报的信息.<br /><div class="quote_title">引用</div><div class="quote_div"><br /> 2008-6-19 13:57:39 net.sf.json.JSONObject morphPropertyValue     <br /> 警告: Can't transform property 'birthday' from java.lang.String into java.util.Date. Will register a default Morpher     <br /> 2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph     <br /> 信息: Property 'java.util.Date.class' has no write method. SKIPPED.     <br /> 2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph     <br /> 警告: Property 'java.lang.String.date' does not exist. SKIPPED.     <br /> 2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph     <br /> 信息: Property 'java.util.Date.day' has no write method. SKIPPED.     <br /> 2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph     <br /> 警告: Property 'java.lang.String.hours' does not exist. SKIPPED.     <br /> 2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph     <br /> 警告: Property 'java.lang.String.minutes' does not exist. SKIPPED.     <br /> 2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph     <br /> 警告: Property 'java.lang.String.month' does not exist. SKIPPED.     <br /> 2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph     <br /> 警告: Property 'java.lang.String.seconds' does not exist. SKIPPED.     <br /> 2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph     <br /> 警告: Property 'java.lang.String.time' does not exist. SKIPPED.     <br /> 2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph     <br /> 信息: Property 'java.util.Date.timezoneOffset' has no write method. SKIPPED.     <br /> 2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph     <br /> 警告: Property 'java.lang.String.year' does not exist. SKIPPED.     <br /> Person's brithday: Thu Jun 19 13:57:39 CST 2008   </div><br /><br />    注意,虽然这也有时间信息打印了出来,可细看发现它不是我们所期待的那个,它是系统的当前时间.<br /><br />     这是怎么回事呢?所报的信息是什么意思?怎么出来的是系统的当前时间?<br /><br />2,试着分析/解决<br /><br />   2.1 找准突破口<br /><br />	百度/Google一番后,没找到合适或相似的解决方案,问同学同事也没有得到满意的回答,于是就想着自己来解决了.可自己对JSON的了解也仅仅停留在为数不多常用方法上,其余像"它背后是怎么实现的?都可做哪些配置?"这样的问题一点也不知道了.<br /><br /><br />	[align=left][/align]看API,一是由于API里的类/接口有二十来个,虽然跟Hibernate或Spring这样的大框架里类/接口在数量上没法比,但现在要有针对性地看时真的不知从哪个开始了,于是一会儿看下JsonConfig,过会再看下...,再有就是API里的描述很少自己也不能静下心来认真地看仔细地琢磨(这大概是源自于自己编码不规范造成的对API描述没有多少信任感吧).有没有跟Hibernate里类似的document呢?或许里有相关的描述.<br /><br /><br />	再往下就习惯性地用debug来跟踪代码的执行,(幸好Java里有很多很多的开源项目,debug跟踪起来了丝毫不奋进费劲.)跟踪了一两遍后除了发现是什么时候报出上述信息外还是一头雾水.没别的办法再继续吧,随着跟踪的次数增多,前面看API时注意到的那些类活了起来,它们之间的调用关系渐渐地露出了来.在这个调用过程中围绕信息报出的那几行代码里的一个概念Morpher吸引了我的注意,意识到这就是问题的突破口.(感觉自己在写侦探小说.)
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/206659#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, 21 Jun 2008 14:58:38 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/206659</link>
        <guid>http://rmn190.javaeye.com/blog/206659</guid>
      </item>
      <item>
        <title>用json时的一个问题</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/205749" style="color:red;">http://rmn190.javaeye.com/blog/205749</a>&nbsp;
          发表时间: 2008年06月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          假设有一个Person类, <br /><pre name="code" class="java">
public class Person{   
   private java.util.Date birthday;   
  
   // settor and gettor methods.....   
}  
</pre><br /><br />现在客户端那边传来如下的json规则的字符串String personJson = "{birthday:\"06/28/2008 17:00:00\"}",要用 <br />JSONOjbect.toBean(JSONObject.from(personJson ),Person.class)方法来获得相应的Person实例时就出问题了,报错如下:<br /><br /><pre name="code" class="java">
<div style="text-align: center">2008-6-19 13:57:39 net.sf.json.JSONObject morphPropertyValue   
警告: Can't transform property 'birthday' from java.lang.String into java.util.Date. Will register a default Morpher   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
信息: Property 'java.util.Date.class' has no write method. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
警告: Property 'java.lang.String.date' does not exist. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
信息: Property 'java.util.Date.day' has no write method. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
警告: Property 'java.lang.String.hours' does not exist. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
警告: Property 'java.lang.String.minutes' does not exist. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
警告: Property 'java.lang.String.month' does not exist. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
警告: Property 'java.lang.String.seconds' does not exist. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
警告: Property 'java.lang.String.time' does not exist. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
信息: Property 'java.util.Date.timezoneOffset' has no write method. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
警告: Property 'java.lang.String.year' does not exist. SKIPPED.   
Person's brithday: Thu Jun 19 13:57:39 CST 2008  
  </div>
</pre> <br /><br />注意这里虽然有"Person's brithday: Thu Jun 19 13:57:39 CST 2008  "这样输出,但它的时间值与输入不符.<br /><br />这个怎么解决? <br /><br />以下是我做实验用的Java代码: <br />======================= <br /><pre name="code" class="java">
package json;   
  
import java.util.Date;   
  
import net.sf.json.JSONObject;   
  
public class Person {   
    private Date birthday;   
  
    public Date getBirthday() {   
        return birthday;   
    }   
  
    public void setBirthday(Date birthday) {   
        this.birthday = birthday;   
    }   
       
    public static Person getInstance(String jsonVale) {   
        return (Person)JSONObject.toBean(JSONObject.fromObject(jsonVale),Person.class);   
    }   
       
    public static void main(String[] args) {   
        String personJson = "{birthday:\"06/28/2008 17:00:00\"}";   
           
        Person p = getInstance(personJson);   
           
        System.out.println("Person's brithday: "+ p.getBirthday());   
    }   
}  


====
所需Jar包见附件.
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/205749#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 Jun 2008 14:11:40 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/205749</link>
        <guid>http://rmn190.javaeye.com/blog/205749</guid>
      </item>
      <item>
        <title>JavaScript中实现工厂模式.</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/204547" style="color:red;">http://rmn190.javaeye.com/blog/204547</a>&nbsp;
          发表时间: 2008年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>JavaScript中实现工厂模式.</p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一次亲密接触:利用JavaScript中的prototype实现"基于多态的工厂模式".</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 老早就知道JavaScript中的prototype了,可一直没机会正式用下,虽说以前自己写着玩过,但由于没有与实际应用联系起来也就没能真真正正地感受到这个prototype的威力.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天在工作中终于有幸用到这个了.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 具体情况是这样的:项目中要提交一个表单,可这个表单有多层结构,用户在提交时可以具体情况而有选择性的提交.刚开始时,是用那种很笨很笨地纯粹表单提交,结果在Java那边要写一大串的代码来从request里取出各个Parameter再用这个生成JavaBean实例(想过用Spring的form标签,但配置起来很是复杂,终因得不偿失而放弃了).</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 决定用JSON来包装并用jQuery里的Post来Ajax地与后台交互.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 刚开始时,用如下的代码来做JSON的包装:</p>
<p style="PADDING-LEFT: 60px"><br />&nbsp;var menu;<br />&nbsp;if(conditionOne){<br />&nbsp;&nbsp;menu = {name: $('nameColumn'), order: $('ordrColumn'), ...subCategory:{...,...}};<br />&nbsp;&nbsp;$.post('xxxx.htm',{para: JSON.stringfy(menu)}, success:function(){....});<br />&nbsp;}else if(conditionTwo){<br />&nbsp;&nbsp;menu = {name: $('nameColumn'), order: $('ordrColumn'), ...imageInfo:{...,...}};<br />&nbsp;&nbsp;$.post('xxxx.htm',{para: JSON.stringfy(menu)}, success:function(){....});<br />&nbsp;}<br />这样做很烦琐,写的代码也很不友好,很不面向对象.</p>
<p style="PADDING-LEFT: 60px">&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 经高手点拔后,采用了下面的方法.</p>
<p style="PADDING-LEFT: 60px"><br />&nbsp;step1:在一个单独的js文件中如下所示地写出menu类:<br />&nbsp;function Menu(name,order,...,condition...,option){<br />&nbsp;&nbsp;this.name = name;<br />&nbsp;&nbsp;this.order = order;<br />&nbsp;&nbsp;...<br />&nbsp;&nbsp;this.condition = condtion;<br />&nbsp;&nbsp;...<br />&nbsp;&nbsp;this.option = option;<br />&nbsp;}</p>
<p style="PADDING-LEFT: 60px">&nbsp;</p>
<p style="PADDING-LEFT: 60px">&nbsp;Menu.prototype.toJsonString = function(){<br />&nbsp;&nbsp;var data;<br />&nbsp;&nbsp;if(this.conditionOne){<br />&nbsp;&nbsp;&nbsp;var subCategory = createSubCategory();<br />&nbsp;&nbsp;&nbsp;data = {name:nameVal,order:orderVal,...,subCategoryString:subCategory};<br />&nbsp;&nbsp;}else if(this.conditionTwo){<br />&nbsp;&nbsp;&nbsp;var imageInfo = createImageInfo();<br />&nbsp;&nbsp;&nbsp;data = {name:nameVal,order:orderVal,...,imageInfoString:imageInfo};<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return JSON.stringfy(data);<br />&nbsp;}</p>
<p style="PADDING-LEFT: 60px">&nbsp;</p>
<p style="PADDING-LEFT: 60px">&nbsp;function createMenu(){<br />&nbsp;&nbsp;if(conditionOne){<br />&nbsp;&nbsp;&nbsp;returne new Menu(.......);<br />&nbsp;&nbsp;}else if(conditionTwo){<br />&nbsp;&nbsp;&nbsp;returne new Menu(.......);<br />&nbsp;&nbsp;}<br />&nbsp;}</p>
<p style="PADDING-LEFT: 60px"><br />&nbsp;step2,这样有了上面的准备后,就可以直接在响应事件中写:</p>
<p style="PADDING-LEFT: 60px">&nbsp;function eventHandler(){<br />&nbsp;&nbsp;var menu = createMenu();</p>
<p style="PADDING-LEFT: 60px">&nbsp;&nbsp;$.post('xxxx.htm',{para: menu.toJsonString()}, success:function(){....});<br />&nbsp;}</p>
<p style="PADDING-LEFT: 60px">&nbsp;</p>
<p style="PADDING-LEFT: 60px">&nbsp;</p>
<p>&nbsp;从调用方的角度来看,代码简洁了许多.</p>
<p>&nbsp;</p>
<p><br />&nbsp;利用这个prototype还实现了JavaScript版的工厂模式,呵呵,不错!<br />&nbsp;<br />&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/204547#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, 17 Jun 2008 08:42:35 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/204547</link>
        <guid>http://rmn190.javaeye.com/blog/204547</guid>
      </item>
      <item>
        <title>这些天的收获:</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/203966" style="color:red;">http://rmn190.javaeye.com/blog/203966</a>&nbsp;
          发表时间: 2008年06月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><br />&nbsp;1,领导说话的艺术:</p>
<p><br />&nbsp;&nbsp;1.1 有如下顺序: 提出问题(客户抱怨) --&gt; 表示自己理解 --&gt; 但也应该有个度 --&gt; 提出要求 --&gt; 再考虑这个要求的影响(晚走加班的弥补,早来上班的有什么困难)</p>
<p><br />&nbsp;&nbsp;1.2 自己的一个致命弱点 --&gt; 但日子一天天的过去也没有这方面的长进 --&gt; 今看到这个活生生的例子 --&gt; 理论分析(编程建模)</p>
<p><br />&nbsp;&nbsp;1.3 给自己的启示: 多多与领导接触,但怎么接触?一般就是自己有了不足才被领导叫去,作为一种偷学方式可以工作中放开手脚去干,干好了自然有收获,干的有足了领导找谈话,这样就有了向高人学说话的机会.&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;2,相声的启发:</p>
<p><br />&nbsp;&nbsp;相声是说话的活,而自己有这方面的不足,偷像相声学,相声说话技巧里的一小撮就能给自己带来很大的改善.</p>
<p>&nbsp;</p>
<p>&nbsp;3,欧洲杯/老梁的启发:</p>
<p><br />&nbsp;&nbsp;荷兰的伟大:给新科世界冠亚军打出了尽胜三球这样史无前例的胜利.</p>
<p><br />&nbsp;&nbsp;荷兰的成功:主教练巴斯藤把意大利足球的防守反击和荷兰的全攻全守做了有机的融合.<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;老梁收集/积累知识: 买菠萝.</p>
<p>&nbsp;</p>
<p>&nbsp;4,向"自负"开炮:</p>
<p><br />&nbsp;端午节放假上班的第一天,心里很烦,后来跟老婆聊总结出了烦的原因其中一个最让我心动的收获就是自己最终认识到自负对自己的前进的束缚了.</p>
<p><br />&nbsp;这个过程很漫长:若隐若显地有些感觉 --&gt; 意识加强,查自负这个词的确切意思 --&gt; 再次遭遇后,把这个"自负"当回事的来处理.</p>
<p><br />&nbsp;认识到这个问题后的一个显著效果:心宽了,不再自觉不自觉地发现自己了,</p>
<p>&nbsp;</p>
<p>&nbsp;5,想着用UML设计一个Model来描述程序员的成长之路.</p>
<p>&nbsp;</p>
<p>&nbsp;6,时时处处都是学习的好地方,关键看自己用心不用心.<br />&nbsp;&nbsp; &nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/203966#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, 16 Jun 2008 08:54:03 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/203966</link>
        <guid>http://rmn190.javaeye.com/blog/203966</guid>
      </item>
      <item>
        <title>停博后再次启动</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/203965" style="color:red;">http://rmn190.javaeye.com/blog/203965</a>&nbsp;
          发表时间: 2008年06月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp; 前天吧,我进博客里看了下,发现一位名为niputo的网友给我以站内短信的方式留言,问我怎么不写Hibernate源码研究了.写信感谢网友之后看了最后一篇博客是在上个月的23号贴上去的.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; 是啊,扳着指头数数发现已有二十来天没写Blog了,心里空落落的,那感觉总像猎人有好久没去打猎一样.</p>
<p>&nbsp;</p>
<p>为什么这段时间没有写Blog呢?</p>
<p>&nbsp;</p>
<p style="padding-left: 30px;">静下心来想想大致有这么几点:</p>
<p style="padding-left: 30px;"><br />&nbsp;&nbsp;&nbsp; 1, 想换个方向来研究/学习Hibernate:</p>
<p style="padding-left: 30px;"><br />&nbsp;前段时间写的Hibernate源码研究系列真的纯粹是从源码的角度来研究/学习Hibernate的,刚开始时很兴奋的,毕竟</p>
<p style="padding-left: 30px;">这样一个成名已久的ORM框架能一步一步地看到其背后代码的执行过程,那感觉就像中学时期的我看到自己偶像一样的激动.于是在兴奋激动的牵引下开始了Hibernate的源码探索.</p>
<p style="padding-left: 30px;"><br />&nbsp;写了十来篇后,发现这样的学习方式有很大的缺陷,那就是以兴趣为出发点的研究离实用差的很远.虽然题目中写的是"从源码角度来看get/load方法的不同",但在实际执行过程中出现了很大的偏差,这样再加上兴奋劲也过去了,又不实用,就想着改变一种方式来前进了.</p>
<p style="padding-left: 30px;"><br />&nbsp;&nbsp;&nbsp; 2,工作方面的影响:</p>
<p style="padding-left: 30px;"><br />&nbsp;应该说这段时间工作上有些乱,项目自身的乱,项目管理的乱,从面也就引发了自己对工作上乱的反击.好在,现在终于这方面的事稳定下来了.</p>
<p style="padding-left: 30px;"><br />&nbsp;&nbsp;&nbsp;3,买了&lt;Hibernate In Action&gt;这本书:</p>
<p style="padding-left: 30px;"><br />&nbsp;想想也是,这本书直接导致了我没再写博客,书是最后一篇博客的那个周末买的.因为书买回来,下班后可以直接看书了,电脑也就懒的开了,自然博客也没持续下来.</p>
<p style="padding-left: 30px;"><br />&nbsp;&nbsp;&nbsp; 4,这些天的欧洲杯:</p>
<p style="padding-left: 30px;"><br />&nbsp;这是一个影响,虽然说我不那种很铁的球迷,但在上学时培养起来的那种对体育的喜爱与理解真的是从看欧洲杯和世界杯开始的,这段时间关注欧洲杯是重温,也是对现在编程生活的一种调剂吧.</p>
<p style="padding-left: 30px;">&nbsp;</p>
<p>&nbsp;&nbsp; 博客还是要写的,毕竟打猎过程的刺激和挑着猎物回家的兴奋本身就是对写作的一种奖励,从实际情况来看,这些天没写博客真的感到自己的"堕落"了:有时候提不起精神了,有那么多事需要去做,需要去提高,可自己却陷入了"没心情去做--&gt;事越积越多--&gt;心情更差--&gt; ..."恶性循环.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; 博客还是要写的,再次感谢niputo.</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/203965#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, 16 Jun 2008 08:51:46 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/203965</link>
        <guid>http://rmn190.javaeye.com/blog/203965</guid>
      </item>
      <item>
        <title>EntityEntry, EntityKey, Cache..Hibernate源码研究碎得(13)</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/195878" style="color:red;">http://rmn190.javaeye.com/blog/195878</a>&nbsp;
          发表时间: 2008年05月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p style="padding-left: 30px;"><br />如上篇结束时所言,本篇中着重研究upgradeLock这个方法.</p>
<p>&nbsp;</p>
<p>进入方法后第一句就是这个requestedLockMode.greaterThan( entry.getLockMode())判断,若不成立,就马上退出此方法.</p>
<p>&nbsp;</p>
<p>有些疑问的是EntityEntry类型的entry里getLockMode有什么意义?再往下追就是EntityEntry里的lockMode是什么时候什么情景下赋值的?</p>
<p><br />.......................</p>
<p><br />刚才用Eclipse里实际debug了一番,现在明白了些.</p>
<p style="padding-left: 30px;"><br />&nbsp;1,那个LockMode所Lock的是缓存里的Entity,把数据从DB中取出并封装成Java中的对象后,先通过addEntity的方式以entityKey为Key,以实际的Entity为value放入到PersistenceContext中的Map类型的entitiesByKey里,(这也就是SessionLevel的Cache吧?),接下来通过下面的参数:</p>
<p style="padding-left: 30px;"><br />&nbsp;EntityEntry e = new EntityEntry(<br />&nbsp;&nbsp;&nbsp;&nbsp;status,<br />&nbsp;&nbsp;&nbsp;&nbsp;loadedState,<br />&nbsp;&nbsp;&nbsp;&nbsp;rowId,<br />&nbsp;&nbsp;&nbsp;&nbsp;id,<br />&nbsp;&nbsp;&nbsp;&nbsp;version,<br />&nbsp;&nbsp;&nbsp;&nbsp;lockMode,<br />&nbsp;&nbsp;&nbsp;&nbsp;existsInDatabase,<br />&nbsp;&nbsp;&nbsp;&nbsp;persister,<br />&nbsp;&nbsp;&nbsp;&nbsp;session.getEntityMode(),<br />&nbsp;&nbsp;&nbsp;&nbsp;disableVersionIncrement,<br />&nbsp;&nbsp;&nbsp;&nbsp;lazyPropertiesAreUnfetched<br />&nbsp;);</p>
<p style="padding-left: 30px;"><br />组建一个EntityEntry对象,再利用如下语句entityEntries.put(entity, e)把这个新建的EntityEntry作为value同时那个DB数据的包装产物entity作为Key也放入到PersistenceContext里类型为Map的entityEntries对象中.这样就完成了数据从DB到PersistenceContext里迁移,而且在PersistenceContext里已有了Hibernate意义上的LockMode.</p>
<p style="padding-left: 30px;">&nbsp;</p>
<p style="padding-left: 30px;">&nbsp;2,这样当开一个Session并利用此Session来get某一个Java对象时,就会先从PersistenceContext里Map来取,若PersistenceContext里有,就取出.这时就要比较当前Session里取Java对象时的LockMode与PersistenceContext里对应EntityEntry里已有的LockMode,若前者大于后者就要来一次upgradeLock,毕竟当把这个Java对象从PersistenceContext里传给业务层后就要保证这个Java对象拥有一个高级别的排它锁,以防止别的Session偷偷地给改掉.这就是方法upgradeLock产生的背景,也正因为此upgradeLock方法也只出现在loadFromSessionCache里. --&gt;不错,把upgradeLock这个方法放在PersistenceContext里来理解一下就通了.</p>
<p>有了上面的分析,对upgradeLock方法的理解就完成一半了.再往下走,就是看这个目标怎么实现了.</p>
<p>就我现在的理解来看,在实现上这个upgradeLock有三个层面的操作:</p>
<p><br />&nbsp;1,二级缓存层面:通过生成一个包含当前Session及相关重要属性的CacheKey来锁定,也就是注明在二级缓存中想的那个Java对象已有CacheKey占有了,其它的"哥们儿"就别再花心思想这事了.</p>
<p><br />&nbsp;2,PersistenceContext层面:有判断是否isVersioned,从而来保证Version的一致;在PersistenceContext层面来更新LockMode的级别.</p>
<p><br />&nbsp;3,DB层面的事务隔离级别:<br />&nbsp;&nbsp;persister.lock( entry.getId(), entry.getVersion(), object, requestedLockMode, source );<br />&nbsp;&nbsp;下面又有:<br />&nbsp;&nbsp;&nbsp;PreparedStatement st = session.getBatcher().prepareSelectStatement( sql );<br />&nbsp;&nbsp;于是我就连蒙带猜地认为在DB层面上触及到事务的隔离级别了.</p>
<p>&nbsp;</p>
<p>到结尾处有一个问题:<br />&nbsp;if ( persister.hasCache() ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;persister.getCache().release(ck, lock );<br />&nbsp;}</p>
<p>&nbsp;</p>
<p>怎么finally里的代码块把前面刚刚Lock的给CacheKey的Entity给放了呢?这又不是session里的Trasaction已经结束了.想不明白,这个以后再慢慢体会吧.</p>
<p>&nbsp;</p>
<p>不过看了对finally做的如下注释,<br />&nbsp;"the database now holds a lock + the object is flushed from the cache,so release the soft lock"<br />虽说没有明白这个finally的作用,但似乎有些验证了前面关于"DB层面的事务隔离级别"的猜想.</p>
<p><br />这个方法终于搞完了.</p>
<p>作为补充,说一下,Hibernate在commit Trasaction时会把EntityEntry里的LockMode重置成最低级别的LockMode.NONE.</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/195878#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 May 2008 08:41:33 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/195878</link>
        <guid>http://rmn190.javaeye.com/blog/195878</guid>
      </item>
      <item>
        <title>甚是无奈的&quot;亲子鉴定&quot;--Hibernate源码研究碎得(12)</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/195487" style="color:red;">http://rmn190.javaeye.com/blog/195487</a>&nbsp;
          发表时间: 2008年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Hibernate中"亲子鉴定"</p>
<p>本篇中,我们来看doLoad方法,按上篇的分析方法,我们将这个方法分为三部分:<br />&nbsp;step1,loadFromSessionCache()的调用和对返回结果的判断.<br />&nbsp;step2,loadFromSecondLevelCache()的调用和对返回结果的判断.<br />&nbsp;step3,若上面两个方法的的返回值都为null的话,最后调用loadFromDatasource并返回此方法的返回值.</p>
<p>首先看step1,先不管loadFromDatasource这个方法的执行细节,值得注意的是并没有把结果的判断放入到loadFromDatasource方法里,而是通过判断返回值是否为REMOVED_ENTITY_MARKER或INCONSISTENT_RTN_CLASS_MARKER而分情况地做出log,虽说这两种情况下的最终返回值都是null.另一个值得注意的是虽然loadFromSessionCache可能返回null,但也并没有直接将其返回.这也算是一种<span style="color: #339966;">编程规范</span>吧:把方法调用及对返回的判断与方法的执行分开,这也很想对Exception的处理,有时根据需要并没有把一些异常都catch起来,而是将其抛出.</p>
<p>关于这个step1,还有一个很值得关注的,那就是特别注意整个系统中debug的安排,这里就特意为debug的需要而创建了两个Object类型的Marker.别的地方虽说也有将debug信息记录下来,但那都是随手而来的debug,不像这特意地<span style="color: #339966;">绕个弯儿来照顾debug的需要</span>.</p>
<p>有了对step1的分析,doLoad里的step2和step3就没什么特别了的.</p>
<p>下面看loadFromSessionCache方法的执行情况.</p>
<p>由于这里的目标很单一,也就不用再细分N多步了.<br />首先看第一句,SessionImplementor session = event.getSession();<br />值得注意的是虽然这个SessionImplementor在onLoad里就从event里获得了,但为了保持代码的精简并没有将那里取得的SessionImplementor作为参数再传到loadFromSessionCache里,而是在这个方法是重新获得,这也正是利用了"指针"的好处,想要什么时就直接获得它的"指针".</p>
<p>接着往下走,从sesion中getEntityUsingInterceptor,这个方法是第一次见,看对这个方法的注释发现了"calling the Interceptor if necessary"这句话.</p>
<p>还没有往下看以前,就觉得有些奇怪,既然这里已经取得了那个Entity为什么不直接返回呢?还要来个处理?接着往下看就发现了这样处理的高明之处:看这个get的Entity的状态,从而决定是否将其返回还是返回那个REMOVED_ENTITY_MARKER或INCONSISTENT_RTN_CLASS_MARKER, 这样的实质也就是任务注册逐层分解,同时也管理好每一次任务分配时的Message反馈,<span style="color: #339966;">而不是把任务交给你就不管了,同时还要充分考虑到你执行当前任务时可能出现的Message反馈.</span></p>
<p>以前对EntityEntry这个类老是不能很好地理解,觉得这个名字本身起的就有些怪怪的,Entity就Entity吧,怎么还再来个Entry呢?现在结合这里的实际应用,终于有了很直观的感觉了.<br />这里有从oldEntry里getStatus的语句,根据这个大致就可以推断出EntityEntry一个用途,那就是Hibernate利用这个类来获得Entity里与Hibernate相关的信息,这样也就理解了Entry一词在这的作用了.</p>
<p>接下往下看,总觉得这段话有点意思:<br />if ( options.isAllowNulls() ) {<br />&nbsp;&nbsp;EntityPersister persister = event.getSession().getFactory().getEntityPersister( event.getEntityClassName() );<br />&nbsp;&nbsp;if ( ! persister.isInstance( old, event.getSession().getEntityMode() ) ) {<br />&nbsp;&nbsp;&nbsp;return INCONSISTENT_RTN_CLASS_MARKER;<br />&nbsp;&nbsp;}<br />}</p>
<p>先不看那个isAllowNulls的作用,下面的isInstance的判断就些不对劲,<span style="color: #339966;">感觉夫妻俩生了孩子后不是高兴,而是马上给这个孩子做亲子鉴定!本来嘛,这个Entity就是在与之对应的EntityPersister的一手监管下取得的,而这个Entity"独立"后,竟然对这个Entity</span><span style="color: #ff0000;">做"亲子鉴定",有这个必要吗?</span></p>
<p>当然,我的这个形象的理解是有问题的,Hibernate经过这么久的考验了,这种"亲子鉴定"真正意义上也没有发生.不过通过这个反映出以前我对EntityPersister的理解还不全,需要进一步的修正.在这里也通过这个形象点的比喻来加强对这个问题重视.</p>
<p>下面是另一个方法upgradeLock了,追着看了下,这个方法是从DefaulLoadEventListener的父类AbstractLockUpgradeEventListener里继承来的.</p>
<p>这个方法很长,只能交给下篇来研究了.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/195487#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>Thu, 22 May 2008 08:51:28 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/195487</link>
        <guid>http://rmn190.javaeye.com/blog/195487</guid>
      </item>
      <item>
        <title>从源码层面来看load与get的区别(七):  Hibernate源码研究碎得(11)</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/194713" style="color:red;">http://rmn190.javaeye.com/blog/194713</a>&nbsp;
          发表时间: 2008年05月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在这篇中本来是没想着画EntityPersister接口继承关系及其实现类的类图,可看着看着觉得这个继承关系很壮美,也就很想看到它的全貌,于是就有在这<a href="../../blog/194711" title="类图" target="_blank">另一篇博客里的类图</a>.</p>
<p>言归正传,来看DefaultLoadEventListener类里的load方法,这个方法里可分为如下三步:<br />&nbsp;step1,判断并处理instanceToLoad不为null时的情况.<br />&nbsp;step2,做实质的doLoad方法,返回Object类型的对象.<br />&nbsp;step3,判断step2里返回的结果,若不符合就抛出相应的异常,从而结束这一超长的get/load操作.</p>
<p>先看step1,这里有个event.getSession().getPersistenceContext().getEntry(event.getInstanceToLoad()) != null判断,(这个Entry是干啥的?)若不为null就抛出"attempted to load into an instance that was already associated with the session: "Message的Exception.对,从这个message也能理解了不为null也就意味着当前PersistenceContext里已有instance.也就是说这个instance与session已关联起来了,那这样先前所假想的那个refresh功能就是错的了.看下面的persister.setIdentifier()方法,我们就可以修正先前的那个关于refresh的假想,或者说是去evolve那个假说:通过设置这个instanceToLoad,我们是想把处于detached状态的对象再次绑定到session里.这不是update的功能么?难道说update在底层就是调用了这个load方法? ----&gt; 以后做进一步的验证.</p>
<p>看step2的doLoad方法,这又是一个独立的方法.只能留到下一篇来详细研究了,不妨也学Hibernate里proxy概念那样,这个load方法将返回一个Object对象,也就是我们想get/load的那个对象.</p>
<p>下面是step3.<br />&nbsp;怎么若instanceToLoad不为null就是isOptionalInstance呢?也是说若设置了那个instanceToLoad就说明了这是一种optionalInstance.不理解.<br />&nbsp;再看下面的判断逻辑,若是optionalInstance或返回结果不能为null的话,就抛出ObjectNotFoundException.这里的"返回结果不为null"可以理解,但optionalInstance...理解了,这个isOptionalInstance也就意味着,事先已设定了那个instanceToLoad,这样即使get/load没有得到更好的结果(hit database),也不能把已有的那个给能丢了吧,估计正是出于这样的考虑,就把这个也加入ObjectNotFoundException异常的管理之内了.<br />&nbsp;有了刚才的分析,下面的这个判断也就好理解了:isOptionalInstance &amp;&amp; entity != event.getInstanceToLoad(),也就是说,我已设置了instanceToLoad,你那边get/load到的东西就得放到这个instanceToLoad里边,不能"狸猫换太子"地给调了包,那岂不是赔大了,辛苦了半天到头来给别人做了一番嫁衣.<br />&nbsp;至些,经过上面两层的异常筛选,我们就可以返回期盼已久的entity了.<br />&nbsp;下一篇中将讨论那个真正的功臣:doLoad.</p>
<p>*****************************************************<br />这篇blog写完了,总有些意犹未尽的感觉，今天写时有些文如泉涌,呵呵,有些自夸了.思路还很清晰.总得想想/总结下原因吧,对Hibernate的研究是很漫长的过程,这个过程中的研究方法也得慢慢完善起来.</p>
<p>现在总结,最先进入mind里的是刚开始画出的那个类图.很直观,扫清了障碍，也更坚定了信心,心里不再疙疙瘩瘩的,可以亮堂堂地前行.这是成功的心理因素.<br />第二,今天下班后看救灾方面的新闻,看到了一个女子在被埋的几十个小时里把自己小腿用石块砸开,用自己的鲜血维持着生命!在感叹生命力量如此之大之震撼之余,也让我更深刻地理解了生命潜力的巨大.这样常人能以想像的行动,再发观自己呢,生活中工作中的一点麻烦事就感觉天塌了似的,这怎么行?!有了这样坚定的信念,那个类图也就画出来了,今天的分析也很是成功.<br />第二,分析方法有了很大的改善.就是把load方法先分为三步,而不是像往常那样,不管三七二十一上来就看.这样的化整为零很见效,事实上,大致地看了一眼这个load方法后也有些犯嘀咕.可当分为三步后,目标一下子更明淅了,心情也就更好了,最终有了后面的文如泉涌.<br />&nbsp;呵呵....</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/194713#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, 20 May 2008 09:09:12 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/194713</link>
        <guid>http://rmn190.javaeye.com/blog/194713</guid>
      </item>
      <item>
        <title>满城尽是Interface,接口真的那么神奇?--Hibernate源码研究碎得(10)</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://rmn190.javaeye.com/blog/194711" style="color:red;">http://rmn190.javaeye.com/blog/194711</a>&nbsp;
          发表时间: 2008年05月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>满城尽是Interface,接口真的那么神奇?</p>
<p>晚饭后由于不能很集中地思考,就大致地看了EntityPersister这个接口的继承关系及其实现类.</p>
<p>呵,真是不看不知道,一看吓一跳,又是一个很庞大的继承树,而且还里有那么多的接口,不禁就感叹了:为什么Hibernate里这么多的接口?这样的接口设计能达到想像的效果么?在解藕合方面真能那么灵验?感觉有些接口过度了,不丁点的小事动不动就来一个接口.说句"大言不惭"的话,在自已的设计中是绝对想不到用这么多接口的.</p>
<p>写着写着,就意识到了:用众多接口而不用众多类是一个以前没想到(或没有这么强烈感觉到)的好处的,那就是利用接口可以视具体情况而做到细粒度的划分,此种情况下不必去考虑其实现类的多少,或更进一步就是不必把实现类也划分的那么细,(若把实现类也划分到接口那样的精细程度,在维护上是很费精力的.)而把这些接口的实现都集中在一起,这样就极好地达到服务与实现的解藕合.或许这就是解藕合的实质吧.</p>
<p>写到这,不由地又想起来这些天稍不留神地会去想去找映证的一个问题:究竟面向对象有什么好处?现在项目虽说是用的Java这一面向对象的语言,但像C语言那样面向过程的设计/编程方式随处可见.每当看到披着Java语言的面向过程就不由地反问,面向对象真的就像某些人所说的那样神奇?</p>
<p>今天由Hibernate里EntityPersister想到的接口带来的好处虽说不能完全消除对"挂着养头卖狗肉"的疑惑,但对面向对象的神奇与伟大有了很直观很切身的体会,再次感谢Hibernate!再次感谢开源软件给俺带来的启发与思考!</p>
<p>****************************************</p>
<p>以前对接口好处的认识也仅仅停留在JavaEE中的Data Object Accessor上,也正是由于这种情况下接口应用很常见,久而久之,习以为常,钝化了思维,心里不免觉得接口设计也不过尔尔嘛,偶尔还自以为是地对自己说掌握了接口设计的精髓.</p>
<p>呵呵,汗颜呀.DAO仅仅是接口发挥威力的一个小小场所.</p>
<p>解藕合:调用与运行分开,服务与实现分开.</p>
          <br/>
          <span style="color:red;">
            <a href="http://rmn190.javaeye.com/blog/194711#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, 20 May 2008 09:03:37 +0800</pubDate>
        <link>http://rmn190.javaeye.com/blog/194711</link>
        <guid>http://rmn190.javaeye.com/blog/194711</guid>
      </item>
  </channel>
</rss>