<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>JavaEye博客</title>
    <description>Java博客,Ruby on Rails博客,AJAX博客,Agile博客 -- JavaEye做最棒的软件开发交流社区</description>
    <link>http://www.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>北漂3月小记_炒自己的鱿鱼</title>
        <author>alfredgao</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://alfredgao.javaeye.com">alfredgao</a>&nbsp;
                    链接：<a href="http://alfredgao.javaeye.com/blog/250450" style="color:red;">http://alfredgao.javaeye.com/blog/250450</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: medium;">国庆送走了3个同学，阿静，阿杜，MZ。心里挺难受的，缘聚缘散。快赶上大学毕业那会了。。。</span></span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 16px;">先发了一篇博文，伤仲永和羞愧呀，罪人。方仲永和越王勾践很famous,拿来比较，也无甚相同之处，只是我内心的自责想起了这两人。</span></span></p>
<p><span style="font-size: 16px;"><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 方仲永年少时期才华卓著，同县乡人皆举为奇才，尝邀其父带其做诗，其父认为有利可图，带着方仲永四处拜访进而敛财。仲永12，13岁时作诗已难于与年少时匹敌了，七年后泯然众生矣。仲永是可悲的，其父是其才华逝去的第一责任人，古人明哲都是为仲永而伤。仲永的确有为自己才华逝去的理由。</span></span></p>
<p><span style="font-size: 16px;"><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 以仲永为镜，自己少未有名，更不用提什么泯然众人矣了，一直就是普通人，普通人所依靠的惟勤奋尔。如果连勤奋都丧失了，也许就该值得为之落泪了，最后逝去的不是自己的才华，而是自己的小聪明。</span></span></p>
<p><span style="font-size: 16px;"><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 勾践这个人很复杂，只讲其成功之处。少时曾大败吴王阖闾，让吴丧一国之主。这是年轻时期勾践的一大大手笔，后其自信心极度爆棚，举全国之兵欲灭吴后而后快，岂料夫差的才能志向不下于勾践，更兼有伍子胥，王孙<span><span style="font-size: 16px;">骆与公孙雄等一干才人辅佐，诱勾践深入，几全歼其兵。后在范蠡等人斡旋下，勾践长尝粪问疾,<span style="color: #c60a00;"><span style="color: #ee6600; background-color: yellow;">卧薪尝胆</span></span>二十年!勾践忍人所不能忍之辱,受人所不能受。终灭吴。20年休养生息，后毕其功于一役。<span style="color: #ff0000;">勾践最伟大的成就莫过于否定自己的狂妄，</span><span style="color: #000000;">老老实实的发展越国国力最后成为战国末期的霸主。勾践对于夫差所表述的忠心臣服是实实在在的，确实夫差是难得一见的英主，只不过勾践笑到了最后。</span></span></span></span></span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 勾践这个人物上要学习的是什么？一是自我的否定。一个拥有将自己毁灭勇气的人是无所匹敌的。另外一点值得大赞勾践的是他20年灭吴的决心和誓言。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 仲永和勾践让我自己炒了自己的鱿鱼。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 和一个月之前对比，自惭形秽，时间上更加荒废了，技术上也没有取得什么明显的进步。自问一下，从SuperMap离职的时候自己想的Flex+Gtgrid+JMail自己接触了多少，所以空有一身的目标，靠幻想来实现，是最不靠谱的事情，想做的好，就把目标量化出来。老老实实的做就行了，即使效果无法达到最佳，也总比没有效果的好。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这是来北京之后的第3个月了，如果前2个月算作对北京生活的适应，那么第三个月的时候自己收获了什么东西呢。自问之下，好像一无所获。看看从9.7-10.7之间自己做的事情吧，好像前2周最大的成就是在javaeye上开了一个技术博客吧，打算把自己的学习成果心得记载于这技术博客上吧，期间还参加了HuaTai人寿的保险培训，真是混乱至极。之后等到9月21号后北京的招聘会开始后开始奔波于各个招聘会之间，想想其实自己也没有去参加加几个招聘会。参加了以下的招聘会：</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 1.9月20日时代网络大厦一层的周六综合场招聘会</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 2.9月21号中国国际展览中心国展&ldquo;黄金九月，共创未来&rdquo;招聘会</span></p>
<p><span style="font-size: medium;"><span>&nbsp;&nbsp;&nbsp;</span>&nbsp; <span style="font-size: 16px;">3.9月23号北京高新技术企业IT,电子专场招聘会</span></span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 4.9月25号海淀区增光路46号大学生就业之家&ldquo;达内IT专场招聘会&rdquo;</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 16px; color: #000000;">9月24号下午参加神码思特奇的笔试，等消息，经验不够，要价太高，估计没戏。9月25号下午参加联龙的面试，算法没答好(全排列)，要价太高，应该已经被Pass了。9月26号参加了英客科技的笔试，都是很基础的东西，自己掌握的不好，应该也被pass了。27，28号呆在家里，29号开始了国庆之繁忙的旅途。</span></span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 最该值得批判的地方是没有为学习分配相应的时间，也许分配了时间我也没有去执行这样的安排，这是我一贯的弊病了，看到阿静在深夜用功读书，心里很热。也许自己有热情，但是不能保持惯性，说白了，就是坚持不住，管不住自己，想起对某人说过的话我的努力一直是以慵懒的状态进行的，这种慵懒实际上是让我很痛恨的。大多数时候我都会拿慵懒的努力当做挡箭牌，给自己一些接口去找个地方荒废自己的时间，逃避应该经历的学习，仲永的下场在所难免。只不过仲永的命运在他爹手里荒废了，难道我的命运要在自己手里荒废？</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 国庆是个触发器。现在总结来看，来北京之后其实我的决定很多都是不理性的，本质上看我是最感性的动物了，照顾了很多别人，让自己的处境很尴尬。某种意义上我是总管，总管生活琐事的大妈，也许以后我真该减少一些这方面的时间花费。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 如何让自己的时间变得有效？</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 1.合理安排时间。如果做出了安排，就老老实实的按安排去做，不要给自己任何的理由不去做。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 2.单位时间量化活动进度。多长时间做完多少事情，必须全情投入，不能编造任何理由。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 记得送MZ同学走时，曾告诫自己心态浮躁，也许来北京后更深刻的发现了自己很脆弱，而且有时候连自己都难以忍受。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 重建自己的生活状态几乎成了我的生活梦想，我想让每天过的充实，是有效，而不是每天都很混乱。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 我感谢三个人的提醒。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 1.智联的小柯姐，骑驴找马，突然陷入一种无所事事的状态，人很容易变慌乱而且没有效率。我不信，我自信自控力可以让我去学习，后来这种自信更像是泡沫，很虚无而且不可见。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 2.MZ同学，MZ同学其实什么都没说，几句很普通的话就Ok了，很多时候，面对现实的问题，我是无力解决的，更多的时候在自欺欺人。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 3.iff_小黑同学。这是说到我心里去的一段话。贴上来晒晒。</span></p>
<p><span style="font-size: small;">&nbsp;&nbsp;&nbsp; <span style="font-size: 12px; color: #0000ff;">iff_小黑 23:29:23<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你该坚强一点<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 天堂小工 23:31:16<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我不坚强吗？看我不坚强吗，就我没工作&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iff_小黑 23:32:16<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我指心里<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iff_小黑 23:32:31<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不然你就不会逃避那个项目，至少不会后悔<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iff_小黑 23:32:42<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 至少不会后悔逃避<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 天堂小工 23:32:53<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 哇，还是你了解我。。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 天堂小工 23:33:05<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以我去做过山车了。。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iff_小黑 23:33:12<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。。。。。。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iff_小黑 23:33:20<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个有关系吗<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 天堂小工 23:33:29<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 哎，离开学校前没明白的事情离开学校后明白了&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 天堂小工 23:33:53<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打个比喻。。其实都没什么的。。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iff_小黑 23:35:01<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 都要有这一步的，有的人天分高，没什么事，有的人就从学校出来到社会要有</span></span></p>
<p><span style="font-size: small; color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个很难的过程，你就看阿莎，他就没这些事，娃哈哈哈哈哈，他就是个逼。哇哈哈哈<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 天堂小工 23:36:02<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 晕。。。那阿沙是哪种？&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iff_小黑 23:36:57<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 哎，我羡慕阿莎啊，整天笑模子的，什么事都没有，阿莎有天分的那种，</span></p>
<p><span style="font-size: small; color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 心里想得开，&nbsp; 放得下，闯得硬朗。。能将就。。这都是好处啊<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iff_小黑 23:37:24<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 能伸能屈，阿莎是真逼</span></p>
<p><span style="font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: medium;">从地狱仰望天堂。。不抛弃，不放弃。<span style="color: #ff0000;">渴望漂泊的人惟一不飘的是那颗心</span>，阿静转给我的这句话最真实了，能走多远，看心力有多么坚韧。</span></span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 小黑资料里的几句话说的非常到位，在此贴一下。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; Touch..用知识守护生命.Ollin中.飘逸的男人.注意细节。真够鹿的！</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 每一句话都挺有味道的，关键是阿静同学所带来的CW的故事，反转WC，一杯水。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 下面是自我总结篇。彻底的分析自己是种种缺点的败露。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 我这个人做事挺认真的，有些完美主义倾向；不好的地方爱吹牛皮，当然不是很过分，但是频率挺高的；华而不实，做事情很浮躁，很难深入，容易半途而废；自控力不足，很多时间没有规划。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 明年这时侯就22岁了，岁岁年年，自问收获了什么。忙忙碌碌这么多年，发现还是和年少是一样容易冲动，缺乏必胜的信心，和为理想为目标付诸实践持续有效的努力。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 趁着年轻，拼吧，Bismark最近说的话很能刺痛我的神经，在那整天忙着想什么呢。托业考试，SCJP认证，通往外企。为未来而设定的目标，你有为之规划过吗，为之200%的努力过吗？和杨老大住一起，真是挺幸运的，这厮很有功底，见识也挺远的。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 我知道自己别说200%的努力了，100%的努力自己都不曾达到过。如果想让自己感动自己，先拿出点东西来吧。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 今天看到一则启示，说是当你害怕某个东西时，经常去做自己不敢做的事情会增大自己的胆量，提高承压力。多做些闻之色变的事情会提高自己的心理稳定性，不再那么脆弱。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 心态很关键，好的心态是高效的前提。让时间有效，让目标有规划，让自己不再慵懒，是我的三大志向。</span></p>
<p><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp; 重建自己的生活状态，修缮自己的性格，完善自己的人际。没有退路，才会直面人生。退缩只会过上患得患失的生活。真的勇士，敢于直面惨淡的人生！</span></p>
<p><span style="font-size: medium;"><span>&nbsp;&nbsp;&nbsp;&nbsp; 现在的我过着惨淡的人生，我并没有心灰意冷。</span><span>关心我的朋友们，亲人们，请看我日后的人生表现，绝不再蓄意颓废。</span></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://alfredgao.javaeye.com/blog/250450#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 08 Oct 2008 18:24:54 +0800</pubDate>
        <link>http://alfredgao.javaeye.com/blog/250450</link>
        <guid>http://alfredgao.javaeye.com/blog/250450</guid>
      </item>
          <item>
        <title>解决Hibernate SQL Query Cache的一个可靠性问题(附源码) </title>
        <author>raymond2006k</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://raymond2006k.javaeye.com">raymond2006k</a>&nbsp;
                    链接：<a href="http://raymond2006k.javaeye.com/blog/250427" style="color:red;">http://raymond2006k.javaeye.com/blog/250427</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          上篇 帖子 <a href="http://www.javaeye.com/topic/249508" target="_blank">Hibernate查询缓存的一个可靠性问题 </a>说发现Hibernate 的 Query Cache 在使用 SQL Query 时的一个可靠性 Bug， 即在关联表数据修改后，无法查询出最新数据的问题。 经过源码分析，找到问题所在，并通过修改 Hibernate 源代码，成功解决了此问题。<br /> <br />&nbsp;&nbsp;&nbsp; Hibernate 3.1， JDK 1.4<br /><br />1. 问题原因：<br />&nbsp;&nbsp;&nbsp; 走了一下源码，大致找到了问题所在，&nbsp; SQLQueryReturnProcessor 在分析 query 时，用于判断缓存失效的&nbsp; querySpaces[]只分析出了返回结果对应的表，例如例子中的权限点表：sys_perm,&nbsp; 而sql中的关联表没有分析出来，并放到 querySpaces[] 中。 <br /><br />&nbsp;&nbsp; 具体分析：<br />&nbsp;&nbsp;&nbsp; 类 org.hibernate.loader.custom.SQLCustomQuery, 它是解析 SQL Query 的一个包装类。<br />&nbsp;&nbsp;&nbsp; SQLCustomQuery 类有一个与缓存相关的属性，querySpaces 集合 ：<br />&nbsp;&nbsp; <pre name="code" class="java"> private final Set querySpaces = new HashSet(); </pre><br /><br />&nbsp;&nbsp;&nbsp; 通过源码分析，发现 querySpaces&nbsp; 主要用来进行Cache更新检查，querySpaces&nbsp; 存放的是基本VOClass 对应的 tableName, 例如： {SYS_PERM,SYS_USER} . Hibernate 在执行查询时，会检查这个集合中的所有 tableName, 如果该任意一个 tableName 对应 VOClass 二级缓存 有增，删，改的更新操作，即 UpdateTimestampsCache 不是最新的 ，那么该 Query 的 cache 就失效，就会重新去数据库中查询 ID 集合。<br /><br />&nbsp;&nbsp;&nbsp; SQLCustomQuery 在构造函数中即进行 sql 的解析和querySpaces[]的判断，其中中有这样一段代码：<br /><pre name="code" class="java">
  public SQLCustomQuery(.....) throws HibernateException {
    SQLQueryReturnProcessor processor = new SQLQueryReturnProcessor(queryReturns, scalarQueryReturns, factory);
   processor.process();
     ....
    SQLLoadable[] entityPersisters = (SQLLoadable[]) processor.getPersisters().toArray( new SQLLoadable[0] );
     ....
   for (int i = 0; i &lt; entityPersisters.length; i++) {
      SQLLoadable persister = entityPersisters[i];
   //alias2Persister.put( aliases[i], persister );
  //TODO:Does not consider any other tables referenced in the query    
ArrayHelper.addAll( querySpaces, persister.getQuerySpaces() );
    ....
   }
....

</pre><br />&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; <span style="color: green">//TODO: Does not consider any other tables referenced in the query</span><br />&nbsp;&nbsp;&nbsp; <span style="color: red">ArrayHelper.addAll( querySpaces, persister.getQuerySpaces() );</span><br /><br />&nbsp;&nbsp;&nbsp; 其中红色部分是将 persister 的querySpaces[] 赋给 sqlQuery 的 querySpaces， 但是 persister 代表返回结果集类型对应的表，测试用例中是权限表 SYS_PERM； 因此漏了关联表 （Reference Table），这就是问题所在。 我们看到作者 author Gavin King, Max Andersen 也打了 TODO 注释：<br /><span style="color: green">//TODO: Does not consider any other tables referenced in the query</span><br />“不要考虑其他查询中的关联表”， 看来作者也留下一手，也许是遗忘了该 TODO 的处理。 <br /><br />2. 解决原理<br />&nbsp;&nbsp;&nbsp; 关键就是要对 sql 分析出关联表，将其加入 querySpaces[] , 这样sql query查询时，就能自动检查关联表是否有更新。<br />&nbsp;&nbsp;&nbsp; 分析关联表，用正则表达式解析 sql 中的所有单词 word，并逐个检查word 是否为 sessionFactory 中已经映射的表，凡是映射的表，就作为 reference table 加入 querySpaces[] 。 <br />&nbsp;&nbsp; <br />&nbsp;&nbsp; 1) 新增分析类： org.hibernate.loader.custom.SQLQueryReferencesAnalyzer.<br />&nbsp;&nbsp; <pre name="code" class="java">
/**
 * analyze reference table of a specified sql query
 * @author Raymond He, Guangzhou China
 * Oct 8, 2008
 *
 */
public class SQLQueryReferencesAnalyzer {	
  private static Pattern p = Pattern.compile( "\\w{3,}" );	 
  private static Map sqlquery2ReferenceTableMapping  = new HashMap();
  private static Map tableName2EntityNameMapping = new HashMap(100);
	 
  private static final Log log = LogFactory.getLog( SQLQueryReferencesAnalyzer.class );
	 
  public List analyzeSQL(SessionFactory sessionFactory,String sql) {		 
    if(sqlquery2ReferenceTableMapping.containsKey(sql)) {
			 
	List refTables  = (List)sqlquery2ReferenceTableMapping.get(sql);
	if(log.isDebugEnabled())
	 log.debug("Got ref tables:" + refTables + "\r\n of SQL: " + sql);
	 return refTables;
   }else {
		 
     if(tableName2EntityNameMapping.size() == 0) {  //init it once
	initTableName2EntityNameMapping(sessionFactory); 
      }
			 
    List refTables = new ArrayList(3);
    Matcher m = p.matcher(sql);
			
    while(m.find()) {				 
	 String word  = m.group();
	 word = word.toUpperCase();
	//check if the word is a table name in sessionFactory
         //cache table for every sessionFactory independently, for multi sessionFactory env.
	 String key = "SF" + sessionFactory.hashCode() + "_" + word; 
	 if(tableName2EntityNameMapping.containsKey( key )) {
	   if(log.isDebugEnabled()) log.debug("word is table: "+ word);
	   refTables.add( word);
          }
     }
			
     if(log.isDebugEnabled())
	 log.debug("To cache sqlquery2ReferenceTableMapping, ref tables:" + refTables + "\r\n of SQL: " + sql);
      //cache it
      sqlquery2ReferenceTableMapping.put(sql, refTables);
     return refTables;
   }
 }
</pre><br /><br />&nbsp;&nbsp; 2) 调用reference table分析类，将关联表加入 querySpaces[]<br /><br />&nbsp;&nbsp;&nbsp; 在 SQLCustomQuery 中 完成 Gavin King&nbsp; 的 TODO 任务。<br />&nbsp;&nbsp;&nbsp; <pre name="code" class="java">
//2008-10-6,Raymond He fix bug here,old text: Does not consider any other tables referenced in the query
   /**start: analyze ref tables and add it to querySpaces ***********/
   SQLQueryReferencesAnalyzer referencesAnalyzer = new SQLQueryReferencesAnalyzer();
   List refTables = referencesAnalyzer.analyzeSQL(factory, sql);
   for (int k = 0; k &lt; refTables.size(); k++) {
	querySpaces.add(refTables.get(k));
   }
   /**end ***********/
</pre> <br /> <br />3. 验证<br />&nbsp;&nbsp;&nbsp; 还是之前那个测试用例，观察日志：<br /><span style="color: blue"><br /> Execute No. 0 ********************<br />2008-10-08 17:32:50,140 [DEBUG](AbstractBatcher.java,346) - select&nbsp; this.PERMCODE as&nbsp; PERM1_15_0_,&nbsp; this.MODULECODE as&nbsp; MODULE2_15_0_,&nbsp; this.PERMTYPECODE as&nbsp; PERM3_15_0_,&nbsp; this.PERMNAME as&nbsp; PERM4_15_0_,&nbsp; this.PERMDESC as&nbsp; PERM5_15_0_,&nbsp; this.PORTNO as&nbsp; PORT6_15_0_ from (select&nbsp; t.perm_code as permCode, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.module_code as moduleCode, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.perm_name as permName, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.perm_desc as permDesc, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.port_no as portNo, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.perm_type_code as permTypeCode <br />&nbsp; 		from sys_perm t join sys_role_perm o <br />&nbsp;&nbsp;&nbsp; on t.perm_code = o.perm_code <br />&nbsp;&nbsp;&nbsp; where o.role_code = ? ) this&nbsp; <br />(No.0)result size:1<br /><br /> Execute No. 1 ********************<br />(No.1)result size:1<br />2008-10-08 17:32:50,187 [DEBUG](AbstractBatcher.java,346) - delete from SYS_ROLE_PERM where PERM_CODE=? and ROLE_CODE=?<br /><br /> Execute No. 2 ********************<br />2008-10-08 17:32:50,187 [DEBUG](AbstractBatcher.java,346) - select&nbsp; this.PERMCODE as&nbsp; PERM1_15_0_,&nbsp; this.MODULECODE as&nbsp; MODULE2_15_0_,&nbsp; this.PERMTYPECODE as&nbsp; PERM3_15_0_,&nbsp; this.PERMNAME as&nbsp; PERM4_15_0_,&nbsp; this.PERMDESC as&nbsp; PERM5_15_0_,&nbsp; this.PORTNO as&nbsp; PORT6_15_0_ from (select&nbsp; t.perm_code as permCode, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.module_code as moduleCode, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.perm_name as permName, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.perm_desc as permDesc, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.port_no as portNo, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.perm_type_code as permTypeCode <br />&nbsp; 		from sys_perm t join sys_role_perm o <br />&nbsp;&nbsp;&nbsp; on t.perm_code = o.perm_code <br />&nbsp;&nbsp;&nbsp; where o.role_code = ? ) this&nbsp; <br />(No.2)result size:0</span><br /><br /><br />注意到第3次又执行了sql 语句，并且 (No.2)result size:0， 表明第二次查询后， 删除了 角色授权记录，因此第3次查询 角色 STESTOR 授权限结果为 0 。 表明成功修复此问题。 <br /><br />4. fix包及源码下载：<br />&nbsp;&nbsp;&nbsp;&nbsp; 用法:&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; <pre name="code" class="java">
    1) remove one class from hibernate3.jar
        org.hibernate.loader.custom.SQLCustomQuery.class
    2) add  hibernate3-sqlquerycache-fix.jar to classpath, it provides another  SQLCustomQuery impl to solve the bug. 
  </pre>
          <br/>
          <span style="color:red;">
            <a href="http://raymond2006k.javaeye.com/blog/250427#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 08 Oct 2008 17:31:19 +0800</pubDate>
        <link>http://raymond2006k.javaeye.com/blog/250427</link>
        <guid>http://raymond2006k.javaeye.com/blog/250427</guid>
      </item>
          <item>
        <title>linux下编译C程序(三)</title>
        <author>lveyo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lveyo.javaeye.com">lveyo</a>&nbsp;
                    链接：<a href="http://lveyo.javaeye.com/blog/250412" style="color:red;">http://lveyo.javaeye.com/blog/250412</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          gcc在命令行上经常使用的几个选项是：<br />-c&nbsp;&nbsp; 只预处理、编译和汇编源程序，不进行连接。编译器对每一个源程序产生一个目标文件。<br /><br />-o file&nbsp; 确定输出文件为file。如果没有用-o选项，缺省的可执行文件的输出是a.out，目标文件和汇编文件的输出对source.suffix分别是source.o和source.s，预处理的C源程序的输出是标准输出stdout。<br /><br />-Dmacro或-Dmacro=defn&nbsp;&nbsp; 其作用类似于源程序里的#define。例如：% gcc -c -DHAVE_GDBM -DHELP_FILE=\"help\" cdict.c其中第一个- D选项定义宏HAVE_GDBM，在程序里可以用#ifdef去检查它是否被设置。第二个-D选项将宏HELP_FILE定义为字符串“help”（由于反斜线的作用，引号实际上已成为该宏定义的一部分），这对于控制程序打开哪个文件是很有用的。<br /><br />-Umacro&nbsp;&nbsp; 某些宏是被编译程序自动定义的。这些宏通常可以指定在其中进行编译的计算机系统类型的符号，用户可以在编译某程序时加上 -v选项以查看gcc缺省定义了哪些宏。如果用户想取消其中某个宏定义，用-Umacro选项，这相当于把#undef macro放在要编译的源文件的开头。<br /><br />-Idir&nbsp;&nbsp; 将dir目录加到搜寻头文件的目录列表中去，并优先于在gcc缺省的搜索目录。在有多个-I选项的情况下，按命令行上-I选项的前后顺序搜索。dir可使用相对路径，如-I../inc等。<br /><br />-O&nbsp;&nbsp; 对程序编译进行优化，编译程序试图减少被编译程序的长度和执行时间，但其编译速度比不做优化慢，而且要求较多的内存。<br /><br />-O2&nbsp;&nbsp; 允许比-O更好的优化，编译速度较慢，但结果程序的执行速度较快。<br /><br />-g&nbsp;&nbsp; 产生一张用于调试和排错的扩展符号表。-g选项使程序可以用GNU的调试程序GDB进行调试。优化和调试通常不兼容，同时使用-g和-O（-O2）选项经常会使程序产生奇怪的运行结果。所以不要同时使用-g和-O（-O2）选项。<br /><br />-fpic或-fPIC&nbsp;&nbsp; 产生位置无关的目标代码，可用于构造共享函数库。<br /><br />以上是gcc的编译选项。gcc的命令行上还可以使用连接选项。事实上，gcc将所有不能识别的选项传递给连接程序ld。连接程序ld将几个目标文件和库程序组合成一个可执行文件，它要解决对外部变量、外部过程、库程序等的引用。但我们永远不必要显式地调用ld。利用gcc命令去连接各个文件是很简单的，即使在命令行里没有列出库程序，gcc也能保证某些库程序以正确的次序出现。<br /><br />gcc的常用连接选项有下列几个：<br />-Ldir&nbsp;&nbsp; 将dir目录加到搜寻-l选项指定的函数库文件的目录列表中去，并优先于gcc缺省的搜索目录。在有多个-L选项的情况下，按命令行上-L选项的前后顺序搜索。dir可使用相对路径。如-L../lib等。<br /><br />-lname&nbsp;&nbsp; 在连接时使用函数库libname.a，连接程序在-Ldir选项指定的目录下和/lib，/usr/lib目录下寻找该库文件。在没有使用-static选项时，如果发现共享函数库libname.so，则使用libname.so进行动态连接。<br /><br />-static&nbsp;&nbsp; 禁止与共享函数库连接。<br /><br />-shared&nbsp;&nbsp; 尽量与共享函数库连接。<br /><br />这是Linux上连接程序的缺省选项。下面是一个使用gcc进行连接的例子：<br /><div class="quote_title">引用</div><div class="quote_div">% gcc -o prog main.o subr.o -L../lib -lany -lm</div>
          <br/>
          <span style="color:red;">
            <a href="http://lveyo.javaeye.com/blog/250412#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 08 Oct 2008 17:09:04 +0800</pubDate>
        <link>http://lveyo.javaeye.com/blog/250412</link>
        <guid>http://lveyo.javaeye.com/blog/250412</guid>
      </item>
          <item>
        <title>看grok的源代码</title>
        <author>winston_y_fulton</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://winston-y-fulton.javaeye.com">winston_y_fulton</a>&nbsp;
                    链接：<a href="http://winston-y-fulton.javaeye.com/blog/250359" style="color:red;">http://winston-y-fulton.javaeye.com/blog/250359</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近在看grok的源代码，源代码的注释很少，不是很爽。心存疑问，这个grok对中文的支持行吗？
          <br/>
          <span style="color:red;">
            <a href="http://winston-y-fulton.javaeye.com/blog/250359#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 08 Oct 2008 16:05:57 +0800</pubDate>
        <link>http://winston-y-fulton.javaeye.com/blog/250359</link>
        <guid>http://winston-y-fulton.javaeye.com/blog/250359</guid>
      </item>
          <item>
        <title>由PHP想到python，又由python想到PHP，一点不成熟的想法！</title>
        <author>aaa110110</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://aaa110110.javaeye.com">aaa110110</a>&nbsp;
                    链接：<a href="http://aaa110110.javaeye.com/blog/250339" style="color:red;">http://aaa110110.javaeye.com/blog/250339</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2>&nbsp;</h2>
<div class="t_msgfont">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; python是越来越火了，其简单的语法，强大的功能无所不能，被人们认为是开发跨平台的GUI应用程序最好的选择，而且基于python的web<span class="t_tag" onclick="tagshow(event)">框架</span>也是越来越成熟。当然，一些python的社区也是越来越活跃，python牛人也是如果滔滔江水，连绵不绝地涌现。<img src="http://bbs.phpchina.com/images/smilies/default/lol.gif" border="0" alt="" /> 连java也推出了基于java的python，即jython，好强大啊！&nbsp; &nbsp;</div>
<div class="t_msgfont">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有人说，php发展的趋势是python！<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;为什么python具有那么大的吸引力呢？为此，我努力<span class="t_tag" onclick="tagshow(event)">学习</span>python 5天，5天就基本把python了解得七七八八，写个多线程的抓取程序早就没有问题了。程序，不就那么点破事吗？<br />其实python就语言本身根本没有什么优势，而且目前虽然他越来越火，但依然雷声大，雨点小，应用还是不那么广泛。直接地说吧，学好python，如果你只会这个还是不好找工作、这样说，各位应该明白了吧。很好，说话就应该这样通俗易懂！<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;但是目前python，什么ruby的确是在瓜分web开发领域的市场了。python和php语言一样，都是解释型语言，这是他的本质，是没有办法改变的。而且他们都是弱类型的，底层都是C写的，可以用C来写扩展（python里面叫类库）。其实python到底有什么优势呢？<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;丑陋的语法，古怪的缩进，这一点其实php更符合人们的习惯。还有pyhton里面一些什么&ldquo;字典&rdquo;，&ldquo;元组&rdquo;等概念，这一点，python弄得其实很不方便，相当落后。php的数组是多么的方便啊，想一维就一维，想多维就多维，要多舒服就多舒服。该死的python怎么不学学php的优点呢？还有python的面向对象比起php的面向对象要弱智很多，这我就不多说了。<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;python的内置<span class="t_tag" onclick="tagshow(event)">函数</span>很少，真正强大的地方在于他那丰富的类库。而且他的类库开发也很方便，用c写好<span class="t_tag" onclick="tagshow(event)">代码</span>，丢在一个目录里面，再import一下就直接可以用了。这一点他比php灵活，php写过扩展要编译成so文件，相当麻烦。所以用php写扩展的人很少，网络上也很少有php扩展下载，写php程序基本全靠内置的函数。而python就不同了，第三方类库多余牛毛。<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 再就是python灵活而强大，在windows平台，可以直接调用<span class="t_tag" onclick="tagshow(event)">系统</span>API函数，想干啥就干啥，可以用API来开发窗口程序，注册系统服务，操作注册表。。。。。。有过C/S模式开发的朋友都知道。python可以使用多种类库写GUI<span class="t_tag" onclick="tagshow(event)">软件</span>，有一个叫做BOB的IDE，这个东西像delphi一样可视化开发。python可以编译成exe文件，比如使用便宜py2exe。<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;嗯，这就是python牛逼的地方，灵活而强大，再加上他再加上他支持多线程和丰富的类库，于是魅力就出来了。于是它可以做一些php不能做的事情，某些方便比php做得更好，最后连php能做的它都能做。<img src="http://bbs.phpchina.com/images/smilies/default/biggrin.gif" border="0" alt="" /> 为什么python能做的，php就不能做呢？<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;想一想php，php做为shell脚本运行和python是一样的方便的。专注web没有错，但是php实在太保守了。多线程这个东西，那么多年了他就是不给支持。我想，是不是php开发组的人员技术力量不够呢？还有每次php版本升级，更新的功能基本就那么一点点，很多是对过去的改造，新功能几年出来不了一个。我想，没有什么比新特性更能吸引<span class="t_tag" onclick="tagshow(event)">程序员</span>的注意吧？php就是这么保守和低调。这两年php应用方面发展是很快，主要原因其实是ASP的逐步淘汰，php相当于以往的ASP了，大家都用他做cms，天天做博客，做cms。其实php的未来发展让人担忧，ruby，python等新兴语言的迅速崛起，java在企业领域有着不可撼动的地位。<br /><br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;以上是一些不成熟的想法，欢迎大家拍砖。</div>
          <br/>
          <span style="color:red;">
            <a href="http://aaa110110.javaeye.com/blog/250339#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 08 Oct 2008 15:28:58 +0800</pubDate>
        <link>http://aaa110110.javaeye.com/blog/250339</link>
        <guid>http://aaa110110.javaeye.com/blog/250339</guid>
      </item>
          <item>
        <title>如何分辨支持rails unpack操作的gem</title>
        <author>yangzhihuan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangzhihuan.javaeye.com">yangzhihuan</a>&nbsp;
                    链接：<a href="http://yangzhihuan.javaeye.com/blog/250328" style="color:red;">http://yangzhihuan.javaeye.com/blog/250328</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p><span style="font-family: -webkit-monospace; white-space: pre-wrap; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;">你也可以在项目运行时列出正在被使用的 gems：
# Listing all gem dependencies
rake gems
如果其中有个gem含有文件rails/init.rb 并且你想将它存放在你的项目中，可以用：
# Copy the specified gem to vendor/gems/nome_do_gem-x.x.x
rake gems:unpack GEM=gem_name
这将会拷贝这个 gem 到vendor/gems/gem_name-x.x.x。若不指定 gem 的名称， Rails 将拷贝所有 gems 包到vendor/gem 目录中.
(以上资料出自 Ruby on Rails2.1 What is new 中文版)

根据上面这段资料
<span style="color: #ff0000;">gem含有文件rails/init.rb 的都可以存放到你的项目中,也就是说可以unpack了,这个就是分辨能不能unpack的准则.</span></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://yangzhihuan.javaeye.com/blog/250328#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 08 Oct 2008 15:04:09 +0800</pubDate>
        <link>http://yangzhihuan.javaeye.com/blog/250328</link>
        <guid>http://yangzhihuan.javaeye.com/blog/250328</guid>
      </item>
          <item>
        <title>list_head 实例</title>
        <author>andrew913</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://andrew913.javaeye.com">andrew913</a>&nbsp;
                    链接：<a href="http://andrew913.javaeye.com/blog/250325" style="color:red;">http://andrew913.javaeye.com/blog/250325</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近一个项目要用到这个东西，发现确实很好用，就写了个最简单的例子，希望对大家有用，对linux下面的编程了解实在太少，正在努力学习中，学生嘛，慢慢来，不急躁。<br /><pre name="code" class="c">
#define __KERNEL__ //这样才能使用list.h，具体请看list.h
#include "list.h" /*由于我的机器上没有list.h,所以我拷贝了一个，如果你机器上有，应该是加#include &lt;linux/list.h>*/
#include &lt;stdio.h> 
#include &lt;string.h>

#define MAX_USER_LEN 32
#define MAX_PAS_LEN 32
#define MAX_SERVER_LEN 1024

 
typedef struct server_detect_ftp
{
	struct list_head list;
	char server[MAX_SERVER_LEN];
	int port;
	char username[MAX_USER_LEN];
	char password[MAX_PAS_LEN];
}server_detect_ftp_t;

int main(void)
{
	struct list_head head;//头部
	server_detect_ftp_t ftp_link;
	server_detect_ftp_t ftp_link1;
	server_detect_ftp_t *entry;
	struct list_head *p;
	INIT_LIST_HEAD(&head);//初始化头部
	strcpy(ftp_link.server,"www.163.com");
	ftp_link.port=34;
	strcpy(ftp_link.username,"good");
	strcpy(ftp_link.password,"good");

	strcpy(ftp_link1.server,"www.163.com");
	ftp_link1.port=34;
	strcpy(ftp_link1.username,"good");
	strcpy(ftp_link1.password,"good");

	INIT_LIST_HEAD(&head);

	list_add(&ftp_link.list,&head);
	list_add(&ftp_link1.list,&head);//添加链表
	list_del(&ftp_link1.list);//删除链表
	list_for_each(p,&head)//遍历
	{
		entry=list_entry(p,struct server_detect_ftp,list);//读取某个值

		printf("%s\n",entry->username);
	}

	return 0;
}


</pre><br /><br />list_head在实际应用中很有用，而且他的设计非常有意思，大家可以去list.h中看他们的宏定义，了解他是如何实现的，关键就是了解他是如何读取具体的数据，其实就是一个地址的获取。
          <br/>
          <span style="color:red;">
            <a href="http://andrew913.javaeye.com/blog/250325#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 08 Oct 2008 14:58:53 +0800</pubDate>
        <link>http://andrew913.javaeye.com/blog/250325</link>
        <guid>http://andrew913.javaeye.com/blog/250325</guid>
      </item>
          <item>
        <title>Agile Development 资源</title>
        <author>samuelray</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://samuelray.javaeye.com">samuelray</a>&nbsp;
                    链接：<a href="http://samuelray.javaeye.com/blog/250324" style="color:red;">http://samuelray.javaeye.com/blog/250324</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="news://comp.software.extreme-programming">news://comp.software.extreme-programming</a><br /><a href="http://www.egroups.com/group/extremeprogramming">www.egroups.com/group/extremeprogramming</a><br /><a href="http://www.extremeprogramming.org">www.extremeprogramming.org</a>, Don Wells&rsquo; site<br /><a href="http://www.junit.org">www.junit.org</a>, JUnit&rsquo;s home.<br /><a href="http://www.refactoring.com">www.refactoring.com</a>, Martin Fowler&rsquo;s refactoring catalog.<br /><a href="http://www.xpdeveloper.com">www.xpdeveloper.com</a><br /><a href="http://www.xprogramming.com">www.xprogramming.com</a>, Ron Jeffries&rsquo; site<br /><a href="http://www.xp123.com">www.xp123.com</a>, William C. Wake's site.</p>
<p><a href="http://tech.groups.yahoo.com/group/extremeprogramming/">http://tech.groups.yahoo.com/group/extremeprogramming/</a>, xp group.</p>
<p>&nbsp;</p>
<p><a href="http://www.controlchaos.com">www.controlchaos.com</a></p>
<p><a href="http://www.scrumalliance.org/">http://www.scrumalliance.org/</a></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://samuelray.javaeye.com/blog/250324#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 08 Oct 2008 14:58:14 +0800</pubDate>
        <link>http://samuelray.javaeye.com/blog/250324</link>
        <guid>http://samuelray.javaeye.com/blog/250324</guid>
      </item>
          <item>
        <title>祸不单行，福无双至</title>
        <author>anglefly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://anglefly.javaeye.com">anglefly</a>&nbsp;
                    链接：<a href="http://anglefly.javaeye.com/blog/250315" style="color:red;">http://anglefly.javaeye.com/blog/250315</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;人常说，祸不单行，福无双至。确实有些道理。母亲走后不到两个月，一贯忠厚的父亲，突然如走火入魔，做出的事情如平地惊雷，让我们做儿女的伤心欲绝。因为长期不在老家，不明白究竟什么引发了父亲如此叛逆的行为，但想起母亲在世的点点滴滴，想起她这辈子受的苦受的罪，我总是悲从中来。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实，母亲走后，我对金钱看得很轻，对什么东西都失去了兴趣。一个人钱再多，也不能保证他这辈子平平安安，无病无灾，又何苦为了金钱费尽心思？平平淡淡的生活我已知足。最大的遗憾就是母亲再也不能分享我的快乐，分担我的烦恼。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 可是总有人，为了钱不择手段。父亲陷在泥潭里，早已听不进亲人的话。母亲这辈子的心血就要旁落别人手里，天堂里的母亲一定看得透心凉。&nbsp;妈妈，此时此刻，我才知道，你这辈子有多苦，有多难。我早知道因为我们姐妹仨，在重男轻女的农村里，你受了多少委屈多少刁难；可是我不知道我的父亲，你的结发45年的丈夫，对你如此无情。你不仅付出多年的艰辛劳动，还忍受这么多年的心里委屈，难怪你总对我说，父亲对你很无情。我一直以为是你生病了烦躁时才对他挑三检四。现在我知道了你的去世，他有不可推卸的责任。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我祈祷，让走火入魔的父亲早点落难吧。钱散了就散了，只要他能回头，能对母亲悔过，我们仍然接受他。&nbsp;&nbsp;&nbsp;&nbsp; </p>
          <br/>
          <span style="color:red;">
            <a href="http://anglefly.javaeye.com/blog/250315#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 08 Oct 2008 14:30:38 +0800</pubDate>
        <link>http://anglefly.javaeye.com/blog/250315</link>
        <guid>http://anglefly.javaeye.com/blog/250315</guid>
      </item>
          <item>
        <title>修饰符volatile学习笔记</title>
        <author>lurga</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lurga.javaeye.com">lurga</a>&nbsp;
                    链接：<a href="http://lurga.javaeye.com/blog/250314" style="color:red;">http://lurga.javaeye.com/blog/250314</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近学习java多线程，碰巧项目中用到AtomicReference类，在网上搜罗了一堆资料，记录一下阅读笔记和一些文章网址供以后复习。这些文章都和volatile有关，通过学习volatile可以知道jdk1.5引入java.util.concurrent.atomic包的原因。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一篇文章是&ldquo;javaeye问答&rdquo;llade回答问题&ldquo;<a href="http://www.javaeye.com/problems/1737" title="加不加volatile看不出有什么效果">加不加volatile看不出有什么效果</a>&rdquo;的答案：</p>
<pre name="code" class="java">package linyumin.test.thread;   
/**  
 * @author llade  
 */  
public class VolatileObjectTest {   
  
    /**  
     * 相信绝大多数使用JAVA的人都没试出volatile变量的区别。献给那些一直想知道volatile
     * 是如何工作的而又试验不出区别的人。  
     * 成员变量boolValue使用volatile和不使用volatile会有明显区别的。  
     * 本程序需要多试几次，就能知道两者之间的区别的。  
     * @param args  
     */  
    public static void main(String[] args) {   
        final VolatileObjectTest volObj=new VolatileObjectTest();   
        Thread t2=new Thread(){   
            public void run(){   
                System.out.println("t1 start");   
                for(;;){   
                        volObj.waitToExit();   
                }   
            }   
        };   
        t2.start();   
        Thread t1=new Thread(){   
            public void run(){   
                System.out.println("t2 start");   
                for(;;){   
                    volObj.swap();   
                }   
            }   
        };   
        t1.start();   
    }   
  
    //加上volatile 修饰的时候，程序会很快退出，因为volatile 保证各个线程工作内存
    //的变量值和主存一致。所以boolValue == !boolValue就成为了可能。  
    boolean boolValue;  
  
    public void waitToExit() {   
        //非原子操作，理论上应该很快会被打断。实际不是，因为此时的boolValue在线
        //程自己内部的工作内存的拷贝，因为它不会强制和主存区域同步，线程2修改
        //了boolValue很少有机会传递到线程一的工作内存中。所以照成了假的“原子现象”。  
        if(boolValue == !boolValue)System.exit(0);  
    }   
       
    public void swap() { 
        //不断反复修改boolValue，以期打断线程1.   
        boolValue = !boolValue;   
    }  
}  
</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这份代码说明了两个问题：1、线程间共享的变量会拷贝到线程的工作内存，如果不能及时写回到主存，将造成线程间共享变量不同步；2、加上volatile修饰符使得线程间共享变量同步会引起a == !a之类的逻辑错误，这是因为我们没有对非原子性操作boolValue == !boolValue加锁。所以可以修改这份代码来修正这两个错误：</p>
<pre name="code" class="java">public class VolatileObjectTest {    
    public static void main(String[] args) {   
        final VolatileObjectTest volObj=new VolatileObjectTest();   
        Thread t2=new Thread(){   
            public void run(){   
                System.out.println("t1 start");   
                for(;;){   
                        volObj.waitToExit();   
                }   
            }   
        };   
        t2.start();   
        Thread t1=new Thread(){   
            public void run(){   
                System.out.println("t2 start");   
                for(;;){   
                    volObj.swap();   
                }   
            }   
        };   
        t1.start();   
    }   
  
    volatile boolean boolValue;
  
    // 加锁
    public synchronized void waitToExit() {   
        if(boolValue == !boolValue) {
         System.out.println("exit...");
         System.exit(0);
        }
    }   
       
    // 加锁
    public synchronized void swap() {
        boolValue = !boolValue;   
    }   
  
}  </pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 问题一：用java.util.concurrent.atomic.AtomicBoolean来替代boolean，达到上面这份代码的效果。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一篇文章中的代码很好的演示了volatile修饰符的作用和局限：保证共享变量在线程间的可见性，无法保证共享变量的非原子操作的互斥性。第二篇文章<a href="http://www.ibm.com/developerworks/java/library/j-jtp06197.html" title="Java theory and practice: Managing volatility">Java theory and practice: Managing volatility</a>进一步展示如何正确使用volatile修饰符。</p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正确使用volatile需要满足两个条件：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?&nbsp;Writes to the variable do not depend on its current value.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ?&nbsp;The variable does not participate in invariants with other variables.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这两个条件其实都是针对变量非原子性操作提出来的，第一个条件表明写volatile变量不能依赖其当前值，比如i++，i+=i之类的操作，因为这些操作涉及&ldquo;读-改-写&rdquo;一系列动作；第二个条件表明volatile变量不能与其他变量共同决定某个状态，比如对上下限(a,b)中的上限和下限分别赋值，这可能导致下限大于上限。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引入volatile修饰符的原因有两个：使用简单，效率高，如果能够在恰当的时机使用它对编写高效的代码很有益，有五种模式：<br />1.&nbsp;Status flags</p>
<pre name="code" class="java">volatile boolean shutdownRequested;

...

public void shutdown() { shutdownRequested = true; }

public void doWork() { 
    while (!shutdownRequested) { 
        // do stuff
    }
}</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在多线的情况下，某个线程调用shutdown函数，volatile修饰符保证变量shutdownRequested的更新值能够被及时写入主存供其他线程调用。<br />2.&nbsp;Onetime safe publication</p>
<pre name="code" class="java">public class BackgroundFloobleLoader {
    public volatile Flooble theFlooble;

    public void initInBackground() {
        // do lots of stuff
        theFlooble = new Flooble();  // this is the only write to theFlooble
    }
}

public class SomeOtherClass {
    public void doWork() {
        while (true) { 
            // do some stuff...
            // use the Flooble, but only if it is ready
            if (floobleLoader.theFlooble != null) 
                doSomething(floobleLoader.theFlooble);
        }
    }
}</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个模式的用法与Double-Checked Locking的问题有关，详细描述请见The "Double-Checked Locking is Broken" Declaration。在执行&ldquo;theFlooble = new Flooble()&rdquo;时，虚拟机可能会对构造函数和赋值语句的执行序列进行重组优化，也就是说先为Flooble的实例分配内存，并将这个内存地址赋予theFlooble，再调用Flooble的构造函数。为对象引用theFlooble加上volatile修饰符能保证虚拟机在调用Flooble的构造函数之后才将其地址赋予theFlooble，其他线程就能操作被成功构造的对象。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 值得注意的是，这个模式有一个限制条件， initInBackground语义表明希望其他线程操作initInBackground之后的对象，initInBackground函数中如果还有其他更改theFlooble对象成员变量的操作将违反volatile修饰符的使用条件一：非原子性操作。<br />3.&nbsp;Independent observations</p>
<pre name="code" class="java">public class UserManager {
    public volatile String lastUser;

    public boolean authenticate(String user, String password) {
        boolean valid = passwordIsValid(user, password);
        if (valid) {
            User u = new User();
            activeUsers.add(u);
            lastUser = user;
        }
        return valid;
    }
}</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这其实是模式二的一个延伸。<br />4.&nbsp;The &ldquo;volatile bean&rdquo; pattern</p>
<pre name="code" class="java">public class Person {
    private volatile String firstName;
    private volatile String lastName;
    private volatile int age;

    public String getFirstName() { return firstName; }
    public String getLastName() { return lastName; }
    public int getAge() { return age; }

    public void setFirstName(String firstName) { 
        this.firstName = firstName;
    }

    public void setLastName(String lastName) { 
        this.lastName = lastName;
    }

    public void setAge(int age) { 
        this.age = age;
    }
}

</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个模式的名字暗指类似于bean，变量的setter和getter加上volatile修饰符可以保证线程安全，这些getter，setter不能包含对变量的逻辑操作，假如被修饰的是对象引用，所引用的对象的成员变量必须是一些不变值，因为volatile修饰的是引用本身，对引用的对象并不起作用。<br />5.&nbsp;The cheap read-write lock trick</p>
<pre name="code" class="java">public class CheesyCounter {
    // Employs the cheap read-write lock trick
    // All mutative operations MUST be done with the 'this' lock held
    @GuardedBy("this") private volatile int value;

    public int getValue() { return value; }

    public synchronized int increment() {
        return value++;
    }
} </pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个模式是对那些非原子性操作加上同步锁，而原子性操作则保留了volatile变量的效率。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 整篇文章在教我们如何正确使用volatile，实际上还是颇多陷阱，这也是引入java.util.concurrent.atomic包的原因。比如执行getAndDecrement这类操作，使用atomic包远比模式五要简单。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后收藏一个网址<a href="http://www.cs.umd.edu/~pugh/java/memoryModel/">http://www.cs.umd.edu/~pugh/java/memoryModel/</a>，这个网址记录了很多java虚拟机内存模型的资料。</p>
          <br/>
          <span style="color:red;">
            <a href="http://lurga.javaeye.com/blog/250314#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 08 Oct 2008 14:27:33 +0800</pubDate>
        <link>http://lurga.javaeye.com/blog/250314</link>
        <guid>http://lurga.javaeye.com/blog/250314</guid>
      </item>
          <item>
        <title>Facebook, Gmail, 校内Web即时通信方案介绍</title>
        <author>erylee</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://erylee.javaeye.com">erylee</a>&nbsp;
                    链接：<a href="http://erylee.javaeye.com/blog/250295" style="color:red;">http://erylee.javaeye.com/blog/250295</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><!--  [if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
p\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
v\:textbox {display:none;}
</style>
<![endif]--><!--  [endif]-->
</p>
<h1>www.facebook.com</h1>
<p><!--  [if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
p\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
v\:textbox {display:none;}
</style>
<![endif]--><!--  [endif]--><span style="font-size: small;">
</span>
</p>
<p><span style="font-size: small;">Facebook是最早推出WebIM功能的SNS社区网站之一，Facebook IM的后台采用Erlang实现大规模的WebIM服务器集群，前台通过IFrame+AJAX实现跨域长轮询。<br />
</span>
</p>
<p><span style="font-size: small;"><br />
</span>
</p>
<p><span style="font-size: small;">方案综述：后台采用PHP+Erlang实现，前台IM界面直接嵌入Facebook所有主要页面中，前后台通过POST发送消息，通过Iframe+AJAX的长轮询(long poll)方式接收消息(Message)和好友状态(Presence)。<br />
<br />
发送消息:&nbsp; POST http://www.facebook.com/ajax/chat/***.php<br />
<br />
接收消息: GET http://0.channel17.facebook.com/x/1473685292/false/p_517871768=4<br />
<br />
通过嵌入Iframe解决Ajax轮询代码的跨域问题: &lt;iframe id=&quot;channel_iframe&quot;/&gt;</span>
</p>
<h1>www.xiaonei.com</h1>
<p><span style="font-size: small;">校内网IM是一个完整的即时通信产品，不仅包括WebIM，还有桌面版本，其整个方案相对Facebook更完整。</span>
</p>
<p><span style="font-size: small;"><br />
</span>
</p>
<p><span style="font-size: small;">校内IM是采用Jabber的XMPP协议，具体后台Jabber服务器应该是Ejabberd之类，桌面版本直连Jabber服务器，WEB版本通过Flash连接Jabber服务器。</span>
</p>
<p><span style="font-size: small;"><br />
</span>
</p>
<p><span style="font-size: small;">方案综述：校内是采用Flash长连接的方式实现即时消息收发，这一点比较特别，个人认为原因有两点：1. 校内网是采用Java做的，即时消息处理上如果采用Ajax的方式，服务器压力较大；2. 后台的Jabber服务器需要建立长连接。<br />
<br />
消息收发：通过flash链接Jabber服务器的39000端口。</span>
</p>
<h1>www.gmail.com</h1>
<p><span style="font-size: small;">GTalk in Gmail的WebIM估计是因为借助了Google强大的后台集群Web服务器，前台实现得非常简单，连跨域都没有，就是通过定时轮询(以前是长轮询，现在是短轮询)的方式来接收即时消息和好友状态。<br />
</span>
</p>
<p><span style="font-size: small;"><br />
</span>
</p>
<p><span style="font-size: small;">
</span>
</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://erylee.javaeye.com/blog/250295#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 08 Oct 2008 14:08:28 +0800</pubDate>
        <link>http://erylee.javaeye.com/blog/250295</link>
        <guid>http://erylee.javaeye.com/blog/250295</guid>
      </item>
          <item>
        <title>是对象复制，还是引用的传递</title>
        <author>ayis</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ayis.javaeye.com">ayis</a>&nbsp;
                    链接：<a href="http://ayis.javaeye.com/blog/250287" style="color:red;">http://ayis.javaeye.com/blog/250287</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>首先看代码：</p>
<pre name="code" class="java">import java.util.ArrayList;

/** 
 * @author ayi
 * @version 创建时间：Oct 8, 2008 1:10:01 PM 
 * 类说明 :测试对象添加到ArrayList容器中，是对象复制，还是引用的传递；以及在toArarry()又是怎么样。
 */

public class TestArarryCopy {
	
	public static void main(String args[]){
		
		Person p1=new Person();
		ArrayList&lt;Person&gt; vect=new ArrayList&lt;Person&gt;();
		Person[] pArarry;
		
		vect.add(p1);
		if(vect.get(0)==p1){
			System.out.println("对象添加到ArrayList容器中是引用的传递；");
		}else{
			System.out.println("对象添加到ArrayList容器中是对象的复制；");
		}
		
		pArarry=(Person[])vect.toArray(new Person[0]);
		if(pArarry[0]==p1){
			System.out.println(" 在toArray()中是引用的传递；");
		}else{
			System.out.println("在toArray()中是对象的复制；");
		}
	}
}

/**
 * 一个用来使用的对象
 * @author ayi
 *
 */
class Person {
	
}</pre>
<p>&nbsp;结果：对象添加到ArrayList容器中是引用的传递；在toArray()中也是引用的传递。在Vector中也是一样的。对于其它的，要判断是对象复制还是引用传递，都可以判断对象的引用是否相等来简单的判别。</p>
          <br/>
          <span style="color:red;">
            <a href="http://ayis.javaeye.com/blog/250287#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 08 Oct 2008 13:57:10 +0800</pubDate>
        <link>http://ayis.javaeye.com/blog/250287</link>
        <guid>http://ayis.javaeye.com/blog/250287</guid>
      </item>
          <item>
        <title>继承Activity类应该注意的问题</title>
        <author>wuhua</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wuhua.javaeye.com">wuhua</a>&nbsp;
                    链接：<a href="http://wuhua.javaeye.com/blog/250279" style="color:red;">http://wuhua.javaeye.com/blog/250279</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在开发Android的时候，往往是extends Activity类来做为主类启动的，但是继承这个类，并覆盖相关的方法的时候需要注意一些问题。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><!--  [if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]--><!--  [if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]--> <span style="font-family: 楷体_GB2312;">public boolean onKeyDown(int key, KeyEvent event)<br />
public boolean onKeyUp(int key, KeyEvent event) <br />
上面这两个方法是事件的入口，因此覆盖的时候需要注意在最后没返回的时候使用return super.onKeyDown() ; return onKeyUp()的方法，以保证父类的方法可以调用的到。<br />
</span>
</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">上面的做法是一定要保证到super的方法必须执行，否则会遇到，你创建菜单，见不到菜单的结果</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://wuhua.javaeye.com/blog/250279#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 08 Oct 2008 13:47:11 +0800</pubDate>
        <link>http://wuhua.javaeye.com/blog/250279</link>
        <guid>http://wuhua.javaeye.com/blog/250279</guid>
      </item>
          <item>
        <title>只有命运能阻挡黄蜂</title>
        <author>Jummy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jummy.javaeye.com">Jummy</a>&nbsp;
                    链接：<a href="http://jummy.javaeye.com/blog/250271" style="color:red;">http://jummy.javaeye.com/blog/250271</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: darkred">&nbsp;&nbsp;&nbsp; 五个月前，黄蜂距离西部决赛只有一步之遥，他们在3比2领先的局势下3比4落败。看过黄蜂马刺七场大战的人应该都记得，当然你可以说，黄蜂是为经验埋单，但也可以说，黄蜂是为资历埋单&mdash;&mdash;在关键的第六战，裁判在下半场开始后连续四次有争议的判罚(1次保罗进攻犯规，2分钟内连吹韦斯特3次犯规)直接决定了比赛。在年轻的黄蜂面前，马刺耗尽气力，才在生死线上取胜。富有打球经验的主帅斯科特对黄蜂输球的原因心知肚明，这也算潜规则了，他给足了联盟面子，没埋怨一句裁判，还说了&ldquo;一支球队是不可能从不进季后赛一下就去争冠军的&rdquo;这样的话。但这句话的反面也很清楚：我们已经吃过苦，交过学费了，下赛季该是我们的了。 　　这样一个赛季之后，黄蜂不但有了人气，也有了资历，他们得到了他们想得到的一切。表现出色的替补帕戈去了欧洲，这是黄蜂阵容上惟一的损失，但迈克&middot;詹姆斯和新转来的德文&middot;布朗能弥补他的空缺，何况在这个位置上，黄蜂拥有整个NBA最杰出的后卫保罗。波西给黄蜂带来了一支冠军球队的经验，也带来了佩贾不具备的防守能力。与此同时，这只黄蜂保持着他们的防守强度、纪律和快攻风格，他们已经青春与经验兼备。以往和黄蜂对阵，如果能跟着他们跑下来，就有机会赢他们；现在你即使能跟着他们跑，在阵地进攻里也很难击败他们。因此我相当确信，稳步上升的黄蜂和更显衰老的马刺如果这个赛季再打一轮季后赛，在没有伤病的情况下，马刺已没有任何机会在七场系列赛中击败黄蜂。 　　<br />&nbsp;&nbsp;&nbsp;&nbsp; 如果没有厄运带来的伤病因素，西部能在季后赛中阻挡黄蜂的球队实在太少了。马刺不能；太阳也不能，奥尼尔和纳什是不可能追上钱德勒和保罗的；小牛不能，这已经被证明过一次了；开拓者也不能，他们还没有季后赛经验；火箭恐怕也不能，抱歉，姚麦是超级明星，但钱德勒和波西可以限制他们，火箭却没人能限制保罗对球队的策动；爵士很难，防守和纪律也是他们的立队之本，德隆是罕见的能对抗保罗的后卫，但爵士在整体上仍然略显不足，尤其是在外线杀伤力上。你发现了么在狂野西部绕了一大圈，能和黄蜂真正对抗而且可能击败他们的，竟然只剩 下了一支湖人。所以黄蜂就算嘴上不说，他们的目标已是路人皆知，至少也要打进西部决赛。 　　<br />&nbsp;&nbsp; 只有命运，只有从天而降的伤病和莫名的厄运，才能阻挡住黄蜂。如果你是保罗的球迷，就替他们祈祷吧。</span>
          <br/>
          <span style="color:red;">
            <a href="http://jummy.javaeye.com/blog/250271#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 08 Oct 2008 13:30:14 +0800</pubDate>
        <link>http://jummy.javaeye.com/blog/250271</link>
        <guid>http://jummy.javaeye.com/blog/250271</guid>
      </item>
          <item>
        <title>&quot;Maven: The Definitive Guide&quot;在国外出版了</title>
        <author>juvenshun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://juvenshun.javaeye.com">juvenshun</a>&nbsp;
                    链接：<a href="http://juvenshun.javaeye.com/blog/250258" style="color:red;">http://juvenshun.javaeye.com/blog/250258</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&quot;Maven: The Definitive Guide&quot;一书的商业模式十分有趣，首先你可以在线免费阅读或者下载PDF，地址为：<a href="http://www.sonatype.com/book" target="_blank">http://www.sonatype.com/book</a>
。而现在，它又推出了纸质的书本，你可以<a href="http://www.amazon.com/Maven-Definitive-Guide-Sonatype-Company/dp/0596517335/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1223303639&amp;sr=8-1" target="_blank">在Amazon上购买</a>
。还有一点有趣的地方是，本书的所有版税全部捐献出来用来植树了。因此，这本书相当环保，不是为了盈利的，主要是为了推广Maven。</p>
<p>&nbsp;</p>
<p>关于本书的内容，绝对是Maven目前最权威的文档，作者都是领域的专家，以及Maven核心代码的提交者。</p>
<p>第一部分是实战，通过很多例子帮助初学者认识Maven。</p>
<p>第二部分是参考，很多高级的特性和底层的概念这里有比较详尽的解释。</p>
<p>此外，第二部分还介绍了Maven的Eclipse插件：m2eclipse，以及一个强大的Maven仓库管理器：Nexus。</p>
<p>&nbsp;</p>
<p>简体中文的翻译，我正在有序进行，第一部分我已经翻译完毕了，第二部分也已开始，此外m2eclipse和Nexus的章节也在之前发布了。请看：<a href="http://www.sonatype.com/book/reference_zh/public-book.html" target="_blank">http://www.sonatype.com/book/reference_zh/public-book.html#</a>
。</p>
<p>翻译的进度，我尽量保持在：两章/月。</p>
<p>关于简体中文版的出版，目前还没有什么计划，在翻译的差不多后，会认真考虑这方面的事情。</p>
<p>&nbsp;</p>
<p>&quot;Maven中文&quot;MSN群（group136525@msnzone.cn）目前已经有41人加入了。</p>
<p>谢谢大家的支持！</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://juvenshun.javaeye.com/blog/250258#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 08 Oct 2008 12:52:48 +0800</pubDate>
        <link>http://juvenshun.javaeye.com/blog/250258</link>
        <guid>http://juvenshun.javaeye.com/blog/250258</guid>
      </item>
          <item>
        <title>自定义漂亮的分页标签</title>
        <author>hnylj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hnylj.javaeye.com">hnylj</a>&nbsp;
                    链接：<a href="http://hnylj.javaeye.com/blog/250256" style="color:red;">http://hnylj.javaeye.com/blog/250256</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>jsp技术已经是一项很老的技术了，该技术也十分成熟，下面我将对jsp中的自定义标签技术进行一下探讨，并附上本人利用该技术实现的一个分页标签。自定义标签技术的出现也是为了让jsp页面尽量不写java代码，使得数据的显示和显示逻辑相分离，使代码的可读性和维护性更好。</p>
<p>jsp技术流行至今，也是每个java程序员再熟悉不过了，发布本人实现的一个分页标签和大家一起交流，有不足之处，你可以进行修改，但希望你能把修改后的代码贴出来，小弟感激不尽！</p>
<p>&nbsp;</p>
<p>该分页标签由3个标签组成，分别是&lt;d:iterator&gt;,&lt;d:field&gt;,&lt;d:page&gt;<br />&lt;d:iterator&gt;用于数据的迭代，&lt;d:field&gt;用于输出每一条数据，&lt;d:page&gt;用于数据的分页</p>
<p>&nbsp;</p>
<p>下面是每个标签对应的源代码：</p>
<p>1.IteratorTag.java</p>
<pre name="code" class="java">package org.hnylj.taglib;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletRequest;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;

public class IteratorTag extends TagSupport {

	private static final long serialVersionUID = -3495128280303394359L;
	private List&lt;String&gt; fieldList;
	private List&lt;String&gt; displayList;
	private String list;
	private String isTemplate;

	public IteratorTag() {
		super();
		fieldList = new ArrayList&lt;String&gt;();
		displayList = new ArrayList&lt;String&gt;();
	}

	public String getIsTemplate() {
		return isTemplate;
	}

	public void setIsTemplate(String isTemplate) {
		this.isTemplate = isTemplate;
	}

	public String getList() {
		return list;
	}

	public void setList(String list) {
		this.list = list;
	}

	public void addField(String field) {
		fieldList.add(field);
	}
	
	public void addDisplay(String display) {
		displayList.add(display);
	}

	public int doStartTag() throws JspTagException {
		fieldList.clear();
		displayList.clear();
		return Tag.EVAL_BODY_INCLUDE;
	}

	public int doEndTag() throws JspTagException {
		this.iteratorDisplay();
		return Tag.EVAL_PAGE;
	}
	
	public void iteratorDisplay () {
		JspWriter jspWriter = this.pageContext.getOut();
		try {
			ServletRequest request = pageContext.getRequest();
			List&lt;Map&lt;String,String&gt;&gt; data = (List&lt;Map&lt;String,String&gt;&gt;)request.getAttribute(this.getList());;
			jspWriter.write("&lt;table width=100% style='border:1 solid #33CCFF' cellpadding=3&gt;&lt;tr&gt;");
			for (int i=0; i&lt;displayList.size(); i++) {
				jspWriter.write("&lt;td bgcolor=#99CCFF&gt;");
				String display = (String) displayList.get(i);
				jspWriter.write(display);
				jspWriter.write("&lt;/td&gt;");
			}
			jspWriter.write("&lt;/tr&gt;");
			for (int j=0; j&lt;data.size(); j++) {
				Map&lt;String,String&gt; d = (Map&lt;String,String&gt;) data.get(j);
				jspWriter.write("&lt;tr&gt;");
				for (int k=0; k&lt;fieldList.size(); k++) {
					jspWriter.write("&lt;td bgcolor=#CCFFFF&gt;");
					String field = (String) fieldList.get(k);
					jspWriter.write((String) d.get(field) + "  ");
					jspWriter.write("&lt;/td&gt;");
				}
				jspWriter.write("&lt;/tr&gt;");
			}
			jspWriter.write("&lt;/table&gt;");
			jspWriter.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}</pre>
<p>&nbsp;2.FieldTag.java</p>
<pre name="code" class="java">package org.hnylj.taglib;

import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;

public class FieldTag extends TagSupport {

	private static final long serialVersionUID = -1330092183292977881L;
	private String name;
	private String display;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getDisplay() {
		return display;
	}

	public void setDisplay(String display) {
		this.display = display;
	}
	
	public int doEndTag() throws JspTagException {  
		Tag t = findAncestorWithClass(this, IteratorTag.class);   
		IteratorTag iTag = (IteratorTag) t;  
		iTag.addDisplay(display);
		iTag.addField(name);
		return EVAL_PAGE;
	}
}
</pre>
<p>&nbsp;3.PageTag.java</p>
<pre name="code" class="java">package org.hnylj.taglib;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

public class PageTag extends TagSupport {

	private static final long serialVersionUID = 5824600810852310338L;
	private String pageSize;
	private String action;
	
	public String getPageSize() {
		return pageSize;
	}

	public void setPageSize(String pageSize) {
		this.pageSize = pageSize;
	}

	public String getAction() {
		return action;
	}

	public void setAction(String action) {
		this.action = action;
	}

	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();
		HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
		String pageNow = (String)request.getSession().getAttribute("pageNow");
		int pageSize = Integer.parseInt(this.getPageSize());
		try {
		      int first = Integer.parseInt(pageNow); 
		      String count = (String)request.getSession().getAttribute("count");
		      long countRow = Integer.parseInt(count);
		      out.println("&lt;style type='text/css'&gt;");
		      out.println("&lt;a:link{COLOR:#2781c9;TEXT-DECORATION:none}" +
		      		       "a:visited{color:blue;TEXT-DECORATION:none}" +
		      		       "a:active{color:blue;TEXT-DECORATION:none}" +
		      		       "a:hover{color:blue;TEXT-DECORATION:underline}"
		      		      +"&lt;/style&gt;");
		      out.println("&lt;div align=right bgcolor=#99CCFF&gt;");
		      
		      if (first == 0) {
		    	  out.println("首页 | ");
		      } else {
		    	  out.println("&lt;a href='"+this.getAction()+"?pageNow=0'&gt;首页 | &lt;/a&gt;"); 
		      }
		      if ((first-1) &lt; 0) {
		    	  out.println(" 上一页 | ");
		      } else {
		    	  out.println("&lt;a href='"+this.getAction()+"?pageNow="+String.valueOf(first-1)+"'&gt; 上一页 | &lt;/a&gt;");
		      }
		      if (countRow%pageSize == 0) {
		    	  if ((first+1) &gt;= (countRow/pageSize)) {
			    	  out.println(" 下一页 | ");
			      } else {
			    	  out.println("&lt;a href='"+this.getAction()+"?pageNow="+String.valueOf(first+1)+"'&gt; 下一页 | &lt;/a&gt;");
			      } 
			      if ((first+1) &gt;= countRow/pageSize) {
			    	  out.println(" 尾页");
			      } else {
			    	  if (countRow%pageSize == 0) {
				    	  out.println("&lt;a href='"+this.getAction()+"?pageNow="+String.valueOf(countRow/pageSize-1)+"'&gt; 尾页&lt;/a&gt;");
				      } else {
				    	  out.println("&lt;a href='"+this.getAction()+"?pageNow="+String.valueOf(countRow/pageSize)+"'&gt; 尾页&lt;/a&gt;");
				      }  
			      }
		      }
		      if (countRow%pageSize != 0) {
		    	  if ((first+1) &gt; (countRow/pageSize)) {
			    	  out.println(" 下一页 | ");
			      } else {
			    	  out.println("&lt;a href='"+this.getAction()+"?pageNow="+String.valueOf(first+1)+"'&gt; 下一页 | &lt;/a&gt;");
			      } 
			      if ((first+1) &gt; countRow/pageSize) {
			    	  out.println(" 尾页");
			      } else {
			    	  if (countRow%pageSize == 0) {
				    	  out.println("&lt;a href='"+this.getAction()+"?pageNow="+String.valueOf(countRow/pageSize-1)+"'&gt; 尾页&lt;/a&gt;");
				      } else {
				    	  out.println("&lt;a href='"+this.getAction()+"?pageNow="+String.valueOf(countRow/pageSize)+"'&gt; 尾页&lt;/a&gt;");
				      }  
			      }
		      }
		    out.println("&lt;/div&gt;");
			out.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return super.doStartTag();
	}
}
</pre>
<p>&nbsp;</p>
<p>下面是每个标签处理类的标签描述文件</p>
<p>iteratorTag.tld</p>
<pre name="code" class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"&gt;

&lt;taglib&gt;
	&lt;tlibversion&gt;1.2&lt;/tlibversion&gt;
	&lt;jspversion&gt;1.1&lt;/jspversion&gt;
	&lt;shortname&gt;d&lt;/shortname&gt;
	&lt;uri&gt;http://hnylj.javaeye.com&lt;/uri&gt;
	&lt;tag&gt;
		&lt;name&gt;iterator&lt;/name&gt;
		&lt;tagclass&gt;org.hnylj.taglib.IteratorTag&lt;/tagclass&gt;
		&lt;bodycontent&gt;JSP&lt;/bodycontent&gt;
		&lt;attribute&gt;
			&lt;name&gt;list&lt;/name&gt;
			&lt;required&gt;true&lt;/required&gt;
			&lt;rtexprvalue&gt;false&lt;/rtexprvalue&gt;
		&lt;/attribute&gt;
	&lt;/tag&gt;
	&lt;tag&gt;
		&lt;name&gt;field&lt;/name&gt;
		&lt;tagclass&gt;org.hnylj.taglib.FieldTag&lt;/tagclass&gt;
		&lt;bodycontent&gt;JSP&lt;/bodycontent&gt;
		&lt;attribute&gt;
			&lt;name&gt;name&lt;/name&gt;
			&lt;required&gt;true&lt;/required&gt;
			&lt;rtexprvalue&gt;false&lt;/rtexprvalue&gt;
		&lt;/attribute&gt;
		&lt;attribute&gt;
			&lt;name&gt;display&lt;/name&gt;
			&lt;required&gt;true&lt;/required&gt;
			&lt;rtexprvalue&gt;false&lt;/rtexprvalue&gt;
		&lt;/attribute&gt;
	&lt;/tag&gt;
	&lt;tag&gt;
		&lt;name&gt;page&lt;/name&gt;
		&lt;tagclass&gt;org.hnylj.taglib.PageTag&lt;/tagclass&gt;
		&lt;bodycontent&gt;JSP&lt;/bodycontent&gt;
		&lt;attribute&gt;
			&lt;name&gt;action&lt;/name&gt;
			&lt;required&gt;true&lt;/required&gt;
			&lt;rtexprvalue&gt;false&lt;/rtexprvalue&gt;
		&lt;/attribute&gt;
		&lt;attribute&gt;
			&lt;name&gt;pageSize&lt;/name&gt;
			&lt;required&gt;true&lt;/required&gt;
			&lt;rtexprvalue&gt;false&lt;/rtexprvalue&gt;
		&lt;/attribute&gt;
	&lt;/tag&gt;
&lt;/taglib&gt;</pre>
<p>********</p>
<p>接下来是对该标签的使用实例,使用非常简单！</p>
<p>我使用的是struts1.2,所以要正确运行，你需要新建web工程,加入struts1.2所需的jar包。</p>
<p>1.jsp页面如下：</p>
<p>data.jsp:</p>
<pre name="code" class="java">&lt;%@ page language="java" pageEncoding="utf-8"%&gt;
&lt;%@ taglib uri="/WEB-INF/iteratorTag.tld" prefix="d" %&gt;

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;自定义漂亮的分页标签&lt;/title&gt;
	&lt;meta http-equiv="pragma" content="no-cache"&gt;
	&lt;meta http-equiv="cache-control" content="no-cache"&gt;
	&lt;meta http-equiv="expires" content="0"&gt;    
  &lt;/head&gt;
  
  &lt;body&gt;
    &lt;d:iterator list="data"&gt;
       &lt;d:field name="cid" display="序号"&gt;&lt;/d:field&gt;
       &lt;d:field name="name" display="姓名"&gt;&lt;/d:field&gt;
       &lt;d:field name="sex" display="性别"&gt;&lt;/d:field&gt;
       &lt;d:field name="address" display="住址"&gt;&lt;/d:field&gt;
       &lt;d:field name="phone" display="电话"&gt;&lt;/d:field&gt;
       &lt;d:field name="job" display="职业"&gt;&lt;/d:field&gt;
    &lt;/d:iterator&gt;
    &lt;d:page action="data.do" pageSize="7"/&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre>
<p>对该页面的3个标签作一个简单说明：</p>
<p>&lt;d:iterator list="data"&gt; 用于数据的迭代，list属性为request范围里的一个List对象，List对性封装了从数据库查询出的数据，这个List需要你在struts或servlet里设置。<br />&lt;d:field name="cid" display="序号"&gt;用于输出每一个字段数据，name属性为数据库表的字段，display属性为在页面上要显示的字段表头<br />&lt;d:page action="data.do" pageSize="7"/&gt;用于数据的分页，action属性为分页请求的的处理器，如jsp，servlet，action等都可以。pageSize属性为每页要显示的数据条数。</p>
<p>&nbsp;</p>
<p>2.后台处理的action如下：</p>
<p>PageAction.java</p>
<pre name="code" class="java">package org.hnylj.action;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.hnylj.db.DbManager;

/**
 * 分页处理的action
 * @编写者：hnylj
 *
 */
public class PageAction extends Action {
	private int pageSize = 7;
	private DbManager dbManager;
	
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		dbManager = new DbManager();
		int pageNow = 0;
		String s = request.getParameter("pageNow");
		if (s == null || "".equals(s)) {
		} else {
			pageNow = Integer.parseInt(s);
		}
		List&lt;Map&lt;String,String&gt;&gt; list = dbManager.pageQuery(pageNow, pageSize);
		int count = dbManager.getCount();
		request.getSession().setAttribute("count", String.valueOf(count));
		request.getSession().setAttribute("pageNow", String.valueOf(pageNow));
		request.setAttribute("data", list);
		return mapping.findForward("success");
	}
}
</pre>
<p>这个action就不必说明了，很简单。</p>
<p>这个action还调用了一个DbManager类，其代码如下：</p>
<pre name="code" class="java">package org.hnylj.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 数据库管理与操作
 * @编写者：hnylj
 *
 */
public class DbManager {
	private Connection conn;
	private Statement stmt;
	private ResultSet rs;

	private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
	private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
	private static final String USERNAME = "scott";
	private static final String PASSWORD = "tiger";

	// 数据库连接
	public synchronized Connection getConnection() {
		try {
			Class.forName(DRIVER);
			conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return null;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
		return conn;
	}
    
	/**
	 * 根据pageNow和pageSize查询数据
	 * @param pageNow
	 * @param pageSize
	 * @return
	 */
	public List&lt;Map&lt;String,String&gt;&gt; pageQuery (int pageNow,int pageSize) {
		String sql = "SELECT * FROM (SELECT AA.*, ROWNUM RN FROM (SELECT * FROM CUSTOMER ORDER BY CID ASC) AA WHERE ROWNUM &lt;= "+((pageNow+1)*pageSize)+") WHERE RN &gt; "+(pageNow*pageSize)+" ";
		Map&lt;String,String&gt; data = null;
		List&lt;Map&lt;String,String&gt;&gt; list = new ArrayList&lt;Map&lt;String,String&gt;&gt;();
		try {
			conn = this.getConnection();
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			while (rs.next()) {
				data = new HashMap&lt;String,String&gt;();
				data.put("cid", new Integer(rs.getInt("cid")).toString());
				data.put("name", rs.getString("name"));
				data.put("sex", rs.getString("sex"));
				data.put("address", rs.getString("address"));
				data.put("phone", rs.getString("phone"));
				data.put("job", rs.getString("job"));
				list.add(data);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
		return list;
	}
	
	/**
	 * 获取总记录数
	 * @param conn
	 * @param sql
	 * @return
	 */
	public int getCount() {
		int count = 0;
		String sql = "SELECT COUNT(*) AS COUNT FROM CUSTOMER";
		try {
			conn = this.getConnection();
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			while (rs.next()) {
				count = Integer.parseInt(rs.getString("count"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
			return 0;
		}
		return count;
	}
}
</pre>
<p>另外要正确运行，你需要配置web.xml,struts-config.xml文件并建立一张数据库表customer（本人使用的是oracle），相信大家知道怎么做！</p>
<p>&nbsp;整个标签代码及使用实例代码如上，与大家交流！我的博客地址:http://hnylj.javaeye.com</p>
          <br/>
          <span style="color:red;">
            <a href="http://hnylj.javaeye.com/blog/250256#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 08 Oct 2008 12:50:00 +0800</pubDate>
        <link>http://hnylj.javaeye.com/blog/250256</link>
        <guid>http://hnylj.javaeye.com/blog/250256</guid>
      </item>
          <item>
        <title>【我的散文】习惯</title>
        <author>kongshanxuelin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cxlh.javaeye.com">kongshanxuelin</a>&nbsp;
                    链接：<a href="http://cxlh.javaeye.com/blog/250243" style="color:red;">http://cxlh.javaeye.com/blog/250243</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" align="right" style="text-align: right;"><span style="font-family: 仿宋; color: #008000; font-size: x-small;"><br />

</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #008000; font-size: x-small;"><span style="font-size: x-large;">我</span>
<span style="font-size: small;">
习惯在周末的清晨懒懒洒洒的趟在床上，随手捧起一本书，不紧不慢的看着；我习惯在晚上工作回来后舒舒服服的洗个澡后，趟上床，拿出手机，给远方的她发发短信</span>
</span>
<span style="color: #008000; font-size: small;">
</span>
<span style="font-family: 仿宋; color: #008000; font-size: small;">
</span>

<span style="font-family: 仿宋; color: #008000; font-size: small;">
<span lang="EN-US">,</span>

</span>

<span style="font-family: 仿宋; color: #008000; font-size: small;">表达远方朋友的思念和问候；我还习惯在周末的晚上，不忘给远在宁波的家中打个电话，因为我深深的知道，我父母会通常在那个时候守候在电话的旁边&hellip;&hellip;</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #008000; font-size: x-small;"><span lang="EN-US">&nbsp;</span>

</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #ff0000; font-size: x-small;"><span style="font-size: x-large;">是</span>

<span style="font-size: small;">啊，生活中往往有很多不自觉的习惯，而那些习惯往往是潜意识的，在特定的时间特定的地点，脑海中就会浮现你应该做而没有做的事情，也许很多人都有，只是更多的人慢慢的把这种习惯变成了一种回忆&hellip;&hellip;</span>
</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #008000; font-size: small;"><span lang="EN-US">&nbsp;</span>

</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #000000; font-size: x-small;"><span style="font-size: x-large;">只</span>
<span style="font-size: small;">
要我一有感触，我就习惯把他写下来，和我的朋友分享这种感触，也许这已经慢慢地成为了我的习惯，而更多的人，往往会选择把他们藏在心里。我更习惯在我写作的同时，放上几首优美的音乐，那种释然的感觉真的可以把平日里工作的压力和苦恼深深地抛在脑后，我不否认我这个人有时候习惯处事孤立和过分自信些，在学校，我往往听不进别人对我的任何善意的指导，而习惯花更多的时间用看书去弥补这种指导，这种习惯，曾在大学里，让我吃了不少苦头，在周末，看着别人男男女女约会，而我只能在图书馆找资料，在生日时，人家可以在外面喝的大醉还有一桌子的朋友，而我，往往每年要不是父母的提醒，我都会忘了自己的生日，我太习惯那种生活了，也从没放弃过，曾一度自信的我，以为可以完成任何再艰难的任务，只可惜那种习惯使我失去了很多的东西，包括友情和爱情&hellip;&hellip;</span>
</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #008000; font-size: x-small;"><span lang="EN-US">&nbsp;</span>

</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #ff9900; font-size: x-small;"><span style="font-size: x-large;">我</span>

<span style="font-size: small;">习惯在做任何事情前，都有十足的把握，本来我宁愿把计划深深埋葬在心底，我习惯用轻蔑的眼光看待我周围的人和事，我习惯住在一个独立房间里放大音乐，在那唉声叹气，我习惯在空余时间里做很多学很多和工作无关的东西&hellip;&hellip;</span>
</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #008000; font-size: x-small;"><span lang="EN-US">&nbsp;</span>

</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #008000; font-size: x-small;"><span style="font-size: x-large;">我</span>

<span style="font-size: small;">习惯坦率地和朋友谈论天南地北，我习惯很偷懒的回朋友发过来的短信，我习惯把朋友在节日里的问候当作一种理所当然，我习惯每年的除夕之夜等待朋友的电话，而自己永远不想拨动心中的那根弦&hellip;&hellip;</span>
</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #008000; font-size: small;"><span lang="EN-US">&nbsp;</span>

</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #008080; font-size: x-small;"><span style="font-size: x-large;">我</span>

<span style="font-size: small;">习惯以恶作剧的方式作弄我的同事或同学，我习惯把朋友的信件锁入我家里的写字台中，我习惯不读任何人信件或</span>
</span>
<span style="color: #008080; font-size: small;">
</span>
<span style="font-family: 仿宋; color: #008080; font-size: small;">
</span>

<span style="font-family: 仿宋; color: #008080; font-size: small;"><span lang="EN-US">EMAIL</span>

</span>

<span style="font-family: 仿宋; color: #008080; font-size: small;">两遍&hellip;&hellip;</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #008000; font-size: small;"><span lang="EN-US">&nbsp;</span>

</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #000000; font-size: x-small;"><span style="font-size: x-large;">我</span>

<span style="font-size: small;">习惯从来不自己买衣裤鞋袜，我习惯进厨房烧上几个菜在朋友面前摆弄我的厨艺，我习惯有公车的地方从不打的，即便在女士面前，我习惯对任何我没做而别人正在做的事情而感到好奇&hellip;&hellip;</span>
</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #008000; font-size: x-small;"><span lang="EN-US">&nbsp;</span>

</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #333399; font-size: x-small;"><span style="font-size: x-large;">我</span>

<span style="font-size: small;">习惯在深深所爱的女孩子面前范傻，我习惯把自己深深所爱的女孩子亲自托付给我认为她爱的人，然后傻傻的盯着深深所爱的女孩子的照片后悔上几十分钟，我习惯我发现原来我不曾真正爱过或被爱过&hellip;&hellip;</span>
</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #008000; font-size: small;"><span lang="EN-US">&nbsp;</span>

</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #00ccff; font-size: x-small;"><span style="font-size: x-large;">我</span>

<span style="font-size: small;">习惯对我看不惯的人和事说三道四，而不管自己有没有这个资格，我习惯不愿看到原来我和平凡的人都一样的平凡，我习惯告诉自己你不需要什么，需要什么，我习惯任何人对我善意的关心都会当作是一种企图&hellip;&hellip;</span>
</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #008000; font-size: small;"><span lang="EN-US">&nbsp;</span>

</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #99ccff; font-size: x-small;"><span style="font-size: x-large;">我</span>

<span style="font-size: small;">习惯拿着望远镜看对面女生宿舍楼而实际只为看清女生宿舍里的某一条棉被上停着的一只苍蝇而直摇头，我习惯被导师叫上黑板连最简单的积分都不会的同学而直叹气，我习惯任何自己知道的事情而别人不知道都当作是一种不可思议，我习惯和同学同事大声吼叫而实际上只是为了争论一道还没证实的结论而暗自觉得可笑&hellip;&hellip;</span>
</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #008000; font-size: small;"><span lang="EN-US">&nbsp;</span>

</span>

</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 仿宋; color: #000000; font-size: x-small;"><span style="font-size: x-large;">很</span>

<span style="font-size: small;">想改变这些习惯，我也希望同事同学在聚餐活动的时候而不会忘记我的存在，我也希望每年逢节逢生日，都会收到很多的祝福和意外的惊喜，我也希望在皎洁的月光下，能有人陪我看星星，也希望在清澈的阳光下，有人陪我钓鱼看海，也希望自己能够时时满足现在的生活而使自己开心快乐，也希望自己不曾有那么多想法而还没付诸行动，也希望自己能忘记所背负的责任和压力，更希望自己永远忘记曾经是这个时代的社会的一份子&hellip;&hellip;</span>
</span>

</p>
<p><span style="font-family: 仿宋; color: #008000; font-size: x-small;"><br />

</span>

</p>
          <br/>
          <span style="color:red;">
            <a href="http://cxlh.javaeye.com/blog/250243#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 08 Oct 2008 12:07:04 +0800</pubDate>
        <link>http://cxlh.javaeye.com/blog/250243</link>
        <guid>http://cxlh.javaeye.com/blog/250243</guid>
      </item>
          <item>
        <title>90后程序员工作经历</title>
        <author>Dirain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dirain.javaeye.com">Dirain</a>&nbsp;
                    链接：<a href="http://dirain.javaeye.com/blog/250241" style="color:red;">http://dirain.javaeye.com/blog/250241</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          首先自我介绍一下，1992年生人，现任某家公司项目的单一模块设计与开发，Java语言。这里就是想谈谈我的面试之路，希望能给大家提供点经验。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	2008年，我16周岁了，根据中华人民共和国未成年人保护法及中华人民共和国劳动法规定，我已经达到了法定工作年龄。在今年4月的清明节，在北京一个很成功的朋友开车带我回家时对我说了一些话，改变了我的近期人生目标。可以给大家看一下当时的对话<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	朋友：“现在还能自己赚钱吗？”。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	我&nbsp; ：“不能了，在专心学习。”。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	朋友：“那生活费怎么处理的？”。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	我&nbsp; ：“我父母每个月给我一些，自己省一点够了。”。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	朋友：“那你父母压力多大，他们养自己就够辛苦了，还要承担你的生活费。你连养自己的能力都没有了还在北京怎么混下去？”<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	此时我看着窗外，无语了。反省之后决定回北京之后努力拼搏几个月，一定要找上一份兼职解决自己的生活费问题。在这之后，给自己定下了一个目标，开始努力学习asp.net。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	2008年7月，觉得自己准备好了，开始投简历。可因为初次的关系，自己什么都不懂，简历没什么吸引的地方。而且我还傻傻的去招聘网站复制人家的邮箱给他们发邮件。苦等2周后还是没见什么成效。后经过网络上前辈们的经验分析，原来是自己项目上项目经验写的不够详细，于是从新把自己头脑中所有的项目想法，因为到公司看项目代码的几率很小，面试的过程最多也只问问经验而已，所以增加了自己的项目经验。这时我已经拥有单独完成一个项目的能力，灵感一来，开始去某某网站竞标。下午投标完，几个小时后有人加我QQ说要免谈，想找一个asp.net的兼职员工帮他们去完成网站部分功能，公司的一个SNS项目，已经有部分功能已经完成。约好时间后心里开始紧张，因为这是人生中第一次面试，只是听别人说过，但没有亲身经历过。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	到了公司，3排办公桌，大约50人左右。走进一间会议室之后，第一个面试我的人很有气质，带个眼镜，我也没有考虑他在这个公司是什么角色。此时心里默念一句话：“注意细节！”。我在屋子内的一举一动都经过了慎重的考虑，防止出现不得意的地方。打了个招呼后开始进行交流了，他说想要跟我合作的人是他老婆，要等他老婆来了之后对我面试，他先让我跟他聊聊。这回心里可有底了，自己理论功底不行，怕问技术，可想法多的狠。我谈了一些以前自己比较伟大的想法和对未来的规划，因为我这么年轻有这么宏伟的想法，那不得不让对方佩服。每次双方不说话时我都会主动谈自己以前的经历，说办过哪些网站，对推广和营销有什么看法。就在这种开头下，我渐渐抓住了对方的心。1个小时很快就过去了，他的老婆来了。拿着个笔记本进了会议室，看到她操作笔记本我觉得可能会考技术题。我马上就开口跟她聊我经历，把她吸引住了，看他没有拿出考题的意思我就放心了。全部过程大约有3个小时，最后问我期望薪水，对于我来说这个问题太难回答了，我也不知道要多少，而且这是份兼职。我可以不去公司，天天在家做，很轻松。结果他们说试用期1500，转正2000的我居然轻松的就答应下来了。而且要我下周直接开始工作。临走时接过了一张名片，“首席执行官”惊讶了，居然第一个面我的人是这个职位，而且还成功拿下了他，对自己越来越有信心了。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	出了公司在回家的路上想了想今天的事，可喜可悲。可喜的是终于有工作了，可以养自己了。可悲的是原来这就是面试，本想今天被打击一次让自己更加优秀呢，可这么轻松就被录用了。就这样我开始了我第一份工作，感觉很轻松，给我一周的任务我往往都是一天就完成了，我们每周五见一次面谈谈都做了些什么。一周每天都偷懒，到周四打打电话约我见面的时候我都会拖延一天，然后用一天的时间去完成我的工作。觉得自己挺不对的，可想一想，一个月这么点钱，而且上来就叫我维护目前系统存在所有的bug，这可有点开玩笑了，我需要一定的时间去熟悉代码呢，更痛苦的是没有文档，让我失去了信心。以后的两个月每天都这样过着，该上学上学，该玩就玩，每个月还拿着公司，任务也给他完成，他们还挺高兴的。这期间管理我的人一直是那个女的，首席的老婆。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	直到有一次管理我的人有事，突然换他老公来管理我。从这之后什么都变了，以前是合作的关系来让我帮他做一些事。可自动他老公接手后居然命令我，要求我每天的每小时都要写工作日报，还说不符合规定扣工资。此时心里很恼火，面对这么点的工资，还有这么多的要求，此时萌生了一个跳槽的想法。自己也喜欢耍聪明，这次有了工作经验，在简历中工作经验成了我的主要描述对象，因为企业可能都喜欢这个。但简历中唯一让我担心的就是年龄和学历。后来经过朋友的劝说和自己的决定，把简历年龄和学历全部写为真实，1992，学历初中。当时的想法就是人家本科或硕士投10份简历可能就能接到面试，那我投1000份应该也有机会了吧。于是开始去招聘网站注册帐号填写详细简历，招聘网站上还可以批量申请职位，这可舒服了。自己当时心里也气现在的公司，所以一狠心申请了4000份asp.net的职位。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	功夫不负有心人，接下来的几天里，我接到了无数面试电话，把一周的时间都排满了面试。又一个面试来了，因为简历投的太多，我都不知道该公司到底要求什么我就带上我的简历去了。第一家去的是35互联，心里很高兴，这公司规模可不小呢。到了35互联前台接待之后我等待了半个小时，开始面试。本来向着进去好好谈经历和想法。可面试官直接叫我做了个自我介绍就回家等消息了，而且说完年龄之后面试官脸色有点不对。介绍完就让我等消息了，心里想这份没希望了，还好明天还有。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	第二天去的一家公司是一个票务公司，我记得是2008年9月4日去面试的。面试进入还是先看我的简历。因为简历项目比较多的原因，面试的是以为经理，多少懂点技术。所以一直在问我的项目，我答的也很好。进行了1小时左右时，他开始问我薪水。既然跳槽就不能亏了自己，一张口就是4000-5000.哎，没想他人家答应了，4000.接下来他开始描述公司要做的项目和我的职位描述。又问我一些问题，其中我记得有一个是问我你能不能做一套航空机票查询的东西。因为自己反应比较快，所以口头给他描述了我的设计思路，其中最靓的地方是航空数据的获取。我说我会采用采集的方式拿到数据并处理到自己的程序中。嘿，这经理很满意。直接叫我签合同。因为当时还有工作和学习在身，他说学习不耽误你。可我还是说中秋后给您答复需要处理工作的事。对方就答应下来了。路上还是高兴啊，4000，自己认为不少了。可想想明天还有面试，那就直白提自己要求好了。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	第三天去一家公司做SNS，这回面试话更多了，因为有开发经验而且对业务也很了解，想法比较多。这次面试每个环节都跟以前一样，我尽量不让面试我的人去提技术问题。最后问我期望薪水，直接说5000-6000.结果他犹豫了半天，说我跟上边交代一下，3天内给你答复。我也没报多大希望就走了。在这之后未来几天的面试我一家也没有去，而且每次打电话邀请我面试我都直接在电话里问薪水。小于4000的就直接跟对方说考虑考虑了。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	现任工作应付着做的让对方很满意，新工作也有了着落，这段时间非常轻松。中秋节的时候我本来想回老家，所以把4000的那份工作拖到了10月1之后，他们也答应了。但中秋节朋友送了两站残奥会的鸟巢门票，家就没回成。并且有一天晚上朋友家没网，来我这边投简历，他是做java的。因为我自己就很喜欢java，但水平和经验不是很好，但有基础。我也就凑热闹，又申请了100多份java的工作。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	可能是本人运气好吧，又有人找面试，java的。这次不管对方给多少，当然要去了。java的工资毕竟比。net要高。面试还是老套路，谈想法和经验，不过这次问了几个技术问题。我也轻松的答上来了，而且很明白的跟人家说我以前是。net程序员，java没有太多经验，但我很有思想和创意。最后公司的技术要看看我的上手能力，要我做个struts的小程序，轻松拿下。最后副总经理来问我薪水问题，我毫不犹豫的直接开口说：“5-7K吧！”。他反问我：“5000-7000？”，我说是后他居然给我个最低数5000，我也提了自己的要求，告诉他为什么不是5500.结果他痛快的答应下来了。试用期三个月，但待遇跟转正一样。饭补、社保、电话费等福利都有，工资也是5500.这次的成功改变了我的一切，这一天是2008年9月20号左右，我也跟他们说国庆回来签合同，也答应下来了。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	 如今已经把所有的事情都处理完毕，已经坐在这家java的公司工作了。我希望我现在的经理看到这篇文章后不要有太多想法，哈哈，我只是想给大家讲一下我的经历。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 	最后做个总结，不要盲目追求技术，选择语言。这些都不重要，要培养自己的逻辑思维能力和业务经验。语言只是工具，有了思想和经验后学一门新技术只是时间问题。
          <br/>
          <span style="color:red;">
            <a href="http://dirain.javaeye.com/blog/250241#comments" style="color:red;">已有 <strong>5</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 08 Oct 2008 12:02:46 +0800</pubDate>
        <link>http://dirain.javaeye.com/blog/250241</link>
        <guid>http://dirain.javaeye.com/blog/250241</guid>
      </item>
          <item>
        <title>到公司已经整整二年了</title>
        <author>aaronjiu_00</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://aaronjiu.javaeye.com">aaronjiu_00</a>&nbsp;
                    链接：<a href="http://aaronjiu.javaeye.com/blog/250219" style="color:red;">http://aaronjiu.javaeye.com/blog/250219</a>&nbsp;
          发表时间: 2008年10月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天是2008年10月8日，我到公司工作已经整整二年了，特此自己庆贺一下。</p>
<p>&nbsp;</p>
<p>2006年的10月8日，我从老家沈阳南下来到风景如画的杭州，加入了公司的创业团队。</p>
<p>&nbsp;</p>
<p>二年时光，说长也长，说短也短。我一共经历了三家公司，说实在的，前两家都没有超过二年的，在公司，我却整整渡过了二年了，我很激动，这真得不容易。</p>
<p>&nbsp;</p>
<p>在这二年里，我见证了公司的从无到有，从小到大，同学们的激情创业，互联网企业的日新月异，也学到了很多管理上的知识，在技术上虽然没有很大的长进，但是也见证了可伸缩、大规模、分布式网站是如何架构的，也领略了流程化管理的风范， 也看到了公司领导的魅力。</p>
<p>&nbsp;</p>
<p>对于自己的职业发展，我有些迷惘，不知道自己该做什么。本人技术方面还算可以，对技术很执着，曾经的职业发展目标是架构师，面试的时候也是奔着这来的。我离那个目标还很远，和理想的架构师还有很大的距离。但是有些时候技术不一定会产生价值的，或许是年纪的问题（还有一个月零2天，我就30了），我对技术有些不敏感了，我的惰性有些加强了，感觉对待技术，像是在混日子，尽管我很喜欢，但是我还是力不从心，这或许是有原因的，现在不是我一个人在苦读技术的年月了，有了家庭，必定会牵扯些～～，没有办法，我爱我的家</p>
<p>&nbsp;</p>
<p>来大公司工作或许图个发展，除了技术上继续深造之外，走管理路线，也是我的目标之一，我知道自己与做M的水准差得很远，自己或许不是那块料，但是人是有可塑性的，我期望自己往双栖发展，技术和管理都要强，但是我感觉做公司的小M真的太累，所以突发奇想，我不想做M了，为了敬业而影响自己的家庭、生活，我无法平衡，迷惘～～</p>
<p>&nbsp;</p>
<p>回顾这二年，我所做的事情，感觉愧对我的头衔加上的&ldquo;资深&rdquo;二字，作为资深开发，我自己做的太少，除了一个我认为是自己的光环&mdash;&mdash;有些技术含量的营销项目，网络爬虫、搜索引擎之外，我做的东西真是微不足道，那个营销项目最后还因为&ldquo;拥抱变化&rdquo;而夭折了，呵呵。大部分的工作就像是做一个实习生的工作，偶尔写写页面，偶尔修复BUG、偶尔什么都不做。我所在部门好几十个人的团队，在相当长的时间里，就是在维护一个登录、注册、订购、结算，反反复复地干这没有技术含量的工作，实际是烦躁，时间久了就没有了激情。信息管理系统是什么啊，就是CURD，我们天天就在CRUD，但是我还是在鞭策自己，平凡人做平凡事，有一天金子会发光的，但是你得在明亮处闪烁。</p>
<p>&nbsp;</p>
<p>虽然有些迷惘，但是我在公司毕竟呆了已经二年了，为了这二年，我耐住了很多的寂寞，远离他乡的孤独，除了老婆，我没有朋友，有没有要好的同事，我没有了自己的圈子；我也在我这平凡的岗位上，贡献了我有限的力量，有时想想，又何必呢？回趟老家成本要那么高，这边的房子还那么贵，但是我还是满怀激情，深信公司一定会成功，也体验一下共同创业的艰辛，一起分享每一点收获的喜悦，这也是当初来公司的原因。</p>
<p>&nbsp;</p>
<p>我既然能在一家公司呆上二年，我就会呆上三年、五年、十年、二十年，这是一家伟大的公司，我不崇拜我们的大领导，但是我爱我们的团队，这是有创业精神、有激情的团队，愿公司明天越来越好，路越走越长，也愿我在公司有好的发展～</p>
<p>&nbsp;</p>
<p>百城于10.8 有感而发</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://aaronjiu.javaeye.com/blog/250219#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚