亚洲日韩一区二区一无码,亚洲人成网站18禁止久久影院,亚洲精品成人av在线http://m.tkk7.com/dorian/zh-cnTue, 13 May 2025 18:46:57 GMTTue, 13 May 2025 18:46:57 GMT6050 AJAX Reference Websites From Around the Worldhttp://m.tkk7.com/dorian/archive/2006/06/13/52351.htmlDorian's BlogDorian's BlogTue, 13 Jun 2006 02:02:00 GMThttp://m.tkk7.com/dorian/archive/2006/06/13/52351.htmlhttp://m.tkk7.com/dorian/comments/52351.htmlhttp://m.tkk7.com/dorian/archive/2006/06/13/52351.html#Feedback0http://m.tkk7.com/dorian/comments/commentRss/52351.htmlhttp://m.tkk7.com/dorian/services/trackbacks/52351.html
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

Dorian's Blog 2006-06-13 10:02 發表評論
]]>
RFC 3261 - SIP: Session Initiation Protocolhttp://m.tkk7.com/dorian/archive/2006/03/01/32986.htmlDorian's BlogDorian's BlogWed, 01 Mar 2006 03:28:00 GMThttp://m.tkk7.com/dorian/archive/2006/03/01/32986.htmlhttp://m.tkk7.com/dorian/comments/32986.htmlhttp://m.tkk7.com/dorian/archive/2006/03/01/32986.html#Feedback0http://m.tkk7.com/dorian/comments/commentRss/32986.htmlhttp://m.tkk7.com/dorian/services/trackbacks/32986.html閱讀全文

Dorian's Blog 2006-03-01 11:28 發表評論
]]>
網絡上真的可以賺錢?!http://m.tkk7.com/dorian/archive/2006/02/23/32072.htmlDorian's BlogDorian's BlogThu, 23 Feb 2006 02:33:00 GMThttp://m.tkk7.com/dorian/archive/2006/02/23/32072.htmlhttp://m.tkk7.com/dorian/comments/32072.htmlhttp://m.tkk7.com/dorian/archive/2006/02/23/32072.html#Feedback0http://m.tkk7.com/dorian/comments/commentRss/32072.htmlhttp://m.tkk7.com/dorian/services/trackbacks/32072.html原來是真的。我也無聊中俗了把,在網絡中賺錢。
 
 
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
 
【八趣通寶】
 
八趣通寶是國內最新的網賺,發展空間巨大,掛著就能賺錢!!像掛QQ一樣掛著就能輕松狂掙人民幣或Q幣,登陸后只有銅錢大的圖標在任務欄里不影響任何上網空間。另外它操作也比較人性化,已經通過本站的收款驗證,所以在這里強強烈推薦!當然,這些都是在免費加入的前提下。不必擔心上當受騙。
 
 
【soho】
 
這是咱中國人自己的廣告運營商,網站正處于高速發展期。基礎打好了,往后您的收益可是相當可觀的,而您要做的只是坐在電腦前看看廣告,就跟看電視廣告一樣。看電視可沒人因為您看了廣告給您錢啊!
 
 
 
【個人心得】
1、無需一點的財力投入,只賺不賠,是個有前景的好生意。
2、精力投入要量力而為。不要為了這點小錢浪費,否則得不償失。
3、積極發展下線伙伴,高高興興一起賺錢。
 
大家也可以玩玩試試。
 
 
PS:本人已經不玩了,呵呵,費時費力。


Dorian's Blog 2006-02-23 10:33 發表評論
]]>
愛過了http://m.tkk7.com/dorian/archive/2006/01/04/26547.htmlDorian's BlogDorian's BlogWed, 04 Jan 2006 06:04:00 GMThttp://m.tkk7.com/dorian/archive/2006/01/04/26547.htmlhttp://m.tkk7.com/dorian/comments/26547.htmlhttp://m.tkk7.com/dorian/archive/2006/01/04/26547.html#Feedback0http://m.tkk7.com/dorian/comments/commentRss/26547.htmlhttp://m.tkk7.com/dorian/services/trackbacks/26547.html

Dorian's Blog 2006-01-04 14:04 發表評論
]]>
真正的佛法http://m.tkk7.com/dorian/archive/2005/12/19/24657.htmlDorian's BlogDorian's BlogMon, 19 Dec 2005 09:53:00 GMThttp://m.tkk7.com/dorian/archive/2005/12/19/24657.htmlhttp://m.tkk7.com/dorian/comments/24657.htmlhttp://m.tkk7.com/dorian/archive/2005/12/19/24657.html#Feedback0http://m.tkk7.com/dorian/comments/commentRss/24657.htmlhttp://m.tkk7.com/dorian/services/trackbacks/24657.html有一天,有心禪師剛好出們,有一禪僧來此參訪,希望能當面請求開示,有得師弟不得已,只好硬著頭皮以“無言對答”的方法來接見這位禪僧。
兩人對面都不發一言,只是用手指筆畫,不久之后,禪僧非常欣喜地向有得禮拜,拜后告辭。路上遇到有心禪師,因此就夸有得實在是個了不起的禪師法將,并滔滔地說著他向有得請益的經過道:“首先,我豎一指,表示大覺世尊,人天無二;他就豎起兩指,表示佛、法二者,一體兩面,是二而一。之后,我豎三指,表示佛、法、僧三寶,和合而往,缺一不可;他就在我面前捏起拳頭,表示三者皆由一悟而得。至此,我已技窮,只得向他禮拜而出”。
禪僧說后離去,有心禪師回來,有得非常氣氛地向他報告道:“剛才有一個禪僧非常無理,他一進門向我瞧了一眼,接著就豎起一指,諷刺我只有一只眼睛!我因他是來參訪的禪僧,對他客氣,所以我就豎起兩指,表示他有兩只眼睛,非常幸運。誰知道這個人非常無理,竟然舉起三只指頭,暗示他和我兩個人只有三只眼睛,你說氣不氣人?因此我舉起拳頭,正要好好揍他,他就急忙磕個頭跑掉了”。
有心禪師聽后,不禁啞然失笑。
在人際交往的過程中,常常發生溝通上的誤會,避免這種誤會,彼此暢通無阻地交流,才能達到交際的目的。


Dorian's Blog 2005-12-19 17:53 發表評論
]]>
新買了只筆記本http://m.tkk7.com/dorian/archive/2005/12/19/24627.htmlDorian's BlogDorian's BlogMon, 19 Dec 2005 05:47:00 GMThttp://m.tkk7.com/dorian/archive/2005/12/19/24627.htmlhttp://m.tkk7.com/dorian/comments/24627.htmlhttp://m.tkk7.com/dorian/archive/2005/12/19/24627.html#Feedback0http://m.tkk7.com/dorian/comments/commentRss/24627.htmlhttp://m.tkk7.com/dorian/services/trackbacks/24627.html










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



Dorian's Blog 2005-12-19 13:41 發表評論
]]>
QQ的HTTP接口探究http://m.tkk7.com/dorian/archive/2005/12/12/23482.htmlDorian's BlogDorian's BlogMon, 12 Dec 2005 06:54:00 GMThttp://m.tkk7.com/dorian/archive/2005/12/12/23482.htmlhttp://m.tkk7.com/dorian/comments/23482.htmlhttp://m.tkk7.com/dorian/archive/2005/12/12/23482.html#Feedback1http://m.tkk7.com/dorian/comments/commentRss/23482.htmlhttp://m.tkk7.com/dorian/services/trackbacks/23482.html
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為字符)


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


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



Dorian's Blog 2005-11-28 17:43 發表評論
]]>
Windows XP 模擬 Windows Vistahttp://m.tkk7.com/dorian/archive/2005/11/21/20759.htmlDorian's BlogDorian's BlogMon, 21 Nov 2005 06:15:00 GMThttp://m.tkk7.com/dorian/archive/2005/11/21/20759.htmlhttp://m.tkk7.com/dorian/comments/20759.htmlhttp://m.tkk7.com/dorian/archive/2005/11/21/20759.html#Feedback0http://m.tkk7.com/dorian/comments/commentRss/20759.htmlhttp://m.tkk7.com/dorian/services/trackbacks/20759.html
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


Dorian's Blog 2005-11-21 14:15 發表評論
]]>
JavaScript 調試新武器http://m.tkk7.com/dorian/archive/2005/11/08/18801.htmlDorian's BlogDorian's BlogTue, 08 Nov 2005 08:40:00 GMThttp://m.tkk7.com/dorian/archive/2005/11/08/18801.htmlhttp://m.tkk7.com/dorian/comments/18801.htmlhttp://m.tkk7.com/dorian/archive/2005/11/08/18801.html#Feedback0http://m.tkk7.com/dorian/comments/commentRss/18801.htmlhttp://m.tkk7.com/dorian/services/trackbacks/18801.htmlJavaScript 調試新武器

 

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 調試器的確很強大,在這里只不過做一個簡單的介紹罷了。



Dorian's Blog 2005-11-08 16:40 發表評論
]]>
Spring Web Flows - 實踐指南 (1)http://m.tkk7.com/dorian/archive/2005/11/02/17770.htmlDorian's BlogDorian's BlogWed, 02 Nov 2005 02:38:00 GMThttp://m.tkk7.com/dorian/archive/2005/11/02/17770.htmlhttp://m.tkk7.com/dorian/comments/17770.htmlhttp://m.tkk7.com/dorian/archive/2005/11/02/17770.html#Feedback0http://m.tkk7.com/dorian/comments/commentRss/17770.htmlhttp://m.tkk7.com/dorian/services/trackbacks/17770.htmlSpring 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 。現在下載并解壓縮這個文件可能是個好注意,它能夠在你閱讀文章的時候幫助你學習。

 

實 例

實例是一個使用 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>


待續……
 

參考資源:



Dorian's Blog 2005-11-02 10:38 發表評論
]]>
糟糕的客戶體驗http://m.tkk7.com/dorian/archive/2005/11/01/17640.htmlDorian's BlogDorian's BlogTue, 01 Nov 2005 01:27:00 GMThttp://m.tkk7.com/dorian/archive/2005/11/01/17640.htmlhttp://m.tkk7.com/dorian/comments/17640.htmlhttp://m.tkk7.com/dorian/archive/2005/11/01/17640.html#Feedback0http://m.tkk7.com/dorian/comments/commentRss/17640.htmlhttp://m.tkk7.com/dorian/services/trackbacks/17640.html昨天因為需要到銀行去辦理保險授權轉賬業務,所以到了一家工商銀行。

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

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

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

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

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

……

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

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

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


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

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

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

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

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

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

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

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

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

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


 



Dorian's Blog 2005-11-01 09:27 發表評論
]]>
EMMA-OpenSource 的 Java code coverage 工具http://m.tkk7.com/dorian/archive/2005/10/27/17066.htmlDorian's BlogDorian's BlogThu, 27 Oct 2005 08:32:00 GMThttp://m.tkk7.com/dorian/archive/2005/10/27/17066.htmlhttp://m.tkk7.com/dorian/comments/17066.htmlhttp://m.tkk7.com/dorian/archive/2005/10/27/17066.html#Feedback0http://m.tkk7.com/dorian/comments/commentRss/17066.htmlhttp://m.tkk7.com/dorian/services/trackbacks/17066.html最近看到有一個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的實現以后要用時在說吧!畢竟這東西好玩歸好玩,暫時還用不上。^_^



Dorian's Blog 2005-10-27 16:32 發表評論
]]>
一個JavaScript的代碼高亮引擎http://m.tkk7.com/dorian/archive/2005/10/27/17051.htmlDorian's BlogDorian's BlogThu, 27 Oct 2005 07:03:00 GMThttp://m.tkk7.com/dorian/archive/2005/10/27/17051.htmlhttp://m.tkk7.com/dorian/comments/17051.htmlhttp://m.tkk7.com/dorian/archive/2005/10/27/17051.html#Feedback0http://m.tkk7.com/dorian/comments/commentRss/17051.htmlhttp://m.tkk7.com/dorian/services/trackbacks/17051.html剛才在閑逛的時候發現了一個用 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://m.tkk7.com/Files/dorian/shCore.zip
shBrushJava.js :  http://m.tkk7.com/Files/dorian/shBrushJava.zip



Dorian's Blog 2005-10-27 15:03 發表評論
]]>
主站蜘蛛池模板: 亚洲av日韩专区在线观看| 一级毛片免费在线观看网站| 美女黄网站人色视频免费国产| 最新亚洲人成无码网www电影| 亚洲综合激情六月婷婷在线观看 | 思思久久99热免费精品6| 久久精品国产亚洲5555| 最近免费中文字幕高清大全| 人人狠狠综合久久亚洲| 亚洲国产AV无码专区亚洲AV| 女人张开腿给人桶免费视频| 国内精品99亚洲免费高清| 欧洲 亚洲 国产图片综合| 国产亚洲日韩一区二区三区| 久久综合AV免费观看| 中文字幕免费观看全部电影| 中文字幕亚洲情99在线| 亚洲春色在线视频| 国产成人免费高清在线观看| 99久久精品免费视频| 深夜免费在线视频| 亚洲色少妇熟女11p| 亚洲影院在线观看| 国产亚洲一区区二区在线| 成人午夜免费福利| 99re免费视频| 四虎国产精品免费永久在线| 亚洲s码欧洲m码吹潮| 亚洲综合激情六月婷婷在线观看| 中文字幕久久亚洲一区| 永久黄网站色视频免费直播| 24小时在线免费视频| 两个人看的www免费视频| 新最免费影视大全在线播放| 亚洲中文字幕一区精品自拍| 久久综合亚洲鲁鲁五月天| 国产精品亚洲mnbav网站| 日本免费人成黄页在线观看视频 | 亚洲综合色视频在线观看| 免费毛片在线播放| 国产99视频精品免费观看7|