﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-agun 阿甘 ---分享,共同进步</title><link>http://www.blogjava.net/agun/</link><description>激情成就梦想，努力创造未来</description><language>zh-cn</language><lastBuildDate>Wed, 08 Oct 2008 03:47:03 GMT</lastBuildDate><pubDate>Wed, 08 Oct 2008 03:47:03 GMT</pubDate><ttl>60</ttl><item><title>人体经络</title><link>http://www.blogjava.net/agun/archive/2008/09/16/229078.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Tue, 16 Sep 2008 01:12:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/09/16/229078.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/229078.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/09/16/229078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/229078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/229078.html</trackback:ping><description><![CDATA[<p>经络是人体的金矿</p>
<p>中国传统文化的精髓根基是道，</p>
<p>是阴阳，是周易，是八卦；枝和叶则是中医，军事，政治，外交，人伦，内外气功的修炼等。而中医无疑是这其中最具特色的了。如果说中医是传统文化中的国粹，那经络和穴位堪称人体内的金矿脉，渴望健康成长的人们一直在挖掘不止，从古止今，网络穴位对人体健康的伟大作用一直让人感觉既神秘有神往。</p>
<p>从中医古代大医学家对经济的论述中，我们知道了&#8220;一切疾病产生的根本原因就是身体里有关经络的失控&#8221;，所以，人的一切疾病都可以叫做&#8220;经络治&#8221;，它产生的预防作用就叫&#8220;经络防&#8221;。</p>
<p>经络的作用不仅仅是治疗已经发生的疾病，更重要的是治&#8220;未病&#8221;未病就是尚未成形，正在发展中的疾病，如果在疾病未成形的时候拿掉它，不是轻而易举的事情吗？如果等其形成了，甚至等它牢不可破了，再想拿掉它，那就不容易了，那就会吃力不讨好。</p>
<p>总之，人们可以通过针灸、推拿等很多简单、方便、省时的方式来刺激经络和穴位，从而保持人体各个脏腑功能的平衡、和谐，使气血畅通，身心团结，从而提高我们对外来疾病的战斗力。 </p>
<p>经络是什么？通俗的讲，经络就是运行气血的线路。它分布在全身的上下里外，如果说我们的身体是一座大厦的话，那么经络就好比是埋伏在大厦墙体里的电线网络，灯火通明的大厦全靠这些网络来通电，一旦电线短路，大厦就会陷入黑暗之中；同样，经络不通了，我们的气血就不能很好的运送到各个脏腑，我们的身体就有问题。</p>
<p>你清楚自己的身体吗？我们全身的经络就好像山川大河，川流不息奔腾无阻，五脏脏腑色彩颜色鲜明，层次分明，如同博物馆陈列的珍贵器物一样，各得其所。你知道阴阳，五行，五色，五味这些听起来很玄的东西跟我们身体的经络有联系吗？</p>
<p>中医很讲究阴阳，经络也不例外。中医上将经络中内属于脏的，跟脏直接相连、关系最紧密的经称为阴经，它与脏对应的腑又有紧密联系，中医称这种关系为络； 内属于腑的，跟腑直接相连、关系最紧密的经称为阳经，同样它络于腑相对应的脏。阳经在四肢的阳面，阴经在四肢的阴面。日常的保健以敲阳经为主。阳代表那些向上的、明亮的、亢进的、强壮的东西；阴则代表向下的、黑暗的、衰退的、虚弱的，和阳相反的一些东西。阴阳是相互依赖的。人们总向往着阳的方面，比如希望自己有用不完的精力，活跃的思维，强壮的身体。但如果懂得阴阳的关系，你就知道必须养足自己的阴，才能得到所向往的阳。只要平时注意养生方法，比如睡眠法、四季睡眠和子午觉、敲经络，就能保持阴阳平衡。</p>
<p><br />
中医的五行学说，是以木、火、土、金、水五种物质的特性来归类自然界的各种事物和现象。五行相生的次序是：木生火、火生土、土生金、金生水、水生木。五行相克的次序是：木克土、土克水、水克火、火克金、金克木。人体经络脏腑的有关，同时也与五行相对应，即木、火、土、金、水分别对应肝经、心经、脾经、肺经、肾精，同时也存在五行相生相克的关系。</p>
<p>肝经太旺的人平时都喜欢生气，因为肝经主怒，若是女士的话容易得乳腺增生，因为肝经循行经过乳房；肝经有异常的话同时影响到脾经，又因为土克木，所以同时她也会有消化系统方面的问题，比如腹泻、腹胀或胃痛等。因此有这样症状的人平时主要敲肝经，就是敲腿的内侧，或者推两侧胁肋部，舒理肝气。</p>
<p>另外，青红黄白黑五色分别对应肝经、心经、脾经、肺经、肾经。根据经络与五色的对应关系，建议心经虚的人，即心慌、心悸的人多穿红色的衣服；肺经虚的人，即平常经常感冒的人多穿白色衣服；肝经虚的人，就是平时胆子小，容易被惊吓的人多穿青色的衣服；肾经虚的人，平常怕冷，小便次数多而且清长的人多穿黑色衣服；脾经虚的人，即消化功能不好的人多穿黄色衣服。</p>
<p>在中医理论中，经络与五味的对应为酸入肝经、甘入脾经、苦入心经、辛入肺经、咸入肾经，五味功能性能为酸收，甘缓、苦泻、辛走、咸润。五味选择性地作用于经络，并通过经络传导间接的作用于脏腑。有的人爱吃甜的，有的人爱吃算的，每个人对味道都有偏好，一般情况下不会影响健康。但这种偏好不能太过。如果这个人喜欢吃酸的，但已经有胃痛了，那就少吃了，因为酸属木，旺肝经，木克土而胃属于土的。</p>
<img src ="http://www.blogjava.net/agun/aggbug/229078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-09-16 09:12 <a href="http://www.blogjava.net/agun/archive/2008/09/16/229078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>成功12级跳（转载）</title><link>http://www.blogjava.net/agun/archive/2008/09/09/227935.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Tue, 09 Sep 2008 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/09/09/227935.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/227935.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/09/09/227935.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/227935.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/227935.html</trackback:ping><description><![CDATA[<h2 style="margin: 0.25em 0px 0px">
<div>成功12级跳<a title="blocked::http://dhlmtzx.edudh.net/oblog/default.asp?id=2535" href="http://dhlmtzx.edudh.net/oblog/default.asp?id=2535" target="_blank"></a></div>
</h2>
<br />
　　<strong>第1跳:1个目标</strong><br />
<br />
　　一艘没有航行目标的船，任何方向的风都是逆风，请明确以下几点：<br />
　　1.你为什么是穷人——很多时候是因为你没有立下成为富人的目标。<br />
　　2.你的人生核心目标是什么——杰出人士与平庸之辈的根本差别，并不是天赋、机遇，而在于有无目标。<br />
　　3.起跑领先一步，人生领先一大步：成功从选定目标开始。<br />
　　4.贾金斯式的人永远不会成功——为什么大多数人没有成功？真正能完成自己计划的人只有5%，大多数人不是将自己的目标舍弃，就是沦为缺乏行动的空想。<br />
　　5.如果你想在35岁以前成功，你一定得在25～30岁之间确立好你的人生目标。<br />
　　6.每日、每月、每年都要问自己：我是否达到了自己定下的目标？<br />
<br />
　　<strong>第2跳：2个成功基点</strong><br />
<br />
　　站好位置，调正心态，努力冲刺，35岁以前成功。<br />
　　（一）人生定位<br />
　　1.人怕入错行：你的核心竞争力是什么？<br />
　　2.成功者找方法，失败者找借口。<br />
　　3.从三百六十行中选择你的最爱：很多时候兴趣所在是成功的动力。人人都可以创业，但却不是人人都能创业成功。<br />
　　4.寻找自己的黄金宝地。<br />
<br />
　　（二）永恒的真理：心态决定命运，35岁以前的心态将决定你一生的命运。<br />
　　1.不满现状的人才能成为富翁——能追不尽景，始是不凡人。<br />
　　2.敢于梦想，勇于梦想——这个世界永远属于追梦的人。<br />
　　3.35岁以前不要怕，35岁以后不要悔。<br />
　　4.出身贫民，并非一辈子是贫民，只要你永远保持一颗进取的心——举目远望，中国成功人士很多来自小地方。<br />
　　5.做一个积极的思维者。<br />
　　6.不要败给悲观的自己。<br />
　　有的人比你富有一千倍，他们也会比你聪明一千倍么？不会，他们只是年轻时心气比你高一千倍。人生的好多次失败，最后并不是败给别人，而是败给了悲观的自己。<br />
　　7.成功者不过是爬起来比倒下去多一次<br />
　　8.宁可去碰壁，也不要在家里面壁.克服你的失败、消极的心态——找个地方喝点酒，或找个迪厅跳跳舞，或找帮朋友侃侃而谈，然后，积极行动起来。<br />
<br />
　　<strong>第3跳：3大技巧</strong><br />
<br />
　　1.管理时间：你的时间在哪里，你的成就就在哪里。<br />
　　一个把1小时看成60分钟的人，比一个将之看作一小时的人的时间，要多60倍。<br />
　　2.你不理财，财不理你。<br />
　　3.自我管理，游刃有余——创业不怕本小，脑子一定要好；可以考虑开家特色店；做别人不愿做的生意。<br />
<br />
　　<strong>第4跳：4项安身立命的理念</strong><br />
<br />
　　35岁以前一定要形成个人风格，正如小天后蔡依林所唱：要有属于你自己的招牌动作。<br />
　　1.做人优于做事。<br />
　　做事失败可以重来，做人失败却不能重来：做人要讲义气；做事永不气馁。<br />
　　2.豁达的男人有财运，所以，35岁前请搞定你的婚姻生活——找个豁达的男人做老公吧！<br />
　　3.忠诚的原则：35岁前你还没有建立起忠诚美誉，这一缺点将要困扰你一生。<br />
　　4.把小事做细，但不要耍小聪明——中国人想做大事的人太多，而愿把小事做完美的人太少。<br />
<br />
　　<strong>第5跳：5分运气</strong><br />
<br />
　　比尔?盖茨说：人生是不公平的，习惯去接受它吧！<br />
　　1.人生的确有很多运气的成分：谋事在人，成事在天。<br />
　　2.机会时常意外地降临，但常常属于那些决不放弃的人。<br />
　　3.抓住人生的每一次机会——机会就像一只小鸟，如果你不抓住，它就会飞得无影无踪。<br />
　　4.智者早一步，愚者晚一步。<br />
<br />
　　<strong>第6跳：6项要求</strong><br />
<br />
　　1.智慧：别人可你以拿走你的一切，但拿不走你的智慧；巧妙运用自己的智慧。<br />
　　2.勇气：勇气的力量有时会让你成为"超人"；敢于放弃，敢于"舍得"。<br />
　　3.培养自己的"领导才能、领袖气质"——有机会一定要登顶"振臂一呼，应者云集"的境地。<br />
　　4.创造性：不要做循规蹈矩的人。25～35岁是人生最有创造性的阶段，很多成功人士也都产生在这一阶段。<br />
　　5.明智：知道自己的长处、短处，定向聚焦；尽量在自己的熟悉的领域努力。<br />
　　6.持之以恒的行动力：在你选定的行业坚持十年，你一定会有机会笑到最后。<br />
<br />
　　<strong>第7跳：7分学习</strong><br />
<br />
　　1.知识改变命运。<br />
　　2.35岁前学会你行业中必要的一切知识——每天淘汰你自己；在商言商；太相信书本的人，只能成为打工仔。<br />
　　3.思考、实践，再思考、再实践。<br />
<br />
　　<strong>第8跳：8分交际</strong><br />
<br />
　　朋友多了路好走：<br />
　　1.智商很重要，情商更重要：35岁前请务必建立起人际关系网。<br />
　　2.人脉即财脉。<br />
　　3.交友有原则。<br />
　　4.善于沟通：35岁前一定要锻炼出自己的演讲才能，很多成功人士首先是个出色的演说家。<br />
<br />
　　<strong>第9跳：9分习惯</strong><br />
<br />
　　习惯的力量是惊人的，35岁前养成的习惯决定着你的成功的大小。<br />
　　1.积极思维的好习惯。<br />
　　2.养成高效工作的好习惯——学会喜欢并习惯你的办公室；生活可以不拘小节，但工作一定要谨小慎微；学习聆听，不打断别人说话。<br />
　　3.养成锻炼身体的好习惯。<br />
　　4.广泛爱好的好习惯。<br />
　　5.快速行动的好习惯。<br />
<br />
　　<strong>第10跳：10分自信</strong><br />
<br />
　　1.自信是成功的精神支柱。<br />
　　2.自信方能赢得别人的信任。<br />
　　3.把自信建立在创造价值的基础上。<br />
　　4.如何建立自信——为自己确立目标；发挥自己的长处；做事有计划、不拖拉、不轻言放弃；学会自我激励；坚持做你自己。<br />
<br />
　　<strong>第11跳11个需要避开的成功陷阱</strong><br />
<br />
　　1.只有功劳，没有苦劳；<br />
　　2.不要"怀才不遇"，而要寻找机遇；<br />
　　3.不要想发横财；<br />
　　4.不要为钱而工作，而让钱为你工作；<br />
　　5.盲目跟风，人云亦云，人做我也做；<br />
　　6.小富即安，不思进取，知足常乐；<br />
　　7.承认错误而非掩饰错误；<br />
　　8.脚踏实地而非想入非非；<br />
　　9.野心太大而不是信心十足；<br />
　　10.反复跳槽不可取；<br />
　　11.眼高手低；不择手段。<br />
<br />
　　<strong>第12跳12分努力</strong><br />
<br />
　　没有人能随随便便成功：<br />
　　1.小不是成功，大不是成功，由小变大才是成功；<br />
　　2.中国社会进入微利时代：巧干+敢干+实干=成功；<br />
　　3.努力尝试就有成功的可能；<br />
　　4.做任何事情，尽最大努力；<br />
　　5.把事情当成事业来做；<br />
　　6.争取早日掘到人生的第一桶金<br />
<img src ="http://www.blogjava.net/agun/aggbug/227935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-09-09 14:12 <a href="http://www.blogjava.net/agun/archive/2008/09/09/227935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据结构与算法(1)</title><link>http://www.blogjava.net/agun/archive/2008/08/01/219293.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Fri, 01 Aug 2008 04:02:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/08/01/219293.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/219293.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/08/01/219293.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/219293.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/219293.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一，概述许多将要讨论到的算法直接适用于某些特殊的数据结构。对于大多数数据结构来说，都需要知道如何插入一条新的数据寻找某一条特定的数据项删除某一特定的数据项1，数据结构的特征：数据结构&nbsp;&nbsp;&nbsp; 优点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/agun/archive/2008/08/01/219293.html'>阅读全文</a><img src ="http://www.blogjava.net/agun/aggbug/219293.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-08-01 12:02 <a href="http://www.blogjava.net/agun/archive/2008/08/01/219293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用数据库函数对比(1)</title><link>http://www.blogjava.net/agun/archive/2008/07/30/218787.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Wed, 30 Jul 2008 09:20:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/07/30/218787.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/218787.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/07/30/218787.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/218787.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/218787.html</trackback:ping><description><![CDATA[<p><font style="background-color: #c7edcc">今天在处理postgreSQL数据库的函数的时候。遇到了一个问题</font></p>
<p><font style="background-color: #c7edcc">我要在select语句中来判断某个字段的属性是否为空，或者是否为一个特定的值，我需要作判断，在<br />
oracle中我们会用nvl decode 等函数。同样 mysql 中会有ifnull,if 函数。有时候会搞混，忘记了那</font></p>
<p><font style="background-color: #c7edcc">个哪个数据库支持这个函数了。</font></p>
<p><font style="background-color: #c7edcc">于是就总结一下，不同数据库中的一些常用函数，这样方便以后使用。</font></p>
<p><font style="background-color: #c7edcc"><strong><span style="color: red"><font style="background-color: #c7edcc">一，日期操作&nbsp; </font></span><br />
</strong><br />
</font><font style="color: #ff6600; background-color: #c7edcc">1，操作当前日期和时间</font></p>
<p><font style="background-color: #c7edcc">Microsoft SQL Server <br />
&nbsp; Select GETDATE()<br />
&nbsp; GO<br />
MySQL 返回日期不包括时间 <br />
&nbsp; Select CURDATE();<br />
MySQL 返回日期和时间 <br />
&nbsp; Select NOW();<br />
oracle <br />
&nbsp; Select SYSDATE&nbsp; FROM dual;<br />
PostgreSQL <br />
&nbsp; Select CURRENT_DATE;<br />
&nbsp; Select NOW();返回日期时间还包括时区</font></p>
<p><font style="color: #ff6600; background-color: #c7edcc">2，操作时间的获取子域</font></p>
<p><font style="background-color: #c7edcc">Microsoft SQL Server <br />
&nbsp; Select DATEPART(dw, GETDATE())<br />
&nbsp; GO</font></p>
<p><font style="background-color: #c7edcc">MySQL <br />
&nbsp; Select DAYNAME(CURDATE());</font></p>
<p><font style="background-color: #c7edcc">oracle <br />
&nbsp; Select TO_CHAR(SYSDATE,'Day')<br />
&nbsp; FROM dual;</font></p>
<p><font style="background-color: #c7edcc">PostgreSQL <br />
&nbsp;Select DATE_PART('dow',date 'now');//dow = day of week<br />
&nbsp;Select DATE_PART('hour', timestamp 'now')</font></p>
<font style="background-color: #c7edcc">
<p><br />
Microsoft SQL 中调用函数DATEPART语法为： DATEPART(datetype, date_expression).函数参数</p>
<p>datetype 为month, day, week, day of week 等，而第二个参数为包含日期类型的字段或者一个真实</p>
<p>的日期值，而mysql中的DAYNAME函数就是直接指定了当前日期为星期几，oracle中的TO_CHAR可以从日</p>
<p>期中拿到所需要的子域，日期，小时，分钟等。</p>
<p><span style="color: #ff6600">3，时间间隔，在一些应用中需要知道两个时间间隔多远</span></p>
<p>Microsoft SQL Server <br />
&nbsp; Select DATEDIFF(dd, '1/1/01', GETDATE())<br />
&nbsp; GO</p>
<p>MySQL <br />
&nbsp; Select FROM_DAYS(TO_DAYS(CURDATE()) - <br />
&nbsp; TO_DAYS('2001-11-25'));</p>
<p>oracle <br />
&nbsp; Select TO_DATE('25-Nov-2000','dd-mon-yyyy') - <br />
&nbsp; TO_DATE('25-Aug-1969','dd-mon-yyyy') <br />
&nbsp; FROM dual;</p>
<p>PostgreSQL </p>
<p>&nbsp; Select AGE(CURRENT_DATE, '25-Aug-1969');</p>
<p>测量不同时间的间隔，不同的数据库之间函数语法有很大的不同。</p>
<p><span style="color: #ff6600">4，日期时间格式化</span></p>
<p>Microsoft SQL Server <br />
&nbsp; Select CONVERT(VARCHAR(11), GETDATE(), 102)<br />
&nbsp; GO<br />
MySQL <br />
&nbsp; Select DATE_FORMAT( \"2001-11-25\", \"%M %e, %Y\");<br />
oracle <br />
&nbsp; Select TO_CHAR(SYSDATE,'dd-Mon-yyyy hh:mi:ss PM') <br />
&nbsp; FROM dual;<br />
PostgreSQL <br />
&nbsp; Select TO_CHAR (timestamp(CURRENT_DATE),'dd-Mon-yyyy hh:mi:ss PM');</p>
<p><span style="color: red"><strong>二，字符串操作 </strong></span></p>
<p><span style="color: #ff6600">1，字符串中包含字符</span></p>
<p>Microsoft SQL Server <br />
&nbsp; Select CHARINDEX('eat', 'great')<br />
&nbsp; GO<br />
MySQL <br />
&nbsp; Select POSITION('eat' IN 'great');<br />
oracle <br />
&nbsp; Select INSTR('Great','eat') FROM dual;<br />
PostgreSQL <br />
&nbsp; Select POSITION('eat' IN 'great');</p>
<p>通过上面的这些函数可以确定字符串在另一个字符串中的位置（及另一个字符串包含这个字符串的位置）。</p>
<p><span style="color: #ff6600">2，字符串去掉空格</span></p>
<p>Microsoft SQL Server <br />
&nbsp; Select LTRIM('&nbsp; sql_in_a_nutshell'), <br />
&nbsp;&nbsp;&nbsp;&nbsp; Select RTRIM('sql_in_a_nutshell&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '),<br />
&nbsp;&nbsp;&nbsp;&nbsp; Select LTRIM(RTRIM('&nbsp;&nbsp;&nbsp;&nbsp; sql_in_a_nutshell&nbsp;&nbsp;&nbsp;&nbsp; ')<br />
&nbsp; GO<br />
MySQL <br />
&nbsp; Select LTRIM('&nbsp; sql_in_a_nutshell'), <br />
&nbsp;&nbsp;&nbsp;&nbsp; Select RTRIM('sql_in_a_nutshell&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '),<br />
&nbsp;&nbsp;&nbsp;&nbsp; Select TRIM('&nbsp;&nbsp;&nbsp;&nbsp; sql_in_a_nutshell&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '),<br />
&nbsp;&nbsp;&nbsp;&nbsp; Select TRIM(BOTH FROM '&nbsp;&nbsp;&nbsp;&nbsp; sql_in_a_nutshell&nbsp;&nbsp;&nbsp;&nbsp; ');<br />
oracle <br />
&nbsp; Select LTRIM('&nbsp; sql_in_a_nutshell'), <br />
&nbsp;&nbsp;&nbsp;&nbsp; Select RTRIM('sql_in_a_nutshell&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '),<br />
&nbsp;&nbsp;&nbsp;&nbsp; TRIM('&nbsp;&nbsp;&nbsp;&nbsp; sql_in_a_nutshell&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ') <br />
&nbsp; FROM dual;<br />
PostgreSQL <br />
&nbsp; Select TRIM(LEADING FROM '&nbsp;&nbsp;&nbsp;&nbsp; sql_in_a_nutshell'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRIM(TRAILING FROM 'sql_in_a_nutshell&nbsp;&nbsp;&nbsp;&nbsp; '),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRIM(BOTH FROM '&nbsp;&nbsp;&nbsp;&nbsp; sql_in_a_nutshell&nbsp;&nbsp;&nbsp;&nbsp; ');</p>
<p><span style="color: #ff6600">3，上面清除空格相反的操作，添加空格</span></p>
<p>Microsoft SQL Server <br />
&nbsp; Not supported<br />
MySQL <br />
&nbsp; Select LPAD('sql_in_a_nutshell', 20, ' '),&nbsp; <br />
&nbsp;&nbsp;&nbsp; RPAD('sql_in_a_nutshell', 20, ' ');<br />
oracle <br />
&nbsp; Select LPAD(('sql_in_a_nutshell', 20, ' '), <br />
&nbsp;&nbsp;&nbsp; RPAD(('sql_in_a_nutshell', 20, ' ') <br />
&nbsp; FROM dual;<br />
PostgreSQL <br />
&nbsp; Select LPAD('sql_in_a_nutshell', 20, ' '),&nbsp; <br />
&nbsp;&nbsp;&nbsp; RPAD('sql_in_a_nutshell', 20, ' ');<br />
上面支持该操作的数据库的函数都相同，并且都包括从左和右添加空格的方法。</p>
<p><span style="color: #ff6600">4，字符串替换</span></p>
<p>Microsoft SQL Server [returns 'wabbit_hunting_season'] <br />
&nbsp; Select STUFF('wabbit_season', 7, 1, '_hunting_') <br />
&nbsp; GO<br />
MySQL [returns 'wabbit_hunting_season'] <br />
&nbsp; Select <br />
&nbsp;&nbsp;&nbsp;&nbsp; REPLACE('wabbit_season','it_','it_hunting_');<br />
oracle [returns 'wabbit_hunting_season'] <br />
&nbsp; Select <br />
&nbsp;&nbsp;&nbsp;&nbsp; REPLACE('wabbit_season','it_','it_hunting_') <br />
&nbsp; FROM dual; <br />
PostgreSQL <br />
&nbsp; Select TRANSLATE('wabbit_season','it_','it_hunting_');<br />
&nbsp; Select replace('wabbit_season','it_','it_hunting_');</p>
<p><span style="color: #ff6600">5，字符串截取</span></p>
<p>Microsoft SQL Server <br />
&nbsp; Select SUBSTRING('wabbit_duck_season', 7, 11) <br />
&nbsp; GO<br />
MySQL <br />
&nbsp; Select <br />
&nbsp;&nbsp;&nbsp;&nbsp; SUBSTRING('wabbit_duck_season', 7, 11);<br />
oracle <br />
&nbsp; Select SUBSTR('wabbit_duck_season', 7, 11) <br />
&nbsp; FROM dual;<br />
PostgreSQL <br />
&nbsp; Select SUBSTR('wabbit_duck_season', 7, 11);</p>
<p><span style="color: red"><strong>三，条件判断</strong></span></p>
<p><span style="color: #ff6600">1，条件判断</span><br />
Microsoft SQL Server <br />
&nbsp; Select&nbsp; CASE <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN foo = 'hi'&nbsp;&nbsp; THEN 'there'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN foo = 'good' THEN 'bye'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE 'default'<br />
&nbsp; END<br />
&nbsp; FROM t2<br />
&nbsp; GO</p>
<p>MySQL <br />
&nbsp;&nbsp; select if(('11'='11'),'1','2')<br />
&nbsp;&nbsp; select if(2&gt;1,'1','2')</p>
<p><br />
oracle <br />
&nbsp; Select DECODE <br />
&nbsp;&nbsp;&nbsp;&nbsp; (payments_info,'CR','Credit','DB','Debit', null)<br />
&nbsp; FROM dual;</p>
<p>PostgreSQL <br />
&nbsp; Select CASE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN foo = 'hi'&nbsp;&nbsp; THEN 'there'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHEN foo = 'good' THEN 'bye'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE 'default'<br />
&nbsp; END <br />
&nbsp; FROM t2;</p>
<p>上面的函数我们就不多作解释了，很容易理解，我们来说一下mysql的if()函数，如果第一个参数为</p>
<p>true那么返回地二个参数，否则返回第三个参数。</p>
<p><span style="color: #ff6600">2，判断空函数</span></p>
<p><br />
Microsoft SQL Server <br />
&nbsp; Select ISNULL(foo, 'Value is Null')<br />
&nbsp; GO</p>
<p>MySQL <br />
&nbsp;&nbsp; select ifnull(122,'aaa')</p>
<p>oracle <br />
&nbsp; Select NVL(foo,'Value is Null') <br />
&nbsp; FROM dual;<br />
PostgreSQL&nbsp; <br />
&nbsp; Select coalesce(foo,'Value is Null')</p>
<p><br />
<span style="color: #ff6600">3，下面与上面的函数不同</span></p>
<p>Microsoft SQL Server [returns NULL when foo equates to 'Wabbits!'] <br />
&nbsp; Select NULLIF(foo, 'Wabbits!')<br />
&nbsp; GO<br />
MySQL <br />
&nbsp; N/A<br />
oracle <br />
&nbsp; Select DECODE(foo,'Wabbits!',NULL) <br />
&nbsp; FROM dual;<br />
PostgreSQL <br />
&nbsp; Select NULLIF(foo, 'Wabbits!'); <br />
函数语法:NULLIF(expression1, expression2)<br />
如果 expression1 等于 expression2则返回 NULL，如果expression1的值为null,也返回NULL<br />
</font></p>
<img src ="http://www.blogjava.net/agun/aggbug/218787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-07-30 17:20 <a href="http://www.blogjava.net/agun/archive/2008/07/30/218787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 支持 postgis函数</title><link>http://www.blogjava.net/agun/archive/2008/07/15/215089.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Tue, 15 Jul 2008 15:05:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/07/15/215089.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/215089.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/07/15/215089.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/215089.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/215089.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天上午一位朋友问到了，关于hibernate中是否支持postgis函数的问题，我就这个问题，随便聊几句。要想使用hibernate的空间数据操作，就要提到一个概念 java Topology Suite (字面上理解就是 空间拓扑的意思，简称JTS,注意：过需要声明一点，本文中的JTS与进行java事务处理的JTS、JTA没有联系).HIBERNATE中对空间数据作了支...&nbsp;&nbsp;<a href='http://www.blogjava.net/agun/archive/2008/07/15/215089.html'>阅读全文</a><img src ="http://www.blogjava.net/agun/aggbug/215089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-07-15 23:05 <a href="http://www.blogjava.net/agun/archive/2008/07/15/215089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript面向对象编程 </title><link>http://www.blogjava.net/agun/archive/2008/07/09/213822.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Wed, 09 Jul 2008 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/07/09/213822.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/213822.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/07/09/213822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/213822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/213822.html</trackback:ping><description><![CDATA[<div class="post">
<div class="posthead">
<h2><a class="singleposttitle" id="AjaxHolder_ctl01_TitleUrl" href=""  href_cetemp>JavaScript面向对象编程</a> (转载)</h2>
</div>
<div class="postbody">
<p><font face="Courier New"><strong>一、引言</strong><br />
&nbsp; 长久以来，JavaScript在Web开发中一直处于被忽视的地位，甚至有相当一部分开发人员对它产生了误解，认为JavaScript只不过是用来完成一些花哨功能的雕虫小技。网络上广为流传的低质量的JavaScript代码对此也起到了推波助澜的作用...很多应用中JavaScript都采用了面向过程的编程方式，代码的可扩展性不好，复制粘贴的代码比比皆是...<br />
&nbsp; 随着Ajax等技术的广泛使用，YUI、Prototype等对JavaScript的应用可谓是淋漓尽致、出神入化。人们才发现原来JavaScript可以实现如此强大的功能，具备如此优雅的架构...<br />
<br />
<strong>二、准备</strong><br />
<span style="color: red">1、概念</span><br />
JavaScript是一种弱类型语言。包括：<br />
基本类型：数字Number，字符串String，布尔值Boolean；<br />
复合类型：对象Object，数组Array；<br />
工具类型：全局对象Global，日期Date，数学对象Math，正则表达式RegExp，错误对象Error；<br />
特殊类型：函数Function。<br />
<br />
这里我只想说两点：<br />
1）基本数据类型的包装对象<br />
每一个基本数据类型都有一个对应的对象类。可以灵活地实现类型转换。简单地说，JavaScript不仅支持数字、字符串和布尔值这些数据类型，还支持Number、String、Boolean类，这些类是基本数据类型的包装(wrapper)。<br />
例子：<br />
var s="some string";<br />
var len=s.length;<br />
这里，s保存了一个字符串，原始的字符串值是不会改变的。一个新的String对象被创建了，实现了对长度属性的访问，之后它就被销毁了。<br />
其它例子：<br />
var a="some string";<br />
var b=new String("some string");<br />
var c=["a","b","c"];<br />
var d=new Array("a","b","c");</font></p>
<p><font face="Courier New">alert(typeof a);//string<br />
alert(a instanceof String);//false<br />
alert(a instanceof Object);//false</font></p>
<p><font face="Courier New">alert(typeof b);//object<br />
alert(b instanceof String);//true<br />
alert(b instanceof Object);//true</font></p>
<p><font face="Courier New">alert(typeof c);//object<br />
alert(c instanceof Array);//true<br />
alert(c instanceof Object);//true</font></p>
<p><font face="Courier New">alert(typeof d);//object<br />
alert(d instanceof Array);//true<br />
alert(d instanceof Object);//true<br />
<br />
2）Function类型<br />
做为JavaScript的一种特殊类型，我们将看到函数在面向对象编程中起到了非常关键的作用。<br />
<br />
<span style="color: red">2.值和引用</span><br />
<table style="width: 533px; height: 174px" cellspacing="2" cellpadding="2" width="533" border="0">
    <tbody>
        <tr>
            <td><strong>类型</strong></td>
            <td><strong>复制</strong></td>
            <td><strong>传递</strong></td>
            <td><strong>比较</strong></td>
        </tr>
        <tr>
            <td><strong>数字</strong></td>
            <td>值</td>
            <td>值</td>
            <td>值</td>
        </tr>
        <tr>
            <td><strong>布尔值</strong></td>
            <td>值</td>
            <td>值</td>
            <td>值</td>
        </tr>
        <tr>
            <td><strong>字符串</strong></td>
            <td>不可变的</td>
            <td>不可变的</td>
            <td>值</td>
        </tr>
        <tr>
            <td><strong>对象</strong></td>
            <td>引用</td>
            <td>引用</td>
            <td>引用</td>
        </tr>
        <tr>
            <td><strong>函数</strong></td>
            <td>引用</td>
            <td>引用</td>
            <td>引用</td>
        </tr>
        <tr>
            <td><strong>数组</strong></td>
            <td>引用</td>
            <td>引用</td>
            <td>引用</td>
        </tr>
    </tbody>
</table>
<br />
</font><font face="Courier New">例子：<br />
var s1="hello";<br />
var s2="hell"+"o";<br />
alert(s1==s2);//true</font></p>
<p><font face="Courier New">var d1=new Date();<br />
var d2=new Date();<br />
alert(d1==d2);//false</font></p>
<p><font face="Courier New"><span style="color: red"><font face="Courier New">3.this</font></span><br />
在构造函数中，指代新创建的对象实例；<br />
在对象的方法被调用时，指代调用该方法的对象实例。<br />
<br />
<span style="color: red">4.arguments</span><br />
arguments属性由解释器创建，用于访问函数对象的每一个参数。<br />
<br />
<span style="color: red">5.callee,caller<br />
</span>arguments的callee属性获取对正在执行的Function对象的引用；<br />
Function对象的caller属性获取正在调用当前函数的父函数对象。<br />
<br />
<span style="color: red">6.apply,call</span><br />
两者都是将函数绑定到其它对象上执行的，区别在于调用方式：<br />
apply([thisObj[,argArray]])<br />
call([thisObj[,arg1[,arg2[,[,.argN]]]]])<br />
<br />
<span style="color: red">7.匿名函数</span><br />
(function(a,b){<br />
&nbsp;return a+b;<br />
&nbsp;})(1,1);<br />
等价于：<br />
function f(a,b){<br />
&nbsp;return a+b;<br />
}<br />
f(1,1);<br />
<br />
<span style="color: red">8.null,undefined</span><br />
null是JavaScript的关键字，表示空值。可以看作Object类型的一个特殊值。<br />
undefined不是关键字，它是一个全局变量，使用了未定义变量、变量未赋值、void运算符，都会返回&#8220;undefined&#8221;。<br />
<br />
<span style="color: red">9.constructor</span><br />
从JavaScript1.1开始，每个对象都具有一个constructor属性，它引用的是用来初始化该对象的构造函数。<br />
<br />
<span style="color: red">10.prototype</span><br />
JavaScript1.1引入了原型对象的概念，每一个对象都有一个原型对象，对象可以继承它的原型对象的所有属性和方法。<br />
要为一个对象的类制定原型对象，需要将构造函数的prototype属性设置为指定的对象。之后，如果用构造函数初始化对象时，会自动将指定的对象作为新创建对象的原型对象。<br />
<br />
注意：<br />
1）使用原型对象可以减少每个继承对象的内存需求量；<br />
2）即使属性是在对象被创建后才加到它的原型对象中的，对象也能够继承这些后定义的属性。<br />
3）当调用一个对象的一个属性时，先在该对象定义内查找该属性，如果没有该属性才到该对象的原型对象中查找，依此类推。<br />
<br />
<strong>三、实现</strong><br />
在面向对象编程中，我们可以把过程编程中的一个个function看作一个个独立定义的类，函数名即为类名。<br />
<span style="color: red">1.例子：Circle类</span><br />
function Circle(radius){<br />
&nbsp;//实例变量<br />
&nbsp;this.r=radius;<br />
}</font></p>
<p><font face="Courier New">//静态变量<br />
Circle.PI=3.14159;</font></p>
<p><font face="Courier New">//实例方法<br />
Circle.prototype.area=function(){<br />
&nbsp;return Circle.PI*this.r*this.r;<br />
}</font></p>
<p><font face="Courier New">//静态方法<br />
Circle.max=function(a,b){<br />
&nbsp;if(a.r&gt;=b.r){<br />
&nbsp;&nbsp;return a;<br />
&nbsp;}<br />
&nbsp;else{<br />
&nbsp;&nbsp;return b;<br />
&nbsp;}<br />
}</font></p>
<p><font face="Courier New">//调用<br />
var a=new Circle(2);<br />
var b=new Circle(3);<br />
var c=a.area();<br />
var d=Circle.max(a,b);</font></p>
<p><font face="Courier New"><span style="color: red"><font face="Courier New">2.继承</font></span><br />
1）一种继承方式<br />
//这里我们将CircleMore类的prototype指向了一个Circle类实例，<br />
//并增加了circumference方法。<br />
function CircleMore(radius){<br />
&nbsp;this.r=radius;<br />
}</font></p>
<p><font face="Courier New">CircleMore.prototype=new Circle(0);</font></p>
<p><font face="Courier New">CircleMore.prototype.circumference=function(){<br />
&nbsp;return 2*Circle.PI*this.r;<br />
}</font></p>
<p><font face="Courier New">这样能够实现对Circle的继承，但是这里存在一点问题：我们直接把CircleMore类的prototype指向了一个Circle类实例，这样就覆盖了JavaScript提供的原型对象，而且抛弃了给定的constructor属性，这样CircleMore的constructor属性就指向了父类Circle的constructor属性。而且这种方式总是使人感觉怪怪的。<br />
<br />
2)Ajax架构Prototype（区别前面提到的prototype哦）的继承方式</font></p>
<p><font face="Courier New">//Prototype框架为Object对象定义了extend方法，<br />
//将source的属性和方法复制到了destination。<br />
Object.extend = function(destination, source) {<br />
&nbsp; for (var property in source)<br />
&nbsp;&nbsp;&nbsp; destination[property] = source[property];<br />
&nbsp; return destination;<br />
};</font></p>
<p><font face="Courier New">//调用<br />
function ParentClass(){...}<br />
function SubClass(){}<br />
SubClass.prototype=Object.extend({<br />
&nbsp;newMethod:function(){<br />
&nbsp;&nbsp;alert("newMethod");<br />
&nbsp;}<br />
},<br />
ParentClass.prototype<br />
);</font></p>
<p><font face="Courier New">3）如果这里对两个参数交换位置，则是对原对象的开展。<br />
例子：通过extend方法对String对象进行了扩展</font></p>
<p><font face="Courier New">Object.extend(String.prototype,{<br />
&nbsp;newMethod:function(){<br />
&nbsp;&nbsp;alert("newMethod");<br />
&nbsp;}<br />
});</font></p>
<p><font style="color: red" face="Courier New">3.多态</font></p>
<p><font face="Courier New">Object.extend = function(destination, source) {<br />
&nbsp; for (var property in source)<br />
&nbsp;&nbsp;&nbsp; destination[property] = source[property];<br />
&nbsp; return destination;<br />
}</font></p>
<p><font face="Courier New">//基类<br />
function base(){}<br />
base.prototype={<br />
&nbsp;initialize:function(){<br />
&nbsp;&nbsp;this.oninit();//调用了一个虚方法<br />
&nbsp;}<br />
}</font></p>
<p><font face="Courier New">//子类SubClassA<br />
function SubClassA(){}<br />
SubClassA.prototype=Object.extend({<br />
&nbsp;//...其它属性方法<br />
&nbsp;prop:"SubClassA",<br />
&nbsp;oninit:function(){<br />
&nbsp;&nbsp;alert(this.prop);<br />
&nbsp;}},<br />
&nbsp;base.prototype<br />
}</font></p>
<p><font face="Courier New">//子类SubClassB<br />
function SubClassB(){}<br />
SubClassB.prototype=Object.extend({<br />
&nbsp;//...其它属性方法<br />
&nbsp;prop:"SubClassB",<br />
&nbsp;oninit:function(){<br />
&nbsp;&nbsp;alert(this.prop);<br />
&nbsp;}},<br />
&nbsp;base.prototype<br />
}</font></p>
<p><font face="Courier New">//调用<br />
var a=new SubClassA();<br />
var b=new SubClassB();</font></p>
<p><font face="Courier New">a.initialize();//输出"SubClassA"<br />
b.initialize();//输出"SubClassB"</font></p>
<p><font face="Courier New"><strong>四、JavaScript与设计模式</strong></font></p>
<p><font style="color: red" face="Courier New">1.Singleton</font></p>
<p><font face="Courier New">function Singleton(){<br />
&nbsp;if(Singleton.caller!=Singleton.getInstance){<br />
&nbsp;&nbsp;throw new Error("Can not new Singleton instance!");<br />
&nbsp;}<br />
&nbsp;this.prop="some string";<br />
&nbsp;//...<br />
}</font></p>
<p><font face="Courier New">Singleton._instance=null;</font></p>
<p><font face="Courier New">Singleton.getInstance=function(){<br />
&nbsp;if(this._instance==null){<br />
&nbsp;&nbsp;this._instance=new Singleton();<br />
&nbsp;}<br />
&nbsp;return this._instance;<br />
}</font></p>
<p><font face="Courier New">var a=Singleton.getInstance();<br />
var b=Singleton.getInstance();<br />
b.prop="another string";<br />
alert(a.prop);//"another string"<br />
alert(b.prop);//"another string"</font></p>
<p><font style="color: red" face="Courier New">2.Factory</font></p>
<p><font face="Courier New">function XMLHttpFactory(){}</font></p>
<p><font face="Courier New">XMLHttpFactory.createXMLHttp=function(){<br />
&nbsp;if(...){<br />
&nbsp;&nbsp;return new XMLHttpRequest();<br />
&nbsp;}<br />
&nbsp;else if(...){<br />
&nbsp;&nbsp;return new ActiveXObject("MSXML2.XMLHttp");<br />
&nbsp;}<br />
&nbsp;...<br />
}</font></p>
<p><font face="Courier New">var xmlhttp=XMLHttpFactory.createXMLHttp();</font></p>
<p><font face="Courier New"><strong>五、备注</strong></font></p>
<p><font face="Courier New">参考资料：<br />
《JavaScript权威指南(第三版)》 中国电力出版社<br />
《JavaScript高级程序设计与应用实例》 人民邮电出版社<br />
&nbsp;Prototype 1.6.0<br />
&nbsp;YUI 2.3.1</font><!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description rdf:about="http://www.cnblogs.com/charming/archive/2007/11/25/972110.html" dc:identifier="http://www.cnblogs.com/charming/archive/2007/11/25/972110.html" dc:title="JavaScript面向对象编程" trackback:ping="http://www.cnblogs.com/charming/services/trackbacks/972110.aspx"  />
</rdf:RDF>
--></p>
<br />
<br />
注：原文(<font style="background-color: #c7edcc">http://www.cnblogs.com/charming/archive/2007/11/25/972110.html</font>)</div>
</div>
<div id="AjaxHolder_UpdatePanel1">&nbsp;</div>
<img src ="http://www.blogjava.net/agun/aggbug/213822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-07-09 23:00 <a href="http://www.blogjava.net/agun/archive/2008/07/09/213822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>很好的文章收藏</title><link>http://www.blogjava.net/agun/archive/2008/07/08/213304.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Tue, 08 Jul 2008 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/07/08/213304.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/213304.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/07/08/213304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/213304.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/213304.html</trackback:ping><description><![CDATA[<font style="background-color: #c7edcc">注：原文出处 <font style="background-color: #c7edcc">http://blog.csdn.net/duhongchao/archive/2008/07/07/2620908.aspx<br />
</font><br />
创业路上之领头羊十二条<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 有人说，这是一个网络创富的乱世。充满机会，也充满了风险。<br />
&nbsp;&nbsp;&nbsp; 有人说，这是一块充满悬念的富矿。蕴含黄金，也会遭遇塌方。<br />
&nbsp;&nbsp;&nbsp; 有人说，这是一个竞争激烈的丛林。容易收获，也很容易迷失。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我都相信。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十余年来，互联网成就了一支支让人敬慕的团队。毋庸总结，大成者何故总是结队存在---道理很简单，个人的力量是有限的。乱世中，结队可以增加视野，分担风险；淘金时，结队有效分工，发现和防范风险；竞争丛林中，结伴可以发挥众人智慧，防止迷失。<br />
让人深思的是，在逆境和利益面前， 怎样避免团队瓦解。换言之，如何与团队真正同甘共苦、不离不弃。仅从企业领头人自身，从四个角度，想了个概要，留此存照、备忘。<br />
&nbsp;<br />
一、道德品质<br />
1.做个好人。搞阳谋不搞阴谋。小事情可以玩点技巧，大事情必须能拿到台面上。搞阴谋的大哥最终会被学会了阴谋的兄弟推翻。<br />
2.与团队成员之间可以有个人交情，但不可以有除了团队共同利益之间的见不得人的其它私利。不拿团队利益与某成员做交易。以不道德为核心的团队文化，只会培养不道德的团队，结果无法预见。<br />
3.戒贪婪，戒懒惰，戒奢侈，戒独享，戒怯懦，勤&#8220;看天&#8221;，勤自省，勤学习，勤动手，勤分享。求生存，需洞悉人性弱点，带团队，身教胜过言传。<br />
&nbsp;<br />
二、方向感<br />
1.认准方向。跑错了，跑的越快，死的越早。<br />
2.犹豫时，要看，要听，要想，要试，但更要立即决断。多练决断力，当断不断，必受其乱。<br />
3.感觉不错时，要三省，君子慎独。<br />
&nbsp;<br />
三、志向及结交<br />
1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 做一个人生的攀登者。<br />
2.坚守信仰。成为金钱的主人，而不是奴隶。<br />
3.慎用厚黑术，不与小人谋。不跟消极的人结密友，不跟臭棋篓子下棋。对敬仰的人，学习程门立雪。对同道中人，不惜十顾茅庐。<br />
&nbsp;<br />
四、柔韧度<br />
1.善于发现每个人的长处，总结自己的不足，互补、包容、和谐。雷军说，创业更是发现长板的过程。<br />
2.不绝对，多换位。<br />
3.坚持，坚强，专注、简易。</font>
<img src ="http://www.blogjava.net/agun/aggbug/213304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-07-08 13:23 <a href="http://www.blogjava.net/agun/archive/2008/07/08/213304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP 简介</title><link>http://www.blogjava.net/agun/archive/2008/06/30/211787.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Mon, 30 Jun 2008 15:38:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/06/30/211787.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/211787.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/06/30/211787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/211787.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/211787.html</trackback:ping><description><![CDATA[<p align="center"><font style="background-color: #c7edcc"><strong>http 简介（学习笔记）<br />
<br />
</strong></font></p>
<p><font style="background-color: #c7edcc"><strong>简介</strong><br />
<br />
http(Hypertext Transfer Protocol) 超文本传输协议，从1990年开始就在www上广泛应用，是现今www</font><font style="background-color: #c7edcc">上应用最多的协议，目前版本1.1<br />
http是应用层协议，当你上网浏览网页的时候，浏览和web服务器之间就会通过http在internet上进行数</font><font style="background-color: #c7edcc">据的发送和接收。</font><font style="background-color: #c7edcc">http是一个基于请求/响应模式的、无状态的协议。</font></p>
<font style="background-color: #c7edcc">
<p><span style="color: red"><em>http是应用层协议，他要使用下层协议提供的服务，http的连接建立，就是利用传输层的 tcp协议来完成的。</em></span>我们知道tcp是面向连接的协议。一方等待一方发起连接，web服务其连接就是等待的一方，浏览器是发起的一方。默认情况下浏览器与在web服务器80端口上的监听程序建立连接，在internet 上http协议基本上都是基于tcp协议的，但是在internet上不排除 http基于其他协议和网络的http实现方式传输。http只是假定传输是可靠的。因而任何能够提供这种保证都是可以使用的。</p>
<p><strong>持续连接(Persistent Connections)</strong></p>
<p>http1.0中，当连接建立后，浏览器发送一个请求，服务器回应一个消息，之后，连接就被关闭。当浏览器下次请求的时候，需要重新建立连接，很显然这种需要不断建立连接的通信方式造成的开销比较大。早期的web页面通常只包含html文本，因此即使建立连接的开销较大，不会有太大的影响，而现在web页面往往包含多种资源(图片，动画，声音等)，每获取一种资源就建立一次连接这样就增加了http服务器的开销，造成了internet上的信息阻塞。因此在http1.1版中，给出了持续连接的机制，并将其作为http1.1中建立连接的缺省行为。通过这种连接，浏览器可以建立一个连接之后 ，发送请求并得到回应，然后继续发送请求再次得到回应，而其，客户端还可以发送流水线请求，也就是说，客户端可以连续发送多个请求，而不用等待每一个响应的到来。<br />
<br />
</p>
<p><strong>HTTP URL<br />
</strong></p>
<p>http url的格式 如下：<a href="http://host[%22:%22port][abs_path/">http://host[":"port][abs_path</a>]</p>
<p>其中http表示要通过http协议来定位网络资源。host表示合法的internet主机域名或ip地址（以点分十进制的格式表示）。port用于指定一个端口号，拥有被请求资源的服务器主机监听该端口的tcp连接，如果port是空，或者没有给出，则使用缺省的端口80。abs_path指定请求资源的url，如果url中没有给出abs_path那么当它作为请求url时，必须以&#8220;/&#8221;的形式给出。通常，这个工作浏览器就帮我们完成了。我们在浏览器的地址栏中输入<a href="http://www.xx.com/">www.xx.com</a>然后回车，浏览器会默认转换为http://www.xx.com/.<br />
<br />
<span style="color: red"><em>注: URI区别URL<br />
</em><span style="color: red"><em>URI(Uniform Resource Identifier,统一资源标识符)纯粹是一个符号结构,用于指定构成web资源的字符串的各个不同部分.<br />
URL是一种特殊的URI,它包含了用于查找某个资源的足够信息.其它的URI, </em><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#122;&#104;&#97;&#111;&#64;&#115;&#105;&#110;&#97;&#46;&#99;&#111;&#109;"><em>mailto:zhao@sina.com</em></a><em>则不属于URL,因为它里面不存在 根据该标识符来查找的任何数据.这种URI称为URN(通用资源名).<br />
<br />
</em></span></span></p>
<p><strong>HTTP 请求</strong></p>
<p>客户端通过发送HTTP请求向服务器请求资源的访问.</p>
<p><em style="color: red">HTTP 请求由三部分组成 分别是请求行,消息报头,请求正文 .</em></p>
<p>请求行以一个方法符号开头,后面跟着请求URI 和协议的版本,以CRLF作为结尾,请求行以空格分隔,除了作为结尾的CRLF外,不允许出现单独的CR或者LF字符.格式如下: </p>
<p>Method Request-URI HTTP-Version CRLF<br />
Method 表示请求的方法,Request-URI是一个统一资源标识符,标识了要请求的资源,HTTP-Version表示请</p>
<p>求的HTTP协议的版本,如：<br />
<span style="color: red"><em>GET /form.html HTTP/1.1(CRLF).</em></span></p>
<p><strong>HTTP请求</strong><br />
<br />
<br />
<table style="width: 796px; height: 278px; background-color: #ccffcc" cellspacing="2" cellpadding="2" width="796" border="0">
    <tbody>
        <tr>
            <td>方法</td>
            <td>作用</td>
        </tr>
        <tr>
            <td>GET</td>
            <td>请求获取由Request-URI所标识的资源</td>
        </tr>
        <tr>
            <td style="width: 245px; height: 25px">POST</td>
            <td>在Request-URI所标识的资源后附加新的数据 </td>
        </tr>
        <tr>
            <td>HEAD&nbsp;</td>
            <td>请求Request-URI所标识的资源响应消息报头</td>
        </tr>
        <tr>
            <td>PUT</td>
            <td>请求服务器存储一个资源，并用Request-URI作为其标识</td>
        </tr>
        <tr>
            <td>DELETE&nbsp;</td>
            <td>请求服务器删除由Request-URI所标识的资源</td>
        </tr>
        <tr>
            <td>TRACE&nbsp;</td>
            <td>请求服务器回送收到的请求信息，主要用于测试或诊断</td>
        </tr>
        <tr>
            <td>CONNECT</td>
            <td>保留将来使用。</td>
        </tr>
        <tr>
            <td>OPTIONS</td>
            <td>请求查询服务器的性能，或者查询与资源相关的选项和需求。</td>
        </tr>
    </tbody>
</table>
<em><span style="color: red">注：HTTP协议是区分大小写的，但是form表单中的get/post是不区分大小写的。目前http协议中的方法</span><span style="color: red">都是大写的。</span></em></p>
<p>GET 方法用于获取由Request-URI所标识的资源的信息，常见格式：<br />
<span style="color: red"><em>GET Request-URI HTTP/1.1</em></span><br />
当我们通过在浏览器的地址栏中直接输入网址的方式访问网页的时候，浏览器采用的就是 GET 方法向服务器获取资源</p>
<p>POST 方法用于向目的服务器发出请求，要求服务器接受附在请求后面的数据。POST方法在表单提交的时候用的较多。<br />
采用POST方法提交表单的例子：<br />
<em><span style="color: red"><em>POST/reg.jsp HTTP/1.1(CRLF)<br />
Accept:image/gif,image/x-xbit...........(CRLF)<br />
Host:www.xx.com(CRLF)<br />
Content-Length:22(CRLF)<br />
Connection:Keep-Alive(CRLF)<br />
Cache-Control:no-cache(CRLF)<br />
(CRLF)-----到上面的为消息报头<br />
username=sss@password=wwww<br />
上面再两个回车之后就是正文的内容<br />
<br />
</em></span></em>HEAD方法与GET方法几乎是一样的,他们的区别在于HEAD方法只是请求消息报头,而不是完整的内容.对于HEAD请求的回应部分来说,他的HTTP头部分中包含的信息与通过GET请求所得到的信息是相同的,利用这个方法,不必传输这个资源内容,就可以得到Request-URI所标识的资源信息.这个方法通常被用于测试超连接的有效性,是否可以访问,以及最近是否更新.</p>
<p><strong>HTTP响应</strong></p>
<p>在接受和解释请求信息后,服务器会返回一个HTTP响应消息.<br />
<span style="color: red"><em>与HTTP请求类似,HTTP响应也是由三个部分组成,分别是: 状态行，消息报头,响应正文.</em></span></p>
<p>状态行由协议版本,数字形式的状态代码,及相应的状态描述组成,各元素之间一空格分隔,除了结尾的CRLF(回车换行)序列外,不允许出现CR或LF字符.格式如下: <br />
<span style="color: red"><em>HTTP-Version Status-Code Reason-Phrase CRLF</em></span></p>
<p>HTTP-Version 表示服务器HTTP协议的版本,Status-Code表示服务器发回的响应代码,Reason-Phrase表示状态代码的文本描述,CRLF表示回车换行<br />
<span style="color: red"><em>如 : HTTP/1.1 200 OK (CRLF)</em></span></p>
<p>状态代码由3位数字组成，表示请求是否被理解或被满足，状态描述了给出状态码的简短的文本描述。</p>
<p>状态代码的第一个数字定义了响应的类别，后面两位数字没有具体的分类。第一个数字有五种可能的取值：</p>
<p>-1XX：指示信息-表示请求已经接收，继续处理 。<br />
-2XX：成功- 表示请求已经被成功接收、理解、接受。<br />
-3XX：重定向 - 要完成请求必须进行更进一步的操作 。<br />
-4XX：客户端错误 - 请求有语法错误或请求无法实现。<br />
-5XX：服务端粗五 - 服务器未能实现合法的请求。</p>
<p><br />
<strong>HTTP响应-状态代码与状态描述</strong></p>
<p>状态代码&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;状态描述&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明</p>
<p>200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; ok&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;客户端请求成功。<br />
400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;bad request&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于客户端请求有语法错误，不能被服务器所理解。<br />
401&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;unauthorized&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请求未经授权。这个状态代码必须和www-authenticate报头域一起使用。<br />
403&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;forbidden&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;服务器收到请求，但是拒绝提供服务。服务器通常会在响应中文中给出不提供服务的原因。<br />
404&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; not found&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 请求的资源不存在，例如，输入了错误的URL</p>
<p><br />
<strong>HTTP 消息</strong></p>
<p>HTTP 消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行，</p>
<p><span style="color: red"><em>消息报头（可选的），空行（只有CRLF的行），消息正文（可选的）组成。</em></span></p>
<p>对于请求消息，开始行就是请求行，对于响应消息，开始行就是状态行。<br />
<br />
<strong>消息报头</strong></p>
<p><span style="color: red"><em>HTTP 消息报头包括普通报头，请求报头，响应报头，实体报头。<br />
</em></span>每一个报头域都是由名字+":"+空格+值组成，消息报头域的名字是大小写无关的。</p>
<p>普通报头：在普通报头中，有少数报头域应用于所有的请求和响应消息，但并不用于被传输的实体，这些报头域只用于传输的消息。</p>
<p><span style="color: red"><em>cache-Control</em></span></p>
<p>Cache-Control 普通报头域用于指定缓存指令，该指令将被请求/响应链中所有的缓存机制所遵循。这些指令将覆盖缺省的缓存规则。缓存指令是单向的，在请求出现缓存指令，并不意味着在响应中也会出现。此外，在一个消息（请求或响应消息）中指定的缓存指令，并不影响另一个消息的缓冲机制。<br />
<span style="color: red"><em>注意：Cache-Control普通报头是在http1.1中新加的，HTTP1.0 使用的类似报头域为pragma</em></span><br />
缓存指令分为<u>请求时的缓存指令</u>和<u>响应时的缓存指令</u>。<br />
请求时的缓存指令包括no-cache,no-store,max-age,max-stale,min-fresh,only-if-cached;<br />
响应时的缓存指令包括public ,private ,no-cache ,no-store,no-transform,must-revalidate,proxy-revalidate,max-age,s-maxage.<br />
其中最常用的是<span style="color: red"><em>no-cache</em></span>,用于指示请求或响应消息不能缓存。</p>
<p>例如：为了指示ie浏览器（客户端）不要缓存页面，服务器端的jsp程序可以编写下面的代码：<br />
<span style="color: red"><em>response.setHeader("Cache-Control","no-cache");</em></span><br />
这句代码将在发送的响应消息中设置普通报头域：Cache-Control: no-cache</p>
<p><strong>Date</strong></p>
<p>&nbsp;&nbsp;&nbsp; Date普通报头域表示消息产生的日期和时间，可以用于HTTP响应中，也可以用于HTTP请求中，作为</p>
<p>服务器端，应该总是在所有的响应中包含Date报头域。作为客户端只有在发送的消息中包含了消息的正</p>
<p>文的时候，才应该发送Date报头域，例如：在ＰＯＳＴ请求的时候。</p>
<p><strong>Connection</strong></p>
<p>&nbsp;&nbsp;&nbsp; Connection普通报头域允许发送者指定连接的选项。例如指定连接是持续的，或者指定&#8220;close&#8221;选项，通知服务器，在响应完成后，关闭连接。</p>
<p><strong>Accept<br />
</strong><br />
&nbsp;&nbsp; Accept请求报头域用于指定客户端接受哪些类型的信息。例如：Accept:image/gis,表明客户端希望</p>
<p>接受gif图像格式的资源;Accept:text/html,表明客户端希望接受html文本.</p>
<p><strong>Accept-Charset<br />
</strong><br />
&nbsp;&nbsp;&nbsp; Accept-Charset请求报头域用于指定客户端接受的字符串.如:&nbsp; Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域，缺省是任何字符集都可以接受。</p>
<p><strong>Accept-Encoding</strong></p>
<p>&nbsp;&nbsp; Accept-Encoding请求报头域类似于Accept，但是它是用于指定可以接受的内容编码。例如：Accept-Encoding:gzip,deflate.如果请求消息中没有设置这个域，服务器假定客户端对各种内容编码都可以接受。<br />
<br />
<strong>Accept-Language</strong><br />
&nbsp;&nbsp; Accept-Language请求报头域类似于Accept，但是它是用于指定一种自然语言。例如：Accept-Language:zh-ch.如果请求消息中没有设置这个域，服务器假定客户端对各种语言都可以接受。</p>
<p><strong>Authorization</strong><br />
&nbsp;&nbsp; Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时，如果收到服务器响应代码为401（未授权），可以发送一个包含Authorization请求报头域的请求，要求服务器对其进行验证。</p>
<p><strong>Host</strong><br />
&nbsp;&nbsp; Host请求报头域主要用于指定被请求资源的internet主机和端口号，它通常是HTTP URL中提取出来的</p>
<p>例如：<a href="http://www.xx.com/index.html">http://www.xx.com/index.html</a>浏览器发送的请求消息中，就会包含Host请求报头域，如下：<br />
Host:www.xx.com<br />
后面没有跟端口号，表明使用的是缺省端口号80，如果端口号不是80，那么就要在主机后面加上一个冒号（：），然后接上端口号，例如：<br />
Host:www.xx.com:8080<br />
<span style="color: red"><em>注意: 在发送HTTP请求的时候这个报头域是必须的.</em></span></p>
<p><br />
<strong>User-Agent</strong></p>
<p>&nbsp;&nbsp;&nbsp; User-Agent请求报头域允许客户端将他的操作系统，浏览器和其他属性告诉服务器，不过这个报头域不是必须的，如果我们自己编写一个浏览器，不使用User-Agent请求报头域，那么服务器端就无法识别User-Agent中包含的操作系统等信息。</p>
<p>响应报头允许服务器传递不能放在状态行中的附加响应信息，以及关于服务器的信息和Request-URI所标</p>
<p>识的资源进行下一步访问的信息。</p>
<p><strong>Location<br />
</strong><br />
&nbsp;&nbsp;&nbsp; Location响应报头域用于重定向接受者到一个新的位置。例如：客户端所请求的页面已不存在原先的位置，为了让客户端重定向到这个页面新的位置，服务器端可以发回Location响应报头域。这种情况还经常发生在更换域名的时候 ，在旧的域名所对应的服务器上保留一个文件，然后使用重定向语句，让客户端去访问新的域名所对应的服务器上的资源。<br />
Location：http://www.xx.com</p>
<p><strong>Server<br />
</strong><br />
&nbsp;&nbsp; Server响应报头域包了服务器用来处理请求的软件信息。他和User-Agent请求报头域是相对应的，前者发送服务器软件的信息，后者发送客户端软件的信息（浏览器）和操作系统的信息。<br />
<span style="color: red"><em>Server：Apache-Coyote/1.1</em></span></p>
<p><strong>消息报头-实体报头</strong></p>
<p>请求和响应消息都可以传送一个实体，一个实体由实体报头域和实体正文组成，在大多数情况下，实体正文就是请求消息中的请求正文或者响应消息中的响应正文。但是在发送时，并不是说实体报头域和实体正文要在一起发送，例如：有些响应可以包含实体报头域。实体就好像我们写的书信，而在信中，我们可以写上标题，加上页号等，这部分就相当于 是实体报头域，而我们所写的书信的内容，就相当于是实体正文。前面所讲的普通报头，请求报头和响应报头我们可以看成写在信封上的邮编，接收者，发送者等内容。<br />
实体报头定义了关于实体正文（例如：有无实体正文）和请求所标识的资源的元信息。</p>
<p>常用的实体报头</p>
<p><strong>Content-Encoding</strong></p>
<p>&nbsp;&nbsp;&nbsp; Content-Encoding实体报头域被用作媒体类型的修饰符，它的值指示了已经被应用到实体正文的附加内容编码，因而要获得Content-Type报头域中所有引用的媒体类型，必须采用相应的解码机制。</p>
<p>Content-Encoding主要用于记录文档的压缩方法，下面是它的一个例子：<br />
Content-Encoding：gzip<br />
<span style="color: red"><em>&nbsp;如果是一个实体正文采用了编码方式存储，在使用之前就必须进行解码。</em></span></p>
<p><strong>Content-Language<br />
</strong><br />
&nbsp;&nbsp; Content-Languag实体报头域描述了资源所用的自然语言。Content-Language允许用户遵照自身的首选语言来识别和区分实体。如果这个实体内容仅仅打算提供给丹麦的阅读者，那么可以按照如下的方式设置这个实体报头域：<br />
Content-Language：da<br />
<span style="color: red"><em>如果没有指定Content-Language报头域，那么实体内容提供给所有语言的阅读者。</em></span></p>
<p><strong>Content-Length</strong></p>
<p>&nbsp;&nbsp; Content-Length实体报头域用于指名实体正文的长度，以字节方式存储的十进制数据来表示，也就是一个数字字符占一个字节，用其对应的ASCCII码存储传输。</p>
<p><span style="color: red"><em>&nbsp;要注意的是：这个长度仅仅是表示实体正文的长度，没有包括实体报头的长度。</em></span></p>
<p><strong>Content-Type<br />
</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Content-Type实体报头域用于指明发送给接收者的实体正文的媒体类型。例如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Content-Type: text/html;charset=iso-8859-1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Content-Type: text/html;charset=gbk<br />
<br />
<strong>Last-Modified<br />
</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp; Last-Modified实体报头域用于指示资源最后的修改日期及时间。</p>
<p><strong>Expires<br />
</strong><br />
&nbsp;&nbsp;&nbsp; Expires实体报头域给出响应过期的日期和时间。通常，代理服务器或浏览器会缓存一些页面，当用户在次访问这些页面时，直接从缓存中加载并显示给用户，这样缩短了响应的时间，减少了服务器的负载。为了让代理服务器或浏览器在一段时间后更新页面，我们可以使用Expires实体报头域指定页面过期的时间。当用户又一次访问页面时，如果Expires报头给出的时间和时间比Date普通报头域给出的日期和时间早（或者相同），那么代理服务器或浏览器就不会再使用缓存的页面，而是从服务器上请求新的页面。不过要注意，即使页面过期了，也并不意味着服务器上的原始资源在此时间之前或者之后发生了改变。<br />
Expires实体报头使用的日期和时间必须是RFC 1123中的日期格式，如<br />
Expires:Thu,15 Sep 2008 16:00:00 GMT<br />
<span style="color: red"><em>HTTP1.1的客户端和缓存必须将其他非法的日期格式（也包括0）看作已经过期。例如，为了让浏览器不要缓存页面，我们也可以利用Expires实体报头域，设置它的值为0，如下：<br />
response.setDateHeader("Expires",0);</em></span></p>
<p><br />
&nbsp;&nbsp; </font></p>
<img src ="http://www.blogjava.net/agun/aggbug/211787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-06-30 23:38 <a href="http://www.blogjava.net/agun/archive/2008/06/30/211787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符编码</title><link>http://www.blogjava.net/agun/archive/2008/06/29/zfbm.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Sun, 29 Jun 2008 05:31:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/06/29/zfbm.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/211471.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/06/29/zfbm.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/211471.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/211471.html</trackback:ping><description><![CDATA[<h3>字符编码</h3>
<div class="blog_content">
<p>这几天又遇到了编码的问题了，所以决定找一下资料，解决一下问题。在web开发中编码问题时常存在，也是我们总要面对的问题。</p>
<p>&nbsp;</p>
<p>&#8220;字符与编码&#8221;是一个被经常讨论的话题。即使这样，时常出现的乱码仍然困扰着大家。虽然我们有很多的办法可以用来消除乱码，但我们并不一定理解这些办法的内在原理。而有的乱码产生的原因，实际上由于底层代码本身有问题所导致的。因此，不仅是初学者会对字符编码感到模糊，有的底层开发人员同样对字符编码缺乏准确的理解。</p>
<p>&nbsp;</p>
<p>首先熟悉一下（在网上找的资料）：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>字符与编码的发展：</p>
<p>&nbsp;</p>
<p>从计算机对多国语言的支持角度看，大致可以分为三个阶段：</p>
<p>
<table cellspacing="0" cellpadding="3" border="0">
    <tbody>
        <tr>
            <td class="top_1">　</td>
            <td class="top_2" align="center"><strong>系统内码</strong></td>
            <td class="top_2" align="center"><strong>说明</strong></td>
            <td class="top_2" align="center"><strong>系统</strong></td>
        </tr>
        <tr>
            <td class="con_1">阶段一</td>
            <td class="con_2" align="center">ASCII</td>
            <td class="con_2">计算机刚开始只支持英语，其它语言不能够在计算机上存储和显示。</td>
            <td class="con_2">英文 DOS</td>
        </tr>
        <tr>
            <td class="con_1">阶段二</td>
            <td class="con_2" align="center">ANSI编码<br />
            （本地化）</td>
            <td class="con_2">为使计算机支持更多语言，通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如：汉字 '中' 在中文操作系统中，使用 [0xD6,0xD0] 这两个字节存储。<br />
            <br />
            不同的国家和地区制定了不同的标准，由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式，称为<strong> ANSI 编码</strong>。在简体中文系统下，ANSI 编码代表 GB2312 编码，在日文操作系统下，ANSI 编码代表 JIS 编码。<br />
            <br />
            不同 ANSI 编码之间互不兼容，当信息在国际间交流时，无法将属于两种语言的文字，存储在同一段<strong> ANSI 编码</strong>的文本中。</td>
            <td class="con_2">中文 DOS，中文 Windows 95/98，日文 Windows 95/98</td>
        </tr>
        <tr>
            <td class="bot_1">阶段三</td>
            <td class="bot_2" align="center">UNICODE<br />
            （国际化）</td>
            <td class="bot_2">为了使国际间信息交流更加方便，国际组织制定了 <strong>UNICODE 字符集</strong>，为各种语言中的每一个字符设定了统一并且唯一的数字编号，以满足跨语言、跨平台进行文本转换、处理的要求。</td>
            <td class="bot_2">Windows NT/2000/XP，Linux，Java</td>
        </tr>
    </tbody>
</table>
</p>
<p>字符串在内存中的存放方法：</p>
<p>在 ASCII 阶段，<strong>单字节字符串</strong>使用一个字节存放一个字符（SBCS）。比如，"Bob123" 在内存中为：</p>
<p>
<table style="font-size: 80%; color: #000080" cellspacing="5" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td>42</td>
            <td>6F</td>
            <td>62</td>
            <td>31</td>
            <td>32</td>
            <td>33</td>
            <td>00</td>
        </tr>
        <tr>
            <td bgcolor="#000080"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td bgcolor="#000080"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td bgcolor="#000080"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td bgcolor="#000080"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td bgcolor="#000080"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td bgcolor="#000080"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td bgcolor="#000080"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
        </tr>
        <tr>
            <td align="center">B</td>
            <td align="center">o</td>
            <td align="center">b</td>
            <td align="center">1</td>
            <td align="center">2</td>
            <td align="center">3</td>
            <td align="center">\0</td>
        </tr>
    </tbody>
</table>
</p>
<p>在使用 ANSI 编码支持多种语言阶段，每个字符使用一个字节或多个字节来表示（MBCS），因此，这种方式存放的字符也被称作<strong>多字节字符</strong>。比如，"中文123" 在中文 Windows 95 内存中为7个字节，每个汉字占2个字节，每个英文和数字字符占1个字节：</p>
<p>
<table style="font-size: 80%; color: #000080" cellspacing="5" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td>D6</td>
            <td>D0</td>
            <td>CE</td>
            <td>C4</td>
            <td>31</td>
            <td>32</td>
            <td>33</td>
            <td>00</td>
        </tr>
        <tr>
            <td bgcolor="#ff0000" colspan="2"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td bgcolor="#ff0000" colspan="2"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td bgcolor="#000080"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td bgcolor="#000080"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td bgcolor="#000080"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td bgcolor="#000080"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
        </tr>
        <tr>
            <td align="center" colspan="2">中</td>
            <td align="center" colspan="2">文</td>
            <td align="center">1</td>
            <td align="center">2</td>
            <td align="center">3</td>
            <td align="center">\0</td>
        </tr>
    </tbody>
</table>
</p>
<p>在 UNICODE 被采用之后，计算机存放字符串时，改为存放每个字符在 UNICODE 字符集中的序号。目前计算机一般使用 2 个字节（16 位）来存放一个序号（DBCS），因此，这种方式存放的字符也被称作<strong>宽字节字符</strong>。比如，字符串 "中文123" 在 Windows 2000 下，内存中实际存放的是 5 个序号：</p>
<p>
<table style="font-size: 80%; color: #000080" cellspacing="5" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td valign="bottom">2D</td>
            <td valign="bottom">4E</td>
            <td valign="bottom">87</td>
            <td valign="bottom">65</td>
            <td valign="bottom">31</td>
            <td valign="bottom">00</td>
            <td valign="bottom">32</td>
            <td valign="bottom">00</td>
            <td valign="bottom">33</td>
            <td valign="bottom">00</td>
            <td valign="bottom">00</td>
            <td valign="bottom">00</td>
            <td><span style="color: #808080">&nbsp;&nbsp;&nbsp;&nbsp; &#8592; 在 x86 CPU 中，低字节在前</span></td>
        </tr>
        <tr>
            <td bgcolor="#ff0000" colspan="2"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td bgcolor="#ff0000" colspan="2"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td bgcolor="#ff0000" colspan="2"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td bgcolor="#ff0000" colspan="2"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td bgcolor="#ff0000" colspan="2"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td bgcolor="#ff0000" colspan="2"><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
            <td><img height="1" alt="" src="http://agun.javaeye.com/admin/images/spacer.gif" width="1" border="0" _counted="undefined" /></td>
        </tr>
        <tr>
            <td align="center" colspan="2">中</td>
            <td align="center" colspan="2">文</td>
            <td align="center" colspan="2">1</td>
            <td align="center" colspan="2">2</td>
            <td align="center" colspan="2">3</td>
            <td align="center" colspan="2">\0</td>
            <td align="center">　</td>
        </tr>
    </tbody>
</table>
</p>
<p>一共占 10 个字节。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>字符　字节　和字符串的概念</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr valign="top">
            <td align="right" width="100%"><img class="magplus" title="点击查看原始大小图片" height="0" alt="" src="http://agun.javaeye.com/admin/images/blue_rule.gif" width="700" border="0" _counted="undefined" /></td>
        </tr>
        <tr valign="top">
            <td align="right" width="100%">&nbsp;</td>
        </tr>
    </tbody>
</table>
<a name="concept"></a></p>
<p>理解编码的关键，是要把字符的概念和字节的概念理解准确。这两个概念容易混淆，我们在此做一下区分：</p>
<p>
<table cellspacing="0" cellpadding="3" border="0">
    <tbody>
        <tr>
            <td class="top_1">　</td>
            <td class="top_2" align="center"><strong>概念描述</strong></td>
            <td class="top_2" align="center"><strong>举例</strong></td>
        </tr>
        <tr>
            <td class="con_1" align="center">字符</td>
            <td class="con_2">人们使用的记号，抽象意义上的一个符号。</td>
            <td class="con_2">'1', '中', 'a', '$', '￥', &#8230;&#8230;</td>
        </tr>
        <tr>
            <td class="con_1" align="center">字节</td>
            <td class="con_2">计算机中存储数据的单元，一个8位的二进制数，是一个很具体的存储空间。</td>
            <td class="con_2">0x01, 0x45, 0xFA, &#8230;&#8230;</td>
        </tr>
        <tr>
            <td class="con_1" align="center">ANSI<br />
            字符串</td>
            <td class="con_2">在内存中，如果&#8220;字符&#8221;是以 <strong>ANSI 编码</strong>形式存在的，一个字符可能使用一个字节或多个字节来表示，那么我们称这种字符串为 <strong>ANSI 字符串</strong>或者<strong>多字节字符串</strong>。</td>
            <td class="con_2">"中文123"<br />
            <span class="rem"><span style="color: #339933">（占7字节）</span></span></td>
        </tr>
        <tr>
            <td class="bot_1" align="center">UNICODE<br />
            字符串</td>
            <td class="bot_2">在内存中，如果&#8220;字符&#8221;是以在 UNICODE 中的序号存在的，那么我们称这种字符串为 <strong>UNICODE 字符串</strong>或者<strong>宽字节字符串</strong>。</td>
            <td class="bot_2">L"中文123"<br />
            <span class="rem"><span style="color: #339933">（占10字节）</span></span></td>
        </tr>
    </tbody>
</table>
</p>
<p>由于不同 ANSI 编码所规定的标准是不相同的，因此，对于一个给定的<strong>多字节字符串</strong>，我们必须知道它采用的是哪一种编码规则，才能够知道它包含了哪些&#8220;字符&#8221;。而对于 <strong>UNICODE 字符串</strong>来说，不管在什么环境下，它所代表的&#8220;字符&#8221;内容总是不变的。</p>
<p>&nbsp;</p>
<p>字符集 与编码</p>
<p>&nbsp;</p>
<p>各个国家和地区所制定的不同 ANSI 编码标准中，都只规定了各自语言所需的&#8220;字符&#8221;。比如：汉字标准（GB2312）中没有规定韩国语字符怎样存储。这些 ANSI 编码标准所规定的内容包含两层含义：</p>
<ol>
    <li>使用哪些字符。也就是说哪些汉字，字母和符号会被收入标准中。所包含&#8220;字符&#8221;的集合就叫做&#8220;<strong>字符集</strong>&#8221;。
    <li>规定每个&#8220;字符&#8221;分别用一个字节还是多个字节存储，用哪些字节来存储，这个规定就叫做&#8220;<strong>编码</strong>&#8221;。 </li>
</ol>
<p>各个国家和地区在制定编码标准的时候，&#8220;字符的集合&#8221;和&#8220;编码&#8221;一般都是同时制定的。因此，平常我们所说的&#8220;字符集&#8221;，比如：GB2312, GBK, JIS 等，除了有&#8220;字符的集合&#8221;这层含义外，同时也包含了&#8220;编码&#8221;的含义。</p>
<p>&#8220;<strong>UNICODE 字符集</strong>&#8221;包含了各种语言中使用到的所有&#8220;字符&#8221;。用来给 UNICODE 字符集编码的标准有很多种，比如：UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig 等。</p>
<p>&nbsp;</p>
<p>常用的编码简介</p>
<p>&nbsp;</p>
<p>简单介绍一下常用的编码规则，为后边的章节做一个准备。在这里，我们根据编码规则的特点，把所有的编码分成三类：</p>
<p>
<table cellspacing="0" cellpadding="3" border="0">
    <tbody>
        <tr>
            <td class="top_1" align="center"><strong>分类</strong></td>
            <td class="top_2" align="center"><strong>编码标准</strong></td>
            <td class="top_2" align="center"><strong>说明</strong></td>
        </tr>
        <tr>
            <td class="con_1" align="center">单字节字符编码</td>
            <td class="con_2">ISO-8859-1</td>
            <td class="con_2">最简单的编码规则，每一个字节直接作为一个 UNICODE 字符。比如，[0xD6, 0xD0] 这两个字节，通过 iso-8859-1 转化为字符串时，将直接得到 [0x00D6, 0x00D0] 两个 UNICODE 字符，即 "&#214;&#208;"。<br />
            <br />
            反之，将 UNICODE 字符串通过 iso-8859-1 转化为字节串时，只能正常转化 0~255 范围的字符。</td>
        </tr>
        <tr>
            <td class="con_1" align="center">ANSI 编码</td>
            <td class="con_2">GB2312,<br />
            BIG5,<br />
            Shift_JIS,<br />
            ISO-8859-2 &#8230;&#8230;</td>
            <td class="con_2">把 UNICODE 字符串通过 ANSI 编码转化为&#8220;字节串&#8221;时，根据各自编码的规定，一个 UNICODE 字符可能转化成一个字节或多个字节。<br />
            <br />
            反之，将字节串转化成字符串时，也可能多个字节转化成一个字符。比如，[0xD6, 0xD0] 这两个字节，通过 GB2312 转化为字符串时，将得到 [0x4E2D] 一个字符，即 '中' 字。<br />
            <br />
            &#8220;ANSI 编码&#8221;的特点：<br />
            1. 这些&#8220;ANSI 编码标准&#8221;都只能处理各自语言范围之内的 UNICODE 字符。<br />
            2. &#8220;UNICODE 字符&#8221;与&#8220;转换出来的字节&#8221;之间的关系是人为规定的。</td>
        </tr>
        <tr>
            <td class="bot_1" align="center">UNICODE 编码</td>
            <td class="bot_2">UTF-8,<br />
            UTF-16, UnicodeBig &#8230;&#8230;</td>
            <td class="bot_2">与&#8220;ANSI 编码&#8221;类似的，把字符串通过 UNICODE 编码转化成&#8220;字节串&#8221;时，一个 UNICODE 字符可能转化成一个字节或多个字节。<br />
            <br />
            与&#8220;ANSI 编码&#8221;不同的是：<br />
            1. 这些&#8220;UNICODE 编码&#8221;能够处理所有的 UNICODE 字符。<br />
            2. &#8220;UNICODE 字符&#8221;与&#8220;转换出来的字节&#8221;之间是可以通过计算得到的。</td>
        </tr>
    </tbody>
</table>
</p>
<p>我们实际上没有必要去深究每一种编码具体把某一个字符编码成了哪几个字节，我们只需要知道&#8220;编码&#8221;的概念就是把&#8220;字符&#8221;转化成&#8220;字节&#8221;就可以了。对于&#8220;UNICODE 编码&#8221;，由于它们是可以通过计算得到的，因此，在特殊的场合，我们可以去了解某一种&#8220;UNICODE 编码&#8221;是怎样的规则。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>以及乱码产生的原因和解决办法</p>
<p>
<table cellspacing="0" cellpadding="3" border="0">
    <tbody>
        <tr>
            <td class="top_1">　</td>
            <td class="top_2" align="center"><strong>对编码的误解</strong></td>
        </tr>
        <tr>
            <td class="con_1" align="center">误解一</td>
            <td class="con_2">在将&#8220;字节串&#8221;转化成&#8220;UNICODE 字符串&#8221;时，比如在读取文本文件时，或者通过网络传输文本时，容易将&#8220;字节串&#8221;简单地作为<strong>单字节字符串</strong>，采用每&#8220;一个字节&#8221;就是&#8220;一个字符&#8221;的方法进行转化。<br />
            <br />
            而实际上，在非英文的环境中，应该将&#8220;字节串&#8221;作为 ANSI 字符串，采用适当的编码来得到 UNICODE 字符串，有可能&#8220;多个字节&#8221;才能得到&#8220;一个字符&#8221;。<br />
            <br />
            通常，一直在英文环境下做开发的程序员们，容易有这种误解。</td>
        </tr>
        <tr>
            <td class="bot_1" align="center">误解二</td>
            <td class="bot_2">
            <p>在 DOS，Windows 98 等非 UNICODE 环境下，字符串都是以 ANSI 编码的字节形式存在的。这种以字节形式存在的字符串，必须知道是哪种编码才能被正确地使用。这使我们形成了一个惯性思维：&#8220;字符串的编码&#8221;。<br />
            <br />
            当 UNICODE 被支持后，Java 中的 String 是以字符的&#8220;序号&#8221;来存储的，不是以&#8220;某种编码的字节&#8221;来存储的，因此已经不存在&#8220;字符串的编码&#8221;这个概念了。只有在&#8220;字符串&#8221;与&#8220;字节串&#8221;转化时，或者，将一个&#8220;字节串&#8221;当成一个 ANSI 字符串时，才有编码的概念。<br />
            <br />
            不少的人都有这个误解。</p>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>第一种误解，往往是导致乱码产生的原因。第二种误解，往往导致本来容易纠正的乱码问题变得更复杂。</p>
<p>在这里，我们可以看到，其中所讲的&#8220;误解一&#8221;，即采用每&#8220;一个字节&#8221;就是&#8220;一个字符&#8221;的转化方法，实际上也就等同于采用 iso-8859-1 进行转化。因此，我们常常使用 bytes = string.getBytes("iso-8859-1") 来进行逆向操作，得到原始的&#8220;字节串&#8221;。然后再使用正确的 ANSI 编码，比如 string = new String(bytes, "GB2312")，来得到正确的&#8220;UNICODE 字符串&#8221;。</p>
<p>&nbsp;</p>
<p>先说Java。 <br />
JVM里面的任何字符串资源都是Unicode，就是说，任何String类型的数据都是Unicode编码。没有例外。既然只有一种编码，那么，我们可以这么说，JVM里面的String是不带编码的。String相当于 char[]。 <br />
JVM里面的 byte[] 数据是带编码的。比如，Big5，GBK，GB2312，UTF-8之类的。 <br />
一个GBK编码的byte[] 转换成 String，其实就是从GBK编码向Unicode编码转换。 <br />
一个String转换成一个Big5编码的byte[]，其实就是从Unicode编码向Big5编码转换。 <br />
所以，Unicode是所有编码转换的中间介质。所有的编码都有一个转换器可以转换到Unicode，而Unicode也可以转换到其他所有的编码。这样构成了一个总线结构。</p>
<p>&nbsp;</p>
<p>非UNICODE程序在不同语言环境间移植时的乱码</p>
<p>&nbsp;</p>
<p>非 UNICODE 程序中的字符串，都是以某种 ANSI 编码形式存在的。如果程序运行时的语言环境与开发时的语言环境不同，将会导致 ANSI 字符串的显示失败。</p>
<p>比如，在日文环境下开发的非 UNICODE 的日文程序界面，拿到中文环境下运行时，界面上将显示乱码。如果这个日文程序界面改为采用 UNICODE 来记录字符串，那么当在中文环境下运行时，界面上将可以显示正常的日文。</p>
<p>由于客观原因，有时候我们必须在中文操作系统下运行非 UNICODE 的日文软件，这时我们可以采用一些工具，比如，南极星，AppLocale 等，暂时的模拟不同的语言环境。</p>
<p>&nbsp;</p>
<p>网页间提交字串</p>
<p>&nbsp;</p>
<p>当页面中的表单提交字符串时，首先把字符串按照当前页面的编码，转化成字节串。然后再将每个字节转化成 "%XX" 的格式提交到 Web 服务器。比如，一个编码为 GB2312 的页面，提交 "中" 这个字符串时，提交给服务器的内容为 "%D6%D0"。</p>
<p>在服务器端，Web 服务器把收到的 "%D6%D0" 转化成 [0xD6, 0xD0] 两个字节，然后再根据 GB2312 编码规则得到 "中" 字。</p>
<p>在 Tomcat 服务器中，request.getParameter() 得到乱码时，常常是因为前面提到的&#8220;误解一&#8221;造成的。默认情况下，当提交 "%D6%D0" 给 Tomcat 服务器时，request.getParameter() 将返回 [0x00D6, 0x00D0] 两个 UNICODE 字符，而不是返回一个 "中" 字符。因此，我们需要使用 bytes = string.getBytes("iso-8859-1") 得到原始的字节串，再用 string = new String(bytes, "GB2312") 重新得到正确的字符串 "中"。</p>
<p>&nbsp;</p>
<p>从数据库读取字符串</p>
<p>&nbsp;</p>
<p>通过数据库客户端（比如 ODBC 或 JDBC）从数据库服务器中读取字符串时，客户端需要从服务器获知所使用的 ANSI 编码。当数据库服务器发送字节流给客户端时，客户端负责将字节流按照正确的编码转化成 UNICODE 字符串。</p>
<p>如果从数据库读取字符串时得到乱码，而数据库中存放的数据又是正确的，那么往往还是因为前面提到的&#8220;误解一&#8221;造成的。解决的办法还是通过 string = new String( string.getBytes("iso-8859-1"), "GB2312") 的方法，重新得到原始的字节串，再重新使用正确的编码转化成字符串。</p>
<p>&nbsp;</p>
<p>电子邮件中的字符串</p>
<p>&nbsp;</p>
<p>当一段 Text 或者 HTML 通过电子邮件传送时，发送的内容首先通过一种指定的<strong>字符编码</strong>转化成&#8220;字节串&#8221;，然后再把&#8220;字节串&#8221;通过一种指定的<strong>传输编码</strong>（Content-Transfer-Encoding）进行转化得到另一串&#8220;字节串&#8221;。比如，打开一封电子邮件源代码，可以看到类似的内容：</p>
<p>
<table cellspacing="0" cellpadding="6" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td class="code">Content-Type: text/plain;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000">charset="gb2312"</span><br />
            <span style="color: #ff0000">Content-Transfer-Encoding: base64</span><br />
            <br />
            sbG+qcrQuqO17cf4yee74bGjz9W7+b3wudzA7dbQ0MQNCg0KvPKzxqO6uqO17cnnsaPW0NDEDQoNCg==</td>
        </tr>
    </tbody>
</table>
</p>
<p>最常用的 Content-Transfer-Encoding 有 Base64 和 Quoted-Printable 两种。在对二进制文件或者中文文本进行转化时，Base64 得到的&#8220;字节串&#8221;比 Quoted-Printable 更短。在对英文文本进行转化时，Quoted-Printable 得到的&#8220;字节串&#8221;比 Base64 更短。</p>
<p>邮件的标题，用了一种更简短的格式来标注&#8220;字符编码&#8221;和&#8220;传输编码&#8221;。比如，标题内容为 "中"，则在邮件源代码中表示为：</p>
<p>
<table cellspacing="0" cellpadding="6" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td class="code"><span style="color: #339933"><span class="rem">// 正确的标题格式</span><br />
            </span>Subject: =？GB231 2 ？B?1tA= ?=</td>
        </tr>
    </tbody>
</table>
</p>
<p>其中，</p>
<ul>
    <li>第一个&#8220;=?&#8221;与&#8220;?&#8221;中间的部分指定了字符编码，在这个例子中指定的是 GB2312。
    <li>&#8220;?&#8221;与&#8220;?&#8221;中间的&#8220;B&#8221;代表 Base64。如果是&#8220;Q&#8221;则代表 Quoted-Printable。
    <li>最后&#8220;?&#8221;与&#8220;?=&#8221;之间的部分，就是经过 GB2312 转化成字节串，再经过 Base64 转化后的标题内容。 </li>
</ul>
<p>如果&#8220;传输编码&#8221;改为 Quoted-Printable，同样，如果标题内容为 "中"：</p>
<p>
<table cellspacing="0" cellpadding="6" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td class="code"><span style="color: #339933"><span class="rem">// 正确的标题格式</span><br />
            </span>Subject: <span style="background-color: #ffff00">=?</span>GB2312<span style="background-color: #ffff00">?Q?</span>=D6=D0<span style="background-color: #ffff00">?=</span></td>
        </tr>
    </tbody>
</table>
</p>
<p>如果阅读邮件时出现乱码，一般是因为&#8220;字符编码&#8221;或&#8220;传输编码&#8221;指定有误，或者是没有指定。比如，有的发邮件组件在发送邮件时，标题 "中"：</p>
<p>
<table cellspacing="0" cellpadding="6" width="100%" bgcolor="#eeeeee" border="1">
    <tbody>
        <tr>
            <td class="code"><span style="color: #339933"><span class="rem">// 错误的标题格式</span><br />
            </span>Subject: <span style="background-color: #ffff00">=?</span><span style="color: #ff0000">ISO-8859-1</span><span style="background-color: #ffff00">?Q?</span>=D6=D0<span style="background-color: #ffff00">?=</span></td>
        </tr>
    </tbody>
</table>
</p>
<p>这样的表示，实际上是明确指明了标题为 [0x00D6, 0x00D0]，即 "&#214;&#208;"，而不是 "中"。</p>
</div>
<img src ="http://www.blogjava.net/agun/aggbug/211471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-06-29 13:31 <a href="http://www.blogjava.net/agun/archive/2008/06/29/zfbm.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring中bean的作用域简介(转载) </title><link>http://www.blogjava.net/agun/archive/2008/06/06/206320.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Fri, 06 Jun 2008 06:30:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/06/06/206320.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/206320.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/06/06/206320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/206320.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/206320.html</trackback:ping><description><![CDATA[<p>Spring上个版本的IoC容器支持两个不同的bean作用域（单例与原型）。<br />
Spring 2.0改进了这一点，不仅提供了一些依赖于Spring部署环境（比如说，在web环境中的request和session作用域bean）的额外的作用域,而且提供了所谓的'钩子'（'hooks'）（因为找不到更好的表达）使Spring用户可以创造自己的作用域。</p>
<p>应该注意的是，即使单例与原型作用域beans的基本（内在）实现发生了变化，上述变化对最终用户来说是透明的...现有的配置不需要改变或放弃。</p>
<br />
如何使用spring的作用域：
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
下面分别对spring 中的作用域分别介绍一下：<br />
</p>
<p><strong>1、singleton作用域</strong></p>
<p>当一个bean的作用域设置为singleton，那么Spring IOC容器中只会存在一个共享的bean实例，并且所有对bean的请求，只要id与该bean定义相匹配，则只会返回bean的同一实例。换言之，当把一个bean定义设置为singleton作用域时，Spring IOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存（singleton cache）中，并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例，这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的，单例设计模式表示一个ClassLoader中只有一个class存在，而这里的singleton则表示一个容器对应一个bean，也就是说当一个bean被标识为singleton时候，spring的IOC容器中只会存在一个该bean。</p>
<p>配置实例：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>或者</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><strong>2、prototype</strong></p>
<p>prototype作用域部署的bean，每一次请求（将其注入到另一个bean中，或者以程序的方式调用容器的getBean()方法）都会产生一个新的bean实例，相当于一个new的操作，对于prototype作用域的bean，有一点非常重要，那就是Spring不能对一个prototype bean的整个生命周期负责，容器在初始化、配置、装饰或者是装配完一个prototype实例后，将它交给客户端，随后就对该prototype实例不闻不问了。不管何种作用域，容器都会调用所有对象的初始化生命周期回调方法，而对prototype而言，任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源，都是客户端代码的职责。（让Spring容器释放被singleton作用域bean占用资源的一种可行方式是，通过使用bean的后置处理器，该处理器持有要被清除的bean的引用。）</p>
<p>配置实例：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;bean id="role" class="spring.chapter2.maryGame.Role" scope="prototype"/&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>或者</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;beanid="role" class="spring.chapter2.maryGame.Role" singleton="false"/&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
&nbsp;<br />
<strong>3、request</strong> </p>
<p>request表示该针对每一次HTTP请求都会产生一个新的bean，同时该bean仅在当前HTTP request内有效，配置实例：</p>
<p>request、session、global session使用的时候，首先要在初始化web的web.xml中做如下配置：</p>
<p>如果你使用的是Servlet 2.4及以上的web容器，那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;web-app&gt;<br />
            ...<br />
            &lt;listener&gt;<br />
            &lt;listener-class&gt;org.springframework.web.context.request.RequestContextListener&lt;/listener-class&gt;<br />
            &lt;/listener&gt;<br />
            ...<br />
            &lt;/web-app&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;web-app&gt;<br />
            ..<br />
            &lt;filter&gt; <br />
            &lt;filter-name&gt;requestContextFilter&lt;/filter-name&gt; <br />
            &lt;filter-class&gt;org.springframework.web.filter.RequestContextFilter&lt;/filter-class&gt;<br />
            &lt;/filter&gt; <br />
            &lt;filter-mapping&gt; <br />
            &lt;filter-name&gt;requestContextFilter&lt;/filter-name&gt; <br />
            &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
            &lt;/filter-mapping&gt;<br />
            ...<br />
            &lt;/web-app&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>接着既可以配置bean的作用域了：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;bean id="role" class="spring.chapter2.maryGame.Role" scope="request"/&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p><strong>4、session</strong></p>
<p>session作用域表示该针对每一次HTTP请求都会产生一个新的bean，同时该bean仅在当前HTTP session内有效，配置实例：</p>
<p>配置实例：</p>
<p>和request配置实例的前提一样，配置好web启动文件就可以如下配置：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;bean id="role" class="spring.chapter2.maryGame.Role" scope="session"/&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><strong>5、global session</strong></p>
<p>global session作用域类似于标准的HTTP Session作用域，不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念，它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean，那么，web会自动当成session类型来使用。</p>
<p>配置实例：</p>
<p>和request配置实例的前提一样，配置好web启动文件就可以如下配置：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>&lt;bean id="role" class="spring.chapter2.maryGame.Role" scope="global session"/&gt;</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><strong>6、自定义bean装配作用域</strong></p>
<p>在spring 2.0中作用域是可以任意扩展的，你可以自定义作用域，甚至你也可以重新定义已有的作用域（但是你不能覆盖singleton和prototype），spring的作用域由接口org.springframework.beans.factory.config.Scope来定义，自定义自己的作用域只要实现该接口即可，下面给个实例：</p>
<p>我们建立一个线程的scope，该scope在表示一个线程中有效，代码如下：</p>
<p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">
            <pre>
            <p>publicclass MyScope implements Scope ...{ <br />
            privatefinal ThreadLocal threadScope = new ThreadLocal() ...{<br />
            protected Object initialValue() ...{<br />
            returnnew HashMap(); <br />
            } <br />
            }; <br />
            public Object get(String name, ObjectFactory objectFactory) ...{ <br />
            Map scope = (Map) threadScope.get(); <br />
            Object object = scope.get(name); <br />
            if(object==null) ...{ <br />
            object = objectFactory.getObject(); <br />
            scope.put(name, object); <br />
            } <br />
            return object; <br />
            } <br />
            public Object remove(String name) ...{ <br />
            Map scope = (Map) threadScope.get(); <br />
            return scope.remove(name); <br />
            }<br />
            publicvoid registerDestructionCallback(String name, Runnable callback) ...{ <br />
            }<br />
            public String getConversationId() ...{<br />
            // TODO Auto-generated method stub<br />
            returnnull;<br />
            } <br />
            }</p>
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
注：本文的原文来源于网络。</p>
<img src ="http://www.blogjava.net/agun/aggbug/206320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/agun/" target="_blank">agun</a> 2008-06-06 14:30 <a href="http://www.blogjava.net/agun/archive/2008/06/06/206320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lucene 搜索技术简介</title><link>http://www.blogjava.net/agun/archive/2008/05/06/198645.html</link><dc:creator>agun</dc:creator><author>agun</author><pubDate>Tue, 06 May 2008 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/agun/archive/2008/05/06/198645.html</guid><wfw:comment>http://www.blogjava.net/agun/comments/198645.html</wfw:comment><comments>http://www.blogjava.net/agun/archive/2008/05/06/198645.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/agun/comments/commentRss/198645.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/agun/services/trackbacks/198645.html</trackback:ping><description><![CDATA[<p align="center"><span style="color: red"><span style="font-size: 18pt"><span style="color: red">lucene 全文检索简介<br />
</span></span></span><font style="background-color: #c7edcc"><br />
</font></p>
<p><font style="background-color: #c7edcc"><span style="color: #00ff00"><font style="background-color: #c7edcc"><strong style="color: #800080">一，信息检索的过程简介<br />
<br />
</strong></font></span>全文检索和数据库应用最大的不同在于：让最相关的头100条结果满足98%以上用户的需求<br />
<span style="color: #000000"><strong>1，构建文本库</strong></span><br />
在开发功能前，一个信息检索系统需要做些准备工作，首先，必须要构建一个文本数据库，这个文本数据库用来保存所有用户可能检索的信息。在这些信息的基础上，确定索引中</font></p>
<p><font style="background-color: #c7edcc">的文本类型，文本类型是被系统所认可的一种信息格式，这种格式应当具有可识别，冗余程度低的特点。一旦文本模型确定下来后，就不应当对其进行大的行动。<br />
<strong>2，建立索引</strong><br />
有了这种文本模型后，就应该根据数据库内的文本建立索引。索引可以大大的提高信息检索的速度。目前，有许多索引的建立方式。采用哪种方式取决于信息检索系统的规模。大</font><font style="background-color: #c7edcc">型信息检索系统（百度，google这样的搜索）均采用倒排的方式来建立索引。<br />
<strong>3，进行搜索</strong><br />
在文档建立索引之后，就可以开始对其进行搜索。这时，通常都是由用户提交一个检索请求，请求将被分析，然后利用文本操作进行处理。对于真实的信息检索系统，在真正处理</font><font style="background-color: #c7edcc">请求前，还可以对请求进行一些预处理，然后再将请求送到后台，并返回用户需要的信息。<br />
<strong>4，对结果进行过滤</strong><br />
通常，在信息检索系统检索到用户需要的信息后，还要做一步操作，就是将信息以一定的规则进行排序或过滤，再返回给用户。这一步实际上关乎到最终用户的体验。</font></p>
<p><font style="background-color: #c7edcc"><span style="color: #800080"><font style="background-color: #c7edcc"><strong>二，Lucene 索引<br />
</strong></font></span><br />
&nbsp;&nbsp;<strong> 1，使用索引提高检索速度</strong></font><font style="background-color: #c7edcc"><strong>常用的3种索引方式为</strong><br />
（1）倒排<br />
倒排是一种面向单词的索引机制。通常它由（关键字）和出现情况两部分组成。对于索引中的每个词（关键字），都跟随一个列表（位置表），用来记录单词在所有文档中出现的</font><font style="background-color: #c7edcc">位置。<br />
&nbsp;倒排的特点：<br />
在倒排索引中，关键字的数量并非随着文本内容的增长也线性增长。这是因为无论多大数量的文本数据库，总能够规范出一个关键字表。这种关键字受到实际语言因素的限制，他</font><font style="background-color: #c7edcc">的增长率在文本数据库达到一定规模后可以忽略不计。</font></p>
<p><font style="background-color: #c7edcc">（2）后缀数组</font></p>
<p><font style="background-color: #c7edcc">（3）签名文件</font></p>
<p><font style="background-color: #c7edcc"><strong>&nbsp; 2，索引的Segment<br />
</strong><br />
每个segment代表lucene的一个完整索引段，通常，一个索引中，包含有多个segment，每个segment都有一个统一的前缀，这个前缀是根据当前索引的document的数量而确立的，前</font><font style="background-color: #c7edcc">缀名是document 数量转成36进制后，在前面加上&#8220;_&#8221;而构成的。</font></p>
<p><font style="background-color: #c7edcc">segment的格式<br />
（1）.fnm格式<br />
包含了document中的所有field的名称。<br />
（2）.fdx 和.fdt格式<br />
.fdx 和.fdt是综合使用的两个文件，其中.fdt类型文件用于存储具有store.YES属性的field的数据。而.fdx类型文件则是一个索引，用于存储document在.fdt中的位置。</font></p>
<p><font style="background-color: #c7edcc">（3）.tii 与.tis格式<br />
.tis 文件用于存储分词的词条(Term)，而.tii就是它的索引文件，它标明了每个.tis文件的词条的位置。<br />
（4）.cfs复合格式<br />
在indexWriter 中有一个属性：useCompoundFile，它的默认值为True，这个属性的含义是：是否使用复合索引格式来保存索引。索引的内容可能非常大，文件的数量可能非常多，</font><font style="background-color: #c7edcc">如果遇到这种情况，系统打开文件数量巨大将会极大地耗费系统资源。因此， lucene提供了一种简单文件索引格式，也就是所谓的复合索引格式。</font></p>
<p><font style="background-color: #c7edcc">&nbsp;&nbsp;&nbsp;<strong>3，索引的优化<br />
</strong></font></p>
<p><font style="background-color: #c7edcc">&nbsp;（1）合并因子mergeFactor</font></p>
<p><font style="background-color: #c7edcc">当mergeFactor取比较小的值时,内存中注入的文档数量少,向磁盘写入segment的操作比较多,故此时将占用较少的内存,但是索引的建立由于i/o操作频繁所以会比较慢.而当</font><font style="background-color: #c7edcc">mergeFactor取较大的值时,内存中驻留的document数量比较多.向磁盘写入segment的操作较少,故此时将占用较多的内存,但索引的建立速度比较快.</font></p>
<p><font style="background-color: #c7edcc">maxMergeDocs<br />
对索引的合并的最多文档数量.<br />
mixMergeDocs(maxBufferedDocs)</font></p>
<p><font style="background-color: #c7edcc">&nbsp; （2）索引的合并与索引的优化</font></p>
<p><font style="background-color: #c7edcc">FSDirectory 和 RAMDirectory目录文件</font></p>
<p><font style="background-color: #c7edcc">FSDirectory 是与文件系统目录有关的，而RAMDirectory则是与内存相关的。<br />
对于lucene 来说，两中目录都可以作为索引的存储路径。在初始化indexwriter的时候需要传入一个directory类型的对象作为参数之一，当indexwriter接收这样的参数时（无论</font><font style="background-color: #c7edcc">是fsdirectory还是ramdirectory），它都会在指定的位置下将索引进行存储。但是文件系统目录就会直接将索引写到磁盘上。而ramdirectory则是在内存中一个区域，虽然向其中</font><font style="background-color: #c7edcc">添加document的过程与使用fsdirectory一样，但是由于它是内存中的一块区域，因此如果不将ramdirectory中的内存写入磁盘，当虚拟机退出后，里面的内容也会随之消失。因此</font><font style="background-color: #c7edcc">，需要将ramdirectory中的内容转到fsdirectory中。</font></p>
<p><font style="background-color: #c7edcc">&nbsp;&nbsp;&nbsp;&nbsp;（3）使用indexWriter来合并索引<br />
document可以被放置在 ramdirectory中，使用它的优点就是索引的速度很快。当document被加入到ramdirectory中后， ramdirectory在逻辑上就是一个完整的索引了，它在逻辑</font><font style="background-color: #c7edcc">上就应当包括如前所说的所有索引格式的文件（但是不能被持久的保存起来）。<br />
indexwriter的addindexs()方法，可以实现索引的合并。addindexs()方法的参数是一个directory类型的数组，因此，可以同时合并多个目录下的索引，只要分别为这些目录创建</font><font style="background-color: #c7edcc">其对应的directory类型的对象就可以了。</font></p>
<p><font style="background-color: #c7edcc">&nbsp;&nbsp;&nbsp;&nbsp;（4）索引的优化<br />
indexwriter的optimize()方法正是为了这个目的而设置的，该方法能够对当前indexwriter所制定的索引目录以及其所使用的缓存目录下的所有segment 进行优化，使所有的</font><font style="background-color: #c7edcc">segments合并成一个完整的segement，即整个索引目录内出现一种文件前缀。<br />
对于系统的优化会有什么性能上的损失呢？由于优化时需要对已有的索引内的文件进行操作，因此需要耗费更多的内存和磁盘空间，索引优化采用的策略是建立新的segment来取代</font><font style="background-color: #c7edcc">那些被合并的segements，所以在旧的segement还未被删除之前，索引内的磁盘空间消耗将会非常大，甚至可能使原来索引的两倍。同理，在进行优化时的磁盘i/o也会非常多，所</font><font style="background-color: #c7edcc">以这是一个耗费资源的过程。</font></p>
<p><font style="background-color: #c7edcc">&nbsp;&nbsp;&nbsp;<strong> 2，索引中删除文档</strong></font></p>
<p><font style="background-color: #c7edcc">索引的读取工具IndexReader，IndexReader中的getVersion方法可以查看当前索引的版本，这个version是索引建立时的精确到毫秒的时间，IndexReader的indexReader.numDosc()</font><font style="background-color: #c7edcc">方法，可以查看当前索引内总共有多少个document，IndexReader.document(int)方法可以从索引中取出相应的document.</font></p>
<p><font style="background-color: #c7edcc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（1）使用文档的id号来删除特定文档</font></p>
<p><font style="background-color: #c7edcc">在创建索引的过程中 lucene会为每一个加入索引的document赋予一个id号,这个id号将唯一的标识每个文档.reader.deleteDocument(int),int参数为id 号删除完毕后需要执行</font><font style="background-color: #c7edcc">reader.close()方法关闭.使删除操作写入索引的deletable文件中,如果不关闭怎没有删除掉,实际上lucene的删除机制为回收站机制,删除操作没有真正删除文件,而是做了一标记,</font><font style="background-color: #c7edcc">可以进行还原;reader.undeleteall()方法可以帮助实现反删除(当使用indexwriter对索引optimize一次时,lucene 为每个document重新分配id,这样那些被标记为已删除的</font><font style="background-color: #c7edcc">document真正的被物理删除了).</font></p>
<p><font style="background-color: #c7edcc">&nbsp;&nbsp;&nbsp;&nbsp;（2）使用field信息来删除批量文档<br />
reader.deleteDocuments(term)该方法是一个能够批量删除索引的方法,它删除索引是按照词条来进行的. term类是用于表示词条的一个工具,它能够将词条表示成&lt;field,value&gt;(</font><font style="background-color: #c7edcc">例如: 词条为&lt;bookename,男&gt;也就是indexReader就会删除所有在"bookname"这个field中含有"男"这个term的document).</font></p>
<p><font style="background-color: #c7edcc"><strong>&nbsp;&nbsp;3， lucene的同步问题</strong></font></p>
<p><font style="background-color: #c7edcc">writer.lock<br />
出现在向索引中添加文档时,或是将文档从索引中删除时,在indexwriter的close()方法被调用时被释放<br />
commit.lock<br />
主要是与segment合并和读取的操作相关.</font></p>
<p><font style="background-color: #c7edcc">&nbsp; indexModifier类</font></p>
<p><font style="background-color: #c7edcc">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800080"><font style="background-color: #c7edcc"><strong>三，lucene 的搜索</strong></font></span></font><font style="background-color: #c7edcc">&nbsp;<br />
<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;1，indexSearcher进行搜索</strong></font></p>
<p><font style="background-color: #c7edcc">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（1）indexSearcher的简单使用：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexSearcher searcher=new IndexSearcher("索引路径");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//构建一个term对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Term term=new Term("name","女")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//构建一个query对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query q =new TermQuery (term);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//检索<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hits hits=searcher.search(q);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//显示结果<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;hits.lengtth();i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;system.out.println(hits.doc(i));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</font></p>
<p><font style="background-color: #c7edcc">&nbsp;&nbsp;&nbsp;&nbsp;上面的例子中介绍了indexsearcher的search方法，search方法是整个检索系统的核心。<br />
indexSearcher有多种重载search方法，这些方法有些在于indexSearcher的父类Search中，有些在本身，Search类实现了一个接口Searchable，该接口提供了可以搜索的功能。</font></p>
<p><font style="background-color: #c7edcc">&nbsp;&nbsp;&nbsp;&nbsp;（2）Hits对象是搜索结果的集合 主要有下面几个方法 [list=1]</font></p>
<p><font style="background-color: #c7edcc">length() ,这个方法记录有多少条结果返回(lazy loading) <br />
doc(n) 返回第n个记录 <br />
id(in) 返回第n个记录的Document ID <br />
score(n) 第n个记录的相关度(积分)<br />
由于搜索的结果一般比较大，从性能上考虑，Hits对象并不会真正把所有的结果全部取回，默认情况下是保留前100个记录(对于一般的搜索引擎,100个记录足够了).<br />
&nbsp;</font></p>
<p><font style="background-color: #c7edcc">hits类，在上面的例子中使用了hits,从Hits的doc(int n)方法来研究Hits的工作原理.<br />
doc(int n)方法用于搜索索引的返回结果中取出相应的文档。参数n代表结果中的第n个文档。而doc(int n)方法的第一步就是使用hitDoc(int n)方法从缓存中取去相应的文档。<br />
在hitDoc(int n)方法中，会先判断当前用户需要取出的文档是不是已经超过了缓存的大小。如果是，则先调用getMoreDocs(int min)方法来扩大缓存，然后再从缓存中返回需要的</font><font style="background-color: #c7edcc">文档。</font></p>
<p><font style="background-color: #c7edcc"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2，搜索结构的评分<br />
</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;（1）文档的得分算法公式：略<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;搜索的结果可以按照分数来排序。</font></p>
<p><font style="background-color: #c7edcc">&nbsp;&nbsp;&nbsp;&nbsp;<strong>3，lucene内建的query对象</strong><br />
（1）&nbsp;内建的query对象主要包括：<br />
（2）TermQuery词条搜索　<br />
（3）&nbsp;BooleanQuery布尔搜索　<br />
（4）RangeQuery范围搜索　<br />
（5）&nbsp;PrefixQuery前缀搜索　<br />
（6）&nbsp;PhraseQuery短语搜索　<br />
（7）MultiPhraseQuery多短语搜索　<br />
（8）FuzzyQuery模糊搜索　<br />
（9）WildcardQuery通配符搜索　<br />
（10）SpanQuery跨度搜索　&nbsp;<br />
（11）还有第三方提供的Query对象：RegexQuery<br />
上面的这些内建的query对象都是可以用来做根据不同的情况来进行搜索。（具体略）<br />
<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;4，Lucene查询总结：<br />
</strong><br />
Lucene面向全文检索的优化在于首次索引检索后，并不把所有的记录（Document）具体内容读取出来，而起只将所有结果中匹配度最高的头100条结果（TopDocs）的ID放到结果集</font><font style="background-color: #c7edcc">缓存中并返回，这里可以比较一下数据库检索：如果是一个10,000条的数据库检索结果集，数据库是一定要把所有记录内容都取得以后再开始返回给应用结果集的。所以即使检索</font><font style="background-color: #c7edcc">匹配总数很多，Lucene的结果集占用的内存空间也不会很多。对于一般的模糊检索应用是用不到这么多的结果的，头100条已经可以满足90%以上的检索需求。</font></p>
<p><font style="background-color: #c7edcc">如果首批缓存结果数用完后还要读取更后面的结果时Searcher会再次检索并生成一个上次的搜索缓存数大1倍的缓存，并再重新向后抓取。所以如果构造一个Searcher去查1－120条</font><font style="background-color: #c7edcc">结果，Searcher其实是进行了2次搜索过程：头100条取完后，缓存结果用完，Searcher重新检索再构造一个200条的结果缓存，依此类推，400条缓存，800条缓存。由于每次</font