2005年11月1日

          As a consistent devotee of the AJAX scene over the past year or so I have hundreds of feeds in my reader. Recently, I've had several email requests from readers requesting to know what AJAX websites I visit daily. While I visit any title that interest me, these are the sites I go to consistently.

          Since the coining of the the term AJAX over a year ago hundreds if not thousands of websites, blogs and forums have been buzzing with posts on the subject. As I've found this can sometimes leave search engines bewildered as to where the current and relevant information really exists. So I thought I would put together this list of what I think are some of the most relevant AJAX sites are worldwide.

          Please consider this list of AJAX reference sites to be in its infancy. I don't read as many languages as I'd like to so the current list is rather limited by language. Please feel free to add to this list by adding a comment to this post with other useful AJAX resource sites. If you think the idea of a moderated AJAX website resource list is a good idea let me know and I'll set up a wiki.

          Special thanks to all of the hard working developers who are spending their free time share their knowledge with all of us!

          English
          Ajaxian
          Simply one of the best AJAX sites on the web. Daily updates, insightful commentary and coverage of Ajax development around the world.

          AJAX Blog
          Daily AJAX content with sreenshots and commentary.

          AJAX Camp
          Ajax Camp is a community for learning, interacting, and asking questions about web-based development using Javascript and Ajax.

          AjaxForums
          Very active forums focusing on AJAX

          AJAX Freaks
          This website exists to provide you with information to use while learning or developing AJAX. If you need AJAX Help or you would like to provide AJAX Help to other developers, you are in the right place.

          AJAX Geek
          All things ajax, css, dhtml, xml, javascript, and geekier

          AJAX Goals
          AJAX site with forums, code samples, news and articles

          AJAX Guru
          AJAX blog by Kishore

          AJAX Impact
          Very nice AJAX Community with great references

          AjaxLessons
          AjaxLessons.com is a resource for ajax tutorials as well as information surrounding Ajax and web 2.0.

          AJAX Line
          AJAX Community with a blog, forum and tutorials

          Ajaxlinks
          AJAX links, code samples and news

          AJAX Magazine
          AJAX blog focusing on new AJAX developments.

          AJAXMatters
          Ajax Matters is an informational site about AJAX (short for "Advanced Javascripting and XML" or "Asynchronous JavaScripting and XML") and how these technologies are applied to web development. Simply put, I started Ajax Matters to collect and share information about the XMLHTTPRequest object, JavaScript and XML.

          AJAX Patterns
          The publicly editable repository of all things Ajax. Design Patterns, Frameworks, Libraries, Tools and Links

          AJAX Projects
          AJAX Projects categorized by programming language

          AJAX Review
          AJAX and web 2.0 dissected. The purpose of this site is simple. Take nifty web-tools, analyze them, post screenshots, and help people find useful (and not so useful) web applications

          AJAX Talk
          Discuss the new web

          Ajax Technology Forums
          Asynchronous JavaScript And XML Ajax forums, discussions and tech issues.

          Ajax Tutorial
          Ajax help for newbies

          AJAXwith
          AJAX resources and information

          AJAX World
          AJAX discussion group with over a thousand members!

          Aspects of AJAX
          AJAX blog with loads of resources

          Coding In Paradise
          Excellent and thoughtful AJAX tutorials and techniques by Brad Neuberg

          Cyber Dummy
          AJAX code samples and source code

          Fiftyfoureleven
          Fiftyfoureleven.com consists of a weblog and resources that focus on web development: designing, programming, copywriting and more.

          Jep's Rich User Interfaces blog
          About AJAX Performance and some other things by Jep Castelein of Backbase

          Logicalley
          AJAX blog by Chris van de Steeg author of LiveGrid

          Mozilla Developer Center
          Great site to get a first look at AJAX.

          Panasonic Youth
          AJAX blog by Rob Sanheim with a focus on AJAX and Java Technology

          Protolize
          Protolize is a place where we share most commonly used and helpful tools out there that we like to use as a web designer + developer.

          Rob Gonda
          Great AJAX Coldfusion content with commentary

          Software As Shea€?s Developed
          AJAX, Java Technology, patterns, usability by Michael Mahemoff

          There and Back Again
          The weblog of Joshua Eichorn, AJAX, PHP and Open Source

          Tony Yoo
          I've been getting many requests from people asking for this page where they can access different resources that are not included in Protolize.org website. So I've decided to keep this page up for those people.

          Web 2.0 Technologies
          Blog with resources for AJAX, javaScript and rails

          Italian
          On Ajax
          Italian blog covering AJAX developments

          Open AJAX
          Italian AJAX community site with forums, demos and articles

          Sastroup
          Italian language site with resources for AJAX, javascript and PHP.

          German
          Ajax Aspekte
          German language AJAX blog with loads of resources

          AJAX Community
          German language site devoted to AJAX and web 2.0 developments.

          Ajax Info
          German language blog focusing on AJAX and web 2.0.

          Ajax Scripting
          A nice German language ajax blog.

          Alvit - The Web Developers Handbook
          A German website written in English full of web dev resources. There is a nice section on AJAX, DOM and css

          Mathertel
          German blog presented in English with some nice AJAX references and projects by Matthias Hertel

          Japanese
          Ajax Blog
          Japanese Ajax presented in English (Asynchronous JavaScript + XML) blog by Yukio Andoh.

          Atmarkit
          Japanese language AJAX site providing code samples and source code

          Hatena
          Japanese site presented in English with AJAX resources

          Korean

          OK JSP
          Korean language site coving AJAX, JSP and XML

          Spanish
          Ingeniuz
          Spanish language site with a useful AJAX section
          posted @ 2006-06-13 10:02 Dorian's Blog 閱讀(337) | 評論 (0)編輯 收藏
           
               摘要: Network Working Group J. RosenbergRequest for Comments: 3261 dynamicsoftObsoletes: 2543 ...  閱讀全文
          posted @ 2006-03-01 11:28 Dorian's Blog 閱讀(1086) | 評論 (0)編輯 收藏
           
          原來是真的。我也無聊中俗了把,在網(wǎng)絡(luò)中賺錢。
           
           
          http://www.ads4cn.com/newsbar/refferer.asp?greco              (newsbar廣告)
           
          http://www.8qu.net/register.asp?net=greco                      (八趣通寶)
           
          http://www.sohoads.com/sabar/reg.asp?sj=greco                   (soho廣告)
           
          點擊以上地址,免費注冊即可。
           
           
          簡單介紹如下:
           
          【 newsbar】
           
          NewsBar是由新聞時報和易趣通過中國廣告網(wǎng)發(fā)起的廣告條賺錢方式,所以真實性絕對不容質(zhì)疑,創(chuàng)辦于2004-5-23。NewsBar自創(chuàng)辦以來,以其良好的信譽得到網(wǎng)友廣泛支持,幾乎一直以每7秒增加一個新會員的速度飛速發(fā)展。目前已經(jīng)突破800,000會員。NewsBar會員中,有部分成員每月收入均超過¥1000元。 努努力,下一個兼職月賺千元的就是你哦。

              注冊地址: http://www.ads4cn.com/newsbar/refferer.asp?greco
           
          【八趣通寶】
           
          八趣通寶是國內(nèi)最新的網(wǎng)賺,發(fā)展空間巨大,掛著就能賺錢!!像掛QQ一樣掛著就能輕松狂掙人民幣或Q幣,登陸后只有銅錢大的圖標在任務(wù)欄里不影響任何上網(wǎng)空間。另外它操作也比較人性化,已經(jīng)通過本站的收款驗證,所以在這里強強烈推薦!當然,這些都是在免費加入的前提下。不必擔心上當受騙。
           
           
          【soho】
           
          這是咱中國人自己的廣告運營商,網(wǎng)站正處于高速發(fā)展期。基礎(chǔ)打好了,往后您的收益可是相當可觀的,而您要做的只是坐在電腦前看看廣告,就跟看電視廣告一樣。看電視可沒人因為您看了廣告給您錢啊!
           
           
           
          【個人心得】
          1、無需一點的財力投入,只賺不賠,是個有前景的好生意。
          2、精力投入要量力而為。不要為了這點小錢浪費,否則得不償失。
          3、積極發(fā)展下線伙伴,高高興興一起賺錢。
           
          大家也可以玩玩試試。
           
           
          PS:本人已經(jīng)不玩了,呵呵,費時費力。
          posted @ 2006-02-23 10:33 Dorian's Blog 閱讀(322) | 評論 (0)編輯 收藏
           
          posted @ 2006-01-04 14:04 Dorian's Blog 閱讀(318) | 評論 (0)編輯 收藏
           
              有心禪師德高望重,博學(xué)多聞,擔任寂相寺住持,但來此向他問道的人雖多,可惜很少人能夠契入。他有一位師弟名叫有得,根基遲鈍,又有一目失明,平常都幫師兄做一些幕后工作,從未對客說法。
          有一天,有心禪師剛好出們,有一禪僧來此參訪,希望能當面請求開示,有得師弟不得已,只好硬著頭皮以“無言對答”的方法來接見這位禪僧。
          兩人對面都不發(fā)一言,只是用手指筆畫,不久之后,禪僧非常欣喜地向有得禮拜,拜后告辭。路上遇到有心禪師,因此就夸有得實在是個了不起的禪師法將,并滔滔地說著他向有得請益的經(jīng)過道:“首先,我豎一指,表示大覺世尊,人天無二;他就豎起兩指,表示佛、法二者,一體兩面,是二而一。之后,我豎三指,表示佛、法、僧三寶,和合而往,缺一不可;他就在我面前捏起拳頭,表示三者皆由一悟而得。至此,我已技窮,只得向他禮拜而出”。
          禪僧說后離去,有心禪師回來,有得非常氣氛地向他報告道:“剛才有一個禪僧非常無理,他一進門向我瞧了一眼,接著就豎起一指,諷刺我只有一只眼睛!我因他是來參訪的禪僧,對他客氣,所以我就豎起兩指,表示他有兩只眼睛,非常幸運。誰知道這個人非常無理,竟然舉起三只指頭,暗示他和我兩個人只有三只眼睛,你說氣不氣人?因此我舉起拳頭,正要好好揍他,他就急忙磕個頭跑掉了”。
          有心禪師聽后,不禁啞然失笑。
          在人際交往的過程中,常常發(fā)生溝通上的誤會,避免這種誤會,彼此暢通無阻地交流,才能達到交際的目的。
          posted @ 2005-12-19 17:53 Dorian's Blog 閱讀(387) | 評論 (0)編輯 收藏
           
             









          posted @ 2005-12-19 13:47 Dorian's Blog 閱讀(381) | 評論 (0)編輯 收藏
           
              欲成就大的事業(yè),必須具有豁達的人生觀。豁達是一種超脫,是自我精神的解放。努力開拓人生,增進眾生的福報,但卻讓我們看清楚,沒有一樣?xùn)|西在生命終了時能帶得走,所以要懂得達觀,懂得放下,不要執(zhí)著。
              人生百年,七十、八十也算是命大了。人這一輩子與其悲悲戚戚、郁郁寡歡地過,倒不如痛痛快快、瀟瀟灑灑地活。可人生一世,那么多的風(fēng)風(fēng)雨雨,坎坎坷坷,怎么才能活得精精神神的?豁達才是人生的奧秘。豁達是一種超脫,是自我精神的解放,人要是成天被名利纏得牢牢的,得失算得精精的,樹葉子掉下來悲悲傷傷的,那還豁達個啥!豁達就要有點豪氣,乍暖還寒尋常事,淡妝濃抹總相宜。凡事到了淡,就到了最高境界,天高云淡,一片光明。人肯定要有追求,追求是一回事,結(jié)果是一回事。你就記住一句話:事物的發(fā)生發(fā)展都必須符合時空條件,有“時”無“空”,有“空”無“時”都不行,那你就得認了.人活得累,是心累,常嘮叨這幾句話就會輕松得多:“功名利祿四道墻,人人翻滾跑得忙;若是你能看得穿,一生快活不嫌長。”
              豁達是一種寬容。恢宏大度,胸?zé)o芥蒂,肚大能容,吐納百川。飛短流長怎么樣,黑云壓城又如何?心中自有一束不滅的陽光。以風(fēng)清月朗的態(tài)度,從從容容地對待一切,待到廓清云霧,必定是柳暗花明。
          豁達是一種開朗。豁達的人,心大,心寬,悲愁痛苦的情緒,都在嬉笑怒罵,大喊大叫中斯個粉碎。你說,世界上的事都公平?不公平有的是,你能讓它都公平?我們要按生活本來的面目看生活,而不是按著自己的意愿看生活。風(fēng)和日麗,你要欣賞,光怪陸離,你也要品嘗,這才自然,你就不會有太多牢騷,太多的不公平。不過,“月有陰晴圓缺”對誰都一樣,“十年河?xùn)|,十年河西”,一切都會隨著時間的推移而變化。陰陽對峙,此消彼長,升降入出,這就是生機,拿這大宇宙來看你這個小宇宙,你能超越的了?
              豁達是一種自信,人要是沒有精神支撐,剩下的就是一具皮囊。人的這個精神就是自信,自信就是力量,自信給人智勇,自信可以使人消除煩惱,自信可以使人擺脫困境。有了自信,就充滿了光明。

          posted @ 2005-12-19 13:41 Dorian's Blog 閱讀(570) | 評論 (1)編輯 收藏
           
          來自:http://blog.donews.com/zwell/archive/2005/08/22/520301.aspx

          1、研究說明

            Tencent在tqq.tencent.com的8000有一個使用HTTP的QQ接口,通過這個接口,可以進行一些基本的操作,如:登陸、登出、改變登陸狀態(tài)(上線、忙碌、離線、隱身)、添加刪除好友、查看好友信息、發(fā)送驗證信息(接受被加為好友、申請加對方為好友、拒絕被加為好友)、收發(fā)用戶消息、系統(tǒng)信息。

            目前我研究的是1.1版本的HTTP QQ協(xié)議,研究是微程在的成果上進行的,不敢說有什么超越,只不過更為詳細和準確。

          2、接口說明:

            接口位置:tqq.tencent.com:8000
            通信協(xié)議:HTTP
            數(shù)據(jù)傳輸方法:POST
            HTTP請求格式:

          POST HTTP/1.1
          Host: tqq.tencent.com:8000
          Content-Type: text/plain; charset=UTF-8
          Content-length: 長度
          Connection: close

          數(shù)據(jù)

            其中長度為 數(shù)據(jù) 的長度,數(shù)據(jù)的格式:
            VER=1.1&CMD=命令&SEQ=標記&UIN=QQ號&....

            以上4個參數(shù)是每個請求都必有的。其中,VER表示協(xié)議的版本,目前為1.1,據(jù)說1.2已經(jīng)出來了,這個亂寫的話,服務(wù)器返回NULL; CMD為操作的指令,有Login、List、Query_Stat、GetInfo、AddToList、Ack_AddToList、 DelFromList、Change_Stat、GetMsgEx、CLTMSG、Logout;SEQ為當前請求的標記,防止重復(fù)發(fā)送,可以用當前時間,也可以用隨機數(shù);UIN是當前執(zhí)行操作的QQ號。不過不同的CMD還需要不同的參數(shù),下面我就公布我的研究成果。

          3、研究方法:

            我對目前網(wǎng)上的資料不夠滿意,就自己寫程序,發(fā)送多條相同CMD不同參數(shù)的請求,根據(jù)服務(wù)器的返回,來做判斷。感興趣的朋友可以參考一下,此處可以跳過。
            下面我公布我探測的代碼(PHP):

          [code:1:1bbf2dec18]
          <?
          $uin = "QQ號";
          $pwd = md5("QQ密碼");

          //登陸測試
          $poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M5=1&LC=9326B87B234E7235";
          //注意:登陸測試不能同時進行,必須等到服務(wù)器認為QQ斷開了,才能夠測試,不然結(jié)果不可信
          /*******
          $poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M5=0&LC=9326B87B234E7235";
          $poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M5=1&LC=9326B87B234E7235";
          $poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M5=2&LC=9326B87B234E7235";
          $poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M5=3&LC=9326B87B234E7235";
          $poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M6=1&LC=9326B87B234E7235";
          $poststring[] = "VER=1.1&CMD=Login&SEQ=".rand(1000,9000)."&UIN=".$uin."&PS=".$pwd."&M6=1&LC=1223423545756679";
          *******/


          //得到好友列表
          $poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin;
          $poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0";
          $poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=160";
          $poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=0";
          $poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=".rand(1,10);
          $poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=0";
          $poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=160&UN=0";
          $poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=160&UN=0";
          $poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=".rand(1,200)."&UN=0";
          $poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=".rand(1,200)."&UN=0";
          $poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=".rand(1,200)."&UN=0";
          $poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=".rand(1,10);
          $poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=".rand(1,10);
          $poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=".rand(1,10);
          $poststring[] = "VER=1.1&CMD=List&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=106814";

          //得到在線列表
          $poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin;
          $poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0";
          $poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=160";
          $poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=0";
          $poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=".rand(1,10);
          $poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=0";
          $poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=160&UN=0";
          $poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=160&UN=0";
          $poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=".rand(1,200)."&UN=0";
          $poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=".rand(1,200)."&UN=0";
          $poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=".rand(1,200)."&UN=0";
          $poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=".rand(1,10);
          $poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=".rand(1,10);
          $poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=".rand(1,10);
          $poststring[] = "VER=1.1&CMD=Query_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&TN=0&UN=106814";

          //查看好友信息
          $poststring[] = "VER=1.1&CMD=GetInfo&SEQ=".rand(1000,9000)."&UIN=".$uin."&LV=0&UN=106814";
          $poststring[] = "VER=1.1&CMD=GetInfo&SEQ=".rand(1000,9000)."&UIN=".$uin."&LV=1&UN=106814";
          $poststring[] = "VER=1.1&CMD=GetInfo&SEQ=".rand(1000,9000)."&UIN=".$uin."&LV=2&UN=106814";
          $poststring[] = "VER=1.1&CMD=GetInfo&SEQ=".rand(1000,9000)."&UIN=".$uin."&LV=3&UN=106814";
          $poststring[] = "VER=1.1&CMD=GetInfo&SEQ=".rand(1000,9000)."&UIN=".$uin."&LV=4&UN=106814";
          $poststring[] = "VER=1.1&CMD=GetInfo&SEQ=".rand(1000,9000)."&UIN=".$uin."&LV=5&UN=106814";

          //增加好友
          $poststring[] = "VER=1.1&CMD=AddToList&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814";

          //發(fā)送驗證
          $poststring[] = "VER=1.1&CMD=Ack_AddToList&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814&CD=0&RS=TEST";
          $poststring[] = "VER=1.1&CMD=Ack_AddToList&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814&CD=1&RS=TEST";
          $poststring[] = "VER=1.1&CMD=Ack_AddToList&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814&CD=2&RS=TEST";
          $poststring[] = "VER=1.1&CMD=Ack_AddToList&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814&CD=3&RS=TEST";
          $poststring[] = "VER=1.1&CMD=Ack_AddToList&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814&CD=4&RS=TEST";
          $poststring[] = "VER=1.1&CMD=Ack_AddToList&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814&CD=5&RS=TEST";

          //刪除好友
          $poststring[] = "VER=1.1&CMD=DelFromList&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814";

          //改變狀態(tài)
          for($i=0;$i<=60;$i=$i+5)
          {
          $poststring[] = "VER=1.1&CMD=Change_Stat&SEQ=".rand(1000,9000)."&UIN=".$uin."&ST=".$i;
          }

          //獲得消息
          $poststring[] = "VER=1.1&CMD=GetMsgEx&SEQ=".rand(1000,9000)."&UIN=".$uin."";

          //發(fā)送消息
          $poststring[] = "VER=1.1&CMD=CLTMSG&SEQ=".rand(1000,9000)."&UIN=".$uin."&UN=106814&MG=TEST";

          //登出
          $poststring[] = "VER=1.1&CMD=Logout&SEQ=".rand(1000,9000)."&UIN=".$uin."";

          $file = fopen("p.txt","w");

          foreach($poststring as $k=>$v)
          {
          ss_timing_start();
          $fp = fsockopen('tqq.tencent.com', '8000', $errno, $errstr, $timeout = 10); 

          if(!$fp){ 
           //error tell us 
           $content = $k.chr(13).chr(10)."ERROR:$errstr ($errno)"; 
             
          }else{ 

            //send the server request 
            fputs($fp, "POST HTTP/1.1\r\n"); 
          //  fputs($fp, "Host: $host\r\n"); 
          //  fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); 
            fputs($fp, "Content-length: ".strlen($v)."\r\n"); 
            fputs($fp, "Connection: close\r\n\r\n"); 
            fputs($fp, $v . "\r\n\r\n"); 

            //loop through the response from the server 
            $res = "";
            while(!feof($fp)) { 
             $res .= fgets($fp, 4096); 
            } 
            //close fp - we are done with it 
            fclose($fp); 

            $content = $v.chr(13).chr(10).$res;

          ss_timing_stop(); 
          $content .= chr(13).chr(10)."Time: ".ss_timing_current().chr(13).chr(10)."--------------------------------------".chr(13).chr(10);
          fputs($file,$content);
          }
          fclose($file);
          ?>
          <?
          function ss_timing_start ($name = "default") { 
          global $ss_timing_start_times; 
          $ss_timing_start_times[$name] = explode(' ', microtime()); 

          function ss_timing_stop ($name = "default") { 
          global $ss_timing_stop_times; 
          $ss_timing_stop_times[$name] = explode(' ', microtime()); 

          function ss_timing_current ($name = "default") { 
          global $ss_timing_start_times, $ss_timing_stop_times; 
          if (!isset($ss_timing_start_times[$name])) { 
          return 0; 

          if (!isset($ss_timing_stop_times[$name])) { 
          $stop_time = explode(' ', microtime()); 

          else { 
          $stop_time = $ss_timing_stop_times[$name]; 

          $current  =  $stop_time[1]-$ss_timing_start_times[$name][1]; 
          $current += $stop_time[0]-$ss_timing_start_times[$name][0]; 
          return $current; 

          ?>
          [/code:1:1bbf2dec18]

          4、研究成果:

          (1).登陸
            說明:在你做任何其他操作以前,你必須登陸。只有在登陸以后,你的其他指令才有可能被正確執(zhí)行(返回RES=0),不然服務(wù)器會返回RES= 20,不過有個例外,就是logout。當你成功登陸以后,服務(wù)器就會根據(jù)你的IP*和參數(shù)中的UIN來驗證身份。一臺電腦可以同時登陸多個QQ,互不影響,就是因為有參數(shù)UIN。
            *至于我能夠確定服務(wù)器是通過IP來驗證的,是因為服務(wù)器不可能通過我的請求獲得其他信息了^_^

            提交數(shù)據(jù):VER=1.1&CMD=Login&SEQ=標記&UIN=QQ號&PS=QQ密碼&M5=1&LC=9326B87B234E7235
            說明:QQ密碼是通過md5加密的字符串,在PHP中可以直接用md5()進行加密;
               M5這個參數(shù)的作用還不清楚,但最好為1。
               LC這個參數(shù)有點神秘,不能有絲毫改動,不然服務(wù)器就沒有響應(yīng)(沒有響應(yīng)就是返回NULL)。

            返回:VER=1.1&CMD=LOGIN&SEQ=標記&UIN=QQ號&RES=0&RS=0&HI=60&LI=300(成功)
               VER=1.1&CMD=LOGIN&SEQ=標記&UIN=QQ號&RES=0&RS=1&RA=密碼錯誤(密碼錯誤)
               VER=1.1&CMD=LOGIN&SEQ=標記&UIN=QQ號&RES=5(QQ號非法,如100)
               NULL(UIN為字符、PS為空、LC錯誤)

          (2).得到好友列表
            提交數(shù)據(jù):VER=1.1&CMD=List&SEQ=標記&UIN=QQ號&TN=160&UN=0
            說明:TN、UN還不清楚具體表示什么,但是TN的值會影響返回的結(jié)果,有沒有UN對結(jié)果沒有影響

            返回:VER=1.1&CMD=LIST&SEQ=標記&UIN=QQ號&RES=0&FN=9(當TN=0或沒有TN參數(shù)時,F(xiàn)N表示好友數(shù))
               VER=1.1&CMD=LIST&SEQ=標記&UIN=QQ號&RES=0&FN= 1&SN=9&UN=3814526,...,(當TN存在且非0時,F(xiàn)N=1,SN表示好友數(shù),UN為好友列表,用","分割)
               VER=1.1&CMD=LIST&SEQ=標記&UIN=QQ號&RES=20(沒有正確登陸)
               NULL(UIN、TN、UN為字符)

          (3).得到在線好友列表
            提交數(shù)據(jù):VER=1.1&CMD=Query_Stat&SEQ=標記&UIN=QQ號&TN=50&UN=0
            說明:TN、UN還不清楚具體表示什么,但是TN的值會影響返回的結(jié)果,有沒有UN對結(jié)果沒有影響

            返回:VER=1.1&CMD=QUERY_STAT&SEQ=標記&UIN=QQ號&RES= 0&FC=0,&FN=1&SN=1&ST=10,&UN=106814,&NK=Hackfan  好,(當TN存在且非0時,F(xiàn)N=1,SN表示在線好友數(shù),F(xiàn)C、ST、UN、NK的值用','分割,分別表示頭像、狀態(tài)、號碼、昵稱)
               VER=1.1&CMD=QUERY_STAT&SEQ=標記&UIN=QQ號&RES=20(沒有正確登陸)
               NULL(UIN、TN、UN為字符)
            說明:FC為QQ頭像的的ID,如的頭像ID為270,那么其頭使用的圖片為91.bmp,其算法為ID/3+1;
               ST為QQ用戶的狀態(tài),10為上線,20為離線(或隱身),30為忙碌;

            特別說明:當參數(shù)TN=0或不存在時,服務(wù)器返回:
          VER=1.1&CMD=Query_Stat&SEQ=標記&UIN=QQ號
          HTTP/1.1 200 OK
          Server: tencent imserver/1.0.0
          Content-Type: text/plain; charset=UTF-8
          Content-Length: 56

          VER=1.1&CMD=QUERY_STAT&SEQ=標記&UIN=QQ號&RES=0&FN=1
          HTTP/1.1 200 OK
          Server: tencent imserver/1.0.0
          Content-Type: text/plain; charset=UTF-8
          Content-Length: 77

          VER=1.1&CMD=QUERY_STAT&SEQ=標記&UIN=QQ號&RES=0&FC=&FN=1&SN=0&ST=&UN=&NK=
            返回了2次,第一次的結(jié)果中,F(xiàn)N為在線好友數(shù),第二次返回的數(shù)據(jù)基本沒用。

          (4).查看好友信息
            提交數(shù)據(jù):VER=1.1&CMD=GetInfo&SEQ=標記&UIN=QQ號&LV=查詢類型&UN=被查詢QQ號碼
            說明:LV=0,1為精簡查詢,LV=2為普通查詢,LV>=3為詳細查詢

            返回:VER=1.1&CMD=GETINFO&SEQ=標記&UIN=QQ號&RES=0&LV=0&UN=106814&NK=Hackfan 好(精簡查詢)
               VER=1.1&CMD=GETINFO&SEQ=標記&UIN=QQ號&RES=0&AD =地址&AG=19&EM=hackfan@qq.com&FC=0&HP=http: //blog.hackfan.net&JB=學(xué)生
          &LV=2&PC=郵編&PH=電話&PR= The guy is updating to .NET Frameword......&PV=江蘇&RN=胡吉陽&SC= 畢業(yè)院校&SX=0&UN=106814&NK=Hackfan 
          好(普通查詢)
               VER=1.1&CMD=GETINFO&SEQ=標記&UIN=QQ號&RES=0&AD =地址&AG=19&BT=2&CO=6&CT=蘇州&CV=%01&CY=中華人民共和國
          &EM=hackfan@qq.com&FC=0&HP=http://blog.hackfan.net&ID =-&JB=學(xué)生&LV=3&MO=136********&MT=0&MV=&PC=郵編& PH=電話&PR=The guy is 
          updating to .NET Frameword......&PV=江蘇&RN=胡吉陽&SC=畢業(yè)院校&SH=3&SX=0&UN=106814&NK=Hackfan 好(詳細查詢)
               VER=1.1&CMD=GETINFO&SEQ=標記&UIN=QQ號&RES=20(沒有正確登陸)
               NULL(UIN、LV、UN為字符)

            說明:AD為聯(lián)系地址
               AG為年齡
               BT為血型
               CO為星座
               CT為城市
               CV為未知*
               CY為國家
               EM為Email
               FC為頭像
               HP為網(wǎng)站
               ID為未知
               JB為職業(yè)
               LV為查詢代碼(就是發(fā)送的LV)
               MO為移動電話
               MT為未知
               MV為未知
               PC為郵編
               PH為聯(lián)系電話
               PR為簡介
               PV為省
               RN為真實姓名
               SC為畢業(yè)院校
               SH為生肖
               SX為性別
               UN為QQ號
               NK為昵稱

               血型:0 => '',
                  1 => 'A型',
                  2 => 'B型',
                  3 => 'O型',
                  4 => 'AB型',
                  5 => '其他'


               星座:0 => '',
                  1 => '水瓶座',
                  2 => '雙魚座',
                  3 => '牡羊座',
                  4 => '金牛座',
                  5 => '雙子座',
                  6 => '巨蟹座',
                  7 => '獅子座',
                  8 => '處女座',
                  9 => '天秤座',
                  10 => '天蝎座',
                  11 => '射手座',
                  12 => '摩羯座'

               生肖:0 => '',
                  1 => '鼠',
                  2 => '牛',
                  3 => '虎',
                  4 => '兔',
                  5 => '龍',
                  6 => '蛇',
                  7 => '馬',
                  8 => '羊',
                  9 => '猴',
                  10 => '雞',
                  11 => '狗',
                  12 => '豬'

               性別:0 => '男',
                  1 => '女'

          (5).增加好友
            提交數(shù)據(jù):VER=1.1&CMD=AddToList&SEQ=標記&UIN=QQ號&UN=對方QQ號

            返回:VER=1.1&CMD=AddToList&SEQ=標記&UIN=QQ號&RES=0&CD=0&UN=對方QQ號(允許被加為好友,此時他已經(jīng)是你的好友)
               VER=1.1&CMD=AddToList&SEQ=標記&UIN=QQ號&RES=0&CD=1&UN=對方QQ號(需要驗證)
               VER=1.1&CMD=AddToList&SEQ=標記&UIN=QQ號&RES=0&CD=2&UN=對方QQ號(決絕被加為好友)
               VER=1.1&CMD=AddToList&SEQ=標記&UIN=QQ號&RES=20(沒有正確登陸)
               NULL(UIN、UN為字符)

          (5).發(fā)送驗證
            說明:1、如果你加對方為好友,你需要發(fā)送驗證
               2、對方加你為好友,發(fā)送了驗證,你要通過或者拒絕
               這2種情況需要發(fā)送驗證消息

            提交數(shù)據(jù):VER=1.1&CMD=Ack_AddToList&SEQ=標記&UIN=QQ號&UN=對方QQ號&CD=驗證類型&RS=理由
            說明:CD為0表示“通過驗證”,CD為1表示“拒決加為對方為好友”,CD為2表示“為請求對方加為好友”。

            返回:VER=1.1&CMD=Ack_AddToList&SEQ=標記&UIN=QQ號&RES=0(成功)
               VER=1.1&CMD=Ack_AddToList&SEQ=標記&UIN=QQ號&RES=3(*)
               VER=1.1&CMD=Ack_AddToList&SEQ=標記&UIN=QQ號&RES=20(沒有正確登陸)
               NULL(UIN、UN、CD為字符,RS為非UTF-8字符)
            *如果服務(wù)器返回RES=3,那么這次對話的響應(yīng)時間在20s。當發(fā)送驗證請求的時候,必須連發(fā)2次(請求內(nèi)容不必一樣),其中一條RES=3,對方收不到,一條RES=0,對方能夠收到。當CD>=3時,RES=3,響應(yīng)時間20s。

          (6).刪除好友
            提交數(shù)據(jù):VER=1.1&CMD=DelFromList&SEQ=標記&UIN=QQ號&UN=刪除的QQ號

            返回:VER=1.1&CMD=DelFromList&SEQ=標記&UIN=QQ號&RES=0&(成功)
               VER=1.1&CMD=DelFromList&SEQ=標記&UIN=QQ號&RES=3(響應(yīng)時間30s,重復(fù)發(fā)送的后果)
               VER=1.1&CMD=DelFromList&SEQ=標記&UIN=QQ號&RES=20(沒有正確登陸)
               NULL(UIN、UN為字符)

          (7).改變狀態(tài)
            提交數(shù)據(jù):VER=1.1&CMD=Change_Stat&SEQ=標記&UIN=QQ號&ST=狀態(tài)代碼
            說明:狀態(tài)代碼:10為上線,20為離線,30為忙碌,40為隱身,其他視為非法

            返回:VER=1.1&CMD=Change_Stat&SEQ=標記&UIN=QQ號&RES=0&(成功)
               VER=1.1&CMD=Change_Stat&SEQ=標記&UIN=QQ號&RES=3(失敗,原因不明,響應(yīng)時間20s,可能是過于頻繁的改變狀態(tài)引起的)
               VER=1.1&CMD=Change_Stat&SEQ=標記&UIN=QQ號&RES=20(沒有正確登陸)
               NULL(UIN為字符,ST非法)

            特別說明:如果你改變好友,將會給所有好友發(fā)送一條系統(tǒng)信息,內(nèi)容就是狀態(tài)代碼;如果隱身,發(fā)送的狀態(tài)代碼為20,表示離線。
                 同理,當你的好友改變狀態(tài),你也會收到一條系統(tǒng)信息。

          (9).獲得消息
            提交數(shù)據(jù):VER=1.1&CMD=GetMsgEx&SEQ=標記&UIN=QQ號

            返回:VER=1.1&CMD=GETMSGEX&SEQ=標記&UIN=QQ號&RES=0& MN=4&MT=99,99,99,9,&UN=36791785,99833581,99833581,106814,&MG= 20,30,10,hi ,(MN表示信息數(shù)量,MT、UN、MG的值用","分割,分別表示消息類型、發(fā)送人號碼、消息內(nèi)容)
               VER=1.1&CMD=GETMSGEX&SEQ=標記&UIN=QQ號&RES=0&MN=0&MT=&UN=&MG=(表示沒有信息)
               VER=1.1&CMD=GETMSGEX&SEQ=標記&UIN=QQ號&RES=20(沒有正確登陸)
               NULL(UIN為字符)
            說明:關(guān)于MT:
                 9為用戶消息,99為系統(tǒng)消息,2為請求信息,3為通過驗證,4為拒絕被加好友
               關(guān)于MG:
                 當MT=9時,MG為用戶發(fā)送的消息內(nèi)容
                 當MT=99時,
                   MG=10(QQ_STATUS_ONLINE)表示對方上線
                   MG=20(QQ_STATUS_OFFLINE)表示對方下線
                   MG=30(QQ_STATUS_BUSY)表示對方進入忙碌狀態(tài)
                 當MT=2時,MG為對方請求你驗證的信息
                 當MT=3時,表示對方通過你的驗證
                 當MT=4時,MG為對方拒絕你理由

          (10).發(fā)送消息
            提交數(shù)據(jù):VER=1.1&CMD=CLTMSG&SEQ=標記&UIN=QQ號&UN=對方QQ號&MG=發(fā)送內(nèi)容

            返回:VER=1.1&CMD=CLTMSG&SEQ=標記&UIN=QQ號&RES=0&(成功發(fā)送,對方不一定能收到哦)
               VER=1.1&CMD=CLTMSG&SEQ=標記&UIN=QQ號&RES=3(發(fā)送過快)
               VER=1.1&CMD=CLTMSG&SEQ=標記&UIN=QQ號&RES=20(沒有正確登陸)
               NULL(UIN、UN為字符,MG含非UTF-8字符)
            說明:1、當你發(fā)消息時,以下情形對方可能看不到(其實是收到了,QQ不提示)你發(fā)送的消息:
                 你倆互為陌生人,且對方?jīng)]有和你說過話
                 你在他的陌生人列表里,并且他沒有和你說過話(沒有驗證)
               2、當你過快發(fā)送消息時,系統(tǒng)會給你一個懲罰,RES=3,相應(yīng)時間20s
               3、當我發(fā)送含有小寫字母h的信息時,服務(wù)器有可能返回NULL

          (11).登出
            提交數(shù)據(jù):VER=1.1&CMD=Logout&SEQ=標記&UIN=QQ號

            返回:VER=1.1&CMD=LOGOUT&SEQ=標記&UIN=QQ號&RES=0(成功,好像永遠成功的,不管你是否登陸)
               NULL(UIN為字符)
          posted @ 2005-12-12 14:54 Dorian's Blog 閱讀(655) | 評論 (1)編輯 收藏
           

              今天中午原本要到一個地方去辦事的,因為對方臨時有事,所以……
              一個人在擁擠的馬路上閑逛,走著走著,走到了一個大型綠地。一眼望去,滿眼
          綠意真是舒坦。走到了一張空椅上,座了下來。任憑微風(fēng)扶過臉龐,太陽輕撫額頭,
          秋天的那股子清香換洗肺中的濁氣。輕輕閉上眼睛享受午后的優(yōu)閑。這種感覺,這種
          愜意,好像好久都沒有過了,留在記憶中的也不過是在兒時的情景中了。是啊!這種
          感覺在我生命中消失已經(jīng)很久了。自已所需要的那種生活也已封存在內(nèi)心的某個角落
          里,永不見天日。
              現(xiàn)在想想究竟什么才是自己所要的生活?是夠單純?是夠簡單?是一簞食,一瓢
          飲?還是其他什么精神上的東西?
              每天早上準時起床,準時擠車,準時上班。上班時間里除了處理掉一些日常事務(wù)
          之外,還要多做一些能被同事所認同的事情。計劃著要買房子,計劃著要結(jié)婚,考慮
          將來的正常生活,還必須得存一筆錢,長輩這邊還要在節(jié)假日不時的關(guān)懷和孝敬一下。
          學(xué)習(xí)方面還要不時的緊跟潮流……這樣的生活把人的靈魂折磨的酸痛不堪。生活時刻
          在繼續(xù),我們也時刻在放棄,逃避,對抗的沖動中掙扎。但悲哀的是,大多數(shù)情況下,
          每晚只能在想著一切美好生活中昏昏沉沉地睡去,然后等著明天地太陽升起再重復(fù)著
          今天。
              生活在都市中,很多人地生活大概都這樣地吧!也許這就是生活吧!誰知道呢!
          反正現(xiàn)在我是要睡覺了,等著明天再重復(fù)一次今天地生活。Good night!


          ps. 希望夢可以做地好一點^_^

          posted @ 2005-11-28 17:43 Dorian's Blog 閱讀(364) | 評論 (0)編輯 收藏
           
          下面是模擬后的一些截圖:

          t_vista1b.jpg

          t_vista2b.jpg

          t_vista3b.jpg

          下面是教你怎么樣模擬的詳細教程:
          http://www.joejoe.biz/joejoe/vista.htm

          還有一些資源包下載:

          http://crystalxp.zerackiel.net/bricopack-vista-inspirat.php
          http://www.winmatrix.com/forums/index.php?showtopic=5684
          http://www.stardock.com/products/stylevista/download.asp
          posted @ 2005-11-21 14:15 Dorian's Blog 閱讀(690) | 評論 (0)編輯 收藏
           

          JavaScript 調(diào)試新武器

           

          Venkman 是為 基于 Mozilla 的瀏覽器而提供的一個強大的 JavaScript 調(diào)試環(huán)境。本文將對Venkman 做一個簡單的介紹。

           

          環(huán)境:Mozilla Firefox 1.0.4

          JavaScript Dubugger 0.9.84 (此為Venkman 的代號)

           

          第一步就是給 Firefox 安裝此插件。

           

          點這里下載并安裝插件

           

          安裝好后重啟一下 Firefox,就可在菜單工具 -> JavaScript Debugger 點擊來運行 Venkman

           

          Venkman 界面如下:

           t_venkman.jpg

           

           

          第二步,我們來寫一個有錯誤的代碼:

           

          一個名為 Test.js JavaScript 腳本文件。

           

          1function test(str) {
          2    alert(Str);
          3}

           

          一個名為 Test.html 的網(wǎng)頁文件。

           

          1<HTML>
          2    <HEAD>
          3    <Script Language="JavaScript" src="Test.js">Script>
          4    HEAD>
          5    
          6    <BODY onload="test('Hello')">
          7    BODY>
          8HTML>

           

          我們可以看到在 Test.js 中的方法 test(str) 中有個不易被發(fā)覺得錯誤”alert(Src)”

           

          這個 Src ,我們并沒有聲明過,像這種誤打在平時的寫代碼過程中經(jīng)常有這種問題。好,我們來看看 Venkman 是如何來捕捉這個 Bug 的。

           

          你可以在 Venkman 中打開這個 Test.js 文件,也可以不用打開,因為在你打開了 Venkman 后,用 Firefox 執(zhí)行任何帶有 JavaScript 的網(wǎng)頁,如果發(fā)生錯誤或者異常,Venkman 都會自動打開 這個 出錯的腳本文件。當然前提是你已經(jīng)對 Venkman 進行過設(shè)置了(Debug -> Error Triger -> Stop For Errors Debug -> Throw Triger -> Sotp For Exceptions)

           

          第三步,用 Friefox 打開這個 Test.html 文件。你就會看到 Venkman 報告類似于如下的錯誤:

          Stopped for error handler.
          #0: function test(str=string:"Hello") in line 2
          001: function test(str) {
          002:     alert(Str);
          Continuing from error handler.
          Exception ``ReferenceError: Str is not defined'' thrown from function test(str=string:"Hello") in line 2.
          [e] message = [string] "Str is not defined"
          Stopped for thrown exception.
          #0: function test(str=string:"Hello") in line 2
          001: function test(str) {
          002:     alert(Str);
          Continuing from thrown exception.
          Error ``ReferenceError: Str is not defined'' [xs] in file ``
          file:///E:/Dorian/MyDocument/Test.js'', line 2, character 0.

           

          其中可以很清除的看到 Str 是未聲明過的。

           

           

          呵呵,這個 JavaScript 調(diào)試器的確很強大,在這里只不過做一個簡單的介紹罷了。

          posted @ 2005-11-08 16:40 Dorian's Blog 閱讀(872) | 評論 (0)編輯 收藏
           

          Spring Web Flows

          實踐指南

          原文:Spring Web Flows - A Practical Guide

          Author: Erwin Vervaet (Mail To)

          translator: Dorian Shi (Mail To)

          這篇文章介紹了 Spring Web Flows。用實例來說明基于 Web Flow 的原理。文章也提供了一個使用 Web Flow 和 Spring 框架來構(gòu)建 Web 應(yīng)用的實踐指南.

          假定讀者已經(jīng)了解一些 J2EE Web 應(yīng)用、XML、Spirng 框架,當然還有 Spring 的 Web MVC 框架。你可以查看資源來了解這些信息。

          介 紹

          在一個 Web 應(yīng)用程序中傳統(tǒng)的定義一個頁面流程是一個一點也不直觀的過程。像 Struts 和 Spring 這樣的框架促使你把頁面流程放進單獨的控制器和視圖中。舉個例子:Struts 會把請求映射到一個 Action。這個 Action 會選擇一個視圖并轉(zhuǎn)發(fā)到這個視圖。雖然這是一個簡單并且實用的方法,但它有一個主要的缺點:到 Action 的定義文件 struts-config.xml 中看看,Web 應(yīng)用程序的所有頁面流程一點也不清晰。因為 Action 不能簡單的被重用,靈活性同樣也會遭到損害。

          Spring Web MVC 框架提供了一個細微的高級功能:表單控制器執(zhí)行一個預(yù)先定義好的工作流。有兩種控制器提供了這一特性:SimpleFormController 和 AbstractWizardFormController。然而,這些仍舊是一種一般化的硬編碼的工作流概念。

          到這里就要引入 Spring 的 Web Flow 了。它允許你用清晰簡單的方式展現(xiàn) Web 應(yīng)用的頁面流程。就像我們要看到的一樣,他有許多有點:

          • 一個 Web 應(yīng)用的頁面流程通過 Web Flow 定義文件(一個 XML 文件)清楚的展現(xiàn)出來。
          • Web Flow 可以被設(shè)計成自包含的(slef contained)。這意味著允許你在很多情形中把你應(yīng)用程序的一部分看成一個組件并且使之重用。
          • Web Flow 可以在一個 Web 應(yīng)用中總是使用一樣的手法來定義任何合理的頁面流程。你無需在非常特殊的情況下被迫使用專門的控制器。

          現(xiàn)在 Web Flow 有足夠的能力表示由一系列 State 組成的一個 Web 流程。State 是事件發(fā)生的流程點:舉例來說就是顯示一個視圖或者執(zhí)行一個 Action。每個 State 有一個或多個 transitions ,他們習(xí)慣于從一個 State 轉(zhuǎn)到另一個 State 。一個 transitions 被一個 Event 所觸發(fā)。 為了讓你對 Web 流程有一個大概的印象,下面這段 XML 定義了一個 Web 流程,大致等效于實現(xiàn)一個 SimpleFormController 的工作流 。對于這個 Web 流程的原理將在本文的稍后詳細說明。

           

          熟悉業(yè)務(wù)過程管理(BPM) 的讀者將認識到 Web 流程是普通工作流的一個特例,所以他們在理論上可以使用像 JBMP(請查看資源) 來實現(xiàn)一般化的 BMP 系統(tǒng)。既然簡單是 Spring Web Flow 的重要設(shè)計目的,所以它不會去使用這種一般化的工作流引擎。在我們 Web 應(yīng)用中,我們會用一個簡單的 Web 流程來描述一個頁面的流程。

          本文的剩余部分會用一個實例來說明這方面內(nèi)容,可以使用這個連接來下載源代碼:PhoneBook.war.zip 。現(xiàn)在下載并解壓縮這個文件可能是個好注意,它能夠在你閱讀文章的時候幫助你學(xué)習(xí)。

           

          實 例

          實例是一個使用 Spring Web Flow 的電話簿應(yīng)用程序,我們將使用圖解的方式來說明他的功能意圖。這是一個典型的公司內(nèi)網(wǎng)的應(yīng)用程序,你會發(fā)現(xiàn)大部分功能可能你已經(jīng)熟悉他的概念了。他主要允許你使用一些標準來查找公司的某位職員。一旦當你發(fā)現(xiàn)了某個適當?shù)厝耍憔涂梢愿M一步的查看他的信息,像電話號碼、辦公桌位置、他的經(jīng)理是誰、他的同事有那些等等。圖1的草圖描繪了這個電話簿應(yīng)用程序的基本需求和頁面流程。

          t_phoneBookAppSketch.jpg

          圖 1. 實例概覽

          就像草圖描述的那樣,應(yīng)用程序?qū)嶋H有兩個模塊組成: Search 模塊允許我們查找一個我們要的人,而 Detail 模塊則顯示查找到這個人的詳細信息。Search 模塊將會使用 Detail 模塊來顯示查詢結(jié)果中某人的詳細信息。草圖同樣顯示了我們可以在明細頁直接訪問被查人同事的明細。這意味著 Detail 模塊可以遞歸使用 Detail 模塊來顯示同事的明細。

          文章稍后,將看到我們可以在一個單獨的 Web 流程中定義各個模塊。這意味著我們會有兩個流程:一個 Search 流程和一個 Detail 流程。

          因為本文的焦點是實現(xiàn)應(yīng)用程序的 Web 接口,所以我們將會提供包含了硬編碼啞數(shù)據(jù)的基本業(yè)務(wù)層。領(lǐng)域?qū)ο蟊话赾om.ervacon.springframework.samples.phonebook.domain 包中。我們有 4 個業(yè)務(wù)類:

          • Person         — 一個簡單的 JavaBean 包含人員的信息 (名, 姓, 電話號碼 ...)。Person 對象使用 User Id 來唯一識別,是 UserId 類的一個實例。一個 Person 類同樣也維護他同事們的引用,同樣都是 Person 類的實例。
          • UserId         — 這是一個主要對象用來識別一個 Person。
          • PhoneBookQuery — 一個查詢對象,在電話簿中描述一個查詢。我們可以是使用姓,名或者姓名來查詢。
          • PhoneBook      — 我們的主要業(yè)務(wù)門面(Business Facade)。這個類僅僅定義了一些啞數(shù)據(jù)和兩個業(yè)務(wù)方法:
            •    public List query(PhoneBookQuery query)
            •    public Person getPerson(UserId userId)

          確定好業(yè)務(wù)功能性后,我們準備使用 Spring Web Flow 來為電話簿應(yīng)用程序開發(fā) Web 接口。

          設(shè)置 Spring MVC

          在我們開始使用 Web Flow 之前,我們需要配置一個基本的 Spring Web 應(yīng)用程序。要做的第一件事是我們必須確定在 /WEB-INF/lib 目錄下有我們所要的 jar 文件。一個 Spring Web Flow 的應(yīng)用程序需要4個jar在類路進下: 包含 Spring 框架自身的 Spring.jar;包含 Web Flow 控制器實現(xiàn)的 webflow.jar; 記錄日志所需的 commons-logging.jar 和用來讀取和分析 Web Flow XML 文件的 jdom.jar;

          由于這將是一個標準的 J2EE Web 應(yīng)用程序,所以需要在 /WEB-INF 目錄下有一個 web.xml 部署文件。下面是此部署描述文件的代碼,它描述了如下事物:

          • contextLoader servlet,當 Servlet 引擎(如 Tomcat )在加載我們的 Web 應(yīng)用程序的時候進行初始化。
          • 一個名為 phoneBook 的 Spring Dispatcher Servlet。這個 Servlet 配置了處理所有相匹配的請求 (如 /phoneBook/*)。
          • index.jsp 將會成為應(yīng)用程序的歡迎頁面。
          • 實例的 JSP 頁面使用到了 Spring 的 標簽庫,所以我們需要聲明它。實際的 TLD 文件存儲在 /WEB-INF/tld 目錄下。
           1xml version="1.0" encoding="UTF-8"?>
           2DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
           3    "http://java.sun.com/dtd/web-app_2_3.dtd">
           4<web-app id="WebApp">
           5    <servlet>
           6        <servlet-name>contextLoaderservlet-name>
           7        <servlet-class>org.springframework.web.context.ContextLoaderServletservlet-class>
           8        <load-on-startup>1load-on-startup>
           9    servlet>
          10    <servlet>
          11        <servlet-name>phoneBookservlet-name>
          12        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
          13        <load-on-startup>2load-on-startup>
          14    servlet>
          15    <servlet-mapping>
          16        <servlet-name>phoneBookservlet-name>
          17        <url-pattern>/phoneBook/*url-pattern>
          18    servlet-mapping>
          19    <welcome-file-list>
          20        <welcome-file>index.jspwelcome-file>
          21    welcome-file-list>
          22    <taglib>
          23        <taglib-uri>/WEB-INF/tld/spring.tldtaglib-uri>
          24        <taglib-location>/WEB-INF/tld/spring.tldtaglib-location>
          25    taglib>
          26web-app>

          在 Spring MVC 應(yīng)用程序中,我們需要一個 Spring 應(yīng)用程序上下文。它是你在應(yīng)用程序上下文中定義業(yè)務(wù)對象最好的地方。這樣你就能夠干凈的區(qū)分你的業(yè)務(wù)對象和任何 Web 應(yīng)用工件(artifacts)。讓我們跟隨這個練習(xí)創(chuàng)建一個 /WEB-INF/applicationContext.xml 文件來定義我們的業(yè)務(wù)門面:phoneBook Bean。

          1xml version="1.0" encoding="UTF-8"?>
          2DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
          3    "http://www.springframework.org/dtd/spring-beans.dtd">
          4<beans>
          5    <bean id="phoneBook" class="com.ervacon.springframework.samples.phonebook.domain.PhoneBook">
          6    bean>
          7beans>

          我們需要在 web.xml 中適當?shù)亩x Dispatcher Servlet。 這個 Servlet 將會以默認得方式讀取 /WEB-INF/ServletName-servlet.xml 配置文件。在我們的例子中將會是 /WEB-INF/phoneBook.xml。我們唯一需要配置的事是一個 View Resolver。這個 View Resolver 負責(zé)將視圖名(如:"criteria")解析成真實的視圖路進(如:/WEB-INF/JSP/criteria.jsp)。下面這段使用的是 InternalResourceViewResolver。 所以在我們的實例中,所有頁面的位置將會在 /WEB-INF/jsp 目錄中。

          我們假設(shè)所有其他的 Dispatcher Servlet 配置為默認值。這意味著我們將使用一個簡單的 BeanNameUrlHandlerMapping 來定位將要處理請求的控制器。對于如何配置 Dispatcher Servlet 的詳細信息請參考 Spring 的參考文檔(查看資源)。

          1xml version="1.0" encoding="UTF-8"?>
          2DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
          3    "http://www.springframework.org/dtd/spring-beans.dtd">
          4<beans>
          5    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          6        <property name="prefix"><value>/WEB-INF/jsp/value>property>
          7        <property name="suffix"><value>.jspvalue>property>
          8    bean>
          9beans>


          待續(xù)……
           

          參考資源:

          posted @ 2005-11-02 10:38 Dorian's Blog 閱讀(5694) | 評論 (0)編輯 收藏
           

          昨天因為需要到銀行去辦理保險授權(quán)轉(zhuǎn)賬業(yè)務(wù),所以到了一家工商銀行。

          一進銀行,就看到辦理業(yè)務(wù)的人很多,隨即找了一條比較人少的隊伍排著。

          雖然我這隊在我之前才6個人,沒想到還是排了將近50分鐘。

          在排隊的過程中,始終有人埋怨銀行工作人員業(yè)務(wù)不熟悉,等等之類的話。

          可我始終想,排歸排,等歸等,畢竟我們中國人多,很多客戶對銀行的業(yè)務(wù)也不知道,

          還有甚者盡然連密碼設(shè)沒設(shè)都不知道,這些都是造成業(yè)務(wù)處理慢的原因。

          ……

          總算輪到我了,告知銀行工作人員說我要辦理轉(zhuǎn)賬授權(quán)后,她向我指指左前方到個人理財中心去辦理。

          我的天,我頓時傻掉了,我排了近50分鐘,難道就為了這一句指路話?

          無奈,隨又到個人理財中心等了近30分鐘辦理了轉(zhuǎn)賬授權(quán)業(yè)務(wù)。其間聽到前面的人也都是這么過來的……


          辦理完業(yè)務(wù)隨后打量了一番銀行,看見裝修豪華的業(yè)務(wù)大廳除了若干監(jiān)視器外竟然沒有一個導(dǎo)向牌。

          還有,工作人員的灰色面孔(好像欠他100萬似的)。

          這些都是導(dǎo)致客戶體驗非常糟糕的直接原因。

          我之前都是通過自動取款,存款,轉(zhuǎn)帳機來辦理自己的需求的。

          即使有些業(yè)務(wù)(如:購買基金),都是在其他銀行辦理的。

          至少其他銀行在客戶進門后,讓客戶自動提取一張自己業(yè)務(wù)需求的號碼紙,

          隨即播報號碼到那個柜臺去辦理業(yè)務(wù)。

          類似這種方式就能解決這方面的客戶體驗問題。

          當然還有其他的一些問題亟待解決。

          我不希望在若干年的將來外資銀行把中國銀行打的一敗涂地……


           

          posted @ 2005-11-01 09:27 Dorian's Blog 閱讀(902) | 評論 (0)編輯 收藏
           
          主站蜘蛛池模板: 太原市| 石首市| 望奎县| 余庆县| 河池市| 抚松县| 博罗县| 溧阳市| 富平县| 工布江达县| 延长县| 盐源县| 得荣县| 堆龙德庆县| 达日县| 彭水| 浑源县| 乡宁县| 万荣县| 达拉特旗| 阜平县| 东丽区| 东丰县| 南郑县| 陆河县| 延寿县| 姚安县| 齐齐哈尔市| 赞皇县| 新郑市| 阿城市| 宝兴县| 望城县| 新源县| 石台县| 宁德市| 汉寿县| 信宜市| 当雄县| 射洪县| 马关县|