<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Qieqie</title>
    <description></description>
    <link>http://qieqie.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>红心两克</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/183721" style="color:red;">http://qieqie.javaeye.com/blog/183721</a>&nbsp;
          发表时间: 2008年04月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          2008-4-17  10:02:25  79years   hi  <br />2008-4-17  10:02:28  years81   hi <br />2008-4-17  10:02:41  79years   msn名字前面请加( L )CHINA （去掉空格） 让全世界看看华人的团结。请转发您的msn朋友。加一个吧 <br />2008-4-17  10:03:01  years81   我很尊重这样的行动 <br />2008-4-17  10:03:14  years81   但我不参与呀 <br />2008-4-17  10:03:27  79years   哦 <br />2008-4-17  10:04:29  years81   团结不一定是正确的，不团结（的人的观点）也不一定是咱不住脚的所以，我认为团结给别人看，显示自己的力量，不代表正确或错误但，我尊重这种表述 <br />2008-4-17  10:04:43  years81   呵呵 sorry <br />2008-4-17  10:05:13  79years   高智商的人都特有个性，已经碰到3个了，呵呵 <br />2008-4-17  10:06:08  years81   你也没有加啊？ <br />2008-4-17  10:06:22  79years   我加了啊 <br />2008-4-17  10:06:34  79years   没看到我的红心？ <br />2008-4-17  10:06:39  years81   我这里没反应，奇怪 <br />2008-4-17  10:08:44     79years 发送 未命名.bmp <br />2008-4-17  10:08:53     79years 发送 未命名.GIF <br />2008-4-17  10:09:11  79years   look一下，我的MSN上有一大溜，好帅气啊 <br />2008-4-17  10:09:17     您成功地从 79years 处接收了 E:\我的文档\我接收到的文件\未命名2.GIF。 <br />2008-4-17  10:09:39  years81   很有力量！ <br />2008-4-17  10:09:44  79years   大部分自由国外的人才能感受到华人团结的重要性， <br />2008-4-17  10:10:30  years81   其实是因为他们害怕，所以才需要这种东西给他们一个气氛 <br />2008-4-17  10:12:05  79years   害怕，你是这么理解的？ <br />2008-4-17  10:12:51  years81   华人在外属于少数民族 他们时常感到郁闷 <br />2008-4-17  10:15:43  79years   我不怎么理解他们的心理 <br />2008-4-17  10:16:57  79years   我觉得这样理解是一种对民族情节的亵渎，他们不是因为害怕而团结，而是因为共同的世界观，民族观，和认同感。  <br />2008-4-17  10:21:08  years81   这些观的在小范围交朋友很好啊，所谓物以类聚，人以群分但这件事是一个追求真相的，反对弯曲的问题，和世界观，民族观，认同观正交的问题呀  <br />2008-4-17  10:21:48  79years   有些东西是很自然的感受，不用经过思考的， <br />2008-4-17  10:22:31  79years   当事情发生了，你第一时间就应该有的冲动，虽然不一定理智，但说明它融入在你的血液里 <br />2008-4-17  10:22:45  years81   你是指爱国激情 <br />2008-4-17  10:24:05  79years   我说不清楚，有些时候，就觉得加个红心，很自然，既不会显得过火和冲动，也完全可以是最平时的爱国表示 <br />2008-4-17  10:25:01  years81   爱国会成为一种边界吗？把人分为爱国　和　不爱国？ <br />2008-4-17  10:25:52  79years   不会，但可以看出一个人心里的情感体现 <br />2008-4-17  10:26:20  79years   如果一个自己很在乎的东西，收到侵犯，亵渎，一个人一定会跳起来 <br />2008-4-17  10:26:37  79years   如果这个东西他不是很在乎，他就会显得理性 <br />2008-4-17  10:26:44  years81   为什么要跳起来？为什么要拍桌子？ <br />2008-4-17  10:26:46  79years   人就是这样的 <br />2008-4-17  10:29:08  years81   如果一个人侵犯我，质疑我（这种事总是有的，这里的“我”有时是代表公司）我不会跳起来啊，我不会激动啊我的理解是：激动　是正确的做事方法吗？是让别人了解我的想法的正确做法吗？我也很想激动，但此时激动会有反效果  <br />2008-4-17  10:29:30  79years   我是说你很在乎的东西 <br />2008-4-17  10:29:41  79years   那是一种本能 <br />2008-4-17  10:29:52  79years   很自然的体现 <br />2008-4-17  10:32:49  years81   在最近的事情上，我在乎的是：我们是否表现出正确的做法？(只有正确的做法，才能受我们批驳的人的尊重，也才能改变他们“错误”的观点) 美国为什么可以全国同意攻打伊拉克，也是当时全国都被“爱国激情”渲染了激情容易使人做错事  <br />2008-4-17  10:33:32  79years   兄弟，这是人家怎么对我们的，想过吗 <br />2008-4-17  10:33:45  years81   知道阿 歪曲 <br />2008-4-17  10:33:49  79years   啥都不知道，就跳出来支持ZD了 <br />2008-4-17  10:33:54  years81   侮辱 <br />2008-4-17  10:34:03  79years   所以一定是他们先认错啊 <br />2008-4-17  10:34:43  years81   所以不是要让他们先认错，而是我们要先保持冷静，展现出我们的看法，让他们愿意接受我的说法 <br />2008-4-17  10:34:55  79years   就好像你被人家莫名的扇了一巴掌，你还要冷静，跟这人讲道理，等人家扇你第二巴掌？ <br />2008-4-17  10:35:21  years81   所以这2个人就在大街上打架了，以后就世仇了？ <br />2008-4-17  10:35:54  79years   错又不是我们，要是他们放错，要跟我们做世仇，who 怕 who啊 <br />2008-4-17  10:36:19  years81   佛(或者是一个名人的说法)就是这样的，你打我一巴掌，我还会把我的另外一个脸呈现给你 <br />2008-4-17  10:36:29  79years   按你的逻辑，国家不需要军队的，日本人侵略我们，是要跟他们将道理的 <br />2008-4-17  10:36:36  79years   说的他们退兵？ <br />2008-4-17  10:36:45  79years   你信佛？ <br />2008-4-17  10:37:11  years81   我赞同一个东西的一面!=〉我赞同所有全部 <br />2008-4-17  10:38:25  79years   那就是一个残破的理论体系 <br />2008-4-17  10:38:21  years81   我们一个技术总监，总架构师讲的我很认同(人家是北大博士，美国留学): 为什么我们要追求让别人害怕我们，而不是让别人喜欢我们？ <br />2008-4-17  10:38:48  79years   兄弟啊，我们以前跟法国是很好的 <br />2008-4-17  10:39:06  79years   问题是他们故意找茬，是故意，不是误会 <br />2008-4-17  10:39:17  79years   就是要把白抹黑 <br />2008-4-17  10:39:53  79years   我就说你王志亮是个小偷，我不管你有没有偷东西，反正你就是小偷 <br />2008-4-17  10:40:46  years81   那我应该怎么回应？ <br />2008-4-17  10:41:13  years81   “我没有，我不是小偷”，然后召集了我们家族的人一齐喊？ <br />2008-4-17  10:41:17  79years   这个国际规则就是强者说话 <br />2008-4-17  10:41:25  79years   看看伊拉克 <br />2008-4-17  10:41:28  79years   你就明白了 <br />2008-4-17  10:41:37  79years   说你有大规模杀伤性武器 <br />2008-4-17  10:41:43  79years   不容分说， <br />2008-4-17  10:41:49  79years   直接侵略， <br />2008-4-17  10:42:00  79years   然后抓了人家的总统 <br />2008-4-17  10:42:04  79years   处决 <br />2008-4-17  10:42:15  79years   这算什么？强权政治 <br />2008-4-17  10:42:24  79years   非常的野蛮的 <br />2008-4-17  10:42:44  years81   对。这件事情 从另外一个角度出发 正是说明不能轻易激动 <br />2008-4-17  10:42:52  79years   你的那些观念在这些人看来是可笑的 <br />2008-4-17  10:43:14  years81   如果愿意的话，最近有人写了一篇这样的评论 激愤 和美国侵略伊拉克的话题 <br />2008-4-17  10:43:24  79years   人家管你，这世界的最终就是以暴治暴 <br />2008-4-17  10:43:36  years81   呵呵 <br />2008-4-17  10:43:50  79years   谁实力强就是赢家，没有道理可讲的 <br />2008-4-17  10:43:55  79years   所以 <br />2008-4-17  10:44:03  79years   中国人这次也不讲道理了 <br />2008-4-17  10:44:09  79years   就是拿家乐福出气 <br />2008-4-17  10:44:15  79years   管你有没有支持zd <br />2008-4-17  10:44:33  years81   是否我们应该回到原始社会？为什么所有的发达民主国家都对中国保持谨慎，我们要好好思考这个问题  <br />2008-4-17  10:44:34  79years   最终看的是国家实力谁强 <br />2008-4-17  10:44:41  79years   弱的就要让步 <br />2008-4-17  10:45:51  years81   唉！ <br />2008-4-17  10:46:01  79years   芷兰若水(314170251) 10:42:25 西方国家这次为什么会如次的团结？欧洲的德国、法国，一般是不会冒着这样的风险得罪中国这个经济大国的。伊拉克战争时德国和法国都和中国站在一边，不支持美国对伊动武。为伊拉克而得罪美国，不符合他们的国家利益啊。法国10年前为了不得罪中国，终止了对台军售，损失了几十亿的收入。而为什么今天会冒着这么大的风险公然与中国为敌？难到就是为了和自己根本不相干的西藏和奥运？ 而另一个值得让人思考的问题是，一向是西方老大的美国，为什么这一次这么低调？让英、法、德在前台唱主角？对于西藏，西方国家很清楚，再怎么闹，中国也不可能做出让步。对于奥运，他们也很清楚，就算西方国家没有一个领导人出席北京奥运会，中国也就是面子上过不去罢了，对中国有实质影响吗？没有。 所以，西藏只是一个幌子，奥运也只是一个幌子。那么他们到底想从中国得到什么？  <br />2008-4-17  10:46:11  79years   看看这个，这才是一切的本质 <br />2008-4-17  10:46:14  79years   就是经济 <br />2008-4-17  10:46:38  79years   兄弟你我都是在为五斗米折腰啊 <br />2008-4-17  10:47:51  79years   太长了 <br />2008-4-17  10:47:52  79years   发了一半 <br />2008-4-17  10:49:36     79years 发送 编辑1.txt <br />2008-4-17  10:49:40  79years   look一下吧 <br />2008-4-17  10:50:47     您成功地从 79years 处接收了 E:\我的文档\我接收到的文件\编辑1.txt。 <br />2008-4-17  10:51:47  years81   我看到了这个作者的观点了 <br />2008-4-17  10:52:02  years81   大部分中国人都是这样思考的呀！ <br />2008-4-17  10:52:25  years81   如果以投票的方式 他肯定会胜出 <br />2008-4-17  10:53:33  years81   不过有些观点 好像作为国家的代表，政府/国务院并不是如此任务的 <br />2008-4-17  10:53:40  years81   任务-〉认为 <br />2008-4-17  10:54:13  79years   你以为抵制和抗议不是国家的想法？ <br />2008-4-17  10:54:15  years81   美元贬值，人民币升值的事情上就是这样的，国家有意在做这个事情，要推动产业结构的调整 <br />2008-4-17  10:54:37  79years   我认为，我们都在配合政府做舆论宣传 <br />2008-4-17  10:54:53  79years   就看你是认识到这一点，还是完全被人做棋子 <br />2008-4-17  10:54:56  years81   人人都有抗议的权利啊，我没说不让抗议，但抗议的事实，显摆的是事实，不是肌肉！ <br />2008-4-17  10:55:38  years81   对不起，为了不影响你的工作，我们先不讨论这些分歧很大的话题 你看如何？ <br />2008-4-17  10:57:42  79years   一直以来都只能求同存异 <br />2008-4-17  10:57:57  79years   比如对日本问题，对日货问题 <br />2008-4-17  10:58:16  79years   我就有个朋友，狂崇拜sony，啥都是sony最好 <br />2008-4-17  10:58:43  79years   在我看来，面对sony，她的智商为0 <br />2008-4-17  11:00:22  years81   只要是sony的就好，这是他的看法，如果只是感觉，只能说sony的广告对他太有效了。从企业层面，sony能培养出他出来，只能说明sony很牛逼。如果哪天，全地球的人都能认为联想的好，这也是联想的牛逼。  <br />2008-4-17  11:01:38  years81   可口可乐，百事可乐也是如此，有人就喜欢某一款，达到偏执，但闭上眼睛，他其实分不清那一杯是可口，那一杯是百事 <br />2008-4-17  11:01:55  years81   只能说品牌做得好！ <br />2008-4-17  11:03:55  79years   呵呵，我们分清，配方绝对不一样！如果这都分不清，那么世界上就不会有品酒师了。 <br />2008-4-17  11:04:13  79years   但我不会特别偏好那个 <br />2008-4-17  11:25:32  years81   连岳 这个人在厦门甚至中国的新兴网络中具有高知名度，他转发的一篇回复，请参阅 http://www.bullogger.com/blogs/lianyue/archives/126122.aspx  <br />2008-4-17  11:31:02  79years   靠，谁做拳民啦，我从来倡导，非暴力不合作。说我爱国，加个红心love china，就是愤青，就是拳民！我觉得你的想法本身就有点愤世嫉俗的表现，很愤青 <br />2008-4-17  11:32:22  years81   为什么这么敏感？ <br />2008-4-17  11:32:34  years81   我有说的是你吗？ <br />2008-4-17  11:32:57  years81   我根本不是在说你呀！ <br />2008-4-17  11:33:08  years81   或加红心China的人啊 <br />2008-4-17  11:33:35  years81   你有证据吗？ <br />2008-4-17  11:33:47  79years   没有 <br />2008-4-17  11:34:15  years81   我是看到我发给你的那个文章后，觉得如果少数一些人要正确抗议 <br />2008-4-17  11:34:20  79years   我突然想起了鲁迅的文章“呐喊” <br />2008-4-17  11:34:26  years81   不要做拳民式的抗议 <br />2008-4-17  11:35:07  years81   这个事情 我们也体会到了 误会是多么容易产生的 <br />2008-4-17  11:38:41  79years   http://military.club.china.com//data/thread/1011/1434/90/17/2_1.html 你看看吧 <br />2008-4-17  11:38:47  79years   国旗都被人降了一半了 <br />2008-4-17  11:38:58  years81   中华网 很有名的  <br />2008-4-17  11:38:59  79years   当你中国人是猪，好欺负哦 <br />2008-4-17  11:39:20  79years   降半旗，这算什么 <br />2008-4-17  11:39:25  years81   前一阵子 狂批评 南方周刊的长平 <br />2008-4-17  11:39:34  79years   你不会不知道吧 <br />2008-4-17  11:39:48  years81   这也是人家的一种抗议吧 <br />2008-4-17  11:40:09  years81   还有经常有人烧美国的国旗了 这不是更严重？ <br />2008-4-17  11:40:28  79years   兄弟啊 <br />2008-4-17  11:40:33  years81   也没见美国人说 这是欺负美国人 <br />2008-4-17  11:40:34  79years   这是中国的土地上啊 <br />2008-4-17  11:40:44  79years   你没治了 <br />2008-4-17  11:40:57  79years   大是大非的问题 <br />2008-4-17  11:41:00  years81   呵呵 你直接说我脑残吧 <br />2008-4-17  11:41:12  79years   国家主权的问题， <br />2008-4-17  11:42:52  years81   你没见过在联合国烧美国的国旗的新闻吗？ <br />2008-4-17  11:43:05  years81   美国人 觉得是在侮辱他们吗？ <br />2008-4-17  11:43:34  years81   在认真想想：家乐福果真要挑衅中国人吗？ <br />2008-4-17  11:43:44  79years   不说了，道不同，不相为谋 <br />2008-4-17  11:46:03  years81   为什么要在我们之间划一个“界限”出来？ 左派，右派似的 <br />2008-4-17  11:46:24  79years   现在不是那个派的内部矛盾 <br />2008-4-17  11:46:26  years81   我们不都是爱国的吗 只是形式不一样而以 <br />2008-4-17  11:46:50  years81   难道我们一个是爱国者 一个崇洋媚外？ <br />2008-4-17  11:46:57  years81   事情不是这样的 <br />2008-4-17  11:47:14  years81   我们实在讨论的爱国的不同方式而已 <br />2008-4-17  11:48:40  years81   何来 “道不同 不相为谋”？  <br />2008-4-17  11:49:07  years81   所谓 兼听则明 我们能意见不同 不挺好的？ <br />2008-4-17  11:49:42  years81   个人从自己的一些角度提出一些想法 对事情 和对自己的认识是很有帮助的这是好事啊  <br />2008-4-17  11:49:54  years81   以上是我的看法 <br />2008-4-17  11:52:56  79years   在国家问题上，第一位的是情感认同，而不是理智的认同，这是没有对错，只有一个帮派和另一个帮派问题，只能各为其主。你看看美国CIA对华分裂活动就知道了那些是赤裸的丑陋的全人类摒弃的东西，但它之所以能在CIA推行，因为那符合他们的国家利益，换句话说，各位其主！所以首先是情感认同，而不是道理 <br />2008-4-17  11:57:36  years81   在我看来，没有主不主的概念，我又不是卖国贼，也不是崇洋媚外！对国家当然要情感认同，对呀，但对事情、处理事情却无法如此，他是屁股+脑袋的决策虽然很多情况下 屁股决定脑袋，但也总有一些人尽量去“理智思考” 这些人的目的不是卖国，不是肯定别人对我们不尊重，甚至侮辱这些人的目的是要建立一种和谐关系，建立一种让别人尊重我们的关系 =======  <br />2008-4-17  11:58:23  years81   CIA对中国统一不感兴趣，就像我们对朝鲜半岛统一不是很愿意推动。一个意思，你说的，这是国家利益。 <br />2008-4-17  11:58:49  79years   我想我们的分歧在于，你认为可以用儒家道德以德服人，我认为这世界上只有强权，没有德 <br />2008-4-17  12:00:25  years81   我们其实也无法以德让他们服，也服不了气。我们要用正确的抗议，对歪曲进行揭露来使他们服气，使他们说谎时起来不踏实 <br />2008-4-17  12:02:28  years81   抗议是一种文明的行为，正确的抗议，不是表达我们恨他们，也不是为了让他们恨我们而是要让他们，知道我们不认同他们的说法要让他们知道 还有另外的事实
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/183721#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 17 Apr 2008 12:27:06 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/183721</link>
        <guid>http://qieqie.javaeye.com/blog/183721</guid>
      </item>
      <item>
        <title>Long Polling + Hessian (Comet)</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/174841" style="color:red;">http://qieqie.javaeye.com/blog/174841</a>&nbsp;
          发表时间: 2008年03月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          简单说一下，使用Swing/RCP或其他胖客户端 ---HTTP--->Java Web服务器的<br />这种情况下，如果服务器有什么消息要“即时”(!=“及时”)通知到客户端时<br />一样可以使用Long Polling技术,大概的做法如下：<br /><br />客户端和服务器使用Hessian技术来做，同时客户端使用能够支持Cookie的功能(JDK6+下加1行代码即可)<br /><br />1>服务端要实现一个事件池，这个事件池能够区分不同用户的事件，服务端一有即时信息要通知客户端，就new一个Event，放入事件池中(事件池能够根据用户id自动为事件排队)，并使用notifyAll进行通知action的poll方法<br /><br />2>客户端使用Hessian调用action一个poll(long timeout)方法，一旦有该用户的事件，poll中的wait方法会被事件池唤醒，poll方法能够从事件池中获得要通知给本用户的那个事件，然后返回,这样就能做到即时告知客户端；如果timeout时间内没有事件，则直接返回null给客户端。<br />返回给客户端的是一个Event对象，非空情况，里面包含了具体的消息对象(任意Object，只要implements java.io.Serializable)；<br /><br />3>客户端接收到该Event后，能够判断如何处理，然后继续再调用poll(timeout)方法；如果返回的Event为null，那二话不说，也继续调用poll(timeout)<br /><br />.....<br />这是我们正在使用的一个设计的基本思想，我们使用时，代码是做了一些必要的封装以便于集中精神做业务开发。<br /><br />====================<br />不要自己再开发一个什么TCPServer，一个字母一个字母从Socket代码编写开始<br />这对服务器、客户端开发人员来说都是复杂的事情，费时费神的事情
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/174841#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 22 Mar 2008 16:17:36 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/174841</link>
        <guid>http://qieqie.javaeye.com/blog/174841</guid>
      </item>
      <item>
        <title>名词请教！！</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/163452" style="color:red;">http://qieqie.javaeye.com/blog/163452</a>&nbsp;
          发表时间: 2008年02月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <img src="http://qieqie.javaeye.com/upload/attachment/14832/f2a7effc-700c-33e7-8a9b-e5ae3772a097.gif" /><br /><br /><br />这个图表示 web server会根据用户的id，从对应的数据库节点去存取。<br />即：<br />user id 为 000000-100000范围的，web server到 数据库结点A 去crud(create,read,update,delete)<br />user id 为 100000-200000范围的，web server到 数据库结点B 去crud<br />user id 为 200000-300000范围的，web server到 数据库结点C 去crud<br /><br />XXX具体执行这个判断，今天和朋友讨论这样一个设计的时候，我们对如何称呼XXX产生了分歧，<br />朋友和我都坚称自己的认为没问题的看法，特此请教下大家的意见：<br /><br />1、负载均衡器/负载均衡模块<br />2、路由器/路由模块<br />3、其它___
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/163452#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 19 Feb 2008 18:00:58 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/163452</link>
        <guid>http://qieqie.javaeye.com/blog/163452</guid>
      </item>
      <item>
        <title>让我介绍MySQL Master-Slave架构下使用MMM的必要性</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/162717" style="color:red;">http://qieqie.javaeye.com/blog/162717</a>&nbsp;
          发表时间: 2008年02月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          MySQL本身没有提供replication failover的解决方案(见<a href="http://dev.mysql.com/doc/refman/5.1/en/replication-faq.html#qandaitem-15-3-4-9" target="_blank">How can I use replication to provide redundancy or high availability?</a>)<br /><br />如何使Replication方案具有HA？<br /><br />答案是<a href="http://blog.kovyrin.net/mysql-master-master-replication-manager/" target="_blank">MMM(MySQL Master-Master Replication Manager) </a><br /><br /><strong>MMM对MySQL Master-Slave Replication绝对是一个很有益的补充!</strong><br /><br /><strong>引言</strong><br /><br />Master-Slave的数据库机构解决了很多问题，特别是read/write比较高的web2.0应用：<br />1、写操作全部在Master结点执行，并由Slave数据库结点定时(默认60s)读取Master的bin-log<br />2、将众多的用户读请求分散到更多的数据库节点，从而减轻了单点的压力<br /><br />这是对Replication的最基本陈述，这种模式的在系统Scale-out方案中很有引力(如有必要，数据可以先进行Sharding，再使用replication)。<br /><br />它的缺点是：<br />1、Slave实时性的保障，对于实时性很高的场合可能需要做一些处理<br />2、高可用性问题，Master就是那个致命点(<a href="http://en.wikipedia.org/wiki/Single_point_of_failure " target="_blank">SPOF:Single point of failure</a>)<br /><br />本文主要讨论的是如何解决第2个缺点。<br /><br />DB的设计对大规模、高负载的系统是极其重要的。高可用性(<a href="http://en.wikipedia.org/wiki/High_availability " target="_blank">High availability</a>)在重要的系统(critical System)是需要架构师事先考虑的。存在<a href="http://en.wikipedia.org/wiki/Single_point_of_failure " target="_blank">SPOF:Single point of failure</a>的设计在重要系统中是危险的。<br /><br /><br /><strong>Master-Master Replication</strong><br />1、使用两个MySQL数据库db01,db02，互为Master和Slave，即：<br />一边db01作为db02的master，一旦有数据写向db01时，db02定时从db01更新<br />另一边db02也作为db01的master，一旦有数据写向db02时，db01也定时从db02获得更新<br />(这不会导致循环，MySQL Slave默认不会记录Master同步过来的变化)<br /><br />2、但从AppServer的角度来说，同时只有一个结点db01扮演Master，另外一个结点db02扮演Slave，不能同时两个结点扮演Master。即AppSever总是把write操作分配某个数据库(db01)，除非db01 failed，被切换。<br /><br />3、如果扮演Slave的数据库结点db02 Failed了：<br />a)此时appServer要能够把所有的read,write分配给db01，read操作不再指向db02<br />b)一旦db02恢复过来后，继续充当Slave角色，并告诉AppServer可以将read分配给它了<br /><br />4、如果扮演Master的数据库结点db01 Failed了<br />a)此时appServer要能够把所有的写操作从db01切换分配给db02，也就是切换Master由db02充当<br />b)db01恢复过来后，充当Slave的角色，Master由db02继续扮演<br /><br />难点：<br /><span style="color: red">3、4要如何自动进行？</span><br /><br /><strong>Master-Master with n Slaves Replication</strong><br /><img src="http://dev.mysql.com/doc/refman/5.1/en/images/redundancy-after.png" /><br /><br />这比上一个还要复杂，即：<br />当一个Master Fail时，所有的Slave不再从原来失败的那个Master(db01)获取更新日志，而应该“自动”切换到最新充当Master角色的数据库db02。<br /><br /><strong>MMM，a greate project!</strong><br />MMM的基本信息请参考它的网站(见后"参考资料")<br />MMM有3个重要的器件:<br />1、mmmd_mon - monitoring script which does all monitoring work and makes all decisions about roles moving and so on. <br />2、mmmd_agent - remote servers management agent script, which provides monitoring node with simple set of remote services to make servers management easier, more flexible abd highly portable. <br />3、mmm_control - simple script dedicated to management of the mmmd_mon processes by commands. <br /><br />每一个MySQL服务器器结点需要运行mmmd_agent，同时在另外的一个机器上(可以是独立的一台机器，也可以是和AppServer共享同一个服务器)运行mmmd_mon。形成1 * mmmd_mon + n * mmmd_agent的部署架构。<br /><br />MMM利用了虚拟IP的技术：1个网卡可以同时使用多个IP。<br />(所以使用MMM时，需要2*n+1个IP，n为mysql数据库结点个数，包括master,slave)<br /><br />当有数据库结点fail时，mmmd_mon检测不到mmmd_agent的心跳或者对应的MySQL服务器的状态，mmmd_mon将进行决定，并下指令给某个正常的数据库结点的mmmd_agent，使得该mmmd_agent“篡位”<em>使用(注)</em>刚才fail的那个结点的虚拟IP，使得虚拟IP实际从指向fail的那个机器自动转为此时的这个正常机器。<br />注：据Qieqie猜测是将获得的虚拟IP设置给网卡，也只能这样了，改天测试验证一下。<br /><br />repeat: <a href="http://blog.kovyrin.net/mysql-master-master-replication-manager/" target="_blank">MMM</a>对MySQL Master-Slave Replication绝对是一个很有益的补充!<br /><br /><strong>参考资料</strong><br />Switching Masters During Failover<br /><a href="http://dev.mysql.com/doc/refman/5.1/en/replication-solutions-switch.html" target="_blank">http://dev.mysql.com/doc/refman/5.1/en/replication-solutions-switch.html</a><br /><br />downpour: 讨论一下基于Master-Slave数据库模式的J2EE开发的框架选择<br /><a href="http://www.javaeye.com/topic/143714" target="_blank">http://www.javaeye.com/topic/143714</a><br /><br />MMM <a href="http://blog.kovyrin.net/mysql-master-master-replication-manager/" target="_blank">http://blog.kovyrin.net/mysql-master-master-replication-manager/</a><br />Project page on Google Code: <a href="http://code.google.com/p/mysql-master-master" target="_blank">http://code.google.com/p/mysql-master-master</a><br />mmm-devel users group: <a href="http://groups.google.com/group/mmm-devel" target="_blank">http://groups.google.com/group/mmm-devel</a>
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/162717#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 17 Feb 2008 05:05:42 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/162717</link>
        <guid>http://qieqie.javaeye.com/blog/162717</guid>
      </item>
      <item>
        <title>怎么回家呢</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/159125" style="color:red;">http://qieqie.javaeye.com/blog/159125</a>&nbsp;
          发表时间: 2008年01月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          怎么回家呢？ 北京-〉福建<br /><br />2大人 + 1不满1岁的小孩<br />2月2,3,4,5号<br /><br />烦恼中......<br /><br /><img src="/images/smiles/icon_sad.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/159125#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 24 Jan 2008 16:16:50 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/159125</link>
        <guid>http://qieqie.javaeye.com/blog/159125</guid>
      </item>
      <item>
        <title>偶们的 男人+女人</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/156761" style="color:red;">http://qieqie.javaeye.com/blog/156761</a>&nbsp;
          发表时间: 2008年01月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>偶们的 男人+女人</strong><br /><br />1、女生自觉勤劳、男生勇于负责<br />2、女生<strong>可正当</strong>在家候着，男生应四海打拼<br />3、好女生会把家整理的好好，上下邻里关系和谐<br />4、男生不挣钱，在家只会泡茶、吃酒就会被人说“好吃懒做”，“这郎莫栋用”<br />5、长久持续做饭、洗衣服、做日常家务的男生，100%可以断定该男没有老婆、老婆跟人跑了、或该男的窝囊<br /><em><span style="color: olive">做饭的我偶尔见过，但至今没有见过洗衣服的男的，扫地的也没有。<br />若有客人来的，那就更不能这样做了，除非男的自命厨艺不错</span></em><br /><br />6、女生不可对男生大声喝斥，这犹如信仰，违反者可以用“无礼”形容之，反之则无碍<br />7、父/男权主义：孩子从小被母亲、里外亲戚、邻里教育要尊重父亲、长辈<br />8、男权主义：小女生从小会经常被“查某郎(za mo lang，女人家)”这句话教育<br />9、做儿女的不能半句对父母长辈有不敬之语<br />10、讲究排场、阵势、热闹；讲究家族/族群；讲究礼仪；....<br /><br />结论：<br />95%的现在中国人看不惯，看不懂，也不想不会嫁给这款人；<br />(非闽南/福建地区的)城市千金深深地可怜上我们那地的女生；<br />女权主义者对我们深恶痛绝，深感历史使命责任重大；
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/156761#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 Jan 2008 23:06:14 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/156761</link>
        <guid>http://qieqie.javaeye.com/blog/156761</guid>
      </item>
      <item>
        <title> Paoding Rest 0.4 </title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/152388" style="color:red;">http://qieqie.javaeye.com/blog/152388</a>&nbsp;
          发表时间: 2008年01月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Paoding Rest今天可以发布0.4版本了。<br /><br />从0.3开始，Paoding替换掉原来的购物车示例为一个简易论坛示例。<br />可以通过 <a href="http://paoding.net/forum" target="_blank">http://paoding.net/forum</a> 试访问该示例的一个运行实例。<br /><br />Paoding Rest下载地址：<a href="http://code.google.com/p/paoding-rest/downloads/list" target="_blank">http://code.google.com/p/paoding-rest/downloads/list</a><br /><br />Paoding Rest是一个Web框架，当然现在的web框架很多，Paoding Rest是否有必要？<br />暂且这样说，有人觉得它比较独特，很好用，功能也算丰富。<br />仅此而已。<br /><br />发布Paoding Rest不必是为了让您去下载并使用它，或许您能给我的最大的价值是：<br />看看使用Paoding Rest如何开发，并进行批评。<br /><br /><br />现在让我说说默认情况下，使用Paoding Rest 0.4开发Web app action层的步骤：<br /><br />1、写一个POJO的Action以及可能使用到的实体类，如:<br />UserAction.java<br /><pre name="code" class="java">
public class UserAction {
    public String read(String id) {
        // User user = get user form database;
        User user = new User();
        user.setId(id);
        user.setName("Java");
        RestContext.setRequestAttrubute("user", user);
        return "user";
    }

    public String hello(User user) {
        return "@hello " + user.getName();
    }

    public int test(int value) {
        return value;
    }
}
</pre><br /><br />User.java<br /><pre name="code" class="java">
public class User {
    private String id;
    private String name;

    // getters & setters
}

</pre><br /><br />2、写一个Velocity文件放在/page下(相对于war路径): <br />user.vm<br /><pre name="code" class="java">
&lt;html>
user id : $user.id&lt;br>
user name: $user.name&lt;br>
&lt;/html>
</pre><br /><br />3、将Action配置到/WEB-INF/root-action.xml中:<br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="utf-8"?>
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
&lt;beans>
	&lt;bean id="user" class="xxx.UserAction" autowire="byName" />
&lt;/beans>
</pre><br /><br />4、配置web.xml<br />不管在root-action.xml写了多少的Action，都只要在web.xml简单增加配置如下: <br /><pre name="code" class="java">
	&lt;!-- RestFilter必须配置在最后，以让前面的Fiter能够起作用，否则会被RestFilter跳过 -->
	
	&lt;filter>
		&lt;filter-name>RestFilter&lt;/filter-name>
		&lt;filter-class>net.paoding.rest.RestFilter&lt;/filter-class>
	&lt;/filter>
	
	&lt;filter-mapping>
		&lt;filter-name>RestFilter&lt;/filter-name>
		&lt;url-pattern>/*&lt;/url-pattern>
		&lt;dispatcher>REQUEST&lt;/dispatcher>
		&lt;dispatcher>FORWARD&lt;/dispatcher>
	&lt;/filter-mapping>
</pre><br /><br /><br />5、OK，以上这些代码和配置就可以了。<br />确定Paoding-Rest依赖的lib都到/WEB-INF/lib下了<br />把webapp部署到tomcat, 就可以启动tomcat了<br /><br />6、访问<br />1) http://127.0.0.1/webpath/user/12345<br />2) http://127.0.0.1/webpath/user/hello?name=world<br />3) http://127.0.0.1/webpath/user?name=world&_method=hello<br />4) http://127.0.0.1/webpath/user/12345?_method=test<br />(webapp是这个示例的ctx path)<br /><br />2) 3)是等价的，按照rest的做法3)优于2)，虽然它看起来比较麻烦。<br /><br /><br /><br />现在这个东西主要还是在小范围内使用。<br /><br />以上只是一个很简单的示例。使用velocity作为页面模板语言。<br />但Paoding Rest不限于此，他可以很简单使用freemarker,jsp等其他视图技术。<br /><br />Paoding Rest也可以很简单地支持上传。我大概需要几个月来完成一份完整的参考文档的编制。
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/152388#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jan 2008 16:37:48 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/152388</link>
        <guid>http://qieqie.javaeye.com/blog/152388</guid>
      </item>
      <item>
        <title>感动人道屠宰</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/149020" style="color:red;">http://qieqie.javaeye.com/blog/149020</a>&nbsp;
          发表时间: 2007年12月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          看到以下这个文章，真的很让人感动，我们无法让他们持续的活着，因为人类要活着<br /><br />我们能做到的是，尽量使他们在“有生之年”保持免于恐惧，<br />“免于恐惧”本来是人类的追求，今天我们终于进步了，将它适用到周遭环境的其他生命中。<br /><br />能对周遭的生命如此体认，我们的社会，人与人才会渐渐变得完美。<br /><br /><a href="http://www.zaobao.com/special/newspapers/2007/12/taiwan071217k.shtml" target="_blank">http://www.zaobao.com/special/newspapers/2007/12/taiwan071217k.shtml</a><br /><br /><div class="quote_title">引用</div><div class="quote_div"><br /><br />    中国河南省将成为猪只人道屠宰的试点省份，在运输、装卸、停留待宰以及宰杀过程，都要合乎动物行为，尽量减少动物的紧张和恐惧，例如赶猪时要轻拍猪屁股，哄着猪只往前走，而且在上「断头台」的途中，还要猪看到自己的夥伴。 <br /><br />　　「河南商报」报道，世界保护动物协会和北京朝阳安华动物产品安全研究所共同发起的中国人道屠宰计划昨天在河南省启动。 <br /><br />　　报道说，人道屠宰就是包括动物的运输、装卸、停留待宰以及宰杀过程，采取合乎动物行为的方式，以<strong>尽量减少动物的紧张和恐惧</strong>。最基本的要求是在宰杀动物时，必须先将动物「致昏」、使其失去痛觉、再放血使其死亡。 <br /><br />　　中国人道屠宰草案规定，卸猪台坡度要小于等于二十度，让猪缓慢从车上走下，避免摔伤。猪圈应保证圈舍四周有不透明的围墙，<strong>避免生猪看到猪圈外的宰割场景而产生恐慌。 </strong><br /><br />　　草案还规定赶猪单通道改成双通道，尽量减少拐弯，而且赶猪要用塑胶赶猪拍<strong>，「哄着」往前走。双通道赶猪是为了让猪看到还有同伴在，不会感到恐慌。最后宰杀步骤，电击昏猪后，缩短处理时间，要在十五秒内刺杀放血。</strong> <br /><br />　　人道宰杀也有助于提高猪肉品质，报道说，研究表明，当猪恐慌后，会分泌一些不好的物质，出现「白肌肉」现象，猪肉的颜色发白，质软，还有渗入的不良体液。因此，人道屠宰猪肉的品质会更好。 <br /><br /></div>
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/149020#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 17 Dec 2007 23:55:25 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/149020</link>
        <guid>http://qieqie.javaeye.com/blog/149020</guid>
      </item>
      <item>
        <title>是谁调用了它的静态方法？</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/148208" style="color:red;">http://qieqie.javaeye.com/blog/148208</a>&nbsp;
          发表时间: 2007年12月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我该如何知道是哪个子类调用了它的静态方法？有必要吗？<br /><br />//ActiveRecord.java<br /><pre name="code" class="java">
public abstract class ActiveRecord {

    public static int count() {
        //我应该如何知道，Xxx.count()中的Xxx实际是什么类？
        //假如java在此可以使用关键字class，用以表示实际调用该静态方法的类：
        Class targetClass = class;
        String hql = "select count(*) from " + targetClass.getSimpleName() 
              + " where " + propertyName + "=?";
        List list = theStaticHibernateTemplate.find(hql, value);
        return (Integer) list.get(0);
    }

}
</pre><br /><br /><pre name="code" class="java">
//Entity.java

@MappedSuperclass
public abstract class Entity extends ActiveRecord {
...
}

//User.java
@Entity
public User extends Entity {...}

//Topic.java
@Entity
public Topic extends Entity {...}</pre><br /><br /><br />//XxxAction.java<br /><pre name="code" class="java">
public void someMethod(){
    //ActiveRecord.count中的targetClass 将是User.class
    int userCount = User.count(); 

    //ActiveRecord.count中的targetClass 将是Topic.class
    int topicCount = Topic.count(); 
}</pre><br /><br />我如何完成如上的做法？
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/148208#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 14 Dec 2007 00:31:40 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/148208</link>
        <guid>http://qieqie.javaeye.com/blog/148208</guid>
      </item>
      <item>
        <title>好友的同事寻：高级行政助理，或这人力资源管理职位</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/147882" style="color:red;">http://qieqie.javaeye.com/blog/147882</a>&nbsp;
          发表时间: 2007年12月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          有朋友的同事需要找一个<strong>高级行政助理，或这人力资源管理</strong>这方面的工作，<br />这是我们部分聊天记录，不知道是否能帮上忙？<br />------------------------------<br /><br />好友: 帮忙， hoho<br /><br />切切·王: 哦 我能帮上不？<br /><br />好友: 哈哈，是这样的<br />我的一个同事好友MM<br />她想去上海，要找一份工作<br /><br />切切·王: 去了北京旅游一次的那个MM？<br /><br />好友: 我现在在帮她谋一个高级行政助理，或这人力资源管理这块的职务<br />薪资在xxxx左右的<br />地点在最好在<strong>上海，杭州</strong>也行<br />帮我向你的朋友推荐<br /><br />切切·王: 如果有人问我我怎么向别人推介？<br /><br />好友: <strong>在一家互联网公司任高级行政助理兼人力资源经理</strong><br /><br /><br />好友: 这件事我很郑重滴委托你哦（没有说一定要找到，但务必帮我实时留意一下，有机会就帮我多问问）<br />哈  呵呵<br /><br />切切·王: 我可以问我们公司人力的  看看他们有否这方面对招聘计划<br /><br />好友: 你们公司在上海有分公司吗？<br /><br />切切·王: 没有，在北京<br /><br />好友: 或者你认识的网友，交往比较好的<br />也帮我问问啊<br />她不去北京<br />她在北京的同学已经帮他找好工作了，她不去，原因不明
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/147882#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Dec 2007 16:56:10 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/147882</link>
        <guid>http://qieqie.javaeye.com/blog/147882</guid>
      </item>
      <item>
        <title>老题：Java 如此 ActiveRecord 可行否?</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/147640" style="color:red;">http://qieqie.javaeye.com/blog/147640</a>&nbsp;
          发表时间: 2007年12月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Java在web应用方面，是否有如下的开发模式的可能（直接在Action写如下代码）？<br /><br /><pre name="code" class="java">
1、User user = ActiveRecord.insert(User.class, "logonName=root;desc='value with blank chars';");
2、user.setDesc("some desc for the new user");
3、ActiveRecord.insert(user);
4、ActiveRecord.update(user);
5、ActiveRecord.delete(user);
6、ActiveRecord.get(user, "7777");//get by id
7、ActiveRecord.load(user, "8888");//load by id
8、ActiveRecord.load(User.class, "9999");//return a unique result
9、ActiveRecord.findEq(User.class, "logonName", "root");
10、ActiveRecord.findLe(User.class, "logonName","root");
11、ActiveRecord.find(User.class, "age>20 and age&lt;22");// return list
12、ActiveRecord.get(User.class, "path='best_guy'");//return a unique result
13、ActiveRecord.find(User.class, "age>? and age&lt;?", 2, 5);// return list
14、ActiveRecord.get(User.class, "path='best_guy'"); //return a unique result
15、String hql1 = "from User u inner join u.department d where d=?";
16、ActiveRecord.find(hql1, 1);// return list
17、String hql2 = "from User u inner join u.department d where d=? and u.role=?";
18、ActiveRecord.get(hql2, 1, "manager");//return a unique result
</pre><br /><br />其中<br />0)、ActiveRecord由独立项目的其它公共组件项目提供<br />1)、ActiveRecord提供静态方法，ActiveRecord底层采用Hibernate API实现CRUD，支持JPA语义<br />2)、ActiveRecord通过某种方式自动寻获Spring Web AppContext下的Hibernate SessionFactory<br />3)、实体类使用jpa的annotation采用@Entity标注，以减少开发代码量(code=java,xml,...)<br />4)、ActiveRecord能够<strong>自动识别</strong>从事先指定package，判断哪些类加注了@Entity。比如com.xxx.domain，并通知给Hibernate<br />5)、ActiveRecord在Web Action中被使用，<strong>去掉Bo、Dao层</strong>，需要事务时，考虑直接把事务架到Action方法上<br /><br />早先很多人习惯使用static的方法(函数)来编程，当时这种方法给人的感觉是“不专业”<br />但是现在反过来看看，<strong>是否在很多应用上(特别是web应用方面),这样的方式方式是否更方便?</strong><br /><br />因为JPA/Hibernatge的承诺，领域逻辑就可以直接在Domain类完成了<br />(Domain类可以根据ref navigation、ActiveRecord 2种方式获取想要的对象)。
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/147640#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 11 Dec 2007 18:04:05 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/147640</link>
        <guid>http://qieqie.javaeye.com/blog/147640</guid>
      </item>
      <item>
        <title>ZT:How to be an expert</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/147555" style="color:red;">http://qieqie.javaeye.com/blog/147555</a>&nbsp;
          发表时间: 2007年12月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://headrush.typepad.com/creating_passionate_users/2006/03/how_to_be_an_ex.html" target="_blank">http://headrush.typepad.com/creating_passionate_users/2006/03/how_to_be_an_ex.html</a><br /><br />讨论“高手”问题的帖子锁了，回到主题吧，这个文章有参考意义：<br /><br />《How to be an expert》  作者：kathy sierra， Head First系列创建人之一<br /><a href="http://www.killuakun.com/article.asp?id=399" target="_blank">中文链接</a><br /><a href="http://headrush.typepad.com/creating_passionate_users/2006/03/how_to_be_an_ex.html" target="_blank">英文链接</a><br /><br />2007，12月号的程序员 P134转载了这篇文章<br /><br /><br /><img src="http://headrush.typepad.com/photos/uncategorized/howtobeanexpert.jpg" /><br /><br />《程序员》上对配图的翻译：<br /><div class="quote_title">引用</div><div class="quote_div"><br /><br />专家：总是处于涌流状态：我要不断挑战自己，总是有某种方式可以把事情做到更好<br /><br />--------------大牛临界点---------------------<br /><br />业余者：现在我知道怎么做了，我会一直这么做下去<br /><br />--------------菜鸟临界点---------------------<br /><br />掉队者：我做这个很逊，还是放弃吧。<br /></div><br /><br /><br />〉〉我的读后感：<br />没有最好，只有更好，不断追求，求得结果，是为专家。
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/147555#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 11 Dec 2007 14:25:34 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/147555</link>
        <guid>http://qieqie.javaeye.com/blog/147555</guid>
      </item>
      <item>
        <title>偶像，柴静</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/147215" style="color:red;">http://qieqie.javaeye.com/blog/147215</a>&nbsp;
          发表时间: 2007年12月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://liubbinm.blog.163.com/blog/static/40354573200711932922228/?fromTodayFocus" target="_blank">http://liubbinm.blog.163.com/blog/static/40354573200711932922228/?fromTodayFocus</a><br /><br /><div class="quote_title">引用</div><div class="quote_div"><br />近来身体不好，睡的很早，是一个朋友的电话把我叫醒，朋友很兴奋地说：“央视《新闻调查》说了，华南虎是假的！”我这才起来在网上看这期节目。<br /><br />        看完了，正是12月9日凌晨2点，我却睡意全无。我不得不说我很高兴华南虎事件终于走到了今天，央视就是央视，采访思路清晰明确，柴静应该改名为“才女”才对，我在全国的各大论坛上，发现了一个用智慧打动全国网民的女人，一句话：“<strong>偶像，柴静</strong>！”<br /><br />        柴静“新闻调查”的功力可谓炉火纯青，她从三个方面论证了华南虎照为假，第一，华南虎被发现这一申报程序存在严重瑕疵（没有走国际公认的稀有动物发现步骤），仅凭几个所谓“证人”的证词是不足以采信镇坪有虎的；第二，陕西省林业厅的专家鉴定团队不可信，因为没有一位专家是大型猫科动物专家（甚至不知道老虎的脚脚印是什么样子）；第三，华南虎照确实与2002年浙江义乌威斯特年画生产商出品的华南虎年画雷同，证实是同一只老虎（中国摄影家协会专业不专业？）。再加之细节方面的论证，这样一个大手笔就出来了。恭喜你，才女，你不仅获得了名誉，而且获得了至少百年的尊重！<br />....<br /></div>
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/147215#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 10 Dec 2007 11:59:59 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/147215</link>
        <guid>http://qieqie.javaeye.com/blog/147215</guid>
      </item>
      <item>
        <title>网站同一资源(网页)，具有不同地址：平白给自己压力？</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/146622" style="color:red;">http://qieqie.javaeye.com/blog/146622</a>&nbsp;
          发表时间: 2007年12月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          以下A和B指向实为同一个资源：<br /><br />A: <a href="http://www.javaeye.com/topic/39" target="_blank">http://www.javaeye.com/topic/39</a><br />B: <a href="http://www.javaeye.com/t/39.html" target="_blank">http://www.javaeye.com/t/39.html</a><br /><br />A: <a href="http://www.javaeye.com/article/9258" target="_blank">http://www.javaeye.com/article/9258</a><br />B: <a href="http://www.javaeye.com/a/9258.html" target="_blank">http://www.javaeye.com/a/9258.html</a><br /><br />。。。<br /><br />虽然xxx.html为静态的页面，不会根据判断请求用户是否登录，但是<br />类似的，<strong>同一资源的uri地址还是应该考虑固定下来一个</strong>，不要提供多种形式，<br />否则搜索引擎将视为不同的资源进行抓取，无故给自己加大了好些压力。(翻倍啊)
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/146622#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 07 Dec 2007 12:39:06 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/146622</link>
        <guid>http://qieqie.javaeye.com/blog/146622</guid>
      </item>
      <item>
        <title>Java Web框架标准化必要性探讨</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/144415" style="color:red;">http://qieqie.javaeye.com/blog/144415</a>&nbsp;
          发表时间: 2007年11月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>java的web框架</strong><br /><br />java的web框架众多的原因在于java的web框架只在servlet一层提供了标准，没有进而再往上作标准。因此，每个web框架都建立自己基于servlet之上的各种不同标准。<br /><br />struts1使用Struts制订的Action接口<br />webwork,struts2使用Model和Action同一Action接口<br />Spring的Controller...<br />Cetia4的RestServlet...<br />...<br />这些web框架有一个基本的假设：开发者编写的Action要<strong>必须继承</strong>于各自框架的基类。<br />到此就完了，如果各自的框架要求开发者要继承自己的基类，这还不会出现“百花齐放”那才奇怪了。<br /><br />这样的Web框架最后都会被抛弃(隐藏在底层)：<br /><br /><span style="color: green">开发者就应该像开发中间层业务逻辑那样开发Web Action,Pure Web Action，不需要继承Servlet，不需要继承特有的Action对象。</span><br /><br /><strong>Pure Web Action</strong><br /><br />web处理对象应该不需要显示继承Servlet,不需要继承框架特有基类，我将这样的web对象称为Pure Web Action，或POJO Action，它的好处是：<br /><br /><u>1、学习成本几乎为零</u><br />如下编写普通的Java代码有何成本可言？<br /><pre name="code" class="java">
public class UserAction {
	private UserBo userBo;
	public void setUserBo(UserBo userBo) {
		this.userBo = userBo;
	}
	//获取一个指定用户id的用户信息
	public String get(String id, HttpServletRequest request) {
		User user = this.userBo.loadUser(id);
		request.setAttribute("user", user);
		return "user_profile_info";
	}

}
</pre><br /><br /><u>2、鼓励Web框架竞争：</u><br /><br />因为如上的UserAction是Pure Web Action，理论上不同的Web框架都能够支持运行它。<br /><br />编写同样的Action，如果能在竞争的Web框架中使用这才是标准的意义。<br /><br />有人认为JSF是标准，这是狗屁不通，没有理解“标准”2个字的意思。<br />JSF是它自己的标准，但不是web框架的标准。<br />就像hibernate只是他的标准，而不是j2ee的标准，ejb3才是他们的标准，hibernate,jdo只是他的实现。<br /><br />web框架也应该如此，开发者按Pure Web Action的标准编写了web处理接口对象，这些pure web action没有限制要在那个web框架使用，这就意味着，他在理论上可在任何一个框架使用。<br /><br /><u>3、可测试性：</u><br /><br />UserAction的get()好测试这是不言而喻的，提供了HttpServletRequest等Servlet要求的对象的Mock对象后，该Action就不需要别的了。<br /><br /><strong>将来的java web framework“标准”的额外要求</strong>：<br /><strong>1</strong>、学习其他语言上web框架的的好思想、好做法，大量使用默认或惯例<br /><strong>2</strong>、采纳REST：支持丰富的http语义，支持uri的意义<br /><strong>3</strong>、透明连接业务逻辑层的AO或BO<br /><strong>4</strong>、支持一句话声明或配置，使就可使用想要的view技术，如velocity, freemark, jsp,...<br />(view技术不一定要是真的view，"假的"view可能只是：(不通过模板而)将对象转化为xml，返回给请求着)<br /><strong>5</strong>、action方法支持指令式格式：<br /><pre name="code" class="java">

	public String login(User user) {
		User user = this.userBo.auth(user.getLogonName(), user.getPassword());
		if (user != null) return "@:1";
		return "@:-1";
	}
</pre><br />即开发者可在返回view对象中加上一些指令，如：<br />使用重定向的：  r:或redirect:或!:指令，如r:register，表示重定向到注册页面<br />直接指定物理的view的：  file:或f:指令, 如file:/page/jsp/error.jsp，表示返回该jsp页面给客户端<br /><br />更多的指令可以在标准中统一规定，并有具体的Web框架实现者来完成以上解析。<br /><br />。。。<br /><br /><br /><strong>我没有看到有所谓知名的web框架采用如上的设计，但是因为它简单，我们没有理由不期待。</strong>
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/144415#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 28 Nov 2007 10:13:20 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/144415</link>
        <guid>http://qieqie.javaeye.com/blog/144415</guid>
      </item>
      <item>
        <title>Paoding Rest 0.2 Released</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/143982" style="color:red;">http://qieqie.javaeye.com/blog/143982</a>&nbsp;
          发表时间: 2007年11月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>Paoding Rest 0.2 释出。</strong><br /><br />经过在实际环境中的开发使用，以及编写了一个完整的从登录到增删查的示例应用，Paoding Rest可以<strong>释出0.2版本</strong>了。<br /><br />该版本中包含了一个完整的可直接copy到webapps目录运行的webapp war(注),线上版本：<a href="http://demo.paoding.net/rest-demo" target="_blank">http://demo.paoding.net/rest-demo</a><br /><span style="color: green">注：部署时需要将paoding-rest-0.2.jar拷贝到WEB-INF/lib下</span><br /><br />--------------------------------<br /><br /><strong>连接</strong><br /><br />项目下载：<a href="http://code.google.com/p/paoding-rest" target="_blank">http://code.google.com/p/paoding-rest</a><br /><br />线上版本：<a href="http://demo.paoding.net/rest-demo" target="_blank">http://demo.paoding.net/rest-demo</a><br /><br /><br />该示例应用使用的具体工具是: jquery, jquery form plugs, jquery tabs plugs, velocity, paoding-rest, spring ioc<br /><br /><br /><strong>我所能做的</strong><br />Struts, webwork不是好轮子，我也换不了它的轮胎<br />目前我能够完全掌握的最好轮子是Spring FrameworkServlet，但是Spring MVC不是好轮胎。<br />Paoding Rest 是作者对自己理解的好轮胎实践。<br /><br /><strong>应用代码片断</strong><br /><br /><br /><br /><br /><br /><pre name="code" class="java"> public class SessionAction {
	
	private UserBo userBo;
	
	public void setUserBo(UserBo userBo) {
		this.userBo = userBo;
	}

	/**
	 * 展现会话开始页面(即登录页面)
	 */
	public String get(HttpServletRequest request, HttpSession session) {
		if (session.getAttribute("user_id") != null) {
			// 如果已经登录过了，重定向到产品主页面
			return "redirect:action:product";
		} else {
			// 如果还没有登录，则展现登录页面
			return "login";
		}
	}

	/**
	 * 执行用户登录认证
	 * 
	 * @param user
	 *            登录者信息
	 * @return
	 */
	public String post(User user, HttpSession session) {
		user = userBo.auth(user.getLogonName(), user.getPassword());
		if (user != null) {
			// 验证正确，返回1给ajax
			session.setAttribute("user_id", user.getId());
			return "@:1";
		} else {
			// 报告用户名和密码错误，返回-1给ajax
			return "@:-1";
		}
	}

	/**
	 * 登出
	 * 
	 * @return
	 */
	public String delete(HttpSession session) {
		// 使会话失效
		session.invalidate();
		// 重定向到登录会话开始页面(即登录页面)
		return "redirect:action:session";
	}
}
</pre><br /><br /><br /><img src="http://demo.paoding.net/rest-demo/payment_login.jpg" />
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/143982#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 27 Nov 2007 14:44:21 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/143982</link>
        <guid>http://qieqie.javaeye.com/blog/143982</guid>
      </item>
      <item>
        <title>Paoding Rest for Java</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/142464" style="color:red;">http://qieqie.javaeye.com/blog/142464</a>&nbsp;
          发表时间: 2007年11月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Paoding-Rest is a java web rest framework based on spring.<br /><br />HOME: http://code.google.com/p/paoding-rest/ <br />示例应用: http://paoding.net/rest-demo<br /><br />Paoding-Rest是Paoding中文分词作者的又一个开源项目。目前版本为0.2。<br /><br /><br /><strong>Paoding-Rest是什么</strong><br /><br />Paoding-Rest是使用Java编写的，基于Spring的，标准而又新颖的WEB REST框架。<br />作者之前多次利用了http method的特性修正传统web框架的使用，这和REST在某种程度上有所吻合。Paoding-Rest可以说是一个具有REST特点的Java Web框架。<br />Paoding-Rest的核心类RestSerlvet继承于Spring提供的FrameworkServlet, 使Paoding-Rest能够以相当少的代码量，提供极其丰富的功能并具有很高灵活性(thanks to Spring)。<br /><br />如果您熟悉Spring，眨两眼就上手Paoding-Rest了。使用Paoding-Rest，您可以抛弃很多无聊、故弄玄虚的工作了。<br /><br /><strong>Paoding-Rest不是什么</strong><br /><br />Paoding-Rest不是一个页面技术，所以您还需要结合其它页面技术来完成整个web应用。<br />默认的Paoding-Rest是使用jsp来展现页面的，不过您只要稍稍配置一下，就可以使用velocity,freemark之类的其它页面展现技术了。<br /><br /><strong>注意</strong><br /><br />Paoding-Rest是建立在Spring FrameworkServlet之上的web框架，如果您不喜欢Spring或者因为其它原因不能使用Spring，那么Paoding-Rest并不适合您。<br /><br /><strong>Paoding-Rest的显著特点</strong><br /><br />1) Rest风格的url和处理<br /><br />2) POJO的Controller and Model<br /><br />Controller:<br /><pre name="code" class="java">
public class SessionAction {
	
	private UserBo userBo;
	
	public void setUserBo(UserBo userBo) {
		this.userBo = userBo;
	}

	/**
	 * 展现会话开始页面(即登录页面)
	 */
	public String get(HttpServletRequest request, HttpSession session) {
		if (session.getAttribute("user_id") != null) {
			// 如果已经登录过了，直接到产品列表资源页面
			return "r:action:product";
		} else {
			// 如果还没有登录，则展现登录页面
			return "login";
		}
	}

	/**
	 * 执行用户登录认证
	 * 
	 * @param user
	 *            登录者信息
	 * @return
	 */
	public String post(User user, HttpSession session) {
		user = userBo.auth(user.getLogonName(), user.getPassword());
		if (user != null) {
			// 验证正确
			session.setAttribute("user_id", user.getId());
			return "@:1";
		} else {
			// 报告用户名和密码错误
			return "@:-1";
		}
	}

	/**
	 * 登出
	 * 
	 * @return
	 */
	public String delete(HttpSession session) {
		// 使会话失效
		session.invalidate();
		// 重定向到登录会话开始页面(即登录页面)
		return "r:action:session";
	}
}
</pre><br /><br />Model<br /><br /><pre name="code" class="java">
public class User {

	private Long id;
	private String logonName;
	private String password;
	private String name;
	private String address;
	private String postalCode;
	private double balance = Integer.MAX_VALUE;

	//getter & setting here
}
</pre><br /><br />3)简单的web.xml配置:<br /><pre name="code" class="java">
	&lt;servlet>
		&lt;servlet-name>shopping&lt;/servlet-name>
		&lt;servlet-class>net.paoding.rest.RestServlet&lt;/servlet-class>
		&lt;init-param>
			&lt;param-name>defaultAction&lt;/param-name>
			&lt;param-value>home&lt;/param-value>
		&lt;/init-param>
	&lt;/servlet>

	&lt;servlet-mapping>
		&lt;servlet-name>shopping&lt;/servlet-name>
		&lt;url-pattern>/shopping/*&lt;/url-pattern>
	&lt;/servlet-mapping>
</pre><br /><br />4) Controller基于Spring配置(ServletName-servlet.xml=>shopping-servlet.xml)，并轻松连接到中间层：<br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

&lt;beans>
	&lt;bean name="viewTransfer"
		class="net.paoding.rest.SimpleViewTransfer">
		&lt;property name="prefix" value="/page/shopping/" />
		&lt;property name="suffix" value=".vm" />
	&lt;/bean>

	&lt;bean name="home" class="net.paoding.rest.examples.shopping.action.HomeAction"
		autowire="byName" />

	&lt;bean name="session" class="net.paoding.rest.examples.shopping.action.SessionAction"
		autowire="byName" />
&lt;/beans>

</pre><br /><br /><br /><br />[b]getting started[b]<br /><br /><br />现在您需要准备这些工作：<br /><br />1)web容器，比如Tomcat,Resin，用以运行web app;<br /><br />2)一个IDE环境，比如Eclipse,NetBean，当然这不是必须的。<br /><br />我们可以开始工作了。<br /><br />----------------------------------------------------<br /><br />搭建并开始使用Paoding-Rest:<br /><br />1、创建一个普通的Java工程，名为HelloRest.<br /><br />2、把Paoding-Rest/examples目录及其子目录和文件整个copy到HelloRest/src<br /><br />3、把Paoding-Rest/war目录及其子目录和文件整个copy到HelloRest/war<br /><br />4、把Paoding-Rest/paoding-rest.jar copy到HelloRest/war/WEB-INF/lib下<br /><br />5、HelloRest/war/WEB-INF/lib下的jar文件，架到您工程的class path中。<br /><br />6、设置该工程的编译路径为war/WEB-INF/classes，并重新编译代码<br /><br />OK，现在可以使用Paoding-Rest了，将HelloRest/war部署到web容器了，<br />并通过127.0.0.1:8080/appPath/ 访问。<br />如果显示了一些列的链接列表清单，则表示一切顺利。<br /><br /><br />[b] tips [b]<br /><br />1、web.xml需要配置一个或多个net.paoding.rest.RestServlet<br /><br />2、每个 RestServlet 需要一个serlvetName-servlet.xml的Spring配置文件，用于配置POJO控制器servletName]要替换成实际配置时该Servlet的名称。<br /><br />3、每个 RestServlet 都需要一个servlet-mapping配置，并只能采用&lt;url-pattern>/shopping/*&lt;/url-pattern>这样的配置形式<br /><br /><br />4、POJO控制器就是一个普通的Java对象，命名、方法名、方法参数的个数和类型没有任何限制，每个方法可以返回任何对象(Paoding使用toString()获取其view name)，也可以返回null。但有一个限制：不能有同名的方法。浏览器使用appPath/servlet-path/pojo_action/method_name/xxx地址时候，方法名为method_name的方法将被调用，处理请求<br /><br />5、POJO控制器的方法可以含有全部或部分 HttpServletRequest,HttpServletResponse,HttpSession,HttpServlet等参数,且顺序可任意： <br /><br /><pre name="code" class="java">
public String login(User user, HttpSession session, int h, HttpServletRequest req, HttpServletResponse resp,  HttpServlet servlet){
    return "home";
}
</pre><br /><br />6、POJO控制器的方法可以放入多个Bean，甚至他们具有同样的类型：<br /><pre name="code" class="java">
//aooPath/servlet/action/hello/110/xyz?user.id=123&user1.name=wang&user2.name=antherwang
public String hello(int a, String b, User c, User d, Company e, HttpServletRequest req) {
    return "hello";
}
</pre><br /><br />URI中的110,xyz按照hello方法声明的顺序分别设置给a和b<br /><br />user.xxx以及user1.xxx的属性设置到第1个user对象中(也就是User c)<br /><br />user2.xxx的属性设置到第2个user对象中(也就是User d)<br /><br />company.xxx的属性设置到Campany对象中。<br /><br />7、支持http method语义：<br /><br />对只有action name，没有method name的请求，如：appPath/servlet/action_name, appPath/servlet/action_name?k=v<br /><br />GET时: 如果POJO控制器有声明index(...)方法，由该方法负责处理此请求，否则由get(...)方法处理<br /><br />POST时：由post(...)方法处理<br /><br />PUT时：由put(...)方法处理<br /><br />DELETE时：由delete(...)处理<br /><br />这些请求只要没有被用到，POJO控制器都可以不声明它们。<br /><br />8、pojo控制器返回串规定：<br /><br />如果以"r:","redirect:","!:"开头，表示使用redirect，此时不经过view name->view page file的转化。<br /><br />其它表示使用forward到对应的page file。<br /><br />如果以"f:","file:"开头，表示不需要经过viewTransfer，比如可以直接返回"file:/page/anotherlocation/some.html"<br /><br />以"@:"开头，表示返回随后的字符串，这一般用于ajax操作的返回值，如"@:1"，用于返回1给ajax客户端。<br /><br />其它的view都经过viewTransfer转化。
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/142464#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 22 Nov 2007 02:16:16 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/142464</link>
        <guid>http://qieqie.javaeye.com/blog/142464</guid>
      </item>
      <item>
        <title>妞发烧了</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/141453" style="color:red;">http://qieqie.javaeye.com/blog/141453</a>&nbsp;
          发表时间: 2007年11月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="color: white">.</span><br />周四给我家妞洗澡，可能是洗的时间有点长了，第二天早上就开始发烧了。温度在37.5~38.5范围反复。<br />她妈妈很紧张，多次几乎是坚持要去医院。<br />我看起来比较乐观，不是到关键时刻，咱们最好也不要摄入药(来自农村的思维惯势?)。<br />我的忍耐点是：小宝低烧较长一个时间没办法自己降下来，或温度升到脑袋热得受不了(小孩表现出烦躁迹象时).<br />现在我们只是给她贴退热贴，总体看来她的精神状态还比较好。<br /><br />工作上，自己的工作任务也不少，“想问题”是需要时间的，最近自己给自己偷偷安排了一个比较有挑战性的任务。<br />小孩不舒服，爸爸这两天也没有自己独立的时间去想问题。<br />都几点了，妞和妈妈睡觉了，我终于有时间冲一杯cafe，戴上耳机听点广播音乐，写上几个字了。<br />这感觉真好。<br /><br />相信并祝我的宝宝平安度过这次发烧，利用这个机会长出一些免疫细胞。<br />不经历发烧，怎能享受以后的美好生活？<br />呵呵<br /><br /><span style="color: green">周日孩子10点醒来后早上已经好了，到今天(2007-11-19)没有反弹，谢谢各位</span><br /><br /><img src="http://paoding.net/press/200711/20071117049.jpg" />
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/141453#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 18 Nov 2007 00:57:06 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/141453</link>
        <guid>http://qieqie.javaeye.com/blog/141453</guid>
      </item>
      <item>
        <title>一对多关系的一次有趣实践</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/139584" style="color:red;">http://qieqie.javaeye.com/blog/139584</a>&nbsp;
          发表时间: 2007年11月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <em>不好给本贴取名，暂且看吧。</em><br /><br />类A 和 类B 具有<strong>一对多</strong>的关系。A有子类 A1 和 A2，且A1和A2的字段个数和种类相差较大。<br />系统对A的检索/查找要求较低，对B的检索/查找功能较多也较重要。<br /><br />表设计如下：<br />A采用TABLE_PER_CLASS的方式<strong>，即A1和A2各一张表TABLE_A1, TABLE_A2</strong>。<br />(系统不会有同时列出A1和A2的查询，也可以容忍A1和A2可重复一个ID)<br />类B映射为一个表TABLE_B，并设置了一个<strong>外键A_ID</strong>，关联对B的关系。<br /><br />OK！现在如何让系统知道A_ID对应的是TABLE_A1，还是TABLE_A2？<br /><br />习惯从数据库角度看问题的，可以这样解决：<br />在TABLE_B中增加一个字段<strong>type</strong>，当type="A1"时，外键A_ID代表关联到TABLE_A1表。当="A2"时，外键A_ID代表关联到TABLE_A2表。<br />(其它方式的，比如规定A1主键和A2主键进行规则区分等等方案暂不考虑)<br /><br />但<strong>如何在Hibernate配置这种关系</strong>？翻了Hibernate的参考手册可没直接这方面的资料。<br /><br />好在B在现实中也确实存在分类的问题，那就这样吧：<br /><br /><br /><pre name="code" class="java"> 

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class B {
	// ...省略主键以及其他属性的

	protected A a;

	@Entity
	@DiscriminatorValue(value = "A1")	
	public static class B1 extends B {
		@Override
		@ManyToOne(fetch = FetchType.LAZY)
		@JoinColumn(name = "A_ID")
		public A1 getA() {
			return (A1) a;
		}
	}

	@Entity
	@DiscriminatorValue(value = "A2")	
	public static class B2 extends B {
		@Override
		@ManyToOne(fetch = FetchType.LAZY)
		@JoinColumn(name = "A_ID")
		public A2 getA() {
			return (A2) a;
		}
	}

	//这里需要配置Transient，子类需override本方法负责具体映射
	@Transient
	public A getA() {
		return a;
	}

	public void setA(A a) {
		this.a = a;
	}
}

</pre><br />配置文件大概是这样的(关键是要把B$B1, B$B2, A1, A2列进去，而A基本可以不列进去)：<br /><br /><pre name="code" class="java">&lt;mapping class="com.yourapp.domain.B" />
&lt;mapping class="com.yourapp.domain.B$B1" />
&lt;mapping class="com.yourapp.domain.B$B2" />
&lt;mapping class="com.yourapp.domain.A1" />
&lt;mapping class="com.yourapp.domain.A2" /></pre><br /><br />经实践，这种方式用起来很顺畅，能够通过以下测试(测试期间一个事务保持Sesison不会被关闭):<br /><br />B b1 = bDao.loadById(某实际是B.B1类的纪录ID);<br />assertEquals(B.B1.class, b1.getClass());<br /><br />B b2 = bDao.loadById(某实际是B.B2类的纪录ID);<br />assertEquals(B.B2.class, b2.getClass());<br /><br />A a1 = b1.getA();<br />assertNotEquals(A1.class, a1.getClass());//Lazy的缘故导致不等<br />assertTrue(a1 instanceof A1);<br /><br />A a2 = b2.getA();<br />assertNotEquals(A2.class, a2.getClass());<br />assertTrue(a2 instanceof A2);
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/139584#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 10 Nov 2007 01:59:41 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/139584</link>
        <guid>http://qieqie.javaeye.com/blog/139584</guid>
      </item>
      <item>
        <title>内有不自量力慎入</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/136450" style="color:red;">http://qieqie.javaeye.com/blog/136450</a>&nbsp;
          发表时间: 2007年10月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          昨天来广州出差，有雾气有湿气，很像家里的那种雾气和湿气，反正感觉不错。<br />还吃了沙县小吃，蓝与白--北京都没有这两样东西<br />以前无名子/蓝与白很经常吃，特想他们，没想到广州有！<br /><br />出差前一直惦记着要去理个头发，但是时间总安排不过来给绕过去了，<br />今天刚好有时间，去了下面的理发店理发了<br />理发的MM说，我的普通话太好了，他听不懂。我很诧异。(我的普通话有福建口音的)<br /><br />无聊随便照了几张,吓到请自负<br /><br /><img src="http://paoding.net/press/guangzhou/5.jpg " /><br /><br /><br /><img src="http://paoding.net/press/guangzhou/4.jpg" />
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/136450#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 29 Oct 2007 18:23:23 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/136450</link>
        <guid>http://qieqie.javaeye.com/blog/136450</guid>
      </item>
      <item>
        <title>从搜索引擎的角度看中文分词算法</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/135825" style="color:red;">http://qieqie.javaeye.com/blog/135825</a>&nbsp;
          发表时间: 2007年10月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          核心：<br />从应用的角度看中文分词算法，是用于搜索引擎，或者智能识别语义等？应用的不同影响着中文分词的策略选择。<br /><br />正文：<br />建立索引或对用户输入的句子分词时，当遇到"<strong>Xx</strong>Yyv<strong>Zz</strong> "(每个字母代表一个汉字)这样一个句子时，<br />如果Xx和Zz是已经收录在词库中的词汇，而Y,y,v,Yy,yv,Yyv均不是词库的词汇，<br />分词器应该如何处理Yyv这个非词汇组成的孤立串呢？可能的处理情况有：<br />1、二元分词：Yy/yv<br />2、单字分词：Y/y/v<br />3、混合分词：Y/Yy/yv/v<br />4、不分分词：Yyv<br />5、通过上下文进行词频统计进行判断<br />6、根据历史智能学习，根据学习结果判断<br /><br />比如假设Y=黄，y=西，v=来，那么Yyv就是"黄西来"，对应的分词就是：<br />1、黄西/西来<br />2、黄/西/来<br />3、黄/黄西/西来/来<br />4、黄西来<br />5、不定结果<br />6、不定结果<br /><br />首先，第5、6种情况应该<strong>首先被排除</strong>！理由如下：<br /><br />通过上下文环境词频的统计进行判断，意味着不同的文章，该孤立字符串可能有不同的切分方法。<br />假设文章1采用Y/yv，文章2采用Yy/v，文章3采用Yyv.<br />当用户在输入框中仅仅输入Yyv三个字或还有少量的其他字时，<br />若采用方法5，则因为缺少足够上下文环境用于统计词频，几乎只会产生某一种分词结果。假设就分为了Yyv，那么，文章3可以被检索出来，而文章1和2则永远也不会检索出来！<br />若采用方法6，则以前被切分为Y/yv，因为自学习后，现在被切为Yyv，那么将导致以前的文章永远不会再被检索出来，除非重新建立索引。<br />所以方法5、6看起来美丽动人，但在搜索领域里不是很可行。<br /><br />由这一点展开的，我有2个有反很多人“想法”的结论：<br /><br /><strong>1、为搜索引擎服务的中文分词组件，不能具有上下文词频的功能，否则是不可用的。<br />2、为搜索引擎提服务的中文分词组件，不能具有自学习的功能，否则是不可用的。</strong><br />相反，作为为搜索引擎服务的中文分词组件，不是为了智能理解中文，而是为了良好地为用户提供良好的检索体验<br />要具有良好的检索体验，我认为应该在满足以下3条原则，并取得平衡：<br />a、索引建立要尽量快(和分词组件密切有关)，检索速度要快(和分词组件关系较疏但亦有关系，先略过不述)<br /><strong>b</strong>、用户想要的目标文章不要因为中文分词组件分词的原因被永远派出在检索结果之外(以上的例子违反了这一条，所以被首先排除出我的考虑范围)<br />c、不要让用户想要的文章淹没在不想要的文章中。<br /><br />说完以上的一些我个人的看法，我继续讨论Yyv的问题。<br /><br />paoding曾经采用过第3种方法，但是因认为分出的词语过多，目前2.0.4-alpha2采用的是第1种方法，但自己也一直都在挣扎当中，<br />今天我似乎能得出一个结论，<strong>paoding目前的做法并不好</strong>，目前的这种做法可能会违反以上的b原则。<br /><br />因为XxYyvZz被分成Xx/Yy/yv/Zz后，那么当用以XxY作为输入条件检索文章时，特别是作为短语查询时，XxYyvZz就不会被检索出来：<br />作为检索条件 XxY 会被paoding-2.0.4-alpha2分成Xx/Y，当使用QueryParser构造Query对象时，因为XxYyvZz的分词结果不满足同时存在这两个Term：Xx和Y，从而被忽略，违反了b原则。<br />而2.0.4之前采用做法3做法，虽然分出的词语过多，但却能够被检索出，其符合b原则。<br />(感慨：QueryParser真是个好东西，可用来测试分词组件的到底具不具有正确性)<br /><br /><strong>作为paoding分词的作者，经过了持续的一段时间思考，现在本人比较倾向于使用第2种分词方式，认为它应是最适合的：</strong>1、符合b原则：将XxYyvZz分成 Xx/Y/y/v/Zz，这样当用户输入XxY时，XxY会被切成Xx/Y，XxYyvZz符合了：a)同时具有Xx,Y两个term，b)且在分词排序上是近邻且顺序和用户输入一致。<br />(对Lucene的QueryParser来说，当输入没有分隔的汉字时，QueryParser会调用Analyzer对它进行分词，并理解短语处理)<br />2、符合c原则：用户以XxY作为输入条件，不会将XxZzYyv的文章检索出来，虽然他可能被分为Xx/Zz/Y/y/v：因为该文章分词结果上Y并没有紧接在Xx这个term后<br /><br />这种分词(方法2)的坏处：总是比二元分词(方法1)多分出一个词。这样从库的大小上，前者不及后者，库可能相应较大。<br /><br />----------------------------------<br />如果paoding-2.0.4-alpha2在这个方面如果真的选择错了，那我会义无反顾地把它改过来，哪怕落了个“不成熟”的帽子！<br /><br />关键是，还要听听各方的意见先。<br /><br /><br />----------------------<br /><span style="color: olive">paoding目前还不是paoding2.x的最终稳定版本。最终的稳定版本应该是2.0.4-beta后的2.0.4-final。<br />如果您愿意在paoding每次分发时(大概1个月1次)，您能够不嫌麻烦地做到paoding分发时提示的建议(可能需要重新建立索引库或词典重命名)，我建议您下载并使用paoding。(paoding程序bug现在倒是已经很难发现了)<br />如果不能遵照paoding分发的建议，比如需要重建索引，或不愿意使用未最终稳定的版本，请您等待至2.0.4-final版本(需等待3-6个月)。<br />谢谢！<br />---------------------<br />to new incoming:<br /><br />Paoding中文分词是一个使用Java开发的，可结合到Lucene应用中的，为互联网、企业内部网使用的中文搜索引擎分词组件。<br />Paoding填补了国内中文分词方面开源组件的空白，致力于此并希翼成为互联网网站首选的中文分词开源组件。<br />Paoding中文分词追求分词的高效率和用户良好体验。</span>
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/135825#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 26 Oct 2007 23:34:46 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/135825</link>
        <guid>http://qieqie.javaeye.com/blog/135825</guid>
      </item>
      <item>
        <title>庖丁中文分词示例应用paoding.net已上线使用</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/135607" style="color:red;">http://qieqie.javaeye.com/blog/135607</a>&nbsp;
          发表时间: 2007年10月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          地址：<a href="http://paoding.net" target="_blank">http://paoding.net</a><br /><br />这是庖丁中文分词的示例应用。使用的分词器版本是2.0.4-alpha2。<br />有关心庖丁中文分词的同学，可以通过访问<a href="http://paoding.net" target="_blank">http://paoding.net</a>测试庖丁的搜索效果。<br /><br />(2.0.4-alpha2发布时间是2007-10-22日)。<br /><br />----------------------------------------------------------<br />索引范围：<br />新浪博客，2007-9-27日统计的点击率最前的1000名博客地址。 <br />paoding建立了这1000个用户从其创建博客到2007-9-26日的所有文章，以及部分博客的9月27日的文章<br /><br />----------------------------------------------------------<br />重要数据摘要：<br />博客数： 1000 <br />博客文章数： >30万篇 <br />Lucene索引库个数： 1个<br />索引库状态： 已优化<br />索引库大小： <span style="color: red"><strong>3.03G</strong></span> <br />操作系统: REHL4 <br />查询效率： 没有不良体验
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/135607#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 26 Oct 2007 04:32:31 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/135607</link>
        <guid>http://qieqie.javaeye.com/blog/135607</guid>
      </item>
      <item>
        <title>冤家路窄：QueryParser对中文分词的要求</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/133318" style="color:red;">http://qieqie.javaeye.com/blog/133318</a>&nbsp;
          发表时间: 2007年10月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="quote_title">vincent 写道</div><div class="quote_div">用庖丁把这句话分词"北京精神文明建设"，可分成"北京 精神 精神文明 精神文明建设 文明 建设"（用lukeall打开看，确实有）。ok，问题来了，我查询"精神文明"结果为零。真的不明白为什么？？？如果按照实际用途，"精神文明建"这个词也应该能搜索出结果。我是用lucene2.2和 <br />paoding结合的，</div><br /><br />其实vincent提的这个问题是很棘手的。罪魁祸首是庖丁作者(也就是本人)没能很好了解QueryParser的对短语查询的要求。 <br /><br /><br />比如：对"中华人民共和国"进行分词，如果分为"中华/中华人民/中华人民共和国/华人/人民/人民共和国/共和/共和国/"或"中华/华人/人民/中 <br />华人民/共和/共和国/人民共和国/中华人民共和国/"等，这些分词结果看似完美，但对lucene的QueryParser来说却是有重大缺陷的。 <br /><br /><br />这2种分词结果导致使用"人民共和"通过QueryParser构造Query对象查询不到"中华人民共和国"的文章。 <br /><br /><br />why？ <br /><br /><br />QueryParser把"人民共和"当成一个短语查询，此时我们的分词结果及其顺序必须是 "人民/共和"才能符合它的要求被检索出来。而如果在"人民" 和 "共和"中间出现其他的分词，就如上面的"人民/人民共和国/共和"被"共和国"这个词隔开，这就不符合要求。所以查询不到。 <br /><br /><br />而这是CJKAnalyzer、ChineseAnalyzer以及StandardAnalyzer之类简单做法的中文分词不会出现的。 <br /><br /><br />那么现在应该如何解决这个问题： <br /><br /><br />“如果1个词能够被其他词语覆盖组成，那么它不应该再被建立索引”。只要满足这个条件QueryParser就很好用了，同时索引库更小，搜索精确度也不会有任何损失(应该说是提高了)。 <br /><br /><br />这样的结果便是： <br />对"中华人民共和国"的分词结果应该是："中华/华人/人民/共和/共和国"。虽然"中华人民共和国"在词典中存在。 <br />对"北京精神文明建设"的分词结果是"北京/精神/文明/建设/"，虽然"精神文明""精神文明建设"本身在词典也存在。 <br /><br /><br />我已经修改paoding来支持上面的做法，但还没马上提交代码，还需要几天。 <br />(这个修改不涉及CJKKnife的变更。而是1、通过加载字典，判断并把“中华人民共和国”之类的可由其他词语组合的词语从词典中去掉，从而使Knife不认识这些组合词  2、通过增强DefaultTokenCollector.java：由DefaultTokenCollector负责根据词语位置关系按照合理的顺序将CJKKnife分词的结果最终呈现给Lucene)<br /><br /><br />至于“‘精神文明建’这个词也应该能搜索出‘北京精神文明建设’结果”，则是不可能的。
          <br/>
          <span style="color:red;">
            <a href="http://qieqie.javaeye.com/blog/133318#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 19 Oct 2007 04:51:18 +0800</pubDate>
        <link>http://qieqie.javaeye.com/blog/133318</link>
        <guid>http://qieqie.javaeye.com/blog/133318</guid>
      </item>
      <item>
        <title>庖丁分词(2.0.4-alpha)的分词策略</title>
        <author>Qieqie</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://qieqie.javaeye.com">Qieqie</a>&nbsp;
          链接：<a href="http://qieqie.javaeye.com/blog/126944" style="color:red;">http://qieqie.javaeye.com/blog/126944</a>&nbsp;
          发表时间: 2007年09月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">public class AnalyzerTest extends TestCase {

 

    protected PaodingAnalyzer analyzer = new PaodingAnalyzer();

 

    protected StringBuilder sb = new StringBuilder();

 

    protected String dissect(String input) {

       try {

           TokenStream ts = analyzer.tokenStream("", new StringReader(input));

           Token token;

           sb.setLength(0);

           while ((token = ts.next()) != null) {

              sb.append(token.termText()).append('/');

           }

           if (sb.length() > 0) {

              sb.setLength(sb.length() - 1);

           }

           return sb.toString();

       } catch (Exception e) {

           e.printStackTrace();

           return "error";

       }

    }

 

    // --------------------------------------------------------------

    // 仅包含词语的句子分词策略

    // --------------------------------------------------------------

 

    /**

     * 句子全由词典词语组成，但词语之间没有包含、交叉关系

     */

    public void test100() {

       String result = dissect("台北中文国际");

       assertEquals("台北/中文/国际", result);

    }

 

    /**

     * 句子全由词典词语组成，但词语之间有包含关系

     */

    public void test101() {

       String result = dissect("北京首都机场");

       assertEquals("北京/首都/首都机场/机场", result);

    }

 

    /**

     * 句子全由词典词语组成，但词语之间有交叉关系

     */

    public void test102() {

       String result = dissect("东西已经拍卖了");

       assertEquals("东西/已经/拍卖/卖了", result);

    }

 

    /**

     * 句子全由词典词语组成，但词语之间有包含、交叉等复杂关系

     */

    public void test103() {

       String result = dissect("羽毛球拍");

       assertEquals("羽毛/羽毛球/羽毛球拍/球拍", result);

    }

 

    // --------------------------------------------------------------

    // noise词汇和单字的分词策略

    // --------------------------------------------------------------

 

    /**

     * 词语之间有一个noise字(的)

     */

    public void test200() {

       String result = dissect("足球的魅力");

       assertEquals("足球/魅力", result);

    }

 

    /**

     * 词语之间有一个noise词语(因之)

     */

    public void test201() {

       String result = dissect("主人因之生气");

       assertEquals("主人/生气", result);

    }

 

    /**

     * 词语前后分别有单字和双字的noise词语(与,有关)

     */

    public void test202() {

       String result = dissect("与谋杀有关");

       assertEquals("谋杀", result);

    }

 

    /**

     * 前有noise词语(哪怕)，后面跟随了连续的noise单字(了,你)

     */

    public void test203() {

       String result = dissect("哪怕朋友背叛了你");

       assertEquals("朋友/背叛", result);

    }

 

    /**

     * 前后连续的noise词汇(虽然,某些)，词语中有noise单字(很)

     */

    public void test204() {

       String result = dissect("虽然某些动物很凶恶");

       assertEquals("动物/凶恶", result);

    }

 

    // --------------------------------------------------------------

    // 词典没有收录的字符串的分词策略

    // --------------------------------------------------------------

 

    

    /**

     * 仅1个字的非词汇串(东,西,南,北)

     */

    public void test300() {

       String result = dissect("东&&西&&南&&北");

       assertEquals("东/西/南/北", result);

    }

 

    

    /**

     * 仅两个字的非词汇串(古哥,谷歌,收狗,搜狗)

     */

    public void test302() {

       String result = dissect("古哥&&谷歌&&收狗&&搜狗");

       assertEquals("古哥/谷歌/收狗/搜狗", result);

    }

    

    /**

     * 多个字的非词汇串

     */

    public void test303() {

       String result = dissect("这是鸟语：玉鱼遇欲雨");

       assertEquals("这是/鸟语/玉鱼/鱼遇/遇欲/欲雨", result);

    }

    

    /**

     * 两个词语之间有一个非词汇的字(真)

     */

    public void test304() {

       String result = dissect("朋友真背叛了你了!");

       assertEquals("朋友/真/背叛", result);

    }

    

    /**

     * 两个词语之间有一个非词汇的字符串(盒蟹)

     */

    public void test305() {

       String result = dissect("建设盒蟹社会");

       assertEquals("建设/盒蟹/社会", result);

    }

    

    /**

     * 两个词语之间有多个非词汇的字符串(盒少蟹)

     */

    public void test306() {

       String result = dissect("建设盒少蟹社会");

       assertEquals("建设/盒少/少蟹/社会", result);

    }

 

    // --------------------------------------------------------------

    // 不包含小数点的汉字数字

    // --------------------------------------------------------------

 

 

    /**

     * 单个汉字数字

     */

    public void test400() {

       String result = dissect("二");

       assertEquals("2", result);

    }

 

    /**

     * 两个汉字数字

     */

    public void test61() {

       String result = dissect("五六");

       assertEquals("56", result);

    }

 

    /**

     * 多个汉字数字

     */

    public void test62() {

       String result = dissect("三四五六");

       assertEquals("3456", result);

    }

 

    /**

     * 十三

     */

    public void test63() {

       String result = dissect("十三");

       assertEquals("13", result);

    }

 

    /**

     * 二千

     */

    public void test65() {

       String result = dissect("二千");

       assertEquals("2000", result);

    }

 

    /**

     * 两千

     */

    public void test651() {

       String result = dissect("两千");

       assertEquals("2000", result);

    }

 

    /**

     * 2千

     */

    public void test652() {

       String result = dissect("2千");

       assertEquals("2000", result);

    }

    

    /**

     * 

     */

    public void test653() {

       String result = dissect("3千万");

       assertEquals("30000000", result);

    }

    

    /**

     * 

     */

    public void test654() {

       String result = dissect("3千万个案例");

       assertEquals("30000000/30000000个/案例", result);

    }

 

 

    /**

     * 

     */

    public void test64() {

       String result = dissect("千万");

       assertEquals("千万", result);

    }

 

    public void test66() {

