<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="http://feeds.qzone.qq.com/rss.xsl" version="1.0"?>
<rss version="2.0" xmlns:qz="http://qzone.qq.com">
<channel>
<title><![CDATA[简单≠一句]]></title>
<description><![CDATA[空]]></description>
<link>http://328781034.qzone.qq.com</link>
<lastBuildDate>Thu, 26 Nov 2009 07:02:29 GMT</lastBuildDate>
<generator>Qzone</generator>
<language>zh-cn</language>
<copyright>Copyright (C), 2005-2008, Tencent Tech. Co., Ltd.</copyright>
<pubDate>Fri, 20 Nov 2009 16:49:45 GMT</pubDate>

<item>
<title><![CDATA[吾]]></title>
<link>http://328781034.qzone.qq.com/blog/1258735785</link>
<description><![CDATA[天已定，<br>事已不可为。<br>命已定，<br>吾已愚为孤。<br>爱已定，<br>终已不成双。<br>情已定，<br>吾重为情痴。<br>　　——题为知心者提 <!--v:3.2--> ]]></description>
<category><![CDATA[情感天地]]></category>
<author><![CDATA[328781034@qq.com(简单≠一句)]]></author>
<comments>http://328781034.qzone.qq.com/blog/1258735785#comment</comments>
<qz:effect>134218256</qz:effect>
<pubDate>Fri, 20 Nov 2009 16:49:45 GMT</pubDate>
<guid>http://328781034.qzone.qq.com/blog/1258735785</guid>
</item>

<item>
<title><![CDATA[独在异乡为异客]]></title>
<link>http://328781034.qzone.qq.com/blog/1258289186</link>
<description><![CDATA[踏上远去的路程、奔赴着幼小的理想来到异乡，初到这里熟悉的面孔还有很多，每天都能看见那些熟悉身影。不知什么时候，渐渐地曾经熟悉的面孔慢慢淡少了。却迎来了新的欢声笑语。也许这样的生活更好一点，最起码有个缓冲和适应的时间。我倒是想这样一人生活挺好的，什么都不用想，过好自己就可以了。相对之下那时候还小，单纯的想法。第一年基本上就在“失去”朋友和认识新朋友中过去了。春节回家感觉是那么新鲜。毕竟从小到大，这是第一次出远门还是第一次回家，当然很高兴了。第一次感受坐火车的人多，真的很多，火车站的人都挤满了，那么冷的天都晚上<span style="font-family:'Times';line-height:1.8em;">10</span><wbr />点多了大部分人都还在外面等车，看着这样的情景我更应该回家了，虽然表面的那种无所谓，但是看着别人都回家团聚，何尝自己独在他乡呢。坐了一夜的火车，并未感觉太疲惫，也许这一切都是新鲜的或者是听家人、朋友讲火车上人多，有小偷，不过还是好人多，呵呵。偶尔睡个小觉就醒了，或者是不习惯这样睡觉吧，火车轰轰的也吵人。透过那些模糊的玻璃窗看外面的夜晚却是那么的漆黑。想留下的记忆都难。<br>刚下火车，完了……不是包没带，而是长了这么大，连自己家乡的省会都不知道在哪坐汽车才能到家。只有问人了，还真是好人多，问了一个人就告诉我了。这不，又拎起包走出了火车站，汽车站不远，呵呵。火车站对面就是，上前直接买个票就坐车去了，当时是早上八点刚过，我不想在这吃饭，我想早点回家还能吃上中午饭，有将近一年的时间没在家吃饭了，想我妈和我外婆做的饭，不过我饭量不大，呵呵，要不然不会这么瘦。可惜了，第一次坐车回家不知道这个站没有直达的，路途只能转车，结果到吃中午饭的时候，听着新买的手机响铃，哎呀我妈打的。只好讲中午饭吃不上了……。<br>终于到家了，刚下车看着路旁的那些没有绿叶衬托的萧条树木。突然感觉一阵心酸，不知从何而来。到家先洗洗，“哎呀饿死了”，拿起热好的饭菜吃了起来，心想还是在家吃舒服，不用掏钱买、不用担心不干净、不用担心吃不饱，反正就是爽。吃过饭本来要睡一觉的，晚上去看一直惦记着我的外婆呢，这下倒好不用去了，她老人家亲自来了。虽然男孩子可能没有那么明显表现出来那种思亲的表情<span style="font-family:'Times';line-height:1.8em;">(</span><wbr />倒不如讲我自己<span style="font-family:'Times';line-height:1.8em;">)</span><wbr />，年纪大了，又是冬天先扶老人家进来，看着坐在凳子上喘着气，我笑笑讲了句：“你们吃过了？”<span style="font-family:'Times';line-height:1.8em;">(</span><wbr />她和我外公一起来的，这句话是我们那平时见人的基本问候语言<span style="font-family:'Times';line-height:1.8em;">)</span><wbr />。<br>时间过的真快没几天又要离开了，这次坐车没那么麻烦了，有点熟悉了。不过却是反向的，有点不习惯。新的一年新的开始，虽然是刚过了春节，但来到这里感觉有点凄凉。包袱放下洗洗睡了一觉。这时却想着吃饭，但是很困，先睡吧。<br>新年上班的第一天感觉真好，到公司门口还有摸红包，试试手气，晕，，，啥也没有。呵呵。“新年好！”这是当时连续几天同事之间讲的最多的祝福语。不知不觉来了已经有一年的时间了。正好这段时间公司在招新员工，顺便看看以前的老师有没有过来？失望了。结果在最后的几天我们部门招了两个新同事，其中有一个是我相处一年多时间而分开的朋友，在这段时间什么事情都有，喜、愁、伤数不清。<br>工作了<span style="font-family:'Times';line-height:1.8em;">2</span><wbr />年多的时间，有新的同事加入也有玩的比较好的朋友离开。说实话我当时我喜欢那个环境，虽然是有点累。可是后来，感觉不能在这样过下去了，我要想我以后的生活，要求的生活超出了我当时的经济收入，我想得到一份更好的工资待遇，也许人就是这样永不满足。我喜欢自力更生，我不喜欢别人奢求什么，所以我想再次选择一次我的人生路。无意中看到了我现在行业的信息。当时看见那个学费……<span style="font-family:'Times';line-height:1.8em;"> </span><wbr />我家并不富裕，我不敢给我家人讲，可是后来还是讲了。先用自己的资本补助下吧，呵呵，还好有点积蓄。<br>初入这个学习的环境，当时有点不适应，两年多的时间没碰过书本了，呵呵。但是我要对得起我来这里的目的、还要对得起我这两年多的积蓄和时光。当时我的信心十足，只有一个想法，就是好好努力，不要再错过了学习的机会（现在想想当时上学的时候，为什么就知道玩呢，现在想想后悔晚矣）。不过还好自认为在这一年多的学习中，收获颇多，人缘之间认识了不少朋友老师同学，学习上现在就可以看出来，不过只怪当初基本功没打好。在学习期间差点因为一件事情给学习又丢掉。但是我扛过来了，我觉得我要对得起我家人对我的付出和自己的将来。<br>转眼间快要毕业了，短暂的一年多时光过去了。我感谢教我技术和教我从事工作做人的基本道理的教员老师。老周是我第一个老师，我很钦佩他。老郭，呵呵，也不错，曾经有不少问题迎刃而解。呵呵，最后一个是老刘了，不用讲，那叫一个个性“马照跑<span style="font-family:'Times';line-height:1.8em;">,</span><wbr />舞照跳”“芝麻粒”等等<span style="font-family:'Times';line-height:1.8em;"> </span><wbr />这些名词，呵呵。上他课就是爽，你不听都不行，很随和、讲课略带风趣。哎，现在听不到了。老杨，呵呵，让我写过一次检查我这辈子都不会忘记你的。那是我长这么大第一次写检查，人挺好的，人称教父。同学之间关系都不错，上课我们一般都这么称呼教员。<br>散伙饭的桌上个个都是喝的……<span style="font-family:'Times';line-height:1.8em;"> </span><wbr />合肥话：感情深，一口闷。她是我们一起的同学。感情上我们是认真的，彼此相爱。但是最终由于我的原因我们分开了，我真的很笨。求同存异嘛。<br>       即将结束我这差不多五年在这边的时间，太累了，这不适合我，我的生活！ <!--v:3.2--> ]]></description>
<category><![CDATA[情感天地]]></category>
<author><![CDATA[328781034@qq.com(简单≠一句)]]></author>
<comments>http://328781034.qzone.qq.com/blog/1258289186#comment</comments>
<qz:effect>142606864</qz:effect>
<pubDate>Sun, 15 Nov 2009 12:46:26 GMT</pubDate>
<guid>http://328781034.qzone.qq.com/blog/1258289186</guid>
</item>

<item>
<title><![CDATA[三种境界 折射软件开发职业轨迹]]></title>
<link>http://328781034.qzone.qq.com/blog/1258243795</link>
<description><![CDATA[人有境界之分，在笔者看来，软件开发也存在三种不同的境界。<br><span style="font-family:'Arial';line-height:1.8em;">        一是“画虎不成反类其犬”。<br>  <br>        写过程序的人都知道，写程序有点像写东西。初学写作的人，往往急于动笔，肚子里有点东西，就忙不迭地想一吐为快。有些企业及其开发人员不愿意潜心研究客户业务与需求，连一些专业术语都没有弄清楚，就急着“练活儿”。他们开发的软件大多源于主观臆断，结果可想而知。有些开发人员多次碰壁之后，仍然不思悔改，即便被逼无奈到用户那里去“体验生活”，仍是学生气十足，非我行我素，便蜻蜓点水。结果，软件修来改去，还是白开水一杯，只是越加热越没养份。这样的员工如果不被及时开除，那么，被市场开除的，就只有其雇主及企业。 <br> <br>        二是“亦步亦趋，老实过分”。<br> <br>       现实生活中，做老实人一点儿也没错。但是，如果老实过分则一准儿不受欢迎，软件开发也不例外。有些开发人员肯下苦功，加之经验老道，能够与用户打成一片，将用户的业务流程摸个一清二楚。他们对用户业务与需求的把握，甚至令一些资深用户自叹弗如，由此写出的软件，怎么看都像那么回事，用户上手也比较快，但是，过不了多久，用户就会觉出没劲----早知道信息化就是用键盘代替纸笔，用敲字代表写字，“脚照跑，汗照流”，还不如不费这个劲！结果可想而知，这样的开发人员，做用户的朋友也许够格，但是，作为商业合作伙伴，早晚拜拜。 <br> <br>        三是“源于生活，高于生活”。<br> <br>        写东西有这个要求，写程序也认这个理儿。那些软件高手儿就高在这里。能在这个境界里打拼的开发人员，才会真正体会到----软件为何称其为“软”件，软件开发为什么比硬件开发更有意思，才能够真正享受到软件开发的乐趣。这类开发人员会在摸排用户业务与需求时做到“内心翻江倒海，外表静如处子”，绝不放过任何一个疑点；还会在与用户的沟通中，主动探讨业务流程的可资改良之处，并且着力加以实现。其摸需求之举，只是为求突破垫底。他们是在流程再造、业务革新中体现研发的快感，实现自身的价值。在他们看来，软件只是其革新思想与内在价值的外在表现。他们写出的软件，就像一本小说，令读者恍惚间感觉到“这写的不就是我吗？这不就是我一直想或不敢想、做或不敢做的吗？”因而爱不释手，欲罢不能。这样的开发人员，不仅实现了自身物质与精神的双丰收，还会带领用户，在不知不觉之中，实现思想境界与业务水平的提升，进而带领企业赢得更多资源，实现良性发展。 <br>    <br>          这样三种境界，由低而高，折射出许多开发人员的职业轨迹。从年龄分布看，第一种境界大抵是20出头刚出校门，第二种是30岁左右，第三种往往是35岁以后直至壮年、暮年；从心态看，第一种是心浮气燥，第二种是中规中矩，第三种是趋于成熟；从人群分布看，第一种大有人在，第二种不乏其人，第三种凤毛麟角。<br> <br>        在我国信息化建设风起云涌、日新月异的今天，笔者写下这段文字，只是想提醒诸位开发人士，注意把握软件开发的艺术性，努力实现从第一、二种境界到第三种境界的跨越，也好让你倾注心血写出的软件，真正创造用户价值，早一天卖出个好的价钱，既养活了自己，也成就了事业。</span><wbr /> <!--v:3.2--> ]]></description>
<category><![CDATA[个人日记]]></category>
<author><![CDATA[328781034@qq.com(简单≠一句)]]></author>
<comments>http://328781034.qzone.qq.com/blog/1258243795#comment</comments>
<qz:effect>142606864</qz:effect>
<pubDate>Sun, 15 Nov 2009 00:09:55 GMT</pubDate>
<guid>http://328781034.qzone.qq.com/blog/1258243795</guid>
</item>

<item>
<title><![CDATA[忐忑]]></title>
<link>http://328781034.qzone.qq.com/blog/1256133550</link>
<description><![CDATA[<br>不就十天的事情吗，快的很 <!--v:3.2--> ]]></description>
<category><![CDATA[没事]]></category>
<author><![CDATA[328781034@qq.com(简单≠一句)]]></author>
<comments>http://328781034.qzone.qq.com/blog/1256133550#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Wed, 21 Oct 2009 13:59:10 GMT</pubDate>
<guid>http://328781034.qzone.qq.com/blog/1256133550</guid>
</item>

<item>
<title><![CDATA[又是一个无聊]]></title>
<link>http://328781034.qzone.qq.com/blog/1252172997</link>
<description><![CDATA[　　脑子空空！没去实现理想的人（称为空理想，虚伪）！真的很落伍，不想讲太多，也讲不出太多，真的是很无语。也是给自己找的借<br>口！<br>　　复杂的社会，复杂的人，现实的社会让后人变得更现实，当然也是人的进步，这种进步让部分人觉得很虚伪。为了生活而工作，应该<br>是这样的。<br>　　人生的路途有时很充实有时很空虚，如果要像小孩子那样真好，脑子真是空空不想太多的问题。可是那时候也羡慕当时的大哥哥没有什么束缚，可以单独有自己的生活等，一些当时以为长大了能做的“好”事情。结果今天大了这些都已经有了。想的问题却不是当初儿时的幼稚，想法的确太简单。直到今天觉得某些想法还是很简单。人这一辈子真的是命运注！太多的事情使之操纵不了。但也不能顺水推舟，如果这样可能又违背了某种东西。短短的几十年真的是酸甜苦辣味味俱全。<br>要想在这短短的数十年中度过，那就需要面对明天的问题好与坏！<br>语言组织能力欠佳。 <!--v:3.2--> ]]></description>
<category><![CDATA[情感天地]]></category>
<author><![CDATA[328781034@qq.com(简单≠一句)]]></author>
<comments>http://328781034.qzone.qq.com/blog/1252172997#comment</comments>
<qz:effect>142606848</qz:effect>
<pubDate>Sat, 05 Sep 2009 17:49:57 GMT</pubDate>
<guid>http://328781034.qzone.qq.com/blog/1252172997</guid>
</item>

<item>
<title><![CDATA[公平？]]></title>
<link>http://328781034.qzone.qq.com/blog/1251210773</link>
<description><![CDATA[先来看一段简介：<br>　　老鷹是所有鳥類中最強壯的種族，<br>根據動物學家所做的研究，<br>這可能與老鷹的餵食習慣有關。<br>老鷹一次生下四、五隻小鷹，<br>由於牠們的巢穴很高，<br>所以獵捕回來的食物一次只能餵食一隻小鷹，<br>而老鷹的餵食方式並不是依平等的原則，<br>而是哪一隻小鷹搶得凶就給誰吃，在此情況下，<br>瘦弱的小鷹吃不到食物都死了，<br>最凶狠的存活下來，代代相傳，<br>老鷹一族愈來愈強壯。  <br><span style="filter: glow(color=#00FFFF,strength=3);color:#FFFFFF;display:inline-block;line-height:1.8em;">“公平”不能成為組織中的公認原則，<br>組織若無適當的淘汰制度，<br>常會因小仁小義而耽誤了進化，<br>在競爭的環境中將會遭到自然淘汰。</span><wbr /> <!--v:3.2--> ]]></description>
<category><![CDATA[闲来转转]]></category>
<author><![CDATA[328781034@qq.com(简单≠一句)]]></author>
<comments>http://328781034.qzone.qq.com/blog/1251210773#comment</comments>
<qz:effect>142606864</qz:effect>
<pubDate>Tue, 25 Aug 2009 14:32:53 GMT</pubDate>
<guid>http://328781034.qzone.qq.com/blog/1251210773</guid>
</item>

<item>
<title><![CDATA[[转]小沈阳过时了 看这个 笑晕你]]></title>
<link>http://328781034.qzone.qq.com/blog/1251022749</link>
<description><![CDATA[<div style="text-align:center;"><embed invokeURLs="false" allowNetworking="all" allowscriptaccess="always" allowFullScreen="true" menu="false" id="flash0" width="456" height="362" src="http://cache.tv.qq.com/qqplayerout.swf?vid=5Q1m2y3FU7q" /></div> <!--v:3.2--> ]]></description>
<category><![CDATA[休闲搞笑]]></category>
<author><![CDATA[328781034@qq.com(简单≠一句)]]></author>
<comments>http://328781034.qzone.qq.com/blog/1251022749#comment</comments>
<qz:effect>134222344</qz:effect>
<pubDate>Sun, 23 Aug 2009 10:19:09 GMT</pubDate>
<guid>http://328781034.qzone.qq.com/blog/1251022749</guid>
</item>

<item>
<title><![CDATA[[转]SQL如何精确查询两个时间段之间的数据]]></title>
<link>http://328781034.qzone.qq.com/blog/1250220861</link>
<description><![CDATA[一般情况我们在查询两个时间段之间的数据内容会用如下的操作方式，如：<br>select * from your_table where date_field between #startdate# AND #enddate#<br>我们可以看到在上面这句Sql查询代码中有两个时间变量，一个是startdate，一个是enddate。<br><br>而我们通常会设置的内容如：startdate为2005-10-1，enddate为2005-11-11。 <br><br>那么这句查询就会变成：<br>select * from your_table where date_field between ‘2005-10-1’ AND ‘2005-11-11’ <br>其实我们查询的初衷是查询2005-10-1日至2005-11-11两个时间段之间的所有数据，然而，上面的查询语句对于2005-11-11的数据却将十分的感冒。事实上，系统将会把以上的查询语句读取为：select * from your_table where date_field between ‘2005-10-1 00:00:00’ AND ‘2005-11-11 00:00:00’，很显然，如果我们有一数据是2005-11-11 13:23:45，那么该数据将不会列入查询结果范围里，这将是我们不希望看到的结果。 <br><br>下面我以图示说明具体的差异： <br>1、以日期粗略的查询 <br>select username,registertime from member where registertime between \'2005-11-08\' AND \'2005-11-09\' order by registertime desc<br><br>2、以日期精确的查询 <br>select username,registertime from member where registertime between \'2005-11-08 00:00:00\' AND \'2005-11-09 23:59:59\' order by registertime desc <br><br>很显然，精确查询的数据结果竟然比粗略查询的多出了7条记录。 <br>因此，为了解决这个精确查询的问题，我们编写了如下两个函数。下次我们在查询两个日期之间的数据内容时，只需要利用这两个函数就可以精确查询了。 <!--v:3.2--> ]]></description>
<category><![CDATA[技术收集]]></category>
<author><![CDATA[328781034@qq.com(简单≠一句)]]></author>
<comments>http://328781034.qzone.qq.com/blog/1250220861#comment</comments>
<qz:effect>142606872</qz:effect>
<pubDate>Fri, 14 Aug 2009 03:34:21 GMT</pubDate>
<guid>http://328781034.qzone.qq.com/blog/1250220861</guid>
</item>

<item>
<title><![CDATA[ASP.NET(C#)返回上一页(后退)代码]]></title>
<link>http://328781034.qzone.qq.com/blog/1249574735</link>
<description><![CDATA[<span style="font-weight:bold"><wbr />第一种</span><wbr /><br>protected void Page_Load(object sender, EventArgs e)<br>{<br>    if (!IsPostBack)<br>    {<br>        ViewState[&quot;BackUrl&quot;] = Request.UrlReferrer.ToString();<br>    }<br>}<br>/// &lt;summary&gt;<br>/// 返回按钮点击事件<br>/// &lt;/summary&gt;<br>protected void Button1_Click(object sender, EventArgs e)<br>{<br>    Response.Redirect(ViewState[&quot;BackUrl&quot;].ToString());<br>}<span style="font-weight:bold"><wbr />另一种方法</span><wbr /><br>在C# Web程序中，如为页面按钮写返回上一页代码<br>this.RegisterClientScriptBlock(&quot;E&quot;, &quot;&lt;script language=javascript&gt;history.go(-2);&lt;/script&gt;&quot;);<br>其中，history.go(-2)，要写为-2，因在按钮事件触发前，已刷新一次页面，所以应是-2。<br>Response.Write(&quot;&lt;script language=javascript&gt;history.go(-2);&lt;/script&gt;&quot;);<br>此处也要写为“-2”。跟直接写脚本的有所不同。 <!--v:3.2--> ]]></description>
<category><![CDATA[技术收集]]></category>
<author><![CDATA[328781034@qq.com(简单≠一句)]]></author>
<comments>http://328781034.qzone.qq.com/blog/1249574735#comment</comments>
<qz:effect>142606864</qz:effect>
<pubDate>Thu, 06 Aug 2009 16:05:35 GMT</pubDate>
<guid>http://328781034.qzone.qq.com/blog/1249574735</guid>
</item>

<item>
<title><![CDATA[Ajax原理及应用]]></title>
<link>http://328781034.qzone.qq.com/blog/1246546046</link>
<description><![CDATA[1、ajax技术的背景<br><br>      不可否认，ajax技术的流行得益于google的大力推广，正是由于google earth、google suggest以及gmail等对ajax技术的广泛应用，催生了ajax的流行。而这也让微软感到无比的尴尬，因为早在97年，微软便已经发明了ajax中的关键技术，并且在99年IE5推出之时，它便开始支持XmlHttpRequest对象，并且微软之前已经开始在它的一些产品中应用ajax，比如说MSDN网站菜单中的一些应用。遗憾的是，不知道出于什么想法，当时微软发明了ajax的核心技术之后，并没有看到它的潜力而加以发展和推广，而是将它搁置起来。对于这一点来说，我个人是觉得非常奇怪的，因为以微软的资源和它的战略眼光来说，应该不会看不到ajax技术的前景，唯一的解释也许就是因为当时它的主要竞争对手Netscape的消失反而使它变得麻痹和迟钝，毕竟巨人也有打盹的时候，比如IBM曾经在对微软战略上的失误。正是这一次的失误，成就了它现在的竞争对手google在ajax方面的领先地位，而事实上google目前在ajax技术方面的领先是微软所无法达到的，这一点在后面我讲述ajax缺陷的时候也会提到。现在微软也意识到了这个问题，因此它也开始在ajax领域奋起直追，比如说推出它自己的ajax框架atlas，并且在.NET2.0也提供了一个用来实现异步回调的接口，即ICallBack接口。那么微软为什么对自己在ajax方面的落后如此紧张呢？现在就让我们来分析一下ajax技术后面隐藏的深刻意义。<br><br>2、ajax技术的意义<br><br>     我们在平时的开发中都多多少少的接触或者应用到了ajax，谈到ajax技术的意义，我们关注得最多的毫无疑问是提升用户的体验。但是，如果我们结合将来电脑和互联网的发展趋势，我们会发现ajax技术在某些方面正好代表了这种趋势。为什么这样说呢？我们知道，自从电脑出现以来，一直是桌面软件占据着绝对主导的地位，但是互联网的出现和成功使这一切开始发生着微妙的变化。相当一部分的人都相信，迟早有一天，数据和电脑软件将会从桌面转移到互联网。也就是说，将来的电脑有可能抛弃笨重的硬盘，而直接从互联网来获取数据和服务，我记得我念大学的时候，有位教授给我们上课的时候，曾经设想过这样一种情景，也许在将来的电脑桌面上，没有任何多余的软件和程序，而仅仅只有一个IE，虽然现在看起来我们距离这一天还很遥远，并且这其中还有很多的问题需要解决，但是我觉得这个并非梦想，而是迟早将实现的现实。那么，这其中的主要问题就是互联网的连接不稳定，谁也不愿意看着自己的电脑从服务器一点一滴的下载数据，那么，ajax是不是解决了这个问题呢，说实话，与其说ajax解决了这个问题，倒不如它只是掩盖了这个问题，它只是在服务器和客户端之间充当了一个缓冲器，让用户误以为服务没有中断。精确的说，ajax并不能提高从服务器端下载数据的速度，而只是使这个等待不那么令人沮丧。但是正是这一点就足以产生巨大的影响和震动，它实际上也对桌面软件产生了巨大的冲击。这一点我用一个例子来说明，我们可以比较一下Outlook Express和Gmail，前者是典型的桌面软件，后者是ajax所实现的B/S模式，实际上后者目前已经在慢慢取代前者了，Gmail在收发邮件的时候已经和Outlook Express的功能几乎没有差别了，而且它不需要安装客户端程序。这就是为什么微软对ajax所带来的冲击有着如此的恐惧心理，并且在它前不久所进行的调查之中，将google看做他们未来十年内的主要竞争对手的主要原因之一。当然，这种变化也并不会将桌面软件全部淘汰，现有的浏览器还没有一个能像PhotoShop等桌面程序那样处理复杂的图像。但是我们也不能忽视它带来的影响和冲击。<br><br>3、关于ajax的名字<br><br>    ajax 的全称是Asynchronous JavaScript and XML，其中，Asynchronous 是异步的意思，它有别于传统web开发中采用的同步的方式。<br><br>、关于同步和异步<br><br>异步传输是面向字符的传输，它的单位是字符；而同步传输是面向比特的传输，它的单位是桢，它传输的时候要求接受方和发送方的时钟是保持一致的。<br><br>具体来说，异步传输是将比特分成小组来进行传送。一般每个小组是一个8位字符，在每个小组的头部和尾部都有一个开始位和一个停止位，它在传送过程中接收方和发送方的时钟不要求一致，也就是说，发送方可以在任何时刻发送这些小组，而接收方并不知道它什么时候到达。一个最明显的例子就是计算机键盘和主机的通信，按下一个键的同时向主机发送一个8比特位的ASCII代码，键盘可以在任何时刻发送代码，这取决于用户的输入速度，内部的硬件必须能够在任何时刻接收一个键入的字符。这是一个典型的异步传输过程。异步传输存在一个潜在的问题，即接收方并不知道数据会在什么时候到达。在它检测到数据并做出响应之前，第一个比特已经过去了。这就像有人出乎意料地从后面走上来跟你说话，而你没来得及反应过来，漏掉了最前面的几个词。因此，每次异步传输的信息都以一个起始位开头，它通知接收方数据已经到达了，这就给了接收方响应、接收和缓存数据比特的时间；在传输结束时，一个停止位表示该次传输信息的终止。按照惯例，空闲（没有传送数据）的线路实际携带着一个代表二进制1的信号。步传输的开始位使信号变成0，其他的比特位使信号随传输的数据信息而变化。最后，停止位使信号重新变回1，该信号一直保持到下一个开始位到达。例如在键盘上数字“1”，按照8比特位的扩展ASCII编码，将发送“00110001”，同时需要在8比特位的前面加一个起始位，后面一个停止位。<br><br>同步传输的比特分组要大得多。它不是独立地发送每个字符，每个字符都有自己的开始位和停止位，而是把它们组合起来一起发送。我们将这些组合称为数据帧，或简称为帧。<br><br>　　数据帧的第一部分包含一组同步字符，它是一个独特的比特组合，类似于前面提到的起始位，用于通知接收方一个帧已经到达，但它同时还能确保接收方的采样速度和比特的到达速度保持一致，使收发双方进入同步。<br><br>　　帧的最后一部分是一个帧结束标记。与同步字符一样，它也是一个独特的比特串，类似于前面提到的停止位，用于表示在下一帧开始之前没有别的即将到达的数据了。<br><br>　　同步传输通常要比异步传输快速得多。接收方不必对每个字符进行开始和停止的操作。一旦检测到帧同步字符，它就在接下来的数据到达时接收它们。另外，同步传输的开销也比较少。例如，一个典型的帧可能有500字节（即4000比特）的数据，其中可能只包含100比特的开销。这时，增加的比特位使传输的比特总数增加2.5%，这与异步传输中25 %的增值要小得多。随着数据帧中实际数据比特位的增加，开销比特所占的百分比将相应地减少。但是，数据比特位越长，缓存数据所需要的缓冲区也越大，这就限制了一个帧的大小。另外，帧越大，它占据传输媒体的连续时间也越长。在极端的情况下，这将导致其他用户等得太久。<br><br>个小时，在这10个小时内水没有完全断，只是流量比原来小了很多，在10个小时后恢复正常流量，那么，如果是你你会选择哪种方式呢？显然是后者。<br><br>4、ajax所包含的技术<br><br>    大家都知道ajax并非一种新的技术，而是几种原有技术的结合体。它由下列技术组合而成。<br><br>   1.使用CSS和XHTML来表示。<br><br>   2. 使用DOM模型来交互和动态显示。<br><br>   3.使用XMLHttpRequest来和服务器进行异步通信。<br><br>   4.使用javascript来绑定和调用。<br><br>在上面几中技术中，除了XmlHttpRequest对象以外，其它所有的技术都是基于web标准并且已经得到了广泛使用的，XMLHttpRequest虽然目前还没有被W3C所采纳，但是它已经是一个事实的标准，因为目前几乎所有的主流浏览器都支持它。<br><br>5、ajax原理和XmlHttpRequest对象<br><br>Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求，从服务器获得数据，然后用javascript来操作DOM而更新页面。这其中最关键的一步就是从服务器获得请求数据。要清楚这个过程和原理，我们必须对 XMLHttpRequest有所了解。<br><br>XMLHttpRequest是ajax的核心机制，它是在IE5中首先引入的，是一种支持异步请求的技术。简单的说，也就是javascript可以及时向服务器提出请求和处理响应，而不阻塞用户。达到无刷新的效果。<br><br>所以我们先从XMLHttpRequest讲起，来看看它的工作原理。<br><br>首先，我们先来看看XMLHttpRequest这个对象的属性。<br><br>它的属性有：<br><br>onreadystatechange 每次状态改变所触发事件的事件处理程序。<br><br>responseText     从服务器进程返回数据的字符串形式。<br><br>responseXML   从服务器进程返回的DOM兼容的文档数据对象。<br><br>status           从服务器返回的数字代码，比如常见的404（未找到）和200（已就绪）<br><br>status Text       伴随状态码的字符串信息<br><br>readyState       对象状态值<br><br>0 (未初始化) 对象已建立，但是尚未初始化（尚未调用open方法）<br><br>1 (初始化) 对象已建立，尚未调用send方法<br><br>2 (发送数据) send方法已调用，但是当前的状态及http头未知<br><br>3 (数据传送中) 已接收部分数据，因为响应及http头不全，这时通过responseBody和responseText获取部分数据会出现错误，<br><br>4 (完成) 数据接收完毕,此时可以通过通过responseXml和responseText获取完整的回应数据<br><br>但是，由于各浏览器之间存在差异，所以创建一个XMLHttpRequest对象可能需要不同的方法。这个差异主要体现在IE和其它浏览器之间。下面是一个比较标准的创建XMLHttpRequest对象的方法。<br><br>function CreateXmlHttp()<br><br>   {<br><br>   <br><br>   //非IE浏览器创建XmlHttpRequest对象<br><br>    if(window.XmlHttpRequest)<br><br>    {<br><br>     xmlhttp=new XmlHttpRequest();<br><br>    }<br><br>    //IE浏览器创建XmlHttpRequest对象<br><br>     if(window.ActiveXObject)<br><br>    {<br><br>    try<br><br>    {<br><br>     xmlhttp=new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);     <br><br>    }<br><br>    catch(e)<br><br>    {<br><br>    try{<br><br>     xmlhttp=new ActiveXObject(&quot;msxml2.XMLHTTP&quot;);<br><br>     }<br><br>     catch(ex){}<br><br>    }<br><br>    }<br><br>   } <br><br>function TestAjax()<br><br>   {<br><br>    var data=document.getElementById(&quot;username&quot;).value;   <br><br>        CreateXmlHttp();<br><br>       if(!xmlhttp)<br><br>        {<br><br>         alert(&quot;创建xmlhttp对象异常！&quot;);<br><br>         return false;<br><br>        }       <br><br>        xmlhttp.open(&quot;POST&quot;,url,false);<br><br>        xmlhttp.onreadystatechange=function()<br><br>        {   <br><br>         if(xmlhttp.readyState==4)<br><br>           {<br><br>           document.getElementById(&quot;user1&quot;).innerHTML=&quot;数据正在加载...&quot;;<br><br>             if(xmlhttp.status==200)<br><br>             {<br><br>              document.write(xmlhttp.responseText);<br><br>             }      <br><br>           } <br><br>         }<br><br>        xmlhttp.send(); <br><br>   <br><br>   }<br><br>如上所示，函数首先检查XMLHttpRequest的整体状态并且保证它已经完成（readyStatus=4），即数据已经发送完毕。然后根据服务器的设定询问请求状态，如果一切已经就绪（status=200），那么就执行下面需要的操作。<br><br>对于XmlHttpRequest的两个方法，open和send，其中open方法指定了：<br><br>a、向服务器提交数据的类型，即post还是get。<br><br>b、请求的url地址和传递的参数。<br><br>c、传输方式，false为同步，true为异步。默认为true。如果是异步通信方式(true)，客户机就不等待服务器的响应；如果是同步方式(false)，客户机就要等到服务器返回消息后才去执行其他操作。我们需要根据实际需要来指定同步方式，在某些页面中，可能会发出多个请求，甚至是有组织有计划有队形大规模的高强度的request，而后一个是会覆盖前一个的，这个时候当然要指定同步方式。<br><br>    Send方法用来发送请求。<br><br>知道了XMLHttpRequest的工作流程，我们可以看出，XMLHttpRequest是完全用来向服务器发出一个请求的，它的作用也局限于此，但它的作用是整个ajax实现的关键，因为ajax无非是两个过程，发出请求和响应请求。并且它完全是一种客户端的技术。而XMLHttpRequest正是处理了服务器端和客户端通信的问题所以才会如此的重要。<br><br>现在，我们对ajax的原理大概可以有一个了解了。我们可以把服务器端看成一个数据接口，它返回的是一个纯文本流，当然，这个文本流可以是XML格式，可以是Html，可以是Javascript代码，也可以只是一个字符串。这时候，XMLHttpRequest向服务器端请求这个页面，服务器端将文本的结果写入页面，这和普通的web开发流程是一样的，不同的是，客户端在异步获取这个结果后，不是直接显示在页面，而是先由javascript来处理，然后再显示在页面。至于现在流行的很多ajax控件，比如magicajax等，可以返回DataSet等其它数据类型，只是将这个过程封装了的结果，本质上他们并没有什么太大的区别。<br><br>6、ajax的优点<br><br>   Ajax的给我们带来的好处大家基本上都深有体会，在这里我只简单的讲几点：<br><br>   1、最大的一点是页面无刷新，在页面内与服务器通信，给用户的体验非常好。<br><br>　 2、使用异步方式与服务器通信，不需要打断用户的操作，具有更加迅速的响应能力。<br><br>　 3、可以把以前一些服务器负担的工作转嫁到客户端，利用客户端闲置的能力来处理，减轻服务器和带宽的负担，节约空间和宽带租用成本。并且减轻服务器的负担，ajax的原则是“按需取数据”，可以最大程度的减少冗余请求，和响应对服务器造成的负担。<br><br>4、基于标准化的并被广泛支持的技术，不需要下载插件或者小程序。<br><br>7、ajax的缺点<br><br>下面我着重讲一讲ajax的缺陷，因为平时我们大多注意的都是ajax给我们所带来的好处诸如用户体验的提升。而对ajax所带来的缺陷有所忽视。<br><br>下面所阐述的ajax的缺陷都是它先天所产生的。<br><br>   1、ajax干掉了back按钮，即对浏览器后退机制的破坏。后退按钮是一个标准的web站点的重要功能，但是它没法和js进行很好的合作。这是ajax所带来的一个比较严重的问题，因为用户往往是希望能够通过后退来取消前一次操作的。那么对于这个问题有没有办法？答案是肯定的，用过Gmail的知道，Gmail下面采用的ajax技术解决了这个问题，在Gmail下面是可以后退的，但是，它也并不能改变ajax的机制，它只是采用的一个比较笨但是有效的办法，即用户单击后退按钮访问历史记录时，通过创建或使用一个隐藏的IFRAME来重现页面上的变更。（例如，当用户在Google Maps中单击后退时，它在一个隐藏的IFRAME中进行搜索，然后将搜索结果反映到Ajax元素上，以便将应用程序状态恢复到当时的状态。）<br><br>但是，虽然说这个问题是可以解决的，但是它所带来的开发成本是非常高的，和ajax框架所要求的快速开发是相背离的。这是ajax所带来的一个非常严重的问题。<br><br>2、安全问题<br><br>技术同时也对IT企业带来了新的安全威胁，ajax技术就如同对企业数据建立了一个直接通道。这使得开发者在不经意间会暴露比以前更多的数据和服务器逻辑。ajax的逻辑可以对客户端的安全扫描技术隐藏起来，允许黑客从远端服务器上建立新的攻击。还有ajax也难以避免一些已知的安全弱点，诸如跨站点脚步攻击、SQL注入攻击和基于credentials的安全漏洞等。<br><br>3、对搜索引擎的支持比较弱。<br><br>4、破坏了程序的异常机制。至少从目前看来，像ajax.dll，ajaxpro.dll这些ajax框架是会破坏程序的异常机制的。关于这个问题，我曾经在开发过程中遇到过，但是查了一下网上几乎没有相关的介绍。后来我自己做了一次试验，分别采用ajax和传统的form提交的模式来删除一条数据……给我们的调试带来了很大的困难。<br><br>5、另外，像其他方面的一些问题，比如说违背了url和资源定位的初衷。例如，我给你一个url地址，如果采用了ajax技术，也许你在该url地址下面看到的和我在这个url地址下看到的内容是不同的。这个和资源定位的初衷是相背离的。<br><br>6、一些手持设备（如手机、PDA等）现在还不能很好的支持ajax，比如说我们在手机的浏览器上打开采用ajax技术的网站时，它目前是不支持的，当然，这个问题和我们没太多关系。<br><br>8、ajax的几种框架<br><br>目前我们采用的比较多的ajax框架主要有ajax.dll,ajaxpro.dll,magicajax.dll 以及微软的atlas框架。Ajax.dll和Ajaxpro.dll这两个框架差别不大，而magicajax.dll只是封装得更厉害一些，比如说它可以直接返回DataSet数据集，前面我们已经说过，ajax返回的都是字符串，magicajax只是对它进行了封装而已。但是它的这个特点可以给我们带来很大的方便，比如说我们的页面有一个列表，而列表的数据是不断变化的，那么我们可以采用magicajax来处理，操作很简单，添加magicajax之后，将要更新的列表控件放在magicajax的控件之内，然后在pageload里面定义更新间隔的时间就ok了，atlas的原理和magicajax差不多。但是，需要注意的一个问题是，这几种框架都只支持IE，没有进行浏览器兼容方面的处理，用反编译工具察看他们的代码就可以知道。<br><br>除了这几种框架之外，我们平时用到的比较多的方式是自己创建xmlHttpRequest对象，这种方式和前面的几种框架相比更具有灵活性。另外，在这里还提一下aspnet2.0自带的异步回调接口，它和ajax一样也可以实现局部的无刷新，但它的实现实际上也是基于xmlhttprequest对象的，另外也是只支持IE，当然这是微软的一个竞争策略。<br><br>9.ajax应用举例<br><br>以上内容是转载高人写的资料，下面我将我在项目中实际应用给出个例子，这个例子是这样的：我参与的一个项目的值班安排模块里，选择值班人时，弹出的是个联系人树型TreeView结构图，点开哪个部门，然后部门下的联系人就展开了，原先是这样的，选择好某些联系人后，哪天白天或晚上的值班人就是这样的格式”小A，小B”，但是现在要求这样的格式”小A(部门一)，小B（部门二）”这里假设小A属于部门一，小B属于部门二。由于选择联系人是纯前台javascript的操作的，这里要通过联系人userlist表中的部门id，来取得部门的名称，也就是通过前台取后台的数据，这个在系列五里我也阐述过，下面给出代码：<br><br>var param  = &quot;date=&lt;%=stryear%&gt;/&lt;%=strmonth%&gt;/&quot; + x<br><br>                     +&quot;&amp;Type=&quot; + type<br><br>                     +&quot;&amp;Other=&quot; + eval(&quot;formData.RBOTHER&quot;+x+&quot;.value&quot;)<br><br>                     +&quot;&amp;ZBRY=&quot; + eval(&quot;formData.RBZBRY&quot;+x+&quot;.value&quot;)<br><br>                     +&quot;&amp;ZBRYID=&quot; + eval(&quot;formData.RBZBRYID&quot;+x+&quot;.value&quot;)<br><br>                     +&quot;&amp;Demo=&quot; + eval(&quot;formData.RBDEMO&quot;+x+&quot;.value&quot;)<br><br>                     +&quot;&amp;id=&quot; + eval(&quot;formData.RBZBID&quot;+x+&quot;.value&quot;);//传递的参数<br><br>                     <br><br>           var retVal = window.showModalDialog( &quot;chooseUsers.asp?&quot;+param,this, &quot;dialogWidth=280px; dialogHeight=500px; help=no; status=no; scroll=no; resizable=yes; &quot;);<br><br>//弹出对话框取得联系人      <br><br>//ajax调用服务器端方法取到部门名称<br><br>if(retVal ['userIds']!=&quot;&quot;&amp;&amp; retVal ['userIds']!=null)//联系人id集合格式1，2，3，4              <br><br>{<br><br>                var PostUrl=&quot; ../../../Application/CallBoard/GetDepartMentByUid.aspx?userIDs=&quot;+objRetVal['userIds']+&quot;&quot;;//后台处理页面url<br><br>           xmlHttp = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);//新建一个xmlhttprequest对象<br><br>           xmlHttp.open(&quot;POST&quot;, PostUrl, false);<br><br>           xmlHttp.setRequestHeader(&quot;Content-Type&quot;,&quot;application/x-www-form-urlencoded&quot;);<br><br>           xmlHttp.send(&quot;&quot;);<br><br>            var builder= xmlHttp.responseText; //将值传递回来,拼成了新格式<br><br>            eval(&quot;formData.RBZBRY&quot;+x+&quot;.value = '&quot; +builder+&quot;'&quot;);// formData.RBZBRY为一文本控件,将显示值班人员新格式<br><br>              }<br><br>           }<br><br>整个过程页面是无所新的，ajax异步调用让用户有了很好用户体验。 <!--v:3.2--> ]]></description>
<category><![CDATA[技术收集]]></category>
<author><![CDATA[328781034@qq.com(简单≠一句)]]></author>
<comments>http://328781034.qzone.qq.com/blog/1246546046#comment</comments>
<qz:effect>142606848</qz:effect>
<pubDate>Thu, 02 Jul 2009 14:47:26 GMT</pubDate>
<guid>http://328781034.qzone.qq.com/blog/1246546046</guid>
</item>

</channel>
</rss>

