??xml version="1.0" encoding="utf-8" standalone="yes"?>日本一区高清,性欧美高清come,欧美成人ⅴideosxxxxxhttp://www.aygfsteel.com/liaojiyong/category/16563.htmlzh-cnTue, 19 Jun 2007 16:34:09 GMTTue, 19 Jun 2007 16:34:09 GMT60房子http://www.aygfsteel.com/liaojiyong/archive/2007/06/18/124960.htmlliaojiyongliaojiyongMon, 18 Jun 2007 08:26:00 GMThttp://www.aygfsteel.com/liaojiyong/archive/2007/06/18/124960.htmlhttp://www.aygfsteel.com/liaojiyong/comments/124960.htmlhttp://www.aygfsteel.com/liaojiyong/archive/2007/06/18/124960.html#Feedback0http://www.aygfsteel.com/liaojiyong/comments/commentRss/124960.htmlhttp://www.aygfsteel.com/liaojiyong/services/trackbacks/124960.htmlhttp://sz.goufang.com/zf/default.html
http://rent.sz.soufun.com/

liaojiyong 2007-06-18 16:26 发表评论
]]>
试驱动开?/title><link>http://www.aygfsteel.com/liaojiyong/archive/2007/01/17/94411.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 17 Jan 2007 05:42:00 GMT</pubDate><guid>http://www.aygfsteel.com/liaojiyong/archive/2007/01/17/94411.html</guid><wfw:comment>http://www.aygfsteel.com/liaojiyong/comments/94411.html</wfw:comment><comments>http://www.aygfsteel.com/liaojiyong/archive/2007/01/17/94411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/liaojiyong/comments/commentRss/94411.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/liaojiyong/services/trackbacks/94411.html</trackback:ping><description><![CDATA[ <font face="Verdana">  </font> <a target="_new"> <font face="Verdana">试驱动开?/font> </a> <font face="Verdana">QTest-Driven DevelopmentQ?/font> <a target="_new"> <font face="Verdana">TDD</font> </a> <font face="Verdana">Q是通过试定义所要开发的功能的接口,然后实现功能的开发过E?/font> <p> <font face="Verdana">      Test-Driven Development(TDD)Q是</font> <a target="_new"> <font face="Verdana">Extreme Programming</font> </a> <font face="Verdana"> (</font> <a target="_new"> <font face="Verdana">XP</font> </a> <font face="Verdana">)--</font> <a target="_new"> <font face="Verdana">极限~程</font> </a> <font face="Verdana">的一个重要组成部分?/font> </p> <p> <img src="http://www.itisedu.com/manage/Upload/image/2006312112811399.jpg" border="0" /> </p> <p> <font face="Verdana">      在上面的图中Q列出的的是XP?2?a target="_new">团队</a>实践。Test-Driven Development是其中之一?/font> </p> <p> <font face="Verdana">      Kent Beck 的著作TDD(Test Driven Development) 中详l讲qC试驱动开发?/font> </p> <p> <font face="Verdana">      当你使用TDD的时候一定要说明是测试驱动开发还是测试驱动设计。这两者是有区别的。测试驱动开发,是通过试定义所要开发的功能的接口,然后实现功能的开发过E。对于测试驱动设计,在XP中似乎已l消׃Q而是被测试驱动开发所取代。另外在XP中有用于描述设计的,SimpleDesign QDesign Improvement.</font> </p> <font face="Verdana"> <p> <br /> <strong>一、测试驱动开发的基本q程</strong> </p> <p>      1Q?明确当前要完成的功能。可以记录成一?TODO 列表?br />      2Q?快速完成针Ҏ功能?a target="_new">试用例</a>~写?br />      3Q?试代码~译不通过?br />      4Q?~写对应的功能代码?br />      5Q?试通过?br />      6Q?对代码进?a target="_new">重构</a>Qƈ保证试通过?br />      7Q?循环完成所有功能的开发?/p> <p> <strong>二、测试驱动开发的原则</strong> </p> <p>      1Q测试隔R不同代码的试应该怺隔离。对一块代码的试只考虑此代码的试Q不要考虑其实现细节(比如它用了其他<a target="_new">c?/a>的边界条Ӟ?</p> <p>      2Q一帽子。开发h员开发过E中要做不同的工作,比如Q编写测试代码、开发功能代码、对代码重构{。做不同的事Q承担不同的角色。开发h员完成对应的工作时应该保持注意力集中在当前工作上Q而不要过多的考虑其他斚w的细节,保证头上只有一帽子。避免考虑无关l节q多Q无谓地增加复杂度?/p> <p>      3Q测试列表。需要测试的功能点很多。应该在M阶段x加功?a target="_new">需?/a>问题Ӟ把相兛_能点加到试列表中,然后l箋手头工作。然后不断的完成对应的测?a target="_new">用例</a>、功能代码、重构。一是避免疏漏,也避免干扰当前进行的工作?/p> <p>      4Q测试驱动。这个比较核心。完成某个功能,某个c,首先~写试代码Q考虑其如何用、如何测试。然后在对其q行设计、编码?/p> <p>      5Q先写断a。测试代码编写时Q应该首先编写对功能代码的判断用的断a语句Q然后编写相应的辅助语句?/p> <p>      6Q可试性。功能代码设计、开发时应该h较强的可试性。其实遵循比较好的设计原则的代码都具备较好的试性。比如比较高的内聚性,量依赖于接口等?/p> <p>      7Q及旉构。无论是功能代码q是试代码Q对l构不合理,重复的代码等情况Q在试通过后,及时q行重构?/p> <p> <strong>三、测试驱动开发的试范围</strong> </p> <p>      按大?Kent Benk 的话Q对那些你认为应该测试的代码q行试Q测试驱动开发强调测试ƈ不应该是负担Q而应该是帮助我们减轻工作量的Ҏ?/p> <p> <strong>四、TDD的优?/strong> </p> <p>      『充满吸引力的优炏V?</p> <p>      完工时完工。表明我可以很清楚的看到自己的这D工作已l结束了Q而传l的方式很难知道什么时候编码工作结束了?<br />      全面正确的认识代码和利用代码Q而传l的方式没有q个Z?<br />      为利用你成果的h提供SampleQ无论它是要利用你的源代码,q是直接重用你提供的<a target="_new">lg</a>?<br />      开发小l间降低了交成本,提高了相互信赖程度?<br />      避免了过渡设计?<br />      pȝ可以与详的试集一起发布,从而对<a target="_new">E序</a>的将来版本的修改和扩展提供方ѝ?<br />      TDDl了我们自信Q让我们今天的问题今天解冻I明天的问题明天解冻I今天不能解决明天的问题,因ؓ明天的问题还没有出现(没有TestCase)Q除非有TestCase否则我决不写M代码Q明天也不必担心今天的问题,只要我亮了绿灯?</p> <p>      『不显而易见的优点?</p> <p>      逃避了设计角艌Ӏ对于一个敏L开发小l,每个人都在做设计?<br />      大部分时间代码处在高质量状态,100Q的旉里成果是可见的?<br />      ׃可以保证~写试和编写代码的是相同的E序员,降低了理解代码所p的成本?<br />      为减文和代码之间存在的细微的差别和由q种差别所引入的Bug作出杰出贡献?<br />      在预先设计和紧急设计之间徏立一U^衡点Qؓ你区分哪些设计该事先做、哪些设计该q代时做提供了一个可靠的判断依据?</p> <p>      『有争议的优炏V?</p> <p>       事实上提高了开发效率。每一个正在用TDDq相信TDD的h都会怿q一点,但观望者则不同Q不怿TDD的h甚至坚决反对q一点,q很正常Q世界Lq样?<br />      发现比传l测试方式更多的Bug?<br />      ?a target="_new">IDE</a>的调试功能失L义,或者应该说Q避免了令h头痛的调试和节约了调试的旉?<br />      L处在要么~程要么重构的状态下Q不会人抓狂。(两顶帽子Q?<br />      <a target="_new">单元试</a>非常有趣?/p> <p> <strong>五、TDD?优势</strong> </p> <p>      TDD的基本思\是通过试来推动整个开发的q行。而测试驱动开发技术ƈ不只是单U的试工作?/p> <p>      需求向来就?a target="_new">软g开?/a>q程中感觉最不好明确描述、易变的东西。这里说的需求不只是指用L需求,q包括对代码的用需求。很多开发h员最x的是后期q要修改某个cL者函数的接口q行修改或者扩展,Z么会发生q样的事情就是因部分代码的用需求没有很好的描述。测试驱动开发就是通过~写试用例Q先考虑代码的用需求(包括功能、过E、接口等Q,而且q个描述是无二义的,可执行验证的?/p> <p>      通过~写q部分代码的试用例Q对其功能的分解、用过E、接口都q行了设计。而且q种从用角度对代码的设计通常更符合后期开发的需求。可试的要求,对代码的内聚性的提高和复用都非常有益。因此测试驱动开发也是一U代码设计的q程?/p> <p>      开发h员通常对编写文档非常厌烦,但要使用、理解别人的代码旉常又希望能有文档进行指对{而测试驱动开发过E中产生的测试用例代码就是对代码的最好的解释?/p> <p>      快乐工作的基是对自己有信心Q对自己的工作成果有信心。当前很多开发h员却l常在担心:“代码是否正?”“辛苦编写的代码q有没有严重bugQ”“修改的C码对其他部分有没有媄响?”。这U担心甚臛_致某些代码应该修改却不敢修改的地步。测试驱动开发提供的试集就可以作ؓ你信心的来源?/p> <p>      当然试驱动开发最重要的功能还在于保障代码的正性,能够q速发现、定位bug。而迅速发现、定位bug是很多开发h员的梦想。针对关键代码的试集,以及不断完善的测试用例,速发现、定位bug提供了条件?/p> <p>      我的一D功能非常复杂的代码使用TDD开发完成,真实环境应用中只发现几个bugQ而且很快被定位解冟뀂您在应用后Q也一定会为U自信的开发过E,功能不断增加、完善的感觉Q迅速发现、定位bug的能力所感染Q喜Ƣ这个技术的?/p> <p>      那么是什么样的原理、方法提供上面说的这些好处哪Q下面我们就看看TDD的原理?/p> <p> <strong>六、TDD的原?/strong> </p> <p>      试驱动开发的基本思想是在开发功能代码之前,先编写测试代码。也是说在明确要开发某个功能后Q首先思考如何对q个功能q行试Qƈ完成试代码的编写,然后~写相关的代码满些测试用例。然后@环进行添加其他功能,直到完全部功能的开发?/p> <p>      我们q里把这个技术的应用领域从代码编写扩展到整个开发过E。应该对整个开发过E的各个阶段q行试驱动Q首先思考如何对q个阶段q行试、验证、考核Qƈ~写相关的测试文,然后开始下一步工作,最后再验证相关的工作。下图是一个比较流行的试模型QV试模型?/p> <p> <img src="http://www.itisedu.com/manage/Upload/image/2006312112737161.jpg" border="0" /> </p> <p>【图 V试模型?/p> <p>      在开发的各个阶段Q包?a target="_new">需求分?/a>、概要设计、详l设计、编码过E中都应该考虑相对应的试工作Q完成相关的试用例的设计、测试方案、测试计划的~写。这里提到的开发阶D只是D例,Ҏ实际的开发活动进行调整。相关的试文也不一定是非常详细复杂的文档,或者什么Ş式,但应该养成测试驱动的习惯?/p> <p>      关于试模型Q还有X试模型。这个测试模型,我认为,是对详细阶段和编码阶D进行徏模,应该说更详细的描qC详细设计和编码阶D늚开发行为。及针对某个功能q行对应的测试驱动开发?/p> <p> <img src="http://www.itisedu.com/manage/Upload/image/2006312112748103.jpg" border="0" /> </p> <p>【图 X试模型?/p> <p>     基本原理应该说非常简单,那么如何q行实际操作哪,下面对开发过E进行详l的介绍?/p> <p> <strong>七、测试技术 </strong> </p> <p>      1. 试范围、粒?/p> <p>      对哪些功能进行测试?会不会太J琐Q什么时候可以停止测试?q些问题比较常见。按大师 Kent Benk 的话Q对那些你认为应该测试的代码q行试。就是说Q要怿自己的感觉,自己的经验。那些重要的功能、核心的代码应该重Ҏ试。感到疲力_应该停下来休息一下。感觉没有必要更详细的测试,停止本轮测试?/p> <p>      试驱动开发强调测试ƈ不应该是负担Q而应该是帮助我们减轻工作量的Ҏ。而对于何时停止编写测试用例,也是应该Ҏ你的l验Q功能复杂、核心功能的代码应该编写更全面、细致的试用例Q否则测试流E即可?/p> <p>      试范围没有静态的标准Q同时也应该可以随着旉改变。对于开始没有编写够的试的功能代码,随着bug的出玎ͼҎbug补齐相关的测试用例即可?/p> <p>      步前进的原则,要求我们对大的功能块试Ӟ应该先分拆成更小的功能块q行试Q比如一个类A使用了类B、CQ就应该~写到A使用B、C功能的测试代码前Q完成对B、C的测试和开发。那么是不是每个类或者小函数都应该测试哪Q我认ؓ没有必要。你应该q用你的l验Q对那些可能出问题的地方重点试Q感觉不可能出问题的地方q它真正出问题的时候再补测试吧?/p> <p>      2. 怎么~写试用例</p> <p>      试用例的编写就用上了传l的试技术?/p> <p>      操作q程量模拟正常使用的过E?<br />      全面的测试用例应该尽量做到分支覆盖,核心代码量做到路径覆盖?<br />      试数据量包括Q真实数据、边界数据?<br />      试语句和测试数据应该尽量简单,Ҏ理解?<br />      Z避免对其他代码过多的依赖Q可以实现简单的桩函数或桩类QMock <a target="_new">Object</a>Q?<br />      如果内部状态非常复杂或者应该判断流E而不是状态,可以通过记录日志字符串的方式q行验证?</p> <p> <strong>八、Tips</strong> </p> <p>      很多朋友有疑问,“测试代码的正确性如何保障?是写试代码q是写测试文档?”这h不是会陷入“鸡生蛋Q蛋生鸡”的循环。其实是不会的。通常试代码通常是非常简单的Q通常围绕着某个情况的正性判断的几个语句Q如果太复杂Q就应该l箋分解啦。而传l的开发过E通常试文。但随着开发节奏的加快Q用户需求的不断变化Q维护高层(需求、概要设计)的测试文可以,更低层的试文档的成本的太大了。而且可实旉证功能正性的试代码是对代码最好的文档?/p> <p>      <a target="_new">软g</a>开发过E中Q除了遵守上面提到的试驱动开发的几个原则外,一个需要注意的问题是Q}防过度设计。编写功能代码时应该x于完成当前功能点Q通过试Q用最单、直接的方式来编码。过多的考虑后期的扩展,其他功能的添加,无疑增加了过多的复杂性,Ҏ产生问题。应该等到要dq些Ҏ时在进行详l的试驱动开发。到时候,有整套测试用例做基础Q通过不断重构很容易添加相关特性?/p> <p> <strong>九、FAQ</strong> </p> <p>[什么时候重构?]<br />如果您在软g公司工作Q就意味着您成天都会和想通过重构改善代码质量的想法打交道Q不仅您如此Q您的大部分同事也都如此。可是,I竟什么时候该重构Q什么情况下应该重构呢?我相信您和您的同事可能有很多不同的看法,最常见的答案是“该重构旉构”,“写不下ȝ时候重构”,和“下一ơP代开始之前重构”,或者干脆就是“最q没旉Q就不重构了Q下ơ有旉的时候重构吧”。正如您已经预见到我惌的——这些想法都是对重构的误解。重构不是一U构Y件的工具Q不是一U设计Y件的<a target="_new">模式</a>Q也不是一个Y件开发过E中的环节,正确理解重构的h应该把重构看成一U书写代码的方式Q或习惯Q重构时时刻L可能发生。在TDD中,除去~写试用例和实现测试用例之外的所有工作都是重构,所以,没有重构M设计都不能实现。至于什么时候重构嘛Q还要分开看,有三句话是我的经验:实现试用例旉构代码,完成某个Ҏ时重构设计Q品的重构完成后还要记得重构一下测试用例哦?/p> <p>[什么时候设计?]<br />q个问题比前面一个要隑֛{的多,实话实说Q本人在依照TDD开发Y件的时候也常常被这个问题困扎ͼL觉得有些问题应该在写试用例之前定下来,而有些问题应该在新增一个一个测试用例的q程中自然出玎ͼ水到渠成。所以,我的是,设计的时机应该由开发者自己把握,不要受到TDD方式的限Ӟ但是Q不需要事先确定的事一定不能事先确定,免得捆住了自q手脚?/p> <p>[什么时候增加新的TestCaseQ]<br />没事做的时候。通常我们认ؓQ如果你要增加一个新的功能,那么先写一个不能通过的TestCaseQ如果你发现了一个bugQ那么先写一个不能通过的TestCaseQ如果你现在什么都没有Q从0开始,请先写一个不能通过的TestCase。所有的工作都是从一个TestCase开始。此外,q要注意的是Q一些大师要求我们每ơ只允许有一个TestCase亮红灯,在这个TestCase没有Green之前不可以写别的TestCaseQ这U要求可以适当考虑Q但即有多个TestCase亮红灯也不要紧,q未q反TDD的主要精?/p> <p>[TestCase该怎么写?]<br />试用例的编写实际上是两个q程Q用尚不存在的代码和定义这些代码的执行l果。所以一个TestCase也就应该包括两个部分——场景和断言。第一ơ写TestCase的h会有很大的不适应的感觉,因ؓ你之前所写的所有东襉K是在解决问题Q现在要你提出问题确实不大习惯,不过不用担心Q你正在做正的事情Q而这个世界上最隄事情也不在于如何解决问题Q而在于ask the right questionQ?/p> <p>[TDD能帮助我消除Bug吗?]<br />{:不能Q千万不要把“测试”和“除虫”؜Z谈!“除虫”是指程序员通过自己的努力来减少bug的数量(消除bugq样的字眼我们还是不要讲为好^_^Q,而“测试”是指程序员书写产品以外的一D代码来保产品能有效工作。虽然TDD所~写的测试用例在一定程度上为寻找bug提供了依据,但事实上Q按照TDD的方式进行的软g开发是不可能通过TDD再找到bug的(x我们前面说的“完工时完工”)Q你惛_Q当我们的代码完成的时候,所有的试用例都亮了绿灯,q时隐藏在代码中的bug一个都不会露出马脚来?/p> <p>但是Q如果要问“测试”和“除虫”之间有什么联p,我相信还是有很多话可以讲的,比如TDD事实上减了bug的数量,把查找bug战役的关注点从全U战场提升到代码战场以上。还有,bug的最可怕之处不在于隐藏之深Q而在于满天遍野。如果你发现了一个用户很不容易才能发现的bugQ那么不一定对工作做出了什么杰A献,但是如果你发CD代码中Qbug的密度或LE度q高Q那么恭喜你Q你应该抛弃q写这D代码了。TDD避免了这U情况,所以将Lbug的工作降低到了一个新的低度?/p> <p>[我该Z个Feature~写TestCaseq是Z个类~写TestCaseQ]<br />初学者常问的问题。虽然我们从TDD的说明书上看到应该ؓ一个特性编写相应的TestCaseQ但Z么著名的TDD大师所写的TestCase都是和类/Ҏ一一对应的呢Qؓ了解释这个问题,我和我的同事们都做了很多试验Q最后我们得C一个结论,虽然我不知道是否正确Q但是如果您没有{案Q可以姑且相信我们?/p> <p>我们的研I结果表明,通常在一个特性的开发开始时Q我们针对特性编写测试用例,如果您发现这个特性无法用TestCase表达Q那么请这个特性细分,直至您可以ؓ手上的特性写出TestCase为止。从q里开始是最安全的,它不会导致Q何设计上重大的失误。但是,随着您不断的重构代码Q不断的重构TestCaseQ不断的依据TDD的思想做下去,最后当产品伴随试用例集一起发布的时候,您就会不l意的发现经q重构以后的试用例很可能是和品中的类/Ҏ一一对应的?/p> <p>[什么时候应该将全部试都运行一遍?]<br />Good QuestionQ大师们要求我们每次重构之后都要完整的运行一遍测试用例。这个要求可以理解,因ؓ重构很可能会改变整个代码的结构或设计Q从而导致不可预见的后果Q但是如果我正在开发的是一个ERP怎么办?q行一遍完整的试用例可能花Ҏ个小Ӟ况且现在很多重构都是由工具做到的Q这个要求的可行性和前提条g都有所动摇。所以我认ؓ原则上你可以挑几个你觉得可能受到本次重构影响的TestCase去runQ但是如果运行整个测试包只要p数秒的时_那么不介意你按大师的要求d?/p> <p>[什么时候改q一个TestCaseQ]<br />增加的测试用例或重构以后的代码导致了原来的TestCase的失M效果Q变得无意义Q甚臛_能导致错误的l果Q这时是改进TestCase的最好时机。但是有时你会发玎ͼq样做仅仅导致了原来的TestCase在设计上是臃肿的Q或者是冗余的,q都不要紧,只要它没有失效,你仍然不用去改进它。记住,TestCase不是你的产品Q它不要好看Q也不要怎么太科学,甚至没有性能要求Q它只要能完成它的命就可以了——这也证明了我们后面所说的“用Ctrl-C/Ctrl-V~写试用例”的可行性?/p> <p>但是Q美国h的想法其实跟我们q是不太一P拿托巴赞的MindMap来说吧,其实画MindMap只是Z表现自己的思\Q或记忆某些重要的事情,但托却大家把MindMapL一件艺术品Q甚臌有很多艺术家把自q的抽象派MindMap拿出来帮助托做宣传。同P大师们也要求我们把TestCase写的跟代码一栯量精良,可我惌的是Q现在国内有几个公司能把产品的代码写的精良?Q还是一步一步慢慢来吧?/p> <p>[Z么原来通过的测试用例现在不能通过了?]<br />q是一个警报,Red AlertQ它可能表达了两层意思——都不是什么好意思—?Q你刚刚q行的重构可能失败了Q或存在一些错误未被发玎ͼ臛_重构的结果和原来的代码不{h了?Q你刚刚增加的TestCase所表达的意思跟前面已经有的TestCase相冲H,也就是说Q新增的功能q背了已有的设计Q这U情况大部分可能是之前的设计错了。但无论哪错了,无论是那层意思,x到这个问题的Ҏ都比TDD的正常工作要难?/p> <p>[我怎么知道那里该有一个方法还是该有一个类Q]<br />q个问题也是常常出现在我的脑中Q无Z是第一ơ接触TDD或者已l成为TDD专家Q这个问题都会缠l着你不放。不q问题的{案可以参考前面的“什么时候设计”一节,{案不是唯一的。其实多数时候你不必考虑未来Q今天只做今天的事,只要有重构工P从方法到cd从类到方法都很容易?/p> <p>[我要写一个TestCaseQ可是不知道从哪里开始?]<br />从最重要的事开始,what matters mostQ从脚下开始,从手头上的工作开始,从眼前的事开始。从一个没有UI的核心特性开始,从算法开始,或者从最有可能耽误旉的模块开始,从一个最严重的bug开始。这是TDDM者和鼠目寸光者的一个共同点Q不同点是前者早已成竹在胸?/p> <p>[Z么我的测试L看v来有Ҏ蠢?]<br />哦?是吗Q来Q握个手Q我的也是!不必担心q一点,事实上,大师们给的例子也相当愚蠢Q比如一个极端的例子是要写一个两个int变量相加的方法,大师先断a2+3=5Q再断言5+5=10Q难道这些代码不是很愚蠢吗?其实q只是一个极端的例子Q当你初ơ接触TDDӞ写这L代码没什么不好,以后当你熟练时就会发现这样写没必要了Q要CQ谦虚是通往TDD的必l之路!从经典开发方法{向TDD像从面向过E{?a target="_new">面向对象</a>一样困难,你可能什么都懂,但你写出来的cL有一个纯<a target="_new">OO</a>的!我的同事q告诉我真正的太极拳Q其速度是很快的Q不比Q何一个快拌慢,但是初学者(通常是指学习太极拳的?0q_太不Ҏ把每个姿劉K做对Q所以只能慢慢来?/p> <p>[什么场合不适用TDDQ]<br />问的好,实有很多场合不适合使用TDD。比如对软g质量要求极高的军事或U研产品——神州六P人命兛_的Y件——医疗设备,{等Q再比如设计很重要必L前做好的软gQ这些都不适合TDDQ但是不适合TDD不代表不能写TestCaseQ只是作用不同,C不同|了?/p> </font> <img src ="http://www.aygfsteel.com/liaojiyong/aggbug/94411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/liaojiyong/" target="_blank">liaojiyong</a> 2007-01-17 13:42 <a href="http://www.aygfsteel.com/liaojiyong/archive/2007/01/17/94411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XP中的TDD是什么?试驱动开发?试驱动设计Q?/title><link>http://www.aygfsteel.com/liaojiyong/archive/2007/01/17/94410.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 17 Jan 2007 05:40:00 GMT</pubDate><guid>http://www.aygfsteel.com/liaojiyong/archive/2007/01/17/94410.html</guid><wfw:comment>http://www.aygfsteel.com/liaojiyong/comments/94410.html</wfw:comment><comments>http://www.aygfsteel.com/liaojiyong/archive/2007/01/17/94410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/liaojiyong/comments/commentRss/94410.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/liaojiyong/services/trackbacks/94410.html</trackback:ping><description><![CDATA[ <h3> <font color="#cc9933">XP中的TDD是什么?试驱动开发?试驱动设计Q?/font> </h3> <div> <a >http://c2.com/cgi/wiki?TestDrivenDevelopment</a> </div> <div> </div> <div> <img height="300" src="http://www.xprogramming.com/images/circles.jpg" width="500" /> </div> <div> <a name="test">  <h3><font color="#0000ff"><em>Test-Driven Development</em></font></h3><p></p></a> <a target="_SELF">http://www.xprogramming.com/xpmag/whatisxp.htm#test</a> <a name="test"> </a> <p> <font color="#0000ff"> <em>Extreme Programming is obsessed with feedback, and in software development, good feedback requires good testing. Top XP teams practice "test-driven development", working in very short cycles of adding a test, then making it work. Almost effortlessly, teams produce code with nearly 100 percent test coverage, which is a great step forward in most shops. (If your programmers are already doing even more sophisticated testing, more power to you. Keep it up, it can only help!)</em> </font> </p> <p> <font color="#0000ff"> <em>It isn't enough to write tests: you have to run them. Here, too, Extreme Programming is extreme. These "programmer tests", or "unit tests" are all collected together, and every time any programmer releases any code to the repository (and pairs typically release twice a day or more), every single one of the programmer tests must run correctly. One hundred percent, all the time! This means that programmers get immediate feedback on how they're doing. Additionally, these tests provide invaluable support as the software design is improved.</em> </font> </p> </div> <div>在上面的图中Q列出的的是XP?2个团队实cTest-Driven Development是其中之一?/div> <div>Kent Beck 的著作TDD(Test Driven Development) 中详l讲qC试驱动开发?/div> <div>在XP中测试是一U设计,不是单的Z试你的功能是否实现。测试先行一个目?/div> <div>是可以在代码~写之前Q保证测试已l写好;其实q些试的另一个目的就是设计接口,</div> <div>保证接口在以后的修改q程中能够满x试(设计Q?em><font color="#ff0000">当你有意或无意修Ҏ口的时候,你必d?/font></em></div> <div> <font color="#ff0000"> <em>修改试 </em> </font> <strong> <font color="#0000ff">要改动接口的时候,也应该是先修Ҏ试,再修改代码。而不是修改代码等着报错再修?/font> </strong> </div> <div> <font color="#000000"> <strong> <font color="#0000ff">试(设计Q?/font> </strong>。(试必须100%通过才能q行下一个功能)Q这h试也是在提醒你,接口已经改变?/font> </div> <div>实际上,设计已经改变。当你修改单元测试的时候,可能׃遭到抱怨。ؓ什么?你修改了设计</div> <div>Q别人的代码是依赖你修改前的试Q设计)Q那么新的测试(设计Q中的变动可能要影响?/div> <div>别h已有的代码?/div> <div> </div> <div>当你使用TDD的时候一定要说明是测试驱动开发还是测试驱动设计。这两者是有区别的。测试驱?/div> <div>开发,是通过试定义所要开发的功能的接口,然后实现功能的开发过E。对于测试驱动设计,在XP中似?/div> <div>已经消失了,而是被测试驱动开发所取代。另外在XP中有用于描述设计的,SimpleDesign QDesign Improvement.</div> <div>在XP中测试是一U设计,设计之后才有开发,q也是Z么要试先行了?/div> <div>在XP中测试是一U文,用于描述设计?/div> <img src ="http://www.aygfsteel.com/liaojiyong/aggbug/94410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/liaojiyong/" target="_blank">liaojiyong</a> 2007-01-17 13:40 <a href="http://www.aygfsteel.com/liaojiyong/archive/2007/01/17/94410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>堆各栈的区别Q{Q?/title><link>http://www.aygfsteel.com/liaojiyong/archive/2006/12/22/89510.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 22 Dec 2006 06:16:00 GMT</pubDate><guid>http://www.aygfsteel.com/liaojiyong/archive/2006/12/22/89510.html</guid><wfw:comment>http://www.aygfsteel.com/liaojiyong/comments/89510.html</wfw:comment><comments>http://www.aygfsteel.com/liaojiyong/archive/2006/12/22/89510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/liaojiyong/comments/commentRss/89510.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/liaojiyong/services/trackbacks/89510.html</trackback:ping><description><![CDATA[ <p> <span id="wmqeeuq" class="oblog_text" twffan="done">一、预备知识—程序的内存分配</span> </p> <p>一个由c/C++~译的程序占用的内存分ؓ以下几个部分<br />1、栈区(stackQ?q译器自动分配释放Q存攑և数的参数|局部变量的值等。其操作方式cM于数据结构中的栈?br />2、堆区(heapQ??一般由E序员分配释放,若程序员不释放,E序l束时可能由OS回收。注意它与数据结构中的堆是两回事Q分配方式倒是cM于链表,呵呵?br />3、全局区(静态区Q(staticQ—,全局变量和静态变量的存储是放在一块的Q初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在盔R的另一块区域?- E序l束后有pȝ释放<br />4、文字常量区 —常量字W串是攑֜q里的。程序结束后ql释?br />5、程序代码区—存攑ևC的二q制代码?br />二、例子程?br />q是一个前辈写的,非常详细<br />//main.cpp<br />int a = 0; 全局初始化区<br />char *p1; 全局未初始化?br />main()<br />{<br />int b; ?br />char s[] = "abc"; ?br />char *p2; ?br />char *p3 = "123456"; 123456\0在常量区Qp3在栈上?br />static int c =0Q?全局Q静态)初始化区<br />p1 = (char *)malloc(10);<br />p2 = (char *)malloc(20);<br />分配得来?0?0字节的区域就在堆区?br />strcpy(p1, "123456"); 123456\0攑֜帔R区,~译器可能会它与p3所指向?123456"优化成一个地斏V?br />}</p> <p> <br />二、堆和栈的理论知?/p> <p>2.1甌方式<br />stack:<br />ql自动分配?例如Q声明在函数中一个局部变?int b; pȝ自动在栈中ؓb开辟空?br />heap:<br />需要程序员自己甌Qƈ指明大小Q在c中malloc函数<br />如p1 = (char *)malloc(10);<br />在C++中用newq算W?br />如p2 = (char *)malloc(10);<br />但是注意p1、p2本n是在栈中的?/p> <p> <br />2.2<br />甌后系l的响应<br />栈:只要栈的剩余I间大于所甌I间Q系l将为程序提供内存,否则报异常提示栈溢出?br />堆:首先应该知道操作pȝ有一个记录空闲内存地址的链表,当系l收到程序的甌Ӟ<br />会遍历该链表Q寻扄一个空间大于所甌I间的堆l点Q然后将该结点从I闲l点链表中删除,q将该结点的I间分配l程序,另外Q对于大多数pȝQ会在这块内存空间中的首地址处记录本ơ分配的大小Q这P代码中的delete语句才能正确的释放本内存I间。另外,׃扑ֈ的堆l点的大不一定正好等于申L大小Q系l会自动的将多余的那部分重新攑օI闲链表中?/p> <p>2.3甌大小的限?br />栈:在Windows?栈是向低地址扩展的数据结构,是一块连l的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是pȝ预先规定好的Q在WINDOWS下,栈的大小?MQ也有的说是1MQM是一个编译时q定的常数Q,如果甌的空间超q栈的剩余空间时Q将提示overflow。因此,能从栈获得的I间较小?br />堆:堆是向高地址扩展的数据结构,是不q箋的内存区域。这是由于系l是用链表来存储的空闲内存地址的,自然是不q箋的,而链表的遍历方向是由低地址向高地址。堆的大受限于计算机系l中有效的虚拟内存。由此可见,堆获得的I间比较灉|Q也比较大?/p> <p> <br />2.4甌效率的比较:<br />栈由pȝ自动分配Q速度较快。但E序员是无法控制的?br />堆是由new分配的内存,一般速度比较慢,而且Ҏ产生内存片,不过用v来最方便.<br />另外Q在WINDOWS下,最好的方式是用VirtualAlloc分配内存Q他不是在堆Q也不是在栈是直接在q程的地址I间中保留一快内存,虽然用v来最不方ѝ但是速度快,也最灉|?/p> <p>2.5堆和栈中的存储内?br />栈:在函数调用时Q第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句Q的地址Q然后是函数的各个参敎ͼ在大多数的C~译器中Q参数是由右往左入栈的Q然后是函数中的局部变量。注意静态变量是不入栈的?br />当本ơ函数调用结束后Q局部变量先出栈Q然后是参数Q最后栈指针指向最开始存的地址Q也是dC的下一条指令,E序p点l运行?br />堆:一般是在堆的头部用一个字节存攑֠的大。堆中的具体内容有程序员安排?/p> <p>2.6存取效率的比?/p> <p>char s1[] = "aaaaaaaaaaaaaaa";<br />char *s2 = "bbbbbbbbbbbbbbbbb";<br />aaaaaaaaaaa是在q行时刻赋值的Q?br />而bbbbbbbbbbb是在~译时就定的;<br />但是Q在以后的存取中Q在栈上的数l比指针所指向的字W串(例如?快?br />比如Q?br />Qi nclude<br />void main()<br />{<br />char a = 1;<br />char c[] = "1234567890";<br />char *p ="1234567890";<br />a = c[1];<br />a = p[1];<br />return;<br />}<br />对应的汇~代?br />10: a = c[1];<br />00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]<br />0040106A 88 4D FC mov byte ptr [ebp-4],cl<br />11: a = p[1];<br />0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]<br />00401070 8A 42 01 mov al,byte ptr [edx+1]<br />00401073 88 45 FC mov byte ptr [ebp-4],al<br />W一U在d时直接就把字W串中的元素d寄存器cl中,而第二种则要先把指针D到edx中,在根据edxd字符Q显然慢了?/p> <p> <br />2.7结Q?br />堆和栈的区别可以用如下的比喻来看出:<br />使用栈就象我们去饭馆里吃饭,只管点菜Q发出申P、付钱、和吃(使用Q,吃饱了就赎ͼ不必理会切菜、洗菜等准备工作和洗、刷锅等扫尾工作Q他的好处是快捷Q但是自由度?br />使用堆就象是自己动手做喜Ƣ吃的菜_比较ȝQ但是比较符合自q口味Q而且自由度大</p> <img src ="http://www.aygfsteel.com/liaojiyong/aggbug/89510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/liaojiyong/" target="_blank">liaojiyong</a> 2006-12-22 14:16 <a href="http://www.aygfsteel.com/liaojiyong/archive/2006/12/22/89510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>卡巴斯基Ȁzȝhttp://www.aygfsteel.com/liaojiyong/archive/2006/10/25/77269.htmlliaojiyongliaojiyongWed, 25 Oct 2006 11:43:00 GMThttp://www.aygfsteel.com/liaojiyong/archive/2006/10/25/77269.htmlhttp://www.aygfsteel.com/liaojiyong/comments/77269.htmlhttp://www.aygfsteel.com/liaojiyong/archive/2006/10/25/77269.html#Feedback10http://www.aygfsteel.com/liaojiyong/comments/commentRss/77269.htmlhttp://www.aygfsteel.com/liaojiyong/services/trackbacks/77269.html卡巴斯基ȀzȝQ请选择适合自己版本的卡巴斯基激zȝ。以下卡巴斯基激zȝ会不断更斎ͼ如果你想要一直拥有最新卡巴斯基激zȝQ请本卡巴斯基激zȝ加入收藏?br>一、Kaspersky Anti-Virus卡巴斯基下蝲地址Q?br>http://www.yaocong.com/soft/48.html

二、其实很多卡巴斯基激zȝ都是可以使用的,只是大家对Kaspersky  Anti-Virus卡巴斯基不是十分了解。如果不清楚的,可以先查看下面的文章---Kaspersky  Anti-Virus卡巴斯基知识大全Q?br>http://www.yaocong.com/Article/200610/4253.html

三、如果下面的卡巴斯基Ȁzȝ都不可以用,请参看下面文章,?60甌免费Ȁzȝ
http://www.yaocong.com/Article/200701/4336.html
360安全卫士下蝲地址Q?br>http://www.yaocong.com/Soft/428.html

                                                                   
                                          在线购买正版卡巴斯基

卡巴斯基kav仍然可以用的Ȁzȝ(试旉:2007-2-10 22:10)
2JAGK-4KJHD-5TBW5-UAUUE      62XQ6-63UTJ-BXCH6-ZK7QK
KEVTM-3T9GY-MSYYV-28NAS     KG2GY-BAGN3-PYVM8-S97Y7

F654S-V6FE8-DDV8U-W7CJG
11PQC-FPQB2-UYWMG-4FJ7J       (20071210)
FVMGV-QGPM5-V2S13-USMJF        (20071024)
FXCP1-ZDR6T-N3QTH-X89TW      (20070129)
1GUFS-ZE4X6-3T2MX-FA61X         (20071219)
2BPEH-XPNQE-XR7VU-7N3W9      (20071104)
7E3C5-K1CHS-Z3U5M-QY54A       (20071015)
7S158-JHDSA-7VJ5R-VUXNJ         (20071108)
FXCP1-ZDR6T-N3QTH-X89TW

卡巴斯基V6.0ȀzȝQ?br>T1JVS-NNMBD-K1QTN-SUBP8    589FY-XR6U9-1PWHK-NA7EY     9JZJH-9DJY2-ZYPAY-C68GM   
R2EDV-CYTTY-AWS83-2C62U    5X7BT-THTWR-GEGTU-9EP1B     FM1YW-CGXJS-9ZM5P-9C197
WDVWG-6ZRTJ-M9TYJ-5G7JJ     K5XJH-FCH26-4A3EA-RPTAY       P2UDX-5MAEH-DTN5E-YC55U
CT1Y6-CM97M-TNYTF-49S77     WWXTS-PGCZK-T64FJ-NR164     M36UB-UHCZ5-HVTGZ-9Y2PA
Z96BH-EXN48-DMQCS-P6AHU     K5JJ4-FBFUZ-AB4ME-RKPJD        F654S-V6FE8-DDV8U-W7CJG
UZ5JQ-FGT9Z-Q338K-5RP43     AR4FW-ZU7TD-3XM4B-95HNX      R4HPR-BPUA1-RC81M-U44Y8
FXCP1-ZDR6T-N3QTH-X89TW

WNM8B-1RV8R-3X6VX-U7QUC   3FZS9-JSQHY-G2ATZ-2TUNY     YCHK1-1ZHD7-A6PNK-MZ7G4
MQG1X-RBMTS-2RV77-2Y7DM   16HU5-U67CZ-1MF7D-1VXXM      1Q5VG-3DGMJ-R2251-GWK5H
MCSC1-18P8Q-1AQK9-SRFTQ    MJV9W-S8K1W-QMDD4-T4KH8   Z8JJP-Y6NF5-A5M3C-24GZK
Q9KG4-42MEZ-BD7B2-TFP9C     WJK28-9CJX8-VJ3XY-HSFG3        U1XZ2-ZR9SW-Q3APD-CW127
QC9C6-H2S2E-HR5HX-B6DEC     8NWPP-P5F4U-NDMB8-4VJ7J       T1SAP-SGK8Z-XKMH7-8RSZN
VBV4F-K43MA-5PADE-UJ4B9     Z3H7H-TUZRA-MS863-ZQV4U      3NQ5K-5QA7Z-SFXBZ-CSHHW
U7YSF-Y8Q7K-31MCC-5ASSH    QCXW2-E4TRF-SGAGQ-D9GMP    PRHHP-X5ZDC-46GCR-DX1UE
9NNJM-Q173U-1WUW4-FXPXE   BMDYU-AAD97-KJQEV-SP6AS     KHU8Q-4ZDV5-SF4V7-DJ5H7
QP7Z6-47S5A-P7A9X-F1GCV     KXZUY-HRC7J-8XVYS-Q1SMN       2C1R2-5VQ2V-1A5Y1-F66NP
HRDNY-RAV3F-JNSXB-1S9UX     ZS771-4Y4WA-PGFRM-NDX15     3QGPD-2JMZH-JU4MF-4FPUK
GSTFY-WW3NF-WV659-NRQRG  E81H5-97UMH-2W21C-81CK2    RN8NT-9YUDS-DXDDW-6N8QX
TW5PF-3MFGE-HUVTH-V6Q7Q    9TCP8-CQ9F5-J4Z47-CSG6X      UTARY-WGUWG-U6NG1-UG358
9XU2S-6U78G-4E8KA-BW2QV     CR9YJ-NZVTP-8GYVC-9DJRY    4344M-GKK8C-T9NMS-YUZX7
JVAU6-GEBCB-5TSJ1-N2KWX     CANHY-ZU43D-KVUE6-8WMTJ    DM4T4-HGVVQ-NAJ2G-FK28W
JSF7D-C3161-FKQKR-VEE7H      N17FY-9D2KJ-WES18-E7XFZ       5Z6BT-9CVYD-Z58P9-NZP2N
6JJ5P-G5PSC-NCHJ1-TD5FE      2P9FM-ETX66-B1SEQ-Q4CQ5

卡巴斯基6.0互联|安全套装激zȝQ?br>1GUFS-ZE4X6-3T2MX-FA61X

 
会不停更新这些Kaspersky  Anti-Virus卡巴斯基Ȁzȝ的,如果有什么问题可以在该页评论或是留言...
该加入你的收藏?/span>


liaojiyong 2006-10-25 19:43 发表评论
]]>
领结的打?/title><link>http://www.aygfsteel.com/liaojiyong/archive/2006/10/25/77112.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 25 Oct 2006 00:59:00 GMT</pubDate><guid>http://www.aygfsteel.com/liaojiyong/archive/2006/10/25/77112.html</guid><wfw:comment>http://www.aygfsteel.com/liaojiyong/comments/77112.html</wfw:comment><comments>http://www.aygfsteel.com/liaojiyong/archive/2006/10/25/77112.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/liaojiyong/comments/commentRss/77112.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/liaojiyong/services/trackbacks/77112.html</trackback:ping><description><![CDATA[ <div> <strong> <font face="楷体_GB2312" color="#008080" size="4">q结<br /><br />  q结为最多男士选用的领l打法之一Q几乎适用于各U材质的领带?br /><br />  要诀Q领l下Ҏ形成的凹z需让两边均匀且对U?img style="CURSOR: hand" src="http://bbs.shippingchina.com/attachment/Mon_0608/115_4675_b11618a830f8416.jpg" /></font> </strong> <br /> </div> <div> <span id="wmqeeuq" class="tpc_content"> <font color="#008080" size="4"> <strong>交叉l?br /><br />  q是对于单色素雅质料且较薄领带适合选用的领l对于喜Ƣ展现流行感的男士不妨多加用?/strong> </font> </span> </div> <div> <br /> </div> <div> <span id="wmqeeuq" class="tpc_content"> <img style="CURSOR: hand" src="http://bbs.shippingchina.com/attachment/Mon_0608/115_4675_3cb9253ad183e80.jpg" /> </span> </div> <div> <br /> </div> <div> <span id="wmqeeuq" class="tpc_content"> <strong> <font color="#008080" size="4">双环l?br /><br />  能营造时感Q适合q轻的上班族选用该领l完成的特色是W一圈会E露ZW二圈之外,可别Ll盖住了啰?/font> </strong> </span> </div> <div> <br /> </div> <div> <span id="wmqeeuq" class="tpc_content"> <img style="CURSOR: hand" src="http://bbs.shippingchina.com/attachment/Mon_0608/115_4675_8ca6aade90cbec9.jpg" /> </span> </div> <div> <br /> </div> <div> <span id="wmqeeuq" class="tpc_content"> <strong> <font color="#008080" size="4">双交叉结<br /><br />  q样的领l很Ҏ让h有种高雅且隆重的感觉Q适合正式之活动场合选用该领l应多运用在素色且丝质领带上Q若搭配大翻领的衬衫不但适合且有U尊贉|?/font> </strong> </span> </div> <div> <br /> </div> <div> <span id="wmqeeuq" class="tpc_content"> <img style="CURSOR: hand" src="http://bbs.shippingchina.com/attachment/Mon_0608/115_4675_ee6389da866bbb8.jpg" /> </span> </div> <div> <br /> </div> <div> <span id="wmqeeuq" class="tpc_content"> <strong> <font color="#008080" size="4">温莎l?/font> </strong> </span> </div> <div> <br /> </div> <div> <span id="wmqeeuq" class="tpc_content"> <img style="CURSOR: hand" src="http://bbs.shippingchina.com/attachment/Mon_0608/115_4675_d0f46a07f84fe1f.jpg" /> </span> </div> <img src ="http://www.aygfsteel.com/liaojiyong/aggbug/77112.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/liaojiyong/" target="_blank">liaojiyong</a> 2006-10-25 08:59 <a href="http://www.aygfsteel.com/liaojiyong/archive/2006/10/25/77112.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AXIS学习Q?Q(转)http://www.aygfsteel.com/liaojiyong/archive/2006/05/23/47674.htmlliaojiyongliaojiyongTue, 23 May 2006 09:05:00 GMThttp://www.aygfsteel.com/liaojiyong/archive/2006/05/23/47674.htmlhttp://www.aygfsteel.com/liaojiyong/comments/47674.htmlhttp://www.aygfsteel.com/liaojiyong/archive/2006/05/23/47674.html#Feedback0http://www.aygfsteel.com/liaojiyong/comments/commentRss/47674.htmlhttp://www.aygfsteel.com/liaojiyong/services/trackbacks/47674.html1.axis服务器包的校验?br>  ?a >http://ws.apache.org/下蝲axis后,解压Q拷贝axis到tomcat的webapps目录下。启动tomcatQ运?a href="http://localhost:8080/axis">http://localhost:8080/axis
  点击“validation”Q程序会少的包Qƈ提示下蝲路径。我目前包含的包如下Q?br>    axis.jar;                              
 axis-ant.jar;                          
 axis-schema.jar;                       
 commons-discovery-0.2.jar;             
 commons-httpclient-3.0-rc2.jar;        
 commons-logging-1.0.4.jar;             
 jaxrpc.jar;                            
 log4j-1.2.8.jar;                       
 saaj.jar;                              
 wsdl4j-1.5.1.jar;                      
 activation.jar;                        
 mail.jar    

2.环境变量的配|?br>  其实q行axis是不用配|环境变量的。但有的时候需要利用axis提供的一些工P产生一些文Ӟ需要应用很多包Q利用ClassPath比较方便了?br>  AXIS_HOME:
  AXIS_LIB:
  AXISCLASSPATH:
 
3.把axis集成 到项目中
  a、把上面所提到的包拯到项目相应的lib目录?br>  b、修改web.xml文gQ增加所需的servlet配置
  <servlet>
  <servlet-name>AxisServlet</servlet-name>
  <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
 </servlet>

 <servlet>
  <servlet-name>AdminServlet</servlet-name>
  <servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
  <load-on-startup>100</load-on-startup>
 </servlet>

 <servlet>
  <servlet-name>SOAPMonitorService</servlet-name>
  <servlet-class>org.apache.axis.monitor.SOAPMonitorService</servlet-class>
  <init-param>
   <param-name>SOAPMonitorPort</param-name>
   <param-value>5001</param-value>
  </init-param>
  <load-on-startup>100</load-on-startup>
 </servlet>

 <servlet-mapping>
  <servlet-name>AxisServlet</servlet-name>
  <url-pattern>/servlet/AxisServlet</url-pattern>
 </servlet-mapping>

 <servlet-mapping>
  <servlet-name>AxisServlet</servlet-name>
  <url-pattern>*.jws</url-pattern>
 </servlet-mapping>

 <servlet-mapping>
  <servlet-name>AxisServlet</servlet-name>
  <url-pattern>/services/*</url-pattern>
 </servlet-mapping>

 <servlet-mapping>
  <servlet-name>SOAPMonitorService</servlet-name>
  <url-pattern>/SOAPMonitor</url-pattern>
 </servlet-mapping>

 <session-config>
  <session-timeout>5</session-timeout>
 </session-config>

 <mime-mapping>
  <extension>wsdl</extension>
  <mime-type>text/xml</mime-type>
 </mime-mapping>

 <mime-mapping>
  <extension>xsd</extension>
  <mime-type>text/xml</mime-type>
 </mime-mapping>
  
4.服务发布Qjws文g发布和定制发布)
  a、jws文g发布
  在web应用E序目录下,新徏一个jws文gQ例如:Hello.jws文gQ其实就是个java文gQ不包含包名Q?nbsp;
  public class Hello {
 public String hello(String name){
  if(name==null){
   name="";
  }
  return "Hi,你好 "+name+",Ƣ迎来到Web服务世界Q?;
 }
  }
  q样可以直接查看hello服务相应的wsdl了:http://localhost:8080/testaxis/hello.jws?wsdl
 
  b.定制发布?br>  定制发布Q依赖一个server-confif.wsdd文g?br>  在web-inf目录下新Z个deploy.wsdd文gQ设|发布的服务Q例如:
  <deployment xmlns="http://xml.apache.org/axis/wsdd/"
            xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <service name="city" provider="java:RPC">
      <parameter name="className" value="yhp.test.axis.service.CityService"/>
      <parameter name="allowedMethods" value="*"/>
    </service>
  </deployment>
 
  利用axis提供的工P可以生成server-confif.wsdd文g了:
  java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd
  在运行过E中发现Q如果没有把axis自带的应用发布到服务器上Q运行时会提C?04的错?未发现axis/servlet/AxisServlet?/p>

5.客户端调?br>        String endpoint = "http://localhost:" + "8080"
    + "/testaxis/services/city";  //以定制发布方式,如果是jws文gQ则endpoint为相应的jws文g

  Service service = new Service();
  Call call = (Call) service.createCall();
  call.setTargetEndpointAddress(new java.net.URL(endpoint));
  call.setOperationName("getZip");

  String res = (String) call.invoke(new Object[] {""});//object数组E方法的参数 

  System.out.println(res);
  
6.生成客户端stub相关c?br>   Axis提供了工L成客Lstub相关的类Q即通过wsdl产生stub?br>   java -cp %AXISCLASSPATH% org.apache.axis.wsdl.WSDL2Java http://localhost:8080/testaxis/services/city?wsdl



liaojiyong 2006-05-23 17:05 发表评论
]]>
վ֩ģ壺 ˮ| ˳| ͨ| ׼| Ǭ| ǭ| °| | | | Ȫ| | | | ׸| | | ˫| | ˮ| Ϫ| ̶| ͨ| | | | | | ̩| | | | ˮ| ɳ| | | | ɽ| | | ʯ|