2005年11月2日

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 She’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 阅读(329) | 评论 (0)编辑 收藏
 
     摘要: Network Working Group J. RosenbergRequest for Comments: 3261 dynamicsoftObsoletes: 2543 ...  阅读全文
posted @ 2006-03-01 11:28 Dorian's Blog 阅读(1081) | 评论 (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
 
【八趣通宝】
 
八趣通宝是国内最新的网赚,发展空间巨大,挂着就能赚钱!!像挂QQ一样挂着就能轻松狂挣人民币或Q币,登陆后只有铜钱大的图标在任务栏里不影响任何上网空间。另外它操作也比较人性化,已经通过本站的收款验证,所以在这里强强烈推荐!当然,这些都是在免费加入的前提下。不必担心上当受骗。
 
 
【soho】
 
这是咱中国人自己的广告运营商,网站正处于高速发展期。基础打好了,往后您的收益可是相当可观的,而您要做的只是坐在电脑前看看广告,就跟看电视广告一样。看电视可没人因为您看了广告给您钱啊!
 
 
 
【个人心得】
1、无需一点的财力投入,只赚不赔,是个有前景的好生意。
2、精力投入要量力而为。不要为了这点小钱浪费,否则得不偿失。
3、积极发展下线伙伴,高高兴兴一起赚钱。
 
大家也可以玩玩试试。
 
 
PS:本人已经不玩了,呵呵,费时费力。
posted @ 2006-02-23 10:33 Dorian's Blog 阅读(316) | 评论 (0)编辑 收藏
 
posted @ 2006-01-04 14:04 Dorian's Blog 阅读(312) | 评论 (0)编辑 收藏
 
    有心禅师德高望重,博学多闻,担任寂相寺住持,但来此向他问道的人虽多,可惜很少人能够契入。他有一位师弟名叫有得,根基迟钝,又有一目失明,平常都帮师兄做一些幕后工作,从未对客说法。
有一天,有心禅师刚好出们,有一禅僧来此参访,希望能当面请求开示,有得师弟不得已,只好硬着头皮以“无言对答”的方法来接见这位禅僧。
两人对面都不发一言,只是用手指笔画,不久之后,禅僧非常欣喜地向有得礼拜,拜后告辞。路上遇到有心禅师,因此就夸有得实在是个了不起的禅师法将,并滔滔地说着他向有得请益的经过道:“首先,我竖一指,表示大觉世尊,人天无二;他就竖起两指,表示佛、法二者,一体两面,是二而一。之后,我竖三指,表示佛、法、僧三宝,和合而往,缺一不可;他就在我面前捏起拳头,表示三者皆由一悟而得。至此,我已技穷,只得向他礼拜而出”。
禅僧说后离去,有心禅师回来,有得非常气氛地向他报告道:“刚才有一个禅僧非常无理,他一进门向我瞧了一眼,接着就竖起一指,讽刺我只有一只眼睛!我因他是来参访的禅僧,对他客气,所以我就竖起两指,表示他有两只眼睛,非常幸运。谁知道这个人非常无理,竟然举起三只指头,暗示他和我两个人只有三只眼睛,你说气不气人?因此我举起拳头,正要好好揍他,他就急忙磕个头跑掉了”。
有心禅师听后,不禁哑然失笑。
在人际交往的过程中,常常发生沟通上的误会,避免这种误会,彼此畅通无阻地交流,才能达到交际的目的。
posted @ 2005-12-19 17:53 Dorian's Blog 阅读(380) | 评论 (0)编辑 收藏
 
   









posted @ 2005-12-19 13:47 Dorian's Blog 阅读(374) | 评论 (0)编辑 收藏
 
    欲成就大的事业,必须具有豁达的人生观。豁达是一种超脱,是自我精神的解放。努力开拓人生,增进众生的福报,但却让我们看清楚,没有一样东西在生命终了时能带得走,所以要懂得达观,懂得放下,不要执著。
    人生百年,七十、八十也算是命大了。人这一辈子与其悲悲戚戚、郁郁寡欢地过,倒不如痛痛快快、潇潇洒洒地活。可人生一世,那么多的风风雨雨,坎坎坷坷,怎么才能活得精精神神的?豁达才是人生的奥秘。豁达是一种超脱,是自我精神的解放,人要是成天被名利缠得牢牢的,得失算得精精的,树叶子掉下来悲悲伤伤的,那还豁达个啥!豁达就要有点豪气,乍暖还寒寻常事,淡妆浓抹总相宜。凡事到了淡,就到了最高境界,天高云淡,一片光明。人肯定要有追求,追求是一回事,结果是一回事。你就记住一句话:事物的发生发展都必须符合时空条件,有“时”无“空”,有“空”无“时”都不行,那你就得认了.人活得累,是心累,常唠叨这几句话就会轻松得多:“功名利禄四道墙,人人翻滚跑得忙;若是你能看得穿,一生快活不嫌长。”
    豁达是一种宽容。恢宏大度,胸无芥蒂,肚大能容,吐纳百川。飞短流长怎么样,黑云压城又如何?心中自有一束不灭的阳光。以风清月朗的态度,从从容容地对待一切,待到廓清云雾,必定是柳暗花明。
豁达是一种开朗。豁达的人,心大,心宽,悲愁痛苦的情绪,都在嬉笑怒骂,大喊大叫中斯个粉碎。你说,世界上的事都公平?不公平有的是,你能让它都公平?我们要按生活本来的面目看生活,而不是按着自己的意愿看生活。风和日丽,你要欣赏,光怪陆离,你也要品尝,这才自然,你就不会有太多牢骚,太多的不公平。不过,“月有阴晴圆缺”对谁都一样,“十年河东,十年河西”,一切都会随着时间的推移而变化。阴阳对峙,此消彼长,升降入出,这就是生机,拿这大宇宙来看你这个小宇宙,你能超越的了?
    豁达是一种自信,人要是没有精神支撑,剩下的就是一具皮囊。人的这个精神就是自信,自信就是力量,自信给人智勇,自信可以使人消除烦恼,自信可以使人摆脱困境。有了自信,就充满了光明。

posted @ 2005-12-19 13:41 Dorian's Blog 阅读(562) | 评论 (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 阅读(647) | 评论 (1)编辑 收藏
 

    今天中午原本要到一个地方去办事的,因为对方临时有事,所以……
    一个人在拥挤的马路上闲逛,走着走着,走到了一个大型绿地。一眼望去,满眼
绿意真是舒坦。走到了一张空椅上,座了下来。任凭微风扶过脸庞,太阳轻抚额头,
秋天的那股子清香换洗肺中的浊气。轻轻闭上眼睛享受午后的优闲。这种感觉,这种
惬意,好像好久都没有过了,留在记忆中的也不过是在儿时的情景中了。是啊!这种
感觉在我生命中消失已经很久了。自已所需要的那种生活也已封存在内心的某个角落
里,永不见天日。
    现在想想究竟什么才是自己所要的生活?是够单纯?是够简单?是一箪食,一瓢
饮?还是其他什么精神上的东西?
    每天早上准时起床,准时挤车,准时上班。上班时间里除了处理掉一些日常事务
之外,还要多做一些能被同事所认同的事情。计划着要买房子,计划着要结婚,考虑
将来的正常生活,还必须得存一笔钱,长辈这边还要在节假日不时的关怀和孝敬一下。
学习方面还要不时的紧跟潮流……这样的生活把人的灵魂折磨的酸痛不堪。生活时刻
在继续,我们也时刻在放弃,逃避,对抗的冲动中挣扎。但悲哀的是,大多数情况下,
每晚只能在想着一切美好生活中昏昏沉沉地睡去,然后等着明天地太阳升起再重复着
今天。
    生活在都市中,很多人地生活大概都这样地吧!也许这就是生活吧!谁知道呢!
反正现在我是要睡觉了,等着明天再重复一次今天地生活。Good night!


ps. 希望梦可以做地好一点^_^

posted @ 2005-11-28 17:43 Dorian's Blog 阅读(354) | 评论 (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 阅读(682) | 评论 (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 阅读(863) | 评论 (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 。现在下载并解压缩这个文件可能是个好注意,它能够在你阅读文章的时候帮助你学习。

 

实 例

实例是一个使用 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 阅读(5687) | 评论 (0)编辑 收藏