2005年10月27日

          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 閱讀(338) | 評論 (0)編輯 收藏
           
               摘要: Network Working Group J. RosenbergRequest for Comments: 3261 dynamicsoftObsoletes: 2543 ...  閱讀全文
          posted @ 2006-03-01 11:28 Dorian's Blog 閱讀(1087) | 評論 (0)編輯 收藏
           
          原來是真的。我也無聊中俗了把,在網絡中賺錢。
           
           
          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是由新聞時報和易趣通過中國廣告網發起的廣告條賺錢方式,所以真實性絕對不容質疑,創辦于2004-5-23。NewsBar自創辦以來,以其良好的信譽得到網友廣泛支持,幾乎一直以每7秒增加一個新會員的速度飛速發展。目前已經突破800,000會員。NewsBar會員中,有部分成員每月收入均超過¥1000元。 努努力,下一個兼職月賺千元的就是你哦。

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









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

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

          1、研究說明

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

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

          2、接口說明:

            接口位置:tqq.tencent.com:8000
            通信協議:HTTP
            數據傳輸方法:POST
            HTTP請求格式:

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

          數據

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

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

          3、研究方法:

            我對目前網上的資料不夠滿意,就自己寫程序,發送多條相同CMD不同參數的請求,根據服務器的返回,來做判斷。感興趣的朋友可以參考一下,此處可以跳過。
            下面我公布我探測的代碼(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";
          //注意:登陸測試不能同時進行,必須等到服務器認為QQ斷開了,才能夠測試,不然結果不可信
          /*******
          $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";

          //發送驗證
          $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";

          //改變狀態
          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."";

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

            提交數據:VER=1.1&CMD=Login&SEQ=標記&UIN=QQ號&PS=QQ密碼&M5=1&LC=9326B87B234E7235
            說明:QQ密碼是通過md5加密的字符串,在PHP中可以直接用md5()進行加密;
               M5這個參數的作用還不清楚,但最好為1。
               LC這個參數有點神秘,不能有絲毫改動,不然服務器就沒有響應(沒有響應就是返回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).得到好友列表
            提交數據:VER=1.1&CMD=List&SEQ=標記&UIN=QQ號&TN=160&UN=0
            說明:TN、UN還不清楚具體表示什么,但是TN的值會影響返回的結果,有沒有UN對結果沒有影響

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

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

            返回: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時,FN=1,SN表示在線好友數,FC、ST、UN、NK的值用','分割,分別表示頭像、狀態、號碼、昵稱)
               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用戶的狀態,10為上線,20為離線(或隱身),30為忙碌;

            特別說明:當參數TN=0或不存在時,服務器返回:
          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次,第一次的結果中,FN為在線好友數,第二次返回的數據基本沒用。

          (4).查看好友信息
            提交數據: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=學生
          &LV=2&PC=郵編&PH=電話&PR= The guy is updating to .NET Frameword......&PV=江蘇&RN=胡吉陽&SC= 畢業院校&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=學生&LV=3&MO=136********&MT=0&MV=&PC=郵編& PH=電話&PR=The guy is 
          updating to .NET Frameword......&PV=江蘇&RN=胡吉陽&SC=畢業院校&SH=3&SX=0&UN=106814&NK=Hackfan 好(詳細查詢)
               VER=1.1&CMD=GETINFO&SEQ=標記&UIN=QQ號&RES=20(沒有正確登陸)
               NULL(UIN、LV、UN為字符)

            說明:AD為聯系地址
               AG為年齡
               BT為血型
               CO為星座
               CT為城市
               CV為未知*
               CY為國家
               EM為Email
               FC為頭像
               HP為網站
               ID為未知
               JB為職業
               LV為查詢代碼(就是發送的LV)
               MO為移動電話
               MT為未知
               MV為未知
               PC為郵編
               PH為聯系電話
               PR為簡介
               PV為省
               RN為真實姓名
               SC為畢業院校
               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).增加好友
            提交數據:VER=1.1&CMD=AddToList&SEQ=標記&UIN=QQ號&UN=對方QQ號

            返回:VER=1.1&CMD=AddToList&SEQ=標記&UIN=QQ號&RES=0&CD=0&UN=對方QQ號(允許被加為好友,此時他已經是你的好友)
               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).發送驗證
            說明:1、如果你加對方為好友,你需要發送驗證
               2、對方加你為好友,發送了驗證,你要通過或者拒絕
               這2種情況需要發送驗證消息

            提交數據: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字符)
            *如果服務器返回RES=3,那么這次對話的響應時間在20s。當發送驗證請求的時候,必須連發2次(請求內容不必一樣),其中一條RES=3,對方收不到,一條RES=0,對方能夠收到。當CD>=3時,RES=3,響應時間20s。

          (6).刪除好友
            提交數據: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(響應時間30s,重復發送的后果)
               VER=1.1&CMD=DelFromList&SEQ=標記&UIN=QQ號&RES=20(沒有正確登陸)
               NULL(UIN、UN為字符)

          (7).改變狀態
            提交數據:VER=1.1&CMD=Change_Stat&SEQ=標記&UIN=QQ號&ST=狀態代碼
            說明:狀態代碼: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(失敗,原因不明,響應時間20s,可能是過于頻繁的改變狀態引起的)
               VER=1.1&CMD=Change_Stat&SEQ=標記&UIN=QQ號&RES=20(沒有正確登陸)
               NULL(UIN為字符,ST非法)

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

          (9).獲得消息
            提交數據: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表示信息數量,MT、UN、MG的值用","分割,分別表示消息類型、發送人號碼、消息內容)
               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為字符)
            說明:關于MT:
                 9為用戶消息,99為系統消息,2為請求信息,3為通過驗證,4為拒絕被加好友
               關于MG:
                 當MT=9時,MG為用戶發送的消息內容
                 當MT=99時,
                   MG=10(QQ_STATUS_ONLINE)表示對方上線
                   MG=20(QQ_STATUS_OFFLINE)表示對方下線
                   MG=30(QQ_STATUS_BUSY)表示對方進入忙碌狀態
                 當MT=2時,MG為對方請求你驗證的信息
                 當MT=3時,表示對方通過你的驗證
                 當MT=4時,MG為對方拒絕你理由

          (10).發送消息
            提交數據:VER=1.1&CMD=CLTMSG&SEQ=標記&UIN=QQ號&UN=對方QQ號&MG=發送內容

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

          (11).登出
            提交數據: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)編輯 收藏
           

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


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

          posted @ 2005-11-28 17:43 Dorian's Blog 閱讀(366) | 評論 (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 調試新武器

           

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

           

          環境: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 的網頁文件。

           

          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) 中有個不易被發覺得錯誤”alert(Src)”

           

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

           

          你可以在 Venkman 中打開這個 Test.js 文件,也可以不用打開,因為在你打開了 Venkman 后,用 Firefox 執行任何帶有 JavaScript 的網頁,如果發生錯誤或者異常,Venkman 都會自動打開 這個 出錯的腳本文件。當然前提是你已經對 Venkman 進行過設置了(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 調試器的確很強大,在這里只不過做一個簡單的介紹罷了。

          posted @ 2005-11-08 16:40 Dorian's Blog 閱讀(873) | 評論 (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 框架來構建 Web 應用的實踐指南.

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

          介 紹

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

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

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

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

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

           

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

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

           

          實 例

          實例是一個使用 Spring Web Flow 的電話簿應用程序,我們將使用圖解的方式來說明他的功能意圖。這是一個典型的公司內網的應用程序,你會發現大部分功能可能你已經熟悉他的概念了。他主要允許你使用一些標準來查找公司的某位職員。一旦當你發現了某個適當地人,你就可以更進一步的查看他的信息,像電話號碼、辦公桌位置、他的經理是誰、他的同事有那些等等。圖1的草圖描繪了這個電話簿應用程序的基本需求和頁面流程。

          t_phoneBookAppSketch.jpg

          圖 1. 實例概覽

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

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

          因為本文的焦點是實現應用程序的 Web 接口,所以我們將會提供包含了硬編碼啞數據的基本業務層。領域對象被包含在com.ervacon.springframework.samples.phonebook.domain 包中。我們有 4 個業務類:

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

          確定好業務功能性后,我們準備使用 Spring Web Flow 來為電話簿應用程序開發 Web 接口。

          設置 Spring MVC

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

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

          • contextLoader servlet,當 Servlet 引擎(如 Tomcat )在加載我們的 Web 應用程序的時候進行初始化。
          • 一個名為 phoneBook 的 Spring Dispatcher Servlet。這個 Servlet 配置了處理所有相匹配的請求 (如 /phoneBook/*)。
          • index.jsp 將會成為應用程序的歡迎頁面。
          • 實例的 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 應用程序中,我們需要一個 Spring 應用程序上下文。它是你在應用程序上下文中定義業務對象最好的地方。這樣你就能夠干凈的區分你的業務對象和任何 Web 應用工件(artifacts)。讓我們跟隨這個練習創建一個 /WEB-INF/applicationContext.xml 文件來定義我們的業務門面: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 中適當的定義 Dispatcher Servlet。 這個 Servlet 將會以默認得方式讀取 /WEB-INF/ServletName-servlet.xml 配置文件。在我們的例子中將會是 /WEB-INF/phoneBook.xml。我們唯一需要配置的事是一個 View Resolver。這個 View Resolver 負責將視圖名(如:"criteria")解析成真實的視圖路進(如:/WEB-INF/JSP/criteria.jsp)。下面這段使用的是 InternalResourceViewResolver。 所以在我們的實例中,所有頁面的位置將會在 /WEB-INF/jsp 目錄中。

          我們假設所有其他的 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>


          待續……
           

          參考資源:

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

          昨天因為需要到銀行去辦理保險授權轉賬業務,所以到了一家工商銀行。

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

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

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

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

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

          ……

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

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

          無奈,隨又到個人理財中心等了近30分鐘辦理了轉賬授權業務。其間聽到前面的人也都是這么過來的……


          辦理完業務隨后打量了一番銀行,看見裝修豪華的業務大廳除了若干監視器外竟然沒有一個導向牌。

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

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

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

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

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

          隨即播報號碼到那個柜臺去辦理業務。

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

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

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


           

          posted @ 2005-11-01 09:27 Dorian's Blog 閱讀(902) | 評論 (0)編輯 收藏
           
          很久以前聽到過code coverage這個詞。但總是在我腦海中一閃而過,Ignore掉的。
          最近看到有一個opensource 的 EMMA,所以就Down下來玩玩。
          看了它的Quick Start發現可以配合JUnit之類的測試工具執行GUI程序。
          把它自帶的程序試了一下,它會產生記錄顯示剛才的操作執行了多少多少部分的代碼。
          覺得蠻好玩的,就自己試了一下:

          環境: EMMA v2.0,build4127
                        OS Windows 2003 server
                        JDK v1.4.2


          EMMA提供兩種使用模式,一個是指令模式(command mode)另外一個是使用Ant。

          將下載下來的JAR(emma.jar&emma_ant.jar)復制到你classpath所在的JRE目錄
           ex.E:\Program\J2SDK\jre\lib\ext
          然后在命令行下輸入Java emmarun,會看到它的使用方法和如何配參數。如果沒看到,那
          說明沒有把剛才兩個Jar包放在classpath中。

          隨后寫一個Hello world程序

          1public class HelloWorld {
          2    public HelloWorld() {
          3        System.out.println("Constructor");
          4    }

          5    public static void main(String[] args) {
          6        new HelloWorld();
          7        System.out.println("Hello World!");
          8    }

          9}

          編譯HelloWorld.java
           javac -d classes -g HelloWorld.java
          運行HelloWorld
           java -cp classes HelloWorld
          現在加入EMMA
           java emmarun -cp classes HelloWorld
          可看到類似如下輸出:
          Constructor
          Hello World!
          EMMA: writing [txt] report to [F:\我的文檔\EMMA\coverage.txt] ...
          你可以看一下執行后在你目錄中的coverage。txt文件
          內容類似如下:
          [EMMA v2.0.4217 report, generated Thu Oct 28 09:09:45 CST 2004]
          -------------------------------------------------------------------------------
          OVERALL COVERAGE SUMMARY:

          [class, %] [method, %] [block, %] [line, %] [name]
          100% (1/1) 100% (2/2) 100% (14/14) 100% (6/6) all classes

          OVERALL STATS SUMMARY:

          total packages: 1
          total classes: 1
          total methods: 2
          total executable files: 1
          total executable lines: 6

          COVERAGE BREAKDOWN BY PACKAGE:

          [class, %] [method, %] [block, %] [line, %] [name]
          100% (1/1) 100% (2/2) 100% (14/14) 100% (6/6) default package
          -------------------------------------------------------------------------------

          這些數據蠻難看懂的,不過EMMA提供三種輸出格式 txt,html,xml

          接下來看看可以加入原代碼的一份html報表。

          這樣來執行:
           java emmarun -r html -sp . -cp classes HelloWorld
           //-sp 代表源文件的所在地,我的源文件在當前目錄,故用 "."
          執行后你就可以看到EMMA生成了一個叫coverage的目錄。在里面的許多html就是帶源文件的一份報表。如下所示:

          t_o_1.jpg

          t_o_2.jpg


          這份東西還是蠻詳細的,可以看到那些東西或者說那些狀況沒有考慮到的。
          至于ant的實現以后要用時在說吧!畢竟這東西好玩歸好玩,暫時還用不上。^_^

          posted @ 2005-10-27 16:32 Dorian's Blog 閱讀(4166) | 評論 (0)編輯 收藏
           

          剛才在閑逛的時候發現了一個用 JavaScirpt 實現的代碼高亮引擎。

          用了一下,發現滿好用的。

          這是他解析后的代碼
          t_HighLight_Demo.jpg

          Download:  http://www.dreamprojections.com/SyntaxHighlighter/
          Examples:  http://www.dreamprojections.com/SyntaxHighlighter/Examples.aspx


          遺憾的是這個引擎沒有 Java 的高亮。

          所以自己添加了一個解析 Java 的類。

          隨后在使用的過程中又發現,代碼段只能打開,而不能收起。

          故又修改了他的核心代碼。

          現把這兩個 JS 文件放上來^_^

          shCore.js      :  http://www.aygfsteel.com/Files/dorian/shCore.zip
          shBrushJava.js :  http://www.aygfsteel.com/Files/dorian/shBrushJava.zip

          posted @ 2005-10-27 15:03 Dorian's Blog 閱讀(522) | 評論 (0)編輯 收藏
           

          原先的 Blog 不太想要了,換個 Blog ,換份心情。

          一切從頭開始。
          ?

          posted @ 2005-10-27 11:53 Dorian's Blog 閱讀(330) | 評論 (0)編輯 收藏
           
          主站蜘蛛池模板: 盖州市| 台江县| 兴义市| 青龙| 永新县| 乌拉特后旗| 天祝| 陆丰市| 长兴县| 墨脱县| 嘉荫县| 儋州市| 诸暨市| 宣恩县| 东光县| 犍为县| 雅安市| 凌云县| 江川县| 凉山| 邢台市| 四川省| 宜都市| 淮南市| 利辛县| 客服| 麻阳| 犍为县| 绥芬河市| 高邑县| 临颍县| 松阳县| 哈巴河县| 麻城市| 昭苏县| 佳木斯市| 琼海市| 博乐市| 浮山县| 齐河县| 肥乡县|