﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-心无痕的博客</title><link>http://www.blogjava.net/xinwuhen/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 12 May 2026 22:28:52 GMT</lastBuildDate><pubDate>Tue, 12 May 2026 22:28:52 GMT</pubDate><ttl>60</ttl><item><title>影响个人成功的18个经典故事(带图)</title><link>http://www.blogjava.net/xinwuhen/archive/2010/04/29/319716.html</link><dc:creator>心无痕</dc:creator><author>心无痕</author><pubDate>Thu, 29 Apr 2010 09:43:00 GMT</pubDate><guid>http://www.blogjava.net/xinwuhen/archive/2010/04/29/319716.html</guid><wfw:comment>http://www.blogjava.net/xinwuhen/comments/319716.html</wfw:comment><comments>http://www.blogjava.net/xinwuhen/archive/2010/04/29/319716.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xinwuhen/comments/commentRss/319716.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xinwuhen/services/trackbacks/319716.html</trackback:ping><description><![CDATA[<div style="layout-grid:  15.6pt none" class="Section0">
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-0.png" width="373" height="292"  alt="" /><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; mso-spacerun: 'yes'">　</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; mso-spacerun: 'yes'">&nbsp;&nbsp;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; font-weight: bold; mso-spacerun: 'yes'">故事一：疯子与呆子</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">一个心理学教授到疯人院参观，了解疯子的生活状态。一天下来，觉得这些人疯疯癫癫，行事出人意料，可算大开眼界。想不到准备返回时，发现自己的车胎被人卸掉了。&#8220;一定是哪个疯子干的！&#8221;教授这样愤愤地想道，动手拿备用胎准备装上。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p15"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">事情严重了。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">卸</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">车胎的人居然将螺丝也都</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">卸</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">掉。没有螺丝有备用胎也装不上去啊！教授一筹莫展。在他着急万分的时候，一个疯子蹦蹦跳跳地过来了，嘴里唱着不知名的欢乐歌曲。他发现了困境中的教授，停下来问发生了什么事。教授懒得理他，但出于礼貌还是告诉了他。疯子哈哈大笑说：&#8220;我有办法！&#8221;他从每个轮胎上面下了一个螺丝，这样就拿到三个螺丝将备用胎装上去了。教授惊奇感激之余，大为好奇：&#8220;请问你是怎么想到这个办法的？&#8221;疯子嘻嘻哈哈地笑道：&#8220;我是疯子，可我不是呆子啊！&#8221;其实，世上有许多的人，由于他们发现了工作中的乐趣，总会表现出与常人不一样的狂热，让人难以理解。许多人在笑话他们是疯子的时候，别人说不定还在笑他呆子呢。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">做人呆呆，处事聪明，在中国尤其不失为一种上佳做人姿态。</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; margin-bottom: 0pt" class="p0"><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-451.png" width="373" height="372"  alt="" /><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 12pt; mso-spacerun: 'yes'">　　　</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 12pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 14pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">故事二：机会与准备</span><span style="font-family: '华文楷体'; font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 20pt; margin-bottom: 0pt; margin-left: 26.985pt" class="p0"><span style="z-index: 1; position: absolute; margin-top: 10px; width: 99px; height: 45px; margin-left: 540px; left: 0px"><img src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-466.png" width="99" height="45"  alt="" /></span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">A在合资企业做白领，觉得自己满腔抱负，没有得到上级的赏识，经常想：如果有一天能见老总，有机会展示一下自己的才干就好了！！</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">　&nbsp;A的同事B，也有同样的想法，他更进一步，去打听老总上下班的时间，算好他大概会在何时进电梯，他也在这个时候去坐电梯，希望能遇到老总，有机会可以打个招呼。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 42pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">他们在合资公司做白领，觉得自己满腔抱负没有得的同事C更进一步。他详细了解老总的奋斗历程，弄清老总毕业的学校，人际风格，关心的问题，精心设计了几句简单却有份量的开场&nbsp;白，在算好的时间去乘坐电梯，跟老总打过几次招后，</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 42pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">终于有一天跟老总长谈了一次，不久就争取到了更好的职位。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">　</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">愚者错失机会，智者善抓机会，成功者创造机会。机会只给准备好的人，这准备二字，并非说说而已。</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 12pt; mso-spacerun: 'yes'">　　</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 12pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 12pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">故事三：谁的身价最高？</span><span style="font-family: '华文楷体'; font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 27pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-804.png" width="481" height="286"  alt="" /><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">一个人去买鹦鹉，看到一只鹦鹉前标：此鹦鹉会两门语言，售价二百元。　另一只鹦鹉前则标道：此鹦鹉会四门语言，售价四百元。该买哪只呢？两只都毛色光鲜，非常灵活可爱。这人转啊转，拿不定主意。结果突然发现一只老掉了牙的鹦鹉，毛色暗淡散乱，标价八百元。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 37.8pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">这人赶紧将老板叫来：这只鹦鹉是不是会说八门语言？</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 37.8pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">店主说：不。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 37.8pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">这人奇怪了：那为什么又老又丑，又没有能力，会值这个数呢？</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 37.8pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">店主回答：因为另外两只鹦鹉叫这只鹦鹉老板。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">这故事告诉我们，真正的领导人，不一定自己能力多强，只要懂信任，懂放权，懂珍惜，就能团结比自己更强的力量，从而提升自己的身价。相反许多能力强的人却因为过于完美主义，事必躬亲，什么人都不如自己，</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">最后只能做最好的攻关人员，销售代表，成不了优秀的领导人。</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 20.265pt; margin-bottom: 0pt" class="p17"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 20.265pt; margin-bottom: 0pt" class="p17"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">故事四：成功与习惯</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 20.265pt; margin-bottom: 0pt" class="p17"><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-1145.png" width="539" height="359"  alt="" /><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">父子俩住山上，每天都要赶牛车下山卖柴。老父较有经验，坐镇驾车，山路崎岖，弯道特多，儿子眼神较好，总是在要转弯时提醒道：&#8220;爹，转弯啦！&#8221;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 27.02pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">有一次父亲因病没有下山，儿子一人驾车。到了弯道，牛怎么也不肯转弯，儿子用尽各种方法，下车又推又拉，用青草诱之，牛一动不动。到底是怎么回事？儿子百思不得其解。最后只有一个办法了，他左右看看无人，贴近牛的耳朵大声叫道：&#8220;爹，转弯啦！&#8221;牛应声而动。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 14pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">　牛用条件反射的方式活着，而人则以习惯生活。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">一个成功的人晓得如何培养好的习惯来代替坏的习惯，当好的习惯积累多了，自然会有一个好的人生。</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; mso-spacerun: 'yes'">　</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">故事五：积极与消极</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 41pt; margin-bottom: 0pt" class="p16"><span style="z-index: 1; position: absolute; margin-top: 83px; width: 99px; height: 45px; margin-left: 396px; left: 0px"><img src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-1418.png" width="99" height="45"  alt="" /></span><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-1419.png" width="217" height="250"  alt="" /><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">有位秀才第三次进京赶考，住在一个经常住的店里。考试前两天他做了三个梦，第一个梦是梦到自己在墙上种白菜，第二个梦是下雨天，他戴了斗笠还打伞，第三个梦是梦到跟心爱的表妹脱光了衣服躺在一起，但是背靠着</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 27pt; margin-bottom: 0pt" class="p0"><span style="z-index: 1; position: absolute; margin-top: 98px; width: 39px; height: 191px; margin-left: 270px; left: 0px"><img src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-1518.png" width="39" height="191"  alt="" /></span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">这三个梦似乎有些深意，秀才第二天就赶紧去找算命的解梦。算命的一听，连拍大腿说：&#8220;你还是回家吧。你想想，高墙上种菜不是白费劲吗？戴斗笠打雨伞不是多此一举吗？跟表妹都脱光了躺在一张床上了，却背靠背，不是没戏吗？&#8221;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 37.8pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">秀才一听，心灰意冷，回店收拾包袱准备回家。店老板非常奇怪，问：&#8220;不是明天才考试吗，今天你怎么就回乡了？&#8221;秀才如此这般说了一番，店老板乐了：&#8220;哟，我也会解梦的。我倒觉得，你这次一定要留下来。你想想，墙上种菜不是高种吗？戴斗笠打伞不是说明你这次有备无患吗？跟你表妹脱光了背靠靠躺在床上，不是说明你翻身的时候就要到了吗？&#8221;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">秀才一听，更有道理，于是精神振奋地参加考试，居然中了个探花。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">积极的人，象太阳，照到哪里亮，消极的人，象月亮，初一十五不一样。想法决定我们的生活，有什么样的想法，就有什么样的未来。</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">故事六：三个金人</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 12pt; margin-top: 0pt; text-indent: 28.125pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">曾经有个小国到中国来，进贡了三个一模一样的金人，金壁辉煌，把皇帝高兴坏了。可是这小国不厚道，同时出一道题目：这三个金人哪个最有价值？皇帝想了许多的办法，请来珠宝匠检查，称重量，看做工，都是一模一样的。怎么办？使者还等着回去汇报呢。泱泱大国，不会连这个小事都不懂吧？最后，有一位退位的老大臣说他有办法。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 12pt; margin-top: 0pt; text-indent: 25pt; margin-bottom: 0pt" class="p0"><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-2035.png" width="625" height="303"  alt="" /><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">皇帝将使者请到大殿，老臣胸有成足地拿着三根稻草，插入第一个金人的耳朵里，这稻草从另一边耳朵出来了。第二个金人的稻草从嘴巴里直接掉出来，而第三个金人，稻草进去后掉进了肚子，什么响动也没有。老臣说：第三个金人最有价值！使者默默无语，答案正确。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 12pt; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">这个故事告诉我们，最有价值的人，不一定是最能说的人的人。老天给我们两只耳朵一个嘴巴，本来就是让我们多听少说的。善于倾听，才是成熟的人最基本的素质。</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 12.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">　　</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">　故事七：因材施用</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 46pt; margin-bottom: 0pt" class="p0"><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-2247.png" width="457" height="459"  alt="" /><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">去过庙的人都知道，一进庙门，首先是弥陀佛，笑脸迎客，而在他的北面，则是黑口黑脸的韦陀。但相传在很久以前，他们并不在同一个庙里，而是分别掌管不同的庙。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">弥乐佛热情快乐，所以来的人非常多，但他什么都不在乎，丢三拉四，没有好好的管理账务，所以依然入不敷出。而韦陀虽然管账是一把好手，但成天阴着个脸，太过严肃，搞得人越来越少，最后香火断绝。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">佛祖在查香火的时候发现了这个问题，就将他们俩放在同一个庙里，由弥乐佛负责公关，笑迎八方客，于是香火大旺。而韦陀铁面无私，&nbsp;锱珠必较，则让他负责财务，严格把关。在两人的分工合作中，庙里一派欣欣向荣景象。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">其实在用人大师的眼里，没有废人，正如武功高手，不需名贵宝剑，摘花飞叶即可伤人，关键看如何运用。</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">故事八：善用资源</span><span style="font-family: '华文楷体'; font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-2573.png" width="583" height="323"  alt="" /><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">有个富家子弟特别爱吃饺子，每天都要吃。但他又特别刁，只吃馅，两头的皮尖尖就丢到后面的小河里去。好景不长，在他十六岁那年，一把大火烧了他的全家，父母急怒中相继病逝。这下他身无分文，又不好意思要饭。邻居家大嫂非常好，每餐给他吃一碗面糊糊。他则发奋读书，三年后考取官位回来，一定要感谢邻居大嫂。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">大嫂对他讲：不要感谢我。我没有给你什么，都是我收集的当年你丢的饺子皮</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">&gt;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">尖，晒干后装了好凡麻袋，本来是想备不时之需的。正好你有需要，就又还给你了。大官思考良久，良久</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">&#8230;&#8230;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">有一个有名的三八理论：八小时睡觉，八小时工作，这个人人一样。人与人之间的不同，是在于业余时间怎么渡过。时间是最有情，也最无情的东西，每人拥有的都一样，非常公平。但拥有资源的人不一定成功，善用资源的人才会成功。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">白天图生存，晚上求发展，这是二十一世纪对人才的要求。</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">故事九：沟通与团队</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; mso-spacerun: 'yes'">有一个博士分到一家研究所，成为学历最高的一个人。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt" class="p0"><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-2970.png" width="559" height="292"  alt="" /><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; mso-spacerun: 'yes'">有一天他到单位后面的小池塘去钓鱼，正好正副所长在他的一左一右，也在钓鱼。他只是微微点了点头，这两个本科生，有啥好聊的呢？不一会儿，正所长放下钓竿，伸伸懒腰，蹭蹭蹭从水面上如飞地走到对面上厕所。博士眼睛睁得都快掉下来了。水上飘？不会吧？这可是一个池塘啊。正所长上完厕所回来的时候，同样也是蹭蹭蹭地从水上飘回来了。怎么回事？博士生又不好去问，自己是博士生哪！</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; mso-spacerun: 'yes'">过一阵，副所长也站起来，走几步，蹭蹭蹭地飘过水面上厕所。这下子博士更是差点昏倒：不会吧，到了一个江湖高手集中的地方？博士生也内急了。这个池塘两边有围墙，要到对面厕所非得绕十分钟的路，而回单位上又太远，怎么办？博士生也不愿意去问两位所长，憋了半天后，也起身往水里跨：我就不信本科生能过的水面，我博士生不能过。只听咚的一声，博士生栽到了水里。两位所长将他拉了出来，问他为什么要下水，他问：&#8220;为什么你们可以走过去呢？&#8221;两所长相视一笑：&#8220;这池塘里有两排木桩子，由于这两天下雨涨水正好在水面下。我们都知道这木桩的位置，所以可以踩着桩子过去。你怎么不问一声呢？&#8221;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; mso-spacerun: 'yes'">　</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 12pt; mso-spacerun: 'yes'">学历代表过去，只有学习力才能代表将来。尊重经验的人，才能少走弯路。一个好的团队，也应该是学习型的团队。</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; mso-spacerun: 'yes'">　</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">故事十：大师与弟子</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">有一位表演大师上场前，他的弟子告诉他鞋带松了。大师点头致谢，蹲下来仔细系好。等到弟子转身后，又蹲下来将鞋带解松。</span><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-3546.png" width="541" height="417"  alt="" /><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">有个旁观者看到了这一切，不解地问：&#8220;大师，您为什么又要将鞋带解松呢？&#8221;大师回答道：&#8220;因为我饰演的是一位劳累的旅者，长途跋涉让他的鞋事松开，可以通过这个细节表现他的劳累憔悴.&#8221;&#8220;那你为什么不直接告诉你的弟子呢？&#8221;&#8220;他能细心地发现我鞋带松了，并热心地告诉我，我要保护他这种热情的积极性，及时地给他鼓励，至于为什么要将鞋带解开，将来会有更多的机会教他表演，可以下一次再说啊。&#8221;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">　</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">人一个时间只能做一件事，懂抓重点，才是真正的人才。</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 392pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 392pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">故事十一：心态与舞台</span><span style="font-family: '华文楷体'; font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 47.6pt; margin-bottom: 0pt" class="p0"><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-3772.png" width="457" height="365"  alt="" /><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">在动物园里的小骆驼问妈妈：&#8220;妈妈，为什么我们的睫毛那么地长？&#8221;骆驼妈妈说：&#8220;当风沙来的时候，长长的睫毛可以让我们在风暴中都能看得到方向。&#8221;小骆驼又问：&#8220;妈妈，为什么我们的背那么驼，丑死了！&#8221;</span><span style="font-family: '华文楷体'; font-size: 14pt; mso-spacerun: 'yes'">骆驼妈妈说：&#8220;这个叫驼峰，可以帮我们储存大量的水和养分，让我们能在沙漠里耐受十几天的无水无食条件。&#8221;小骆驼又问：&#8220;妈妈，为什么我们的脚掌那么厚？&#8221;骆驼妈妈说：&#8220;那可以让我们重重的身子不至于陷在软软的沙子里，便于长途跋涉啊。&#8221;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">小骆驼高兴坏了：&#8220;哗，原来我们这么有用啊！！可是妈妈，为什么我们还在动物园里，不去沙漠远足呢？&#8221;　　</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">天生我才必用，可惜现在没人用。一个好的心态+一本成功的教材+一个无限的舞台=成功。每人的潜能是无限的，关键是要找到一个能充分发挥潜能的舞台。</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 36pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; font-weight: bold; mso-spacerun: 'yes'">　</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 70pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 70pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">故事十二：不同的分配制度</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 56pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">有七个人曾经住在一起，每天分一大桶粥。要命的是，粥每天都是不够的。</span><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-4150.png" width="397" height="344"  alt="" /><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">一开始，他们抓阄决定谁来分粥，每天轮一个。于是乎每周下来，他们只有一天是饱的，就是自己分粥的那一天。后来他们开始推选出一个道德高尚的人出来分粥。强权就会产生腐败，大家开始挖空心思去讨好他，贿赂他，搞得整个小团体乌烟障气。然后大家开始组成三人的分粥委员会及四人的评选委员会，互相攻击扯皮下来，粥吃到嘴里全是凉的。最后想出来一个方法：轮流分粥，但分粥的人要等其它人都挑完后拿剩下的最后一碗。为了不让自己吃到最少的，每人都尽量分得平均，就算不平，也只能认了。大家快快乐乐，和和气气，日子越过越好。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">　　</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">同样是七个人，不同的分配制度，就会有不同的风气。所以一个单位如果有不好的工作习气，一定是机制问题，一定是没有完全公平公正公开，没有严格的奖勤罚懒。如何制订这样一个制度，是每个领导需要考虑的问题。</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 42pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 42pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">故事十三：选择</span><span style="font-family: '华文楷体'; font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 44pt; margin-bottom: 0pt" class="p0"><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-4506.png" width="269" height="438"  alt="" /><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">有三个人要被关进监狱三年，监狱长给他们三个一人一个要求。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">　美国人爱抽雪茄，要了三箱雪茄。法国人最浪漫，要一个美丽的女子相伴。而犹太人说，他要一部与外界沟通的电话。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">　三年过后，第一个冲出来的是美国人，嘴里鼻孔里塞满了雪茄，大喊道：&#8220;给我火，给我火！&#8221;原来他忘了要火了。接着出来的是法国人。只见他手里抱着一个小孩子，美丽女子手里牵着一个小孩子，肚子里还怀着第三个。　　最后出来的是犹太人，他紧紧握住监狱长的手说：&#8220;这三年来我每天与外界联系，我的生意不但没有停顿，反而增长了200％，为了表示感谢，我送你一辆劳施莱斯！&#8221;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">　　</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">这个故事告诉我们，什么样的选择决定什么样的生活。今天的生活是由三年前我们的选择决定的，而今天我们的抉择将决定我们三年后的生活。我们要选择接触最新的信息，了解最新的趋势，从而更好的创造自己的将来。</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 55pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p16"><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-4868.png" width="431" height="469"  alt="" /><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">故事十四：强者</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 43.05pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p16"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">五岁的汉克和爸爸妈妈哥哥一起到森林干活，突然间下起雨来，可是他们只带了一块雨披。爸爸将雨披给了妈妈，妈妈给了哥哥，哥哥又给了汉克。汉克问道：&#8220;为什么爸爸给了妈妈，妈妈给了哥哥，哥哥又给了我呢？&#8221;爸爸回答道：&#8220;因为爸爸比妈妈强大，妈妈比哥哥强大，哥哥又比你强大呀。我们都会保护比较弱小的人。&#8221;汉克左右看了看，跑过去将雨披撑开来挡在了一朵风雨中飘摇的娇弱小花上面。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 42pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">这个故事告诉我们，真正的强者不一定是多有力，或者多有钱，而是他对别人多有帮助。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">责任可以让我们将事做完整，爱可以让我们将事情做好。</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 150%; margin-top: 0pt; text-indent: 28pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 40.88pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 40.88pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 40.88pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">故事十五：跑鞋的故事</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 40.88pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-5139.png" width="553" height="396"  alt="" /><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">两个人在森林里，遇到了一只大老虎。A就赶紧从背后取下一双更轻便的运动鞋换上。B急死了，骂道：&#8220;你干嘛呢，再换鞋也跑不过老虎啊！&#8221;　A说：&#8220;我只要跑得比你快就好了。&#8221;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 42pt; margin-bottom: 0pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">二十一世纪，没有危机感是最大的危机。特别是入关在即，电信，银行，保险，甚至是公务员这些我们以为非常稳定和有保障的企业，也会面临许多的变数。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 40.88pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">当更多的老虎来临时，我们没有有准备好自己的跑鞋？</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 20.86pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 20.86pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 20.86pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 20.86pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">故事十六：我要离开这个公司</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 20.86pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">A对B说：&#8220;我要离开这个公司。我恨这个公司！&#8221;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 20.86pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">B建议道：&#8220;我举双手赞成你报复！！破公司一定要给它点颜色看看。不过你现在离开，还不是最好的时机。&#8221;&nbsp;&nbsp;&nbsp;　A问：？？？</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 14pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-5420.png" width="217" height="386"  alt="" /><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">&nbsp;B说：&#8220;如果你现在走，公司的损失并不大。你应该趁着在公司的机会，拼命去为自己拉一些客户，成为公司独挡一面的人物，然后带着这些客户突然离开公司，公司才会受到重大损失，非常被动。&#8221;&nbsp;A觉得B说的非常在理。于是努力工作，事遂所愿，半年多的努力工作后，他有了许多的忠实客户。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 20.86pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">再见面时B问A：现在是时机了，要跳赶快行动哦！</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 20.86pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">A淡然笑道：老总跟我长谈过，准备升我做总经理助理，我暂时没有离开的打算了。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 20.86pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">其实这也正是B的初衷。一个人的工作，永远只是为自己的简历。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 20.86pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">只有付出大于得到，让老板真正看到你的能力大于位置，才会给你更多的机会替他创造更多利润。</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 20.86pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><span style="font-family: '华文楷体'; font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 20.86pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><span style="font-family: '华文楷体'; font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">故事十七：&#8220;我是陈阿土！&#8221;</span><span style="font-family: '华文楷体'; font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 12pt; margin-top: 0pt; text-indent: 25.2pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-5707.png" width="313" height="219"  alt="" /><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">陈阿土是台湾的农民，从来没有出过远门。攒了半辈子的钱，终于参加一个旅游团出了国。国外的一切都是非常新鲜的，关键是，陈阿土参加的是豪华团，一个人住一个标准间。这让他新奇不已。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 12pt; margin-top: 0pt; text-indent: 25.2pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">早晨，服务生来敲门送早餐时大声说道：&#8220;GOODMORNING</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">SIR！&#8221;陈阿土愣住了。这是什么意思呢？在自己的家乡，一般陌生的人见面都会问：&#8220;您贵姓？&#8221;于是陈阿土大声叫道：&#8220;我叫陈阿土！&#8221;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 12pt; margin-top: 0pt; text-indent: 25.2pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">如是这般，连着三天，都是那个服务生来敲门，每天都大声说：&#8220;GOODMORNINGSIR！&#8221;而陈阿土亦大声回道：&#8220;我叫陈阿土！&#8221;但他非常的生气。这个服务生也太笨了，天天问自己叫什么，告诉他又记不住，很烦的。终于他忍不住去问导游，&#8220;GOODMORNING&nbsp;SIR！&#8221;是什么意思，导游告诉了他，天啊！！真是丢脸死了。陈阿土反复练习&#8220;GOODMORNING</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'">SIR！&#8221;这个词，以便能体面地应对服务生。又一天的早晨，服务生照常来敲门，门一开陈阿土就大声叫道：&#8220;GOODMORNINGSIR！&#8221;与此同时，服务生叫的是：&#8220;我是陈阿土！&#8221;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 12pt; margin-top: 0pt; text-indent: 25.2pt; margin-bottom: 0pt; margin-left: 17.955pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'">这个故事告诉我们，人与人交往，常常是意志力与意志力的较量。不是你影响他，就是他影响你，而我们要想成功，一定要培养自己的影响力，只有影响力大的人才可以成为最强者。</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 14pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 1.25pt; margin-top: 0pt; margin-bottom: 0pt" class="p0"><img hspace="12" align="left" src="file:///C:/DOCUME~1/xinwuhen/LOCALS~1/Temp/ksohtml/wps_clip_image-6233.png" width="284" height="625"  alt="" /><span style="font-family: '华文楷体'; font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">故事十八：</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 14pt; font-weight: bold; mso-spacerun: 'yes'">我想跟什么样的人合作</span><span style="font-family: '黑体'; color: rgb(0,0,0); font-size: 22pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 12pt; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '宋体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">　</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">曾经有人采访比尔盖次成功的秘决。比尔盖次说：因为又有更多的成功人士在为我工作。成功的人很多，但在我生活中我不认识，也没有办法去为他工作，而让成功的人为我工作，在现阶段，我更没有这个实力。只有合作，是我最喜欢和最欣赏的。我也力图借助一个宽松的环境和积极的团队，与更多的人公平合作，以便在未来替自己经营一个抵抗风险的事业。我最喜欢合作的人应该有以下几个特点：</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 12pt; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">一、&nbsp;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">不甘心。二十一世纪，最大的危机是没有危机感，最大的陷阱是满足。人要学会用望远镜看世界，</span><span style="font-family: '华文楷体'; font-size: 12.5pt; mso-spacerun: 'yes'">不是用近视眼看世界。顺境时要想着为自己找个退路，逆境时要懂为自己找出路.</span><span style="font-family: '华文楷体'; font-size: 12.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 12pt; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">二、&nbsp;</span><span style="font-family: '华文楷体'; font-size: 12.5pt; mso-spacerun: 'yes'">学习力强.学历代表过去,学习力掌握将来.懂得从任何的细节,所有的人身上学习</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">和感悟,并且要懂得举一反三。主要的是，学习，其实是学与习两个字。学一次，做一百次，才能真正掌握。学，做，教是一个完整的过程，只有达到教的程度，才算真正吃透。而且在更多时候，学习是一种态度。只有谦卑的人，才真正学到东西。大海之所以成为大海，是因为它比所有的河流都低。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 12pt; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">三、&nbsp;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">行动力强。只有行动才会有结果。行动不一样，结果才不一样。知道不去做，等于不知道，做了没有结果，等于没有做。不犯错误，一定会错，因为不犯错误的人一定没有尝试。错了不要紧，一定要善于总结，然后再做，一直到正确的结果出来为止。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 12pt; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">四、&nbsp;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">要懂付出。要想杰出一定得先付出。斤斤计较的人，一生只得两斤。有点奉献精神，是不可能创业的。要先用行动让别人知道，你有超过所得的价值，别人才会开更高的价。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 12pt; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">五、&nbsp;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">有强烈的沟通意识。沟通无极限，这更是一种态度，而非一种技巧。一个好的团队当然要有共同的愿景，非一日可以得来。需要无时不在的沟通，从目标到细节，甚至到家庭等等，都在沟通的内容之列。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 12pt; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">六、&nbsp;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">诚恳大方。每人都有不同的立场，不可能要求利益都一致。关键是大家都要开诚布公地谈清楚，不要委屈求全。相信诚信才是合作的最好基石。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 12pt; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">七、&nbsp;</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">有最基本的道德观。曾经有一个记者在家写稿时，他的四岁儿子吵着要他陪。记者很烦，就将一本杂志的封底撕碎，对他儿子说：&#8220;&nbsp;你先将这上面的世界地图拼完整，爸爸就陪你玩。&#8221;过了不到五分钟，儿子又来拖他的手说：&#8220;爸爸我拼好了，陪我玩！&#8221;记者很生气：&#8220;小孩子要玩是可以理解的，但如果说谎话就不好了。怎么可能这么快就拼好世界地图！&#8221;儿子非常委屈：&#8220;可是我真的拼好了呀！&#8221;记者一看，果然如此：不会吧？家里出现了神童？他非常好奇地问：&#8220;你是怎么做到的？&#8221;儿子说：世界地图的背面是一个人的头像。我反过来拼，只要拼这个人了，世界就完整了。所以做事先做人。做人做好了，他的世界也就是好的。</span><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="line-height: 12pt; margin-top: 0pt; text-indent: 24pt; margin-bottom: 0pt; margin-left: 8.925pt" class="p0"><span style="font-family: '华文楷体'; color: rgb(0,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">　</span><span style="font-family: '华文楷体'; color: rgb(255,0,0); font-size: 12.5pt; mso-spacerun: 'yes'">陈安之的超级成功学也有提到：先为成功的人工作，再与成功的人合作，最后是让成功的人为你工作。</span><span style="font-family: '华文楷体'; font-size: 12.5pt; font-weight: bold; mso-spacerun: 'yes'"><o:p></o:p></span></p>
</div>
<!--endfragment-->
<img src ="http://www.blogjava.net/xinwuhen/aggbug/319716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xinwuhen/" target="_blank">心无痕</a> 2010-04-29 17:43 <a href="http://www.blogjava.net/xinwuhen/archive/2010/04/29/319716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用连接池配置BIRT报表的数据库连接。。。。</title><link>http://www.blogjava.net/xinwuhen/archive/2009/04/07/264241.html</link><dc:creator>心无痕</dc:creator><author>心无痕</author><pubDate>Tue, 07 Apr 2009 05:32:00 GMT</pubDate><guid>http://www.blogjava.net/xinwuhen/archive/2009/04/07/264241.html</guid><wfw:comment>http://www.blogjava.net/xinwuhen/comments/264241.html</wfw:comment><comments>http://www.blogjava.net/xinwuhen/archive/2009/04/07/264241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xinwuhen/comments/commentRss/264241.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xinwuhen/services/trackbacks/264241.html</trackback:ping><description><![CDATA[<p>现阶段我们在开发报表的时候，是使用jdbc链接数据库的，为提高报表的运行效率和稳定性，使用连接池进行管理。比较简便和低耦合的解决办法，使用jndi连接池。</p>
<p>&nbsp;</p>
<p><font color="#ff0000"><strong>jdbc和jndi的区别</strong></font></p>
<p><font color="#ff0000">JDBC -最基本的连接数据库的方式， 每次对数据库打交道的时候 ，连接数据库是需要实例下你实现连接数据库的方法或者类。 <br />
JNDI DataSource 英文全称是:Java Naming and Directory Interface java 命明接口，当服务启动时 事先把连接数据库的已经连好多条，具体多少条你可以设置，存放在tomcat容器里，用的时候可以直接使用， 不用再实例化得到连接， 相对与jdbc效率要快点</font></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在eclipse设计报表的时候，我们使用jdbc链接数据库做测试，当到了tomcat运行环境中切换到jndi连接池，这是比较方便的开发方法。</p>
<p>实现步骤：</p>
<p><strong>1.tomcat配置jndi连接池</strong></p>
<p>在 {tomcat目录}\webapps\{项目名}\META-INF 中新增context.xml文件，配置代码如下<br />
</p>
<p><strong></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Context</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Resource<br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">auth</span><span style="color: #0000ff">="Container"</span><span style="color: #ff0000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff">="jdbc/travel_agency"</span><span style="color: #ff0000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: #0000ff">="javax.sql.DataSource"</span><span style="color: #ff0000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxIdle</span><span style="color: #0000ff">="5"</span><span style="color: #ff0000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxWait</span><span style="color: #0000ff">="-1"</span><span style="color: #ff0000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;driverClassName</span><span style="color: #0000ff">="com.mysql.jdbc.Driver"</span><span style="color: #ff0000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username</span><span style="color: #0000ff">="itravel"</span><span style="color: #ff0000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;password</span><span style="color: #0000ff">="709394"</span><span style="color: #ff0000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url</span><span style="color: #0000ff">="jdbc:mysql://192.168.1.100/travel_agency?useUnicode=true&amp;amp;characterEncoding=UTF-8"</span><span style="color: #ff0000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxActive</span><span style="color: #0000ff">="10"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Context</span><span style="color: #0000ff">&gt;</span></div>
<p>2.在web.xml中加入配置<br />
</strong></p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">resource-ref</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">description</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Database&nbsp;Source</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">description</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">res-ref-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">jdbc/travel_agency</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">res-ref-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">res-type</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javax.sql.DataSource</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">res-type</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">res-auth</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Container</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">res-auth</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">resource-ref</span><span style="color: #0000ff">&gt;</span></div>
<p><br />
<strong>3.实例报表中数据源代码</strong></p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">1</span><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">data-sources</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">oda-data-source&nbsp;</span><span style="color: #ff0000">extensionID</span><span style="color: #0000ff">="org.eclipse.birt.report.data.oda.jdbc"</span><span style="color: #ff0000">&nbsp;name</span><span style="color: #0000ff">="数据源"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="227"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="odaDriverClass"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com.mysql.jdbc.Driver</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="odaURL"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">jdbc:mysql://192.168.1.100/travel_agency</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="odaUser"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">itravel</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">encrypted-property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="odaPassword"</span><span style="color: #ff0000">&nbsp;encryptionID</span><span style="color: #0000ff">="base64"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">NzA5Mzk0</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">encrypted-property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="odaJndiName"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">java:comp/env/jdbc/travel_agency</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">8</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">oda-data-source</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">9</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">data-sources</span><span style="color: #0000ff">&gt;</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>除了第7行&nbsp;<span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="odaJndiName"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">java:comp/env/jdbc/travel_agency</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span>，其余是我们的之前的配置。用了第7行的代码，表示该报表支持jndi数据源，birt在运行报表的时候，会先用jndi去连接，如果失败了再用jdbc链接，这样做的好处就是，我们在开发报表的时候，没有放到web环境中，可以使用jdbc，当放到tomcat中，因为有了第7行的配置。默认采用jdni连接。<br />
<br />
<strong>4.步骤3中第6行密码的生成程序（JAVA程序）</strong><br />
<span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">package</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;com.hollycrm.birt.security;</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">import</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;java.io.BufferedReader;</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">import</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;java.io.IOException;</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">import</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;java.io.InputStreamReader;</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">import</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;sun.misc.BASE64Encoder;</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">public</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">class</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;CreateBirtBase64Password&nbsp;{</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">public</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">static</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">void</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;main(String[]&nbsp;args)&nbsp;{</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">InputStreamReader&nbsp;inStreamReader&nbsp;=&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">new</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;InputStreamReader(System.</span><span style="font-style: italic; font-family: 'Courier New'; color: rgb(0,0,192); font-size: 10.5pt; mso-spacerun: 'yes'">in</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">);</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">BufferedReader&nbsp;buffReader&nbsp;=&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">new</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;BufferedReader(inStreamReader);</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">System.</span><span style="font-style: italic; font-family: 'Courier New'; color: rgb(0,0,192); font-size: 10.5pt; mso-spacerun: 'yes'">out</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">.println(</span><span style="font-family: 'Courier New'; color: rgb(42,0,255); font-size: 10.5pt; mso-spacerun: 'yes'">"请输入需要通过Base64加密的字符串："</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">);</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">String&nbsp;strSrcPassword&nbsp;=&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">null</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">;</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">try</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;{</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">strSrcPassword&nbsp;=&nbsp;buffReader.readLine();</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">if</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;(strSrcPassword&nbsp;!=&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">null</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">)&nbsp;{</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(63,127,95); font-size: 10.5pt; mso-spacerun: 'yes'">//&nbsp;通过用户输入的密码信息生成Base64的加密密码</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">String&nbsp;strBase64Password&nbsp;=&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">new</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;BASE64Encoder().encode(strSrcPassword.trim().getBytes());</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">System.</span><span style="font-style: italic; font-family: 'Courier New'; color: rgb(0,0,192); font-size: 10.5pt; mso-spacerun: 'yes'">out</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">.println(</span><span style="font-family: 'Courier New'; color: rgb(42,0,255); font-size: 10.5pt; mso-spacerun: 'yes'">"您输入的原始密码为："</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;+&nbsp;strSrcPassword&nbsp;+&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(42,0,255); font-size: 10.5pt; mso-spacerun: 'yes'">"\r对应生成的Base64密码值为："</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;+&nbsp;strBase64Password);</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">}&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(127,0,85); font-size: 10.5pt; font-weight: bold; mso-spacerun: 'yes'">catch</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;(IOException&nbsp;e)&nbsp;{</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">e.printStackTrace();</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; margin-bottom: 0pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Courier New'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p style="margin-top: 0pt; text-indent: 21pt; margin-bottom: 0pt; margin-left: 63pt" class="p0"><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10.5pt; mso-spacerun: 'yes'">}</span><span style="font-family: '宋体'; font-size: 10.5pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p><!--endfragment--></p>
 <img src ="http://www.blogjava.net/xinwuhen/aggbug/264241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xinwuhen/" target="_blank">心无痕</a> 2009-04-07 13:32 <a href="http://www.blogjava.net/xinwuhen/archive/2009/04/07/264241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>&lt;转载&gt;用javascript动态生成表格...</title><link>http://www.blogjava.net/xinwuhen/archive/2009/03/18/260607.html</link><dc:creator>心无痕</dc:creator><author>心无痕</author><pubDate>Wed, 18 Mar 2009 15:18:00 GMT</pubDate><guid>http://www.blogjava.net/xinwuhen/archive/2009/03/18/260607.html</guid><wfw:comment>http://www.blogjava.net/xinwuhen/comments/260607.html</wfw:comment><comments>http://www.blogjava.net/xinwuhen/archive/2009/03/18/260607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xinwuhen/comments/commentRss/260607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xinwuhen/services/trackbacks/260607.html</trackback:ping><description><![CDATA[<div style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;!</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">DOCTYPE </span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">html </span><span style="font-size: 10pt; color: gray; font-family: 'Courier New'">PUBLIC </span><span style="font-size: 10pt; color: navy; font-family: 'Courier New'">"-//W3C//DTD XHTML 1.0 Transitional//EN" </span><span style="font-size: 10pt; color: rgb(63,127,95); font-family: 'Courier New'">"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">html </span><span style="font-size: 10pt; color: rgb(127,0,127); font-family: 'Courier New'">xmlns</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"http://www.w3.org/1999/xhtml"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">head</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">meta </span><span style="font-size: 10pt; color: rgb(127,0,127); font-family: 'Courier New'">http-equiv</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"Content-Type" </span><span style="font-size: 10pt; color: rgb(127,0,127); font-family: 'Courier New'">content</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"text/html; charset=gb2312" </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">/&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">title</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">javascript </span><span style="font-size: 10pt; color: black; font-family: 宋体">动态生成表格</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">title</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">head</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">body</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">form </span><span style="font-size: 10pt; color: rgb(127,0,127); font-family: 'Courier New'">id</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"form1" </span><span style="font-size: 10pt; color: rgb(127,0,127); font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"form1"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">table </span><span style="font-size: 10pt; color: rgb(127,0,127); font-family: 'Courier New'">id</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"oTable"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">tbody </span><span style="font-size: 10pt; color: rgb(127,0,127); font-family: 'Courier New'">id</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"oTBody"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">tbody</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">table</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">SCRIPT </span><span style="font-size: 10pt; color: rgb(127,0,127); font-family: 'Courier New'">LANGUAGE</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"JScript"</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">function </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">test()</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">{</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; var </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">inputs=document.getElementsByTagName(</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"input"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">for</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(</span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">var </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">i=0;i&lt;inputs.length;i++)</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">{</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(inputs[i].type==</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"text"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">)</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">{</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">alert(inputs[i].id+</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"="</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+inputs[i].value);</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">// </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">接收参数</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">可修改</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">；</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">var </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">rowNumbers=3; </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">// </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">行；</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">var </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">colNumbers=4; </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">// </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">列；</span></div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">// </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">设置表格属性；</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">var </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCaption = oTable.createCaption(); </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">// </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">在表格中创建空的</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'"> caption </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">元素；</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">var </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oTHead = oTable.createTHead();</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">// </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">在表格中创建空的</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'"> tHead </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">元素；</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">var </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oTFoot = oTable.createTFoot(); </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">// </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">在表格中创建空的</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'"> tFoot </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">元素；</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">var </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oRow, oCell;</span></div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">var </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">heading = </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">new </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Array();</span></div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">/*-------------</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">列数</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'"> start------&lt;head&gt;-------*/</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">for</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(</span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">var </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">i=0;i&lt;colNumbers+1;i++)</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">{&nbsp;&nbsp; </span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; if</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(i==0)</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">{</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">heading[i]=</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">""</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; else</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; {</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">heading[i]=</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"S"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+(i);</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oRow = oTHead.insertRow(); </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">// insertRow()</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">方法：在表格中创建新行</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">(tr)</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">，并将行添加到</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'"> rows </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">集合中；</span></div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">for </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(k=0; k&lt;colNumbers+1; k++)</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">{</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCell = oRow.insertCell(); </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">// insertCell()</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">方法：</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">在表格行</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">(tr)</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">中创建新单元格，并将单元格添加到</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'"> cells </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">集合中；</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp; oCell.align = </span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"center"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;oCell.style.fontWeight = </span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"bold"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;oCell.style.color=</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"#ffffff"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;oCell.innerHTML =heading[k];</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span></div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;</span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">if</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(k==0)</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;</span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">{</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCell.bgColor = </span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"#ffffff"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;else</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;{</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCell.bgColor = </span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"#666666"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">/*-------------</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">列数</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'"> end-------------*/</span></div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">/*-------------</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">行数</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'"> start----&lt;tbody&gt;---------*/</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">var </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">stock = </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">new </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Array;</span></div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">for</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(</span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">var </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">i=0;i&lt;rowNumbers;i++)</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">{</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; for</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(</span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">var </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">j=0;j&lt;colNumbers;j++)</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">{</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(j==0)</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">{</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">stock[</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">""</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+i+</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">","</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+j+</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">""</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">]=</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"R"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+(i+1);</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">stock[</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">""</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+i+</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">","</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+j+</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">""</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">]=j;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">for </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(i=0; i&lt;rowNumbers; i++)</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">{</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oRow = oTBody.insertRow();</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">for </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(j=0; j&lt;colNumbers+1; j++)</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">{</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCell = oRow.insertCell();</span></div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">// </span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">背景色；</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">&nbsp;&nbsp;</span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">if</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(j==0)</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;</span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">{</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCell.bgColor = </span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"#999999"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;else</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;{</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCell.bgColor = </span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"#ffffff"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; if</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(j==0)</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">{</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCell.innerHTML = stock[i + </span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"," </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+ j];</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; else</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; {</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCell.innerHTML = </span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"&lt;input type='text' id='"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+stock[i+</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">","</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+0]+</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"_S"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+j+</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"' name='"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+stock[i+</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">","</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+0]+</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"_S"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">+j+</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"' value='' /&gt;"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;}</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">/*-------------</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 宋体">行数</span><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'"> end-------------*/</span></div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">/*----------------------foot start*/</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oRow = oTFoot.insertRow();</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCell = oRow.insertCell();</span></div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCell.innerText=</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"Author:maomao"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCell.colSpan = colNumbers+1;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCell.style.fontSize = </span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"12"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCell.align=</span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"center"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCell.bgColor = </span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"ffffff"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCaption.innerText = </span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"<a href="mailto:alan.xue@ebizserve.com">alan.xue@ebizserve.com</a>"</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCaption.style.fontSize = </span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"12"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">oCaption.align = </span><span style="font-size: 10pt; color: rgb(142,0,255); font-family: 'Courier New'">"bottom"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">/*----------------------foot end*/</span></div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left">&nbsp;</div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">function </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">$(id) </span><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">{</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; return </span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">document.getElementById(id);</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">}</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">SCRIPT</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">input </span><span style="font-size: 10pt; color: rgb(127,0,127); font-family: 'Courier New'">type</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"button" </span><span style="font-size: 10pt; color: rgb(127,0,127); font-family: 'Courier New'">value</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"</span><span style="font-size: 10pt; color: rgb(42,0,255); font-family: 宋体">测试</span><span style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">" </span><span style="font-size: 10pt; color: rgb(127,0,127); font-family: 'Courier New'">onclick</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><span style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"javascript:test();" </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">/&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">form</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">body</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></div>
<div style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: rgb(63,127,127); font-family: 'Courier New'">html</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></div>
<img src ="http://www.blogjava.net/xinwuhen/aggbug/260607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xinwuhen/" target="_blank">心无痕</a> 2009-03-18 23:18 <a href="http://www.blogjava.net/xinwuhen/archive/2009/03/18/260607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于用javascript动态生成表格的注意点...</title><link>http://www.blogjava.net/xinwuhen/archive/2009/03/18/260606.html</link><dc:creator>心无痕</dc:creator><author>心无痕</author><pubDate>Wed, 18 Mar 2009 15:11:00 GMT</pubDate><guid>http://www.blogjava.net/xinwuhen/archive/2009/03/18/260606.html</guid><wfw:comment>http://www.blogjava.net/xinwuhen/comments/260606.html</wfw:comment><comments>http://www.blogjava.net/xinwuhen/archive/2009/03/18/260606.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xinwuhen/comments/commentRss/260606.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xinwuhen/services/trackbacks/260606.html</trackback:ping><description><![CDATA[<p>有时为了动态生成页面内容, 我们会用到javascript来这么处理, 但有时用javascript动态生成页面信息时,会有错误却查不到信息,现以用javascript动态生成表格为例, 说明如下(以下代码可以直接拷贝下来,存为html格式的文件执行):<br />
<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&nbsp;&lt;script language='javascript'&gt;<br />
&nbsp;&nbsp;function addNode() {<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;// 第一部分代码<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;var vDiv = document.getElementById('1');&nbsp;// 注意:此处是取的不包含在&lt;table&gt;内的&lt;div&gt;标签<br />
&nbsp;&nbsp;&nbsp;var vTable = document.createElement('table');<br />
&nbsp;&nbsp;&nbsp;var tbody = document.createElement("tbody");<br />
&nbsp;&nbsp;&nbsp;var vTr = document.createElement('tr');<br />
&nbsp;&nbsp;&nbsp;var vTd = document.createElement('td');<br />
&nbsp;&nbsp;&nbsp;var vText = document.createTextNode('这是第一部分代码');<br />
&nbsp;&nbsp;&nbsp;vTd.appendChild(vText);&nbsp;// 或: vTd.innerText='这是第一部分代码';<br />
&nbsp;&nbsp;&nbsp;vTr.appendChild(vTd);<br />
&nbsp;&nbsp;&nbsp;tbody.appendChild(vTr);<br />
&nbsp;&nbsp;&nbsp;vTable.appendChild(tbody);<br />
&nbsp;&nbsp;&nbsp;vDiv.appendChild(vTable);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;// 第二部分代码<br />
&nbsp;&nbsp;&nbsp;/*<br />
&nbsp;&nbsp;&nbsp;var vDiv = document.getElementById('2');&nbsp;// 注意:此处是取的&lt;table&gt;标签<br />
&nbsp;&nbsp;&nbsp;//var obj = document.createElement("table");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;var tbody = document.createElement("tbody");<br />
&nbsp;&nbsp;&nbsp;var tr = document.createElement("tr");<br />
&nbsp;&nbsp;&nbsp;var td = document.createElement("td");<br />
&nbsp;&nbsp;&nbsp;td.innerText = "这是第二部分代码";<br />
&nbsp;&nbsp;&nbsp;tr.appendChild(td);<br />
&nbsp;&nbsp;&nbsp;tbody.appendChild(tr);<br />
&nbsp;&nbsp;&nbsp;//obj.appendChild(tbody);<br />
&nbsp;&nbsp;&nbsp;vDiv.appendChild(tbody);&nbsp;// 注意: 此处vDiv即为&lt;table&gt;标签, 故只需要在这个标签上添加&lt;tbody&gt;标签<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp; 同样，如果本段代码取&lt;tbody&gt;标签，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 即：var vDiv = document.getElementById('4'); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 那么，我们只需用vDiv.appendChild(tr);即可实现同样的效果。<br />
&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;/*<br />
&nbsp;&nbsp;&nbsp;// 第三部分代码<br />
&nbsp;&nbsp;&nbsp;var vDiv = document.getElementById('8');&nbsp;// 注意:此处是取的包含在&lt;tbody&gt;标签(id为6)内的&lt;div&gt;标签<br />
&nbsp;&nbsp;&nbsp;//var obj = document.createElement("table");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//var tbody = document.createElement("tbody");<br />
&nbsp;&nbsp;&nbsp;var tr = document.createElement("tr");<br />
&nbsp;&nbsp;&nbsp;var td = document.createElement("td");<br />
&nbsp;&nbsp;&nbsp;td.innerText="这是第三部分代码";<br />
&nbsp;&nbsp;&nbsp;tr.appendChild(td);<br />
&nbsp;&nbsp;&nbsp;//tbody.appendChild(tr);<br />
&nbsp;&nbsp;&nbsp;//obj.appendChild(tbody);<br />
&nbsp;&nbsp;&nbsp;vDiv.appendChild(tr);&nbsp;// 通过此处，向id为8的&lt;div&gt;添加标签&lt;tr&gt;是错误的；因为，&lt;div&gt;与&lt;tr&gt;不是父子关系<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;// 这是错误的代码： vDiv.innerHtml="&lt;table&gt;&lt;tr&gt;&lt;td&gt;test&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;";<br />
&nbsp;&nbsp;&nbsp;*/</p>
<p>&nbsp;&nbsp;}<br />
&nbsp;&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;</p>
<p>&nbsp;&lt;!-- 总结: 动态生成页面表格 --&gt; <br />
&nbsp;&lt;!--&nbsp;&nbsp;&nbsp; 1: 在页面中本身就没有&lt;table&gt;标签时, 必须创建&lt;table&gt;、&lt;tbody&gt;、&lt;tr&gt;、&lt;td&gt;这四个标签,并且缺一不可;&nbsp;--&gt;<br />
&nbsp;&lt;!--&nbsp;&nbsp;&nbsp;参见：&#8220;第一部分代码&#8221; --&gt;<br />
&nbsp;&lt;!--&nbsp;&nbsp;&nbsp; 2: 在页面中本身存在&lt;table&gt;标签时, 依据上边四个标签必须有的原则：在页面中有的标签我们直接取 --&gt;<br />
&nbsp;&lt;!--&nbsp;&nbsp;&nbsp;最内层的标签, 然后把缺的标签补上即可;参见：&#8220;第二部分代码&#8221; --&gt;<br />
&nbsp;&lt;!--&nbsp;&nbsp;&nbsp; 3: 对于没有父子关系的标签，如ID为8的标签（即：div标签）与tr标签就没有父子关系。--&gt;<br />
&nbsp;&lt;!--&nbsp;&nbsp;&nbsp;此时，就不能直接添加tbody标签到div标签内部. 参见：&#8220;第三部分代码&#8221;。--&gt;</p>
<p>&nbsp;&lt;!-- 此处仅有div标签 --&gt;<br />
&nbsp;&lt;div id='1'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&lt;/div&gt;</p>
<p>&nbsp;&lt;!-- 此处仅有table标签 --&gt;<br />
&nbsp;&lt;table id='2'&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&lt;/table&gt;</p>
<p>&nbsp;&lt;!-- 此处有table、tbody二种标签 --&gt;<br />
&nbsp;&lt;table id='3'&gt;<br />
&nbsp;&nbsp;&lt;tbody id='4'&gt;</p>
<p>&nbsp;&nbsp;&lt;/tbody&gt;<br />
&nbsp;&lt;/table&gt;</p>
<p>&nbsp;&lt;table id='5'&gt;<br />
&nbsp;&nbsp;&lt;tbody id='6'&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;tr id=7&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;div id='8'&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&lt;/div&gt;<br />
&nbsp;&nbsp;&lt;/tbody&gt;<br />
&nbsp;&lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;html&gt;</p>
<p>&lt;script language='javascript'&gt;<br />
&nbsp;addNode();<br />
&lt;/script&gt;</p>
<img src ="http://www.blogjava.net/xinwuhen/aggbug/260606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xinwuhen/" target="_blank">心无痕</a> 2009-03-18 23:11 <a href="http://www.blogjava.net/xinwuhen/archive/2009/03/18/260606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入Struts 1.1----转自IBM DeveloperWorks</title><link>http://www.blogjava.net/xinwuhen/archive/2008/07/01/212013.html</link><dc:creator>心无痕</dc:creator><author>心无痕</author><pubDate>Tue, 01 Jul 2008 14:10:00 GMT</pubDate><guid>http://www.blogjava.net/xinwuhen/archive/2008/07/01/212013.html</guid><wfw:comment>http://www.blogjava.net/xinwuhen/comments/212013.html</wfw:comment><comments>http://www.blogjava.net/xinwuhen/archive/2008/07/01/212013.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xinwuhen/comments/commentRss/212013.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xinwuhen/services/trackbacks/212013.html</trackback:ping><description><![CDATA[<p>2003 年 8 月 02 日</p>
<blockquote>作为基于MVC模式的Web应用最经典框架，Struts已经正式推出了1.1版本，该版本在以往版本的基础上，提供了许多激动人心的新功能。本文就将带你走进Struts 1.1去深入地了解这些功能。</blockquote>
<p><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<table cellspacing="0" cellpadding="0" width="150" border="0">
    <tbody>
        <tr>
            <td class="left-nav-highlight" colspan="2"><a class="left-nav" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#" cmimpressionsent="1">本文内容包括：</a></td>
        </tr>
        <tr class="left-nav-child-highlight">
            <td><img height="8" alt="" src="http://www.ibm.com/i/v14/t/cl-bullet.gif" width="2" /></td>
            <td><a class="left-nav-child" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#1" cmimpressionsent="1">Model 2</a></td>
        </tr>
        <tr class="left-nav-child-highlight">
            <td><img height="8" alt="" src="http://www.ibm.com/i/v14/t/cl-bullet.gif" width="2" /></td>
            <td><a class="left-nav-child" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#2" cmimpressionsent="1">Struts 1.1 和Model 2</a></td>
        </tr>
        <tr class="left-nav-child-highlight">
            <td><img height="8" alt="" src="http://www.ibm.com/i/v14/t/cl-bullet.gif" width="2" /></td>
            <td><a class="left-nav-child" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#3" cmimpressionsent="1">模块</a></td>
        </tr>
        <tr class="left-nav-child-highlight">
            <td><img height="8" alt="" src="http://www.ibm.com/i/v14/t/cl-bullet.gif" width="2" /></td>
            <td><a class="left-nav-child" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#4" cmimpressionsent="1">ActionServlet</a></td>
        </tr>
        <tr class="left-nav-child-highlight">
            <td><img height="8" alt="" src="http://www.ibm.com/i/v14/t/cl-bullet.gif" width="2" /></td>
            <td><a class="left-nav-child" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#5" cmimpressionsent="1">ActionForm</a></td>
        </tr>
        <tr class="left-nav-child-highlight">
            <td><img height="8" alt="" src="http://www.ibm.com/i/v14/t/cl-bullet.gif" width="2" /></td>
            <td><a class="left-nav-child" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#6" cmimpressionsent="1">Action</a></td>
        </tr>
        <tr class="left-nav-child-highlight">
            <td><img height="8" alt="" src="http://www.ibm.com/i/v14/t/cl-bullet.gif" width="2" /></td>
            <td><a class="left-nav-child" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#7" cmimpressionsent="1">宣称式异常处理</a></td>
        </tr>
        <tr class="left-nav-child-highlight">
            <td><img height="8" alt="" src="http://www.ibm.com/i/v14/t/cl-bullet.gif" width="2" /></td>
            <td><a class="left-nav-child" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#8" cmimpressionsent="1">taglib</a></td>
        </tr>
        <tr class="left-nav-child-highlight">
            <td><img height="8" alt="" src="http://www.ibm.com/i/v14/t/cl-bullet.gif" width="2" /></td>
            <td><a class="left-nav-child" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#9" cmimpressionsent="1">Commons Logging 接口</a></td>
        </tr>
        <tr class="left-nav-child-highlight">
            <td><img height="8" alt="" src="http://www.ibm.com/i/v14/t/cl-bullet.gif" width="2" /></td>
            <td><a class="left-nav-child" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#author" cmimpressionsent="1">关于作者</a></td>
        </tr>
        <tr class="left-nav-child-highlight">
            <td><img height="8" alt="" src="http://www.ibm.com/i/v14/t/cl-bullet.gif" width="2" /></td>
            <td><a class="left-nav-child" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#rate" cmimpressionsent="1">对本文的评价</a></td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p><strong>说明：</strong>希望本文的读者能有一定的Struts使用基础。 </p>
<p><a name="1"><span class="atitle">Model 2</span></a></p>
<p>
<p>Struts是基于Model 2之上的，而Model 2是经典的MVC（模型－视图－控制器）模型的Web应用变体，这个改变主要是由于网络应用的特性--HTTP协议的无状态性引起的。Model 2的目的和MVC一样，也是利用控制器来分离模型和视图，达到一种层间松散耦合的效果，提高系统灵活性、复用性和可维护性。在多数情况下，你可以将Model 2与MVC等同起来。</p>
<p>下图表示一个基于Java技术的典型网络应用，从中可以看出Model 2中的各个部分是如何对应于Java中各种现有技术的。</p>
<p><br />
<img alt="" src="http://www.ibm.com/developerworks/cn/java/l-struts1-1/image001.gif" /> <br />
</p>
<p>在利用Model 2之前，我们是把所有的表示逻辑和业务逻辑都集中在一起（比如大杂烩似的JSP），有时也称这种应用模式为Model 1，Model 1的主要缺点就是紧耦合，复用性差以及维护成本高。</p>
<p><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><a name="2"><span class="atitle">Struts 1.1 和Model 2</span></a></p>
<p>
<p>既然Struts 1.1是基于Model 2之上，那它的底层机制也就是MVC，下面是Struts 1.1中的MVC实现示意图：</p>
<p><br />
<img alt="" src="http://www.ibm.com/developerworks/cn/java/l-struts1-1/image002.jpg" /> <br />
<em>图解说明：其中不同颜色代表MVC的不同部分：红色（控制器）、紫色（模型）和绿色（视图） </em></p>
<p>首先，控制器（ActionServlet）进行初始化工作，读取配置文件（struts-config.xml），为不同的Struts模块初始化相应的ModuleConfig对象。比如配置文件中的Action映射定义都保存在ActionConfig集合中。相应地有ControlConfig集合、FormBeanConfig集合、ForwardConfig集合和MessageResourcesConfig集合等。</p>
<p><em><strong>提示：</strong>模块是在Struts 1.1中新提出的概念，在稍后的内容中我们将详细介绍，你现在可以简单地把模块看作是一个子系统，它们共同组成整个应用，同时又各自独立。Struts 1.1中所有的处理都是在特定模块环境中进行的。模块的提出主要是为了解决Struts 1.0中单配置文件的问题。 </em></p>
<p>控制器接收HTTP请求，并从ActionConfig中找出对应于该请求的Action子类，如果没有对应的Action，控制器直接将请求转发给JSP或者静态页面。否则控制器将请求分发至具体Action类进行处理。</p>
<p>在控制器调用具体Action的execute方法之前，ActionForm对象将利用HTTP请求中的参数来填充自己（可选步骤，需要在配置文件中指定）。具体的ActionForm对象应该是ActionForm的子类对象，它其实就是一个JavaBean。此外，还可以在ActionForm类中调用validate方法来检查请求参数的合法性，并且可以返回一个包含所有错误信息的ActionErrors对象。如果执行成功，ActionForm自动将这些参数信息以JavaBean（一般称之为form bean）的方式保存在Servlet Context中，这样它们就可以被其它Action对象或者JSP调用。</p>
<p>Struts将这些ActionForm的配置信息都放在FormBeanConfig集合中，通过它们Struts能够知道针对某个客户请求是否需要创建相应的ActionForm实例。</p>
<p>Action很简单，一般只包含一个execute方法，它负责执行相应的业务逻辑，如果需要，它也进行相应的数据检查。执行完成之后，返回一个ActionForward对象，控制器通过该ActionForward对象来进行转发工作。我们主张将获取数据和执行业务逻辑的功能放到具体的JavaBean当中，而Action只负责完成与控制有关的功能。遵循该原则，所以在上图中我将Action对象归为控制器部分。</p>
<p><em><strong>提示：</strong>其实在Struts 1.1中，ActionMapping的作用完全可以由ActionConfig来替代，只不过由于它是公共API的一部分以及兼容性的问题得以保留。ActionMapping通过继承ActionConfig来获得与其一致的功能，你可以等同地看待它们。同理，其它例如ActionForward与ForwardConfig的关系也是如此。 </em></p>
<p>下图给出了客户端从发出请求到获得响应整个过程的图解说明。</p>
<p><br />
<img alt="" src="http://www.ibm.com/developerworks/cn/java/l-struts1-1/image003.jpg" /> <br />
</p>
<p>下面我们就来详细地讨论一下其中的每个部分，在这之前，先来了解一下模块的概念。</p>
<p><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><a name="3"><span class="atitle">模块</span></a></p>
<p>
<p>我们知道，在Struts 1.0中，我们只能在web.xml中为ActionServlet指定一个配置文件，这对于我们这些网上的教学例子来说当然没什么问题，但是在实际的应用开发过程中，可能会有些麻烦。因为许多开发人员都可能同时需要修改配置文件，但是配置文件只能同时被一个人修改，这样肯定会造成一定程度上的资源争夺，势必会影响开发效率和引起开发人员的抱怨。</p>
<p>在Struts 1.1中，为了解决这个并行开发的问题，提出了两种解决方案：
<ol>
    <li>多个配置文件的支持
    <li>模块的支持 </li>
</ol>
<p>&nbsp;</p>
<p>支持多个配置文件，是指你能够为ActionServlet同时指定多个xml配置文件，文件之间以逗号分隔，比如Struts提供的MailReader演示例子中就采用该种方法。</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">  &lt;!-- Action Servlet Configuration --&gt;
            &lt;servlet&gt;
            &lt;servlet-name&gt;action&lt;/servlet-name&gt;
            &lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;
            &lt;init-param&gt;
            &lt;param-name&gt;config&lt;/param-name&gt;
            &lt;param-value&gt;/WEB-INF/struts-config.xml, /WEB-INF/struts-config-registration.xml&lt;/param-value&gt;
            &lt;/init-param&gt;
            &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
            &lt;/servlet&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>这种方法可以很好地解决修改冲突的问题，不同的开发人员可以在不同的配置文件中设置自己的Action、ActionForm等等（当然不是说每个开发人员都需要自己的配置文件，可以按照系统的功能模块进行划分）。但是，这里还是存在一个潜在的问题，就是可能不同的配置文件之间会产生冲突，因为在ActionServlet初始化的时候这几个文件最终还是需要合并到一起的。比如，在struts-config.xml中配置了一个名为success的&lt;forward&gt;，而在struts-config-registration.xml中也配置了一个同样的&lt;forward&gt;，那么执行起来就会产生冲突。</p>
<p>为了彻底解决这种冲突，Struts 1.1中引进了模块（Module）的概念。一个模块就是一个独立的子系统，你可以在其中进行任意所需的配置，同时又不必担心和其它的配置文件产生冲突。因为前面我们讲过，ActionServlet是将不同的模块信息保存在不同的ModuleConfig对象中的。要使用模块的功能，需要进行以下的准备工作：</p>
<p>1、为每个模块准备一个配置文件</p>
<p>2、配置web.xml文件，通知控制器</p>
<p>决定采用多个模块以后，你需要将这些信息告诉控制器，这需要在web.xml文件进行配置。下面是一个典型的多模块配置：</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;init-param&gt;
            &lt;param-name&gt;config&lt;/param-name&gt;
            &lt;param-value&gt;/WEB-INF/struts-config.xml&lt;/param-value&gt;
            &lt;/init-param&gt;
            &lt;init-param&gt;
            &lt;param-name&gt;config/customer&lt;/param-name&gt;
            &lt;param-value&gt;/WEB-INF/struts-config-customer.xml&lt;/param-value&gt;
            &lt;/init-param&gt;
            &lt;init-param&gt;
            &lt;param-name&gt;config/order&lt;/param-name&gt;
            &lt;param-value&gt;/WEB-INF/struts-config-order.xml&lt;/param-value&gt;
            &lt;/init-param&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>要配置多个模块，你需要在原有的一个&lt;init-param&gt;（在Struts 1.1中将其对应的模块称为缺省模块）的基础之上，增加模块对应的&lt;init-param&gt;。其中&lt;param-name&gt;表示为config/XXX的形式，其中XXX为对应的模块名，&lt;param-value&gt;中还是指定模块对应的配置文件。上面这个例子说明该应用有三个模块，分别是缺省模块、customer和order，它们分别对应不同的配置文件。</p>
<p>3、准备各个模块所需的ActionForm、Action和JSP等资源</p>
<p>但是要注意的是，模块的出现也同时带来了一个问题，即如何在不同模块间进行转发？有两种方法可以实现模块间的转发，一种就是在&lt;forward&gt;（全局或者本地）中定义，另外一种就是利用org.apache.struts.actions.SwitchAction。</p>
<p>下面就是一个全局的例子：</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">    ...
            &lt;struts-config&gt;
            ...
            &lt;global-forwards&gt;
            &lt;forward name="toModuleB"
            contextRelative="true"
            path="/moduleB/index.do"
            redirect="true"/&gt;
            ...
            &lt;/global-forwards&gt;
            ...
            &lt;/struts-config&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>可以看出，只需要在原有的path属性前加上模块名，同时将contextRelative属性置为true即可。此外，你也可以在&lt;action&gt;中定义一个类似的本地&lt;forward&gt;。</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">  &lt;action-mappings&gt;
            &lt;!-- Action mapping for profile form --&gt;
            &lt;action path="/login"
            type="com.ncu.test.LoginAction"
            name="loginForm"
            scope="request"
            input="tile.userLogin"
            validate="true"&gt;
            &lt;forward name="success" contextRelative="true" path="/moduleA/login.do"/&gt;
            &lt;/action&gt;
            &lt;/action-mappings&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>如果你已经处在其他模块，需要转回到缺省模块，那应该类似下面这样定义，即模块名为空。</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;forward name="success" contextRelative="true" path="/login.do"/&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>此外，你也可以使用org.apache.struts.actions.SwitchAction，例如：</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">    ...
            &lt;action-mappings&gt;
            &lt;action path="/toModule"
            type="org.apache.struts.actions.SwitchAction"/&gt;
            ...
            &lt;/action-mappings&gt;
            ...
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><a name="4"><span class="atitle">ActionServlet</span></a></p>
<p>
<p>我们首先来了解MVC中的控制器。在Struts 1.1中缺省采用ActionServlet类来充当控制器。当然如果ActionServlet不能满足你的需求，你也可以通过继承它来实现自己的类。这可以在/WEB-INF/web.xml中来具体指定。</p>
<p>要掌握ActionServlet，就必须了解它所扮演的角色。首先，ActionServlet表示MVC结构中的控制器部分，它需要完成控制器所需的前端控制及转发请求等职责。其次，ActionServlet被实现为一个专门处理HTTP请求的Servlet，它同时具有servlet的特点。在Struts 1.1中它主要完成以下功能：
<ul>
    <li>接收客户端请求
    <li>根据客户端的URI将请求映射到一个相应的Action类
    <li>从请求中获取数据填充Form Bean（如果需要）
    <li>调用Action类的execute()方法获取数据或者执行业务逻辑
    <li>选择正确的视图响应客户 </li>
</ul>
<p>&nbsp;</p>
<p>此外，ActionServlet还负责初始化和清除应用配置信息的任务。ActionServlet的初始化工作在init方法中完成，它可以分为两个部分：初始化ActionServlet自身的一些信息以及每个模块的配置信息。前者主要通过initInternal、initOther和initServlet三个方法来完成。</p>
<p>我们可以在/WEB-INF/web.xml中指定具体的控制器以及初始参数，由于版本的变化以及Struts 1.1中模块概念的引进，一些初始参数被废弃或者移入到/WEB-INF/struts-config.xml中定义。下面列出所有被废弃的参数，相应地在web.xml文件中也不鼓励再使用。</p>
<ul>
    <li>application
    <li>bufferSize
    <li>content
    <li>debug
    <li>factory
    <li>formBean
    <li>forward
    <li>locale
    <li>mapping
    <li>maxFileSize
    <li>multipartClass
    <li>nocache
    <li>null
    <li>tempDir </li>
</ul>
<p>ActionServlet根据不同的模块来初始化ModuleConfig类，并在其中以XXXconfig集合的方式保存该模块的各种配置信息，比如ActionConfig，FormBeanConfig等。</p>
<p>初始化工作完成之后，ActionServlet准备接收客户请求。针对每个请求，方法process(HttpServletRequest request, HttpServletResponse response)将被调用。该方法指定具体的模块，然后调用该模块的RequestProcessor的process方法。</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">protected void process(HttpServletRequest request,
            HttpServletResponse response)
            throws IOException, ServletException {
            RequestUtils.selectModule(request, getServletContext());
            getRequestProcessor(getModuleConfig(request)).process(request, response);
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>RequestProcessor包含了Struts控制器的所有处理逻辑，它调用不同的processXXX方法来完成不同的处理。下表列出其中几个主要的方法：</p>
<p>
<table border="1">
    <tbody>
        <tr>
            <td>方法</td>
            <td>功能</td>
        </tr>
        <tr>
            <td>processPath</td>
            <td>获取客户端的请求路径</td>
        </tr>
        <tr>
            <td>processMapping</td>
            <td>利用路径来获得相应的ActionMapping</td>
        </tr>
        <tr>
            <td>processActionForm</td>
            <td>初始化ActionForm（如果需要）并存入正确的scope中</td>
        </tr>
        <tr>
            <td>processActionCreate</td>
            <td>初始化Action</td>
        </tr>
        <tr>
            <td>processActionPerform</td>
            <td>调用Action的execute方法</td>
        </tr>
        <tr>
            <td>processForwardConfig</td>
            <td>处理Action返回的ActionForward</td>
        </tr>
    </tbody>
</table>
</p>
<p><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><a name="5"><span class="atitle">ActionForm</span></a></p>
<p>
<p>对于ActionForm你可以从以下几个方面来理解它：
<ol>
    <li>ActionForm表示HTTP窗体中的数据，可以将其看作是模型和视图的中介，它负责保存视图中的数据供模型或者视图使用。Struts 1.1文档中把它比作HTTP和Action之间的防火墙，这体现了ActionForm具有的过滤保护的作用，只有通过ActionForm验证的数据才能够发送到Action处理。
    <li>ActionForm是与一个或多个ActionConfig关联的JavaBean，在相应的action的execute方法被调用之前，ActionForm会自动利用请求参数来填充自己（初始化属性）。
    <li>ActionForm是一个抽象类，你必须通过继承来实现自己的类。 </li>
</ol>
<p>&nbsp;</p>
<p>ActionForm首先利用属性的getter和setter方法来实现初始化，初始化完毕后，ActionForm的validate方法被调用，你可以在其中来检查请求参数的正确性和有效性，并且可以将错误信息以ActionErrors的形式返回到输入窗体。否则，ActionForm将被作为参数传给action的execute方法以供使用。</p>
<p>ActionForm bean的生命周期可以设置为session（缺省）和request，当设置为session时，记得在reset方法中将所有的属性重新设置为初始值。</p>
<p>由于ActionForm对应于HTTP窗体，所以随着页面的增多，你的ActionForm将会急速增加。而且可能同一类型页面字段将会在不同的ActionForm中出现，并且在每个ActionForm中都存在相同的验证代码。为了解决这个问题，你可以为整个应用实现一个ActionForm或者至少一个模块对应于一个ActionForm。</p>
<p>但是，聚合的代价就是复用性很差，而且难维护。针对这个问题，在Struts 1.1中提出了DynaActionForm的概念。</p>
<p><strong>DynaActionForm类</strong> </p>
<p>DynaActionForm的目的就是减少ActionForm的数目，利用它你不必创建一个个具体的ActionForm类，而是在配置文件中配置出所需的虚拟ActionForm。例如，在下表中通过指定&lt;form-bean&gt;的type为"org.apache.struts.action.DynaActionForm"来创建一个动态的ActionForm--loginForm。</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;form-beans&gt;
            &lt;form-bean name="loginForm" type="org.apache.struts.action.DynaActionForm"&gt;
            &lt;form-property name="actionClass" type="java.lang.String"/&gt;
            &lt;form-property name="username" type="java.lang.String"/&gt;
            &lt;form-property name="password" type="java.lang.String"/&gt;
            &lt;/form-bean&gt;
            &lt;/form-beans&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>动态的ActionForm的使用方法跟普通的ActionForm相同，但是要注意一点。普通的ActionForm对象需要为每个属性提供getter和setter方法，以上面的例子而言，我们需要提供getUsername() 和 setUsername()方法取得和设置username属性，同样地有一对方法用于取得和设置password属性和actionClass属性。</p>
<p>如果使用DynaActionForm，它将属性保存在一个HashMap类对象中，同时提供相应的get(name) 和 set(name)方法，其中参数name是要访问的属性名。例如要访问DynaActionForm中username的值，可以采用类似的代码：</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">String username = (String)form.get("username")；
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>由于值存放于一个HashMap对象，所以要记得对get()方法返回的Object对象做强制性类型转换。正是由于这点区别，如果你在Action中非常频繁地使用ActionForm对象，建议还是使用普通的ActionForm对象。</p>
<p>在Struts 1.1中，除了DynaActionForm以外，还提供了表单输入自动验证的功能，在包org.apache.struts.validator中提供了许多有用的类，其中最常见的就是DynaValidatorForm类。</p>
<p><strong>DynaValidatorForm类</strong> </p>
<p>DynaValidatorForm是DynaActionForm的子类，它能够提供动态ActionForm和自动表单输入验证的功能。和使用DynaActionForm类似，你必须首先在配置文件中进行配置：</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;form-beans&gt;
            &lt;form-bean name="loginForm" type="org.apache.struts.validator.DynaValidatorForm"&gt;
            &lt;form-property name="actionClass" type="java.lang.String"/&gt;
            &lt;form-property name="username" type="java.lang.String"/&gt;
            &lt;form-property name="password" type="java.lang.String"/&gt;
            &lt;/form-bean&gt;
            &lt;/form-beans&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>同时要定义验证的插件：</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">  &lt;plug-in className="org.apache.struts.validator.ValidatorPlugIn"&gt;
            &lt;set-property property="pathnames"
            value="/WEB-INF/validator-rules.xml,
            /WEB-INF/validation.xml"/&gt;
            &lt;/plug-in&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>其中的validator.xml和validator-rules.xml分别表示验证定义和验证规则的内容（可以合并在一起），比如针对上例中的DynaValidatorForm，我们有如下验证定义（validator.xml）：</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;
            &lt;!DOCTYPE form-validation PUBLIC
            "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"
            "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd"&gt;
            &lt;!--    Validation Rules    $Id: validation.xml--&gt;
            &lt;form-validation&gt;
            &lt;!-- ========== Default Language Form Definitions ===================== --&gt;
            &lt;formset&gt;
            &lt;form name="loginForm"&gt;
            &lt;field property="username" depends="required, minlength,maxlength"&gt;
            &lt;arg0   key="prompt.username"/&gt;
            &lt;arg1   key="${var:minlength}" name="minlength" resource="false"/&gt;
            &lt;arg2   key="${var:maxlength}" name="maxlength" resource="false"/&gt;
            &lt;var&gt;
            &lt;var-name&gt;maxlength&lt;/var-name&gt;
            &lt;var-value&gt;16&lt;/var-value&gt;
            &lt;/var&gt;
            &lt;var&gt;
            &lt;var-name&gt;minlength&lt;/var-name&gt;
            &lt;var-value&gt;3&lt;/var-value&gt;
            &lt;/var&gt;
            &lt;/field&gt;
            &lt;field property="password" depends="required, minlength,maxlength" bundle="alternate"&gt;
            &lt;arg0   key="prompt.password"/&gt;
            &lt;arg1   key="${var:minlength}" name="minlength" resource="false"/&gt;
            &lt;arg2   key="${var:maxlength}" name="maxlength" resource="false"/&gt;
            &lt;var&gt;
            &lt;var-name&gt;maxlength&lt;/var-name&gt;
            &lt;var-value&gt;16&lt;/var-value&gt;
            &lt;/var&gt;
            &lt;var&gt;
            &lt;var-name&gt;minlength&lt;/var-name&gt;
            &lt;var-value&gt;3&lt;/var-value&gt;
            &lt;/var&gt;
            &lt;/field&gt;
            &lt;/form&gt;
            &lt;/formset&gt;
            &lt;/form-validation&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>从上述定义中，我们可以看到对于字段username有三项验证：required, minlength, maxlength，意思是该字段不能为空，而且长度在3和16之间。而validator-rules.xml文件则可以采用Struts提供的缺省文件。注意在&lt;form-bean&gt;中定义的form是如何与validation.xml中的form关联起来的。最后，要启动自动验证功能，还需要将Action配置的validate属性设置为true。</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;action path="/login"
            type="com.ncu.test.LoginAction"
            name="loginForm"
            scope="request"
            input="tile.userLogin"validate="true"&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>此时，Struts将根据xml配置文件中的定义来检验表单输入，并将不符合要求的错误信息输出到页面。但是你可能会想：这个功能虽然好，可是什么检验都跑到服务器端执行，效率方面和用户易用性方面是不是有些问题？你可能会怀念起那简单的JavaScript客户端验证。</p>
<p>不用担心，在Struts 1.1中也支持JavaScript客户端验证。如果你选择了客户端验证，当某个表单被提交以后，Struts 1.1启动客户端验证，如果浏览器不支持JavaScript验证，则服务器端验证被启动，这种双重验证机制能够最大限度地满足各种开发者的需要。JavaScript验证代码也是在validator-rules.xml文件中定义的。要启动客户端验证，你必须在相应的JSP文件中做如下设置：
<ol>
    <li>为&lt;html:form&gt;增加onsubmit属性
    <li>设置Javascript支持 </li>
</ol>
<p>&nbsp;</p>
<p>下表中列出了一JSP文件的示例代码，红字部分为Javascript验证所需代码。</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %&gt;
            &lt;table bgcolor="#9AFF9A" cellspacing="0" cellpadding="10" border="1" width="100%"&gt;
            &lt;tr&gt;
            &lt;td&gt;
            &lt;table cellspacing="0" cellpadding="0" border="0" width="100%"&gt;
            &lt;tr bgcolor="#696969"&gt;
            &lt;td align="center"&gt;
            &lt;font color="#FFFFFF"&gt;Panel 3: Profile&lt;/font&gt;
            &lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
            &lt;td&gt;&lt;br&gt;
            &lt;html:errors/&gt;
            &lt;html:form action="/login.do" focus="username"  onsubmit="return validateLoginForm(this);"&gt;
            &lt;html:hidden property="actionClass"/&gt;
            &lt;center&gt;
            &lt;table&gt;
            &lt;tr&gt;
            &lt;td&gt;UserName:&lt;/td&gt;
            &lt;td&gt;&lt;html:text property="username" size="20"/&gt;&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
            &lt;td&gt;Password:&lt;/td&gt;
            &lt;td&gt;&lt;html:password property="password" size="20"/&gt;&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
            &lt;td colspan=2&gt;&lt;html:submit property="submitProperty" value="Submit"/&gt;&lt;/td&gt;
            &lt;/table&gt;
            &lt;/center&gt;
            &lt;/html:form&gt;
            &lt;html:javascript formName="loginForm" dynamicJavascript="true" staticJavascript="false"/&gt;
            &lt;script language="Javascript1.1" src="staticJavascript.jsp"&gt;&lt;/script&gt;
            &lt;/td&gt;
            &lt;/tr&gt;
            &lt;/table&gt;
            &lt;/td&gt;
            &lt;/tr&gt;
            &lt;/table&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>其中onsubmit的值为"return validateLoginForm(this);"，它的语法为：</p>
<p>return validate + struts-config.xml中定义的form-bean名称 + (this);</p>
<p>staticJavascript.jsp的内容为：</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;%@ page language="java" %&gt;
            &lt;%-- set document type to Javascript (addresses a bug in Netscape according to a web resource --%&gt;
            &lt;%@ page contentType="application/x-javascript" %&gt;
            &lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %&gt;
            &lt;html:javascript dynamicJavascript="false" staticJavascript="true"/&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>如果validator-rules.xml中定义的基本验证功能不能满足你的需求，你可以自己添加所需的验证类型。</p>
<p><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><a name="6"><span class="atitle">Action</span></a></p>
<p>
<p>我们通过继承Action类来实现具体的执行类。具体Action类的功能一般都在execute（以前是perform方法）方法中完成，其中主要涉及到以下几个方面：
<ol>
    <li>辅助ActionForm进行一些表单数据的检查。
    <li>执行必要的业务逻辑，比如存取数据库，调用实体bean等。
    <li>更新服务器端的bean数据，后续对象中可能会用到这些数据，比如在JSP中利用bean:write来获得这些数据。
    <li>根据处理结果决定程序的去处，并以ActionForward对象的形式返回给ActionServlet。 </li>
</ol>
<p>&nbsp;</p>
<p><em><strong>提示：</strong>由于在Action和ActionForm中都可以实现验证方法，那么如何来安排它们之间的分工呢？一般来说，我们秉着MVC分离的原则，也就是视图级的验证工作放在ActionForm来完成，比如输入不能为空，email格式是否正确，利用ValidatorForm可以很轻松地完成这些工作。而与具体业务相关的验证则放入Action中，这样就可以获得最大ActionForm重用性的可能。 </em></p>
<p>前面我们提到过，我们主张将业务逻辑执行分离到单独的JavaBean中，而Action只负责错误处理和流程控制。而且考虑到重用性的原因，在执行业务逻辑的JavaBean中不要引用任何与Web应用相关的对象，比如HttpServletRequest，HttpServletResponse等对象，而应该将其转化为普通的Java对象。关于这一点，可以参考Petstore中WAF框架的实现思路。</p>
<p>此外，你可能还注意到execute与perform的一个区别：execute方法简单地掷出Exception异常，而perform方法则掷出ServletException和IOException异常。这不是说Struts 1.1在异常处理功能方面弱化了，而是为了配合Struts 1.1中一个很好的功能--宣称式异常处理机制。</p>
<p><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><a name="7"><span class="atitle">宣称式异常处理</span></a></p>
<p>
<p>和EJB中的宣称式事务处理概念类似，宣称式异常处理其实就是可配置的异常处理，你可以在配置文件中指定由谁来处理Action类中掷出的某种异常。你可以按照以下步骤来完成该功能：
<ol>
    <li>实现org.apache.struts.action.ExceptionHandler的子类，覆盖execute方法，在该方法中处理异常并且返回一个ActionForward对象
    <li>在配置文件中配置异常处理对象，你可以配置一个全局的处理类或者单独为每个Action配置处理类 </li>
</ol>
<p>&nbsp;</p>
<p>下表就定义了一个全局的处理类CustomizedExceptionHandler，它被用来处理所有的异常。</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;global-exceptions&gt;
            &lt;exception
            handler="com.yourcorp.CustomizedExceptionHandler"
            key="global.error.message"
            path="/error.jsp"
            scope="request"
            type="java.lang.Exception"/&gt;
            &lt;/global-exceptions&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>其中具体的参数含义，可以参考ExceptionHandler.java源文件。</p>
<p><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><a name="8"><span class="atitle">taglib</span></a></p>
<p>
<p>讲完了模型和控制器，接下来我们要涉及的是视图。视图的角色主要是由JSP来完成，从JSP的规范中可以看出，在视图层可以"折腾"的技术不是很多，主要的就是自定义标记库的应用。Struts 1.1在原有的四个标记库的基础上新增了两个标记库--Tiles和Nested。</p>
<p>其中Tiles除了替代Template的基本模板功能外，还增加了布局定义、虚拟页面定义和动态页面生成等功能。Tiles强大的模板功能能够使页面获得最大的重用性和灵活性，此外可以结合Tiles配置文件中的页面定义和Action的转发逻辑，即你可以将一个Action转发到一个在Tiles配置文件中定义的虚拟页面，从而减少页面的数量。比如，下表中的Action定义了一个转发路径，它的终点是tile.userMain，而后者是你在Tiles配置文件中定义的一个页面。</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;!-- ========== Action Mapping Definitions ============================== --&gt;
            &lt;action-mappings&gt;
            &lt;!-- Action mapping for profile form --&gt;
            &lt;action path="/login"
            type="com.ncu.test.LoginAction"
            name="loginForm"
            scope="request"
            input="tile.userLogin"
            validate="true"&gt;
            &lt;forward name="success" path="tile.userMain"/&gt;
            &lt;/action&gt;
            &lt;/action-mappings&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>Tiles配置文件：tiles-defs.xml</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&lt;!DOCTYPE tiles-definitions PUBLIC
            "-//Apache Software Foundation//DTD Tiles Configuration//EN"       "http://jakarta.apache.org/struts/dtds/tiles-config.dtd"&gt;
            &lt;tiles-definitions&gt;
            &lt;!-- =======================================================  --&gt;
            &lt;!-- Master definitions                                       --&gt;
            &lt;!-- =======================================================  --&gt;
            &lt;!-- Page layout used as root for all pages. --&gt;
            &lt;definition name="rootLayout" path="/tiles-layouts/rootLayout.jsp"&gt;
            &lt;put name="titleString" value="CHANGE-ME"/&gt;
            &lt;put name="topMenu" value="/tiles-components/topMenu.jsp"/&gt;
            &lt;put name="leftMenu" value="/tiles-components/panel1.jsp"/&gt;
            &lt;put name="body" value="CHANGE-ME"/&gt;
            &lt;put name="footer" value="/tiles-components/footer.jsp"/&gt;
            &lt;/definition&gt;
            &lt;!-- =======================================================  --&gt;
            &lt;!-- Page definitions 					--&gt;
            &lt;!-- =======================================================  --&gt;
            &lt;!-- User Login page --&gt;
            &lt;definition name="tile.userLogin" extends="rootLayout"&gt;
            &lt;put name="titleString" value="User Login"/&gt;
            &lt;put name="body" value="/src/userLogin.jsp"/&gt;
            &lt;/definition&gt;
            &lt;!-- User Main page --&gt;
            &lt;definition name="tile.userMain" extends="rootLayout"&gt;
            &lt;put name="titleString" value="User Main"/&gt;
            &lt;put name="body" value="/src/userMain.jsp"/&gt;
            &lt;/definition&gt;
            &lt;/tiles-definitions&gt;
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>而Nested标记库的作用是让以上这些基本标记库能够嵌套使用，发挥更大的作用。</p>
<p><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/java/l-struts1-1/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
</p>
<p><a name="9"><span class="atitle">Commons Logging 接口</span></a></p>
<p>
<p>所谓的Commons Logging接口，是指将日志功能的使用与日志具体实现分开，通过配置文件来指定具体使用的日志实现。这样你就可以在Struts 1.1中通过统一的接口来使用日志功能，而不去管具体是利用的哪种日志实现，有点于类似JDBC的功能。Struts 1.1中支持的日志实现包括：Log4J，JDK Logging API， LogKit，NoOpLog和SimpleLog。</p>
<p>你可以按照如下的方式来使用Commons Logging接口（可以参照Struts源文中的许多类实现）：</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">package com.foo;
            // ...
            import org.apache.commons.logging.Log;
            import org.apache.commons.logging.LogFactory;
            //...
            public class Foo {
            // ...
            private static Log log = LogFactory.getLog(Foo.class);
            // ...
            public void setBar(Bar bar) {
            if (log.isTraceEnabled()) {
            log.trace("Setting bar to " + bar);
            }
            this.bar = bar;
            }
            // ...
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>而开启日志功能最简单的办法就是在WEB-INF/classes目录下添加以下两个文件：</p>
<p>commons-logging.properties文件：</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode"># Note: The Tiles framework now uses the commons-logging package to output different information or debug statements.
            Please refer to this package documentation to enable it. The simplest way to enable logging is to create two files in
            WEB-INF/classes:
            # commons-logging.properties
            # org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
            # simplelog.properties
            # # Logging detail level,
            # # Must be one of ("trace", "debug", "info", "warn", "error", or "fatal").
            #org.apache.commons.logging.simplelog.defaultlog=trace
            org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>simplelog.properties文件：</p>
<p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode"># Logging detail level,
            # Must be one of ("trace", "debug", "info", "warn", "error", or "fatal").
            org.apache.commons.logging.simplelog.defaultlog=fatal
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<p>这里我们采用的日志实现是SimpleLog，你可以在simplelog.properties文件指定日志明细的级别：trace，debug，info，warn，error和fatal，从trace到fatal错误级别越来越高，同时输出的日志信息也越来越少。而这些级别是和org.apache.commons.logging.log接口中的方法一一对应的。这些级别是向后包含的，也就是前面的级别包含后面级别的信息。</p>
<img src ="http://www.blogjava.net/xinwuhen/aggbug/212013.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xinwuhen/" target="_blank">心无痕</a> 2008-07-01 22:10 <a href="http://www.blogjava.net/xinwuhen/archive/2008/07/01/212013.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts配置文件详解----转载</title><link>http://www.blogjava.net/xinwuhen/archive/2008/07/01/211910.html</link><dc:creator>心无痕</dc:creator><author>心无痕</author><pubDate>Tue, 01 Jul 2008 07:16:00 GMT</pubDate><guid>http://www.blogjava.net/xinwuhen/archive/2008/07/01/211910.html</guid><wfw:comment>http://www.blogjava.net/xinwuhen/comments/211910.html</wfw:comment><comments>http://www.blogjava.net/xinwuhen/archive/2008/07/01/211910.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xinwuhen/comments/commentRss/211910.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xinwuhen/services/trackbacks/211910.html</trackback:ping><description><![CDATA[<div id="related_topics" style="position: relative" _eventid="3" _madepositioned="true">相关文章: <span class="close"><a title="关闭" onclick="$('related_topics').hide();return false;" href="http://www.javaeye.com/topic/146902#">&nbsp;</a></span>
<ul>
    <li><a href="http://www.javaeye.com/topic/83869" target="_blank">配置Struts应用--解读Struts应用的两大配置文件</a>
    <li><a href="http://www.javaeye.com/topic/136575" target="_blank">struts配置</a> </li>
</ul>
<br />
<span>推荐圈子: <a href="http://ibm-websphere.group.javaeye.com/" target="_blank">IBM WebSphere专区</a></span> <br />
<a href="http://www.javaeye.com/wiki/topic/146902" target="_blank">更多相关推荐</a> </div>
<script type="text/javascript">
            new Draggable("related_topics");
          </script><span style="color: green">Struts应用采用两个基于XML的配置文件来配置,分别是web.xml和struts-cofig.xml文件.web.xml文件是配置所有 web应用的而struts-config.xml文件是struts专用的配置文件,事实上也是可以根据需要给这个配置文件起其他名称的. <br />
Web应用的发布描述文件:web应用发布描述文件可以在应用开着者,发布者和组装者之间传递配置信息,Web容器在启动的时候从该文件中读取配置信息, 根据它来装载和配置web应用.文档类型定义DTD对XML文档的格式做了定义,DTD吧XML文档划分为元素,属性,实体每一种XML文档都有独自的 DTD文件.可以从网上下载.&lt;web-app&gt;元素是web.xml的根元素,其他元素必须嵌入在&lt;web-app&gt;元素之内.要注意的是子元素也是有顺序的比如必须是首先&lt;servlet&gt;,然后&lt;servlet-mapping&gt;最后&lt; taglib&gt;. <br />
<br />
为Struts应用配置Web.xml文件:首先最重要的一步是配置ActionServlet,这个用&lt;servlet&gt;标签的 servlet-name属性起一个名字叫action,然后用servlet-class属性指定ActionServlet的类.然后用&lt; servlet-mapping&gt;标签的servlet-name属性指定action,在用url-pattern指定接收范围是*.do的请求.不管应用中包含了多少子应用,都只需要配置一个ActionServlet,类来出来应用中的不同的功能,其实者就是不必要的,因为Servlet本身就是多线程的,而且目前Struts只允许配置一个ActionServlet.声明ActionServlet的初始化参数:&lt; servlet&gt;的&lt;init-param&gt;子元素用来配置Servlet的初始化参数.param-name设置config参数名.param-value设置struts-config.xml的路径参数值. <br />
<br />
配置欢迎使用清单:如果客户访问Web的时候值是访问了WEB应用的根目录URL.没有具体的指定文件,Web会自动调用Web的欢迎文件.&lt; welcome-file-list&gt;元素来配置的.通过其中的&lt;welcome-file&gt;欢迎页面&lt;/welcome- file&gt;来配置. <br />
<br />
配置错误处理:尽管Struts框架功能强大的错误处理机制,但是不能保证处理所有的错误或者异常.当错误发生时,如果框架不能处理这种错误,把错误抛弃给Web容器,在默认的情况下web容器会想客户端返回错误信息.如果想避免让客户看到原始的错误信息,可以在Web应用发布描述文件中配置&lt; error-page&gt;元素.通过&lt;error-code&gt;404来定义错误的类型.然后通过&lt;location&gt;要处理错误的JSP页面来对错误进行处理.还可以用&lt;exception-type&gt;来设置异常,然后通过&lt;location&gt;来处理异常的JSP页面来处理异常. <br />
<br />
配置Struts标签库:这个就和以前学到的JSP自定义标签类似,配置元素为&lt;taglib&gt;来配置.&lt;taglib- uri&gt;这个指定标签库的uri,类似起一个名称.&lt;taglib-location&gt;这个是标签库的位置也就是实际所在的路径.通过这样的方法引入一个标签库,然后在前台JSP页面就可以通过自己定义的URI来调用标签. <br />
<br />
Struts配置文件:struts-config.xml文件.首先研讨一下org.apache.struts.config包,在struts应用启动的时候会把Struts配置文件信息读取到内存中,并把它们存放在config包中相关的JavaBean类的实例中.包中的每一个类都和 struts配置文件中特定的配置元素对应,ModuleConfig在Struts框架中扮演了十分重要的角色,它是整个config包的核心,在 Struts运行时来存放整个应用的配置信息.如果有多个子应用都会有一个ModuleConfig对象,它和Struts文件根元素的&lt; struts-config&gt;对应.根元素中包含&lt;form-bean&gt;&lt;action&gt;&lt;forward&gt; 等元素. <br />
<br />
&lt;struts-config&gt;元素:时Struts配置文件的根元素,和它对应的配置类ModuleConfig类,&lt;struts -config&gt;元素有8个子元素.他们的DTD定义是data-sources?form-bean? global-exception?global-forwards?action-mapping?controller?message-resources? plug-in*在Struts配置文件中,必须按照DTD指定的先手顺序来配置&lt;struts-config&gt;元素的各个子元素,如果颠倒了这些子元素的顺序,会产生错误. <br />
<br />
&lt;data-sources&gt;元素:用来配置应用所需要的数据源,数据源负责创建和特定的数据库的连接.许多数据源采用连接池的机制实现.以便提高数据库访问的性能.JAVA语言提供了javax.sql.DataSource接口,所有的数据源都必须实现这个接口.许多应用服务器和Web服务器都提供了数据源组件.很多数据库厂商也提供了数据源的实现.&lt;data-sources&gt;元素包含多个&lt;data- source&gt;子元素永远配置特定的数据源.他们可以包含多个&lt;set-property&gt;子元素用于设置数据源的各种属性.配置了数据源以后,就可以在Action类中访问数据源,在Action中定义了getDataSource(HttpRequest)方法,用于获取数据源对象的引用.然后可以利用DataSource对象调用getConnection获取一个连接对象对数据库进行操作.在配置文件中声明多个数据源的时候需要为每一个数据源分配唯一的Key值,通过这个来表示特定的数据源.获取特定的数据源的时候可以用dataSource = getDataSource(reqeust,&#8221;A&#8221;); <br />
<br />
&lt;form-beans&gt;元素:用来配置多个ActionForm,包含一个或者N个&lt;form-bean&gt;子元素.每个 &lt;form-bean&gt;元素都包含多个属性.className指定和&lt;form-bean&gt;匹配的类.name指定该 ActionForm的唯一标识符,这个属性是必须的以后作为引用使用.type指定ActionForm类的完整类名,这个属性也是必须的.注意包名也要加上.&lt;form-property&gt;是指定动态的Form的元素,以后会深入了解. <br />
<br />
&lt;global-exception&gt;元素:用于配置异常处理,元素可以包含一个或者多个&lt;exception&gt;元素,用来设置 JAVA异常和异常处理类ExceptionHandler之间的映射.className指定和元素对应的配置类,默认的不用动.handler指定异常处理类默认是ExceptionHandler.key指定在本地资源文件中异常的消息Key,path指定当前异常发生的时候转发的路径.scope 指定ActionMessages实例存放的范围.type指定需要处理异常类的名字,必须的.bundle指定Resource Bundle. <br />
<br />
&lt;global-forwards&gt;元素:用来声明全局转发,元素可以有一个或者N个&lt;forward&gt;元素组成,用于把一个逻辑名映射到特定的URL,通过这种方法Action类或者JSP页面无需指定URL,只要指定逻辑名称就可以实现请求转发或者重定向.这样可以减少控制组件和视图的聚合.易于维护.className对应的配置类.contextRelative如果为true表示当path属性以/开头的时候,给出的是对应的上下文URL默认是false.name转发路径的逻辑名,必须写.path转发或者重定向的URL,必须写必须是以/开头.redirect设置为true的时候表示执行重定向操作,此项为false的时候,表示执行请求转发操作.重定向与请求转发的区别以后就是重定向是把请求生成应答给客户端然后在重新发送给定向的URL,浏览器地址栏会有显示.而转发就是直接把请求转发给本应用的另一个文件,不生成应答所以客户端IE没显示. <br />
<br />
&lt;action-mapping&gt;元素:包含一个或者N个&lt;action&gt;元素,描述了从特定的请求路径到响应的Action的映射.在&lt;action&gt;元素中可以包含多个&lt;exception&gt;和&lt;forward&gt;子元素,他们分别配置局部异常处理和局部转发.attribute设置Action关联的ActionForm在request或者session范围内的key.就是在 request或者session共享内的名称.className对应配置元素的类.默认的是ActionMapping.forward指定转发 URL路径include指定包含URL路径.input指定包含表单的URL,当表单验证失败的时候发送的URL.name,指定和该Action关联的Form名字.该名字必须是在form-bean中定义过的,可写可不写.path必须/开头的方位Action的路径.parameter指定 Action配置参数.在Action的execute()方法中可以调用ActionMapping的getParameter()方法来读取匹配的参数.roles指定允许调用该Action的安全角色,多个角色之间逗号格开.scope指定Form的存在范围.默认是session.tyep指定 Action的完整类名.unknown如果是true表示可以处理用户发出的所有的无效的ActionURL默认是false.validate指定是否调用ActionForm的validate方法. <br />
<br />
&lt;controller&gt;元素:用于配置ActionServlet.buffreSize指定上载文件的输入缓冲大小.该属性为可选默认 4096.className指定元素对应的配置类,ControllerConfig.然后是contentType指定响应结果内容类型和字符编码, 该属性为可选,默认是text/html如果在Action或者JSP网页也设置了类型内容,会覆盖这个.locale指定是否把Locale对象保存到当前用户的session中默认false.tempDir指定处理文件上载的临时工作目录.nochache如果是true在响应结果中加入特定的头参数. <br />
<br />
&lt;message-resources&gt;元素:用来配置Resource Bundle.用于存放本地文本消息文件.className元素对应的配置类.MessageResourcesConfig.factory指定消息的工厂类.key指定文件存放的Servlet对象中采用的属性Key.null指定如何处理未知消息.parameter指定消息的文件名. <br />
<br />
&lt;plug-in&gt;元素:用于配置Struts插件. <br />
<br />
配置多应用模块:所有的子应用都可以共享同一个ActionServlet实例,但是每个子应用都有单独的配置文件.把应用划分为多个子应用模块. 首先为每个应用创建单独的Struts配置文件,在web.xml的ActionServlet配置代码中添加几个子应用信息.采用&lt; forward&gt;元素来实现应用之间的切换. <br />
<br />
Digester组件:是一个Apache的另一个开源代码项目.当Struts被初始化的时候,首先会读取并解析配置文件,框架采用Digester组件来且西配置文件.然后创建config包中的对象.者对象用于存放配置信息. <br />
<br />
其实配置文件不难,只要都理其中的原理就OK了.真正实际的项目开发中,采用的工具例如Eclipse系列,提供了相应的插件,在创建一个Struts工程的时候配置文件的标签都是自动生成的,而我们只需要往里面填写属性就OK了. <br />
</span>
<img src ="http://www.blogjava.net/xinwuhen/aggbug/211910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xinwuhen/" target="_blank">心无痕</a> 2008-07-01 15:16 <a href="http://www.blogjava.net/xinwuhen/archive/2008/07/01/211910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用例建模指南----转自IBM DeveloperWorks</title><link>http://www.blogjava.net/xinwuhen/archive/2008/07/01/211808.html</link><dc:creator>心无痕</dc:creator><author>心无痕</author><pubDate>Tue, 01 Jul 2008 01:26:00 GMT</pubDate><guid>http://www.blogjava.net/xinwuhen/archive/2008/07/01/211808.html</guid><wfw:comment>http://www.blogjava.net/xinwuhen/comments/211808.html</wfw:comment><comments>http://www.blogjava.net/xinwuhen/archive/2008/07/01/211808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xinwuhen/comments/commentRss/211808.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xinwuhen/services/trackbacks/211808.html</trackback:ping><description><![CDATA[<blockquote>用例(Use Case)是一种描述系统需求的方法，使用用例的方法来描述系统需求的过程就是用例建模。用例方法最早是由Iva Jackboson博士提出的，后来被综合到UML规范之中，成为一种标准化的需求表述体系。用例的使用在RUP中被推崇备至，整个RUP流程都被称作是"用例驱动"(Use-Case Driven)的，各种类型的开发活动包括项目管理、分析设计、测试、实现等都是以系统用例为主要输入工件，用例模型奠定了整个系统软件开发的基础。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p><a name="N1003A"><span class="atitle">1. 什么是用例？</span></a></p>
<p>在介始用例方法之前，我们首先来看一下传统的需求表述方式-"软件需求规约"(Software Requirement Specification)。传统的软件需求规约基本上采用的是功能分解的方式来描述系统功能，在这种表述方式中，系统功能被分解到各个系统功能模块中，我们通过描述细分的系统模块的功能来达到描述整个系统功能的目的。一个典型的软件需求规约可能具有以下形式：</p>
<br />
<img height="294" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/1.gif" width="315" border="0" /> <br />
<p>采用这种方法来描述系统需求，非常容易混淆需求和设计的界限，这样的表述实际上已经包含了部分的设计在内。由此常常导致这样的迷惑：系统需求应该详细到何种程度？一个极端就是需求可以详细到概要设计，因为这样的需求表述既包含了外部需求也包含了内部设计。在有些公司的开发流程中，这种需求被称为"内部需求"，而对应于用户的原始要求则被称之为"外部需求"。</p>
<p>功能分解方法的另一个缺点是这种方法分割了各项系统功能的应用环境，从各项功能项入手，你很难了解到这些功能项是如何相互关联来实现一个完成的系统服务的。所以在传统的SRS文档中，我们往往需要另外一些章节来描述系统的整体结构及各部分之间的相互关联，这些内容使得SRS需求更象是一个设计文档。</p>
<p><a name="N1005A"><span class="smalltitle">1.1 参与者和用例</span></a></p>
<p>从用户的角度来看，他们并不想了解系统的内部结构和设计，他们所关心的是系统所能提供的服务，也就是被开发出来的系统将是如何被使用的，这就用例方法的基本思想。用例模型主要由以下模型元素构成：</p>
<ul>
    <li>参与者(Actor) <br />
    参与者是指存在于被定义系统外部并与该系统发生交互的人或其他系统，他们代表的是系统的使用者或使用环境。
    <li>用例(Use Case) <br />
    用例用于表示系统所提供的服务，它定义了系统是如何被参与者所使用的，它描述的是参与者为了使用系统所提供的某一完整功能而与系统之间发生的一段对话。
    <li>通讯关联(Communication Association) <br />
    通讯关联用于表示参与者和用例之间的对应关系，它表示参与者使用了系统中的哪些服务（用例），或者说系统所提供的服务（用例）是被哪些参与者所使用的。 </li>
</ul>
<p>这大三种模型元素在UML中的表述如下图所示。</p>
<br />
<img height="89" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image006.gif" width="341" border="0" /> <br />
<p>以银行自动提款机(ATM)为例，它的主要功能可以由下面的用例图来表示。ATM的主要使用者是银行客户，客户主要使用自动提款机来进行银行帐户的查询、提款和转帐交易。</p>
<br />
<img height="230" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image008.gif" width="261" border="0" /> <br />
<p>通讯关联表示的是参与者和用例之间的关系，箭头表示在这一关系中哪一方是对话的主动发起者，箭头所指方是对话的被动接受者；如果你不想强调对话中的主动与被动关系，可以使用不带箭头的关联实线。在参与者和用例之间的信息流不是由通讯关联来表示的，该信息流是缺省存在的（用例本身描述的就是参与者和系统之间的对话），并且信息流向是双向的，它与通讯关联箭头所指的方向亳无关系。</p>
<p><a name="N100A0"><span class="smalltitle">1.2 用例的内容</span></a></p>
<p>用例图使我们对系统的功能有了一个整体的认知，我们可以知道有哪些参与者会与系统发生交互，每一个参与者需要系统为它提供什么样的服务。用例描述的是参与者与系统之间的对话，但是这个对话的细节并没有在用例图中表述出来，针对每一个用例我们可以用事件流来描述这一对话的细节内容。如在ATM系统中的"提款"用例可以用事件流表述如下：</p>
<p>提款-基本事件流</p>
<p>1. 用户插入信用卡</p>
<p>2. 输入密码</p>
<p>3. 输入提款金额</p>
<p>4. 提取现金</p>
<p>5. 退出系统，取回信用卡</p>
<p>但是这只描述了提款用例中最顺利的一种情况，作为一个实用的系统，我们还必须考虑可能发生的各种其他情况，如信用卡无效、输入密码错、用户帐号中的现金余额不够等，所有这些可能发生的各种情况（包括正常的和异常的）被称之为用例的场景(Scenario)，场景也被称作是用例的实例(Instance)。在用例的各种场景中，最常见的场景是用基本流(Basic Flow)来描述的，其他的场景则是用备选流(Alternative Flow)来描述。对于ATM系统中的"提款"用例，我们可以得到如下一些备选流：</p>
<p>提款-备选事件流</p>
<p>备选流一：用户可以在基本流中的任何一步选择退出，转至基本流步骤5。</p>
<p>备选流二：在基本流步骤1中，用户插入无效信用卡，系统显示错误并退出信用卡，用例结束。</p>
<p>备选流三：在基本流步骤２中，用户输入错误密码，系统显示错误并提示用户重新输入密码，重新回到基本流步骤2；三次输入密码错误后，信用卡被系统没收，用例结束。</p>
<p>&#8230;</p>
<p>通过基本流与备选流的组合，就可以将用例所有可能发生的各种场景全部描述清楚。我们在描述用例的事件流的时候，就是要尽可能地将所有可能的场景都描述出来，以保证需求的完备性。</p>
<p><a name="N100D0"><span class="smalltitle">1.3 用例方法的优点</span></a></p>
<p>用例方法完全是站在用户的角度上（从系统的外部）来描述系统的功能的。在用例方法中，我们把被定义系统看作是一个黑箱，我们并不关心系统内部是如何完成它所提供的功能的。用例方法首先描述了被定义系统有哪些外部使用者（抽象成为Actor），这些使用者与被定义系统发生交互；针对每一参与者，用例方法又描述了系统为这些参与者提供了什么样的服务（抽象成为Use Case），或者说系统是如何被这些参与者使用的。所以从用例图中，我们可以得到对于被定义系统的一个总体印象。</p>
<p>与传统的功能分解方式相比，用例方法完全是从外部来定义系统的功能，它把需求与设计完全分离开来。在面向对象的分析设计方法中，用例模型主要用于表述系统的功能性需求，系统的设计主要由对象模型来记录表述。另外，用例定义了系统功能的使用环境与上下文，每一个用例描述的是一个完整的系统服务。用例方法比传统的SRS更易于被用户所理解，它可以作为开发人员和用户之间针对系统需求进行沟通的一个有效手段。</p>
<p>在RUP中，用例被作为整个软件开发流程的基础，很多类型的开发活动都把用例作为一个主要的输入工件(Artifact)，如项目管理、分析设计、测试等。根据用例来对目标系统进行测试，可以根据用例中所描述的环境和上下文来完整地测试一个系统服务，可以根据用例的各个场景(Scenario)来设计测试用例，完全地测试用例的各种场景可以保证测试的完备性。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N100DF"><span class="atitle">2. 建立用例模型</span></a></p>
<p>使用用例的方法来描述系统的功能需求的过程就是用例建模，用例模型主要包括以下两部分内容：</p>
<ul>
    <li>用例图(Use Case Diagram) <br />
    确定系统中所包含的参与者、用例和两者之间的对应关系，用例图描述的是关于系统功能的一个概述。
    <li>用例规约(Use Case Specification) <br />
    针对每一个用例都应该有一个用例规约文档与之相对应，该文档描述用例的细节内容。 </li>
</ul>
<p>在用例建模的过程中，我们建议的步聚是先找出参与者，再根据参与者确定每个参与者相关的用例，最后再细化每一个用例的用例规约。</p>
<p><a name="N100F8"><span class="smalltitle">2.1 寻找参与者</span></a></p>
<p>所谓的参与者是指所有存在于系统外部并与系统进行交互的人或其他系统。通俗地讲，参与者就是我们所要定义系统的使用者。寻找参与者可以从以下问题入手：</p>
<ul>
    <li>系统开发完成之后，有哪些人会使用这个系统？
    <li>系统需要从哪些人或其他系统中获得数据？
    <li>系统会为哪些人或其他系统提供数据？
    <li>系统会与哪些其他系统相关联？
    <li>系统是由谁来维护和管理的？ </li>
</ul>
<p>这些问题有助于我们抽象出系统的参与者。对于ATM机的例子，回答这些问题可以使我们找到更多的参与者：操作员负责维护和管理ATM机系统、ATM机也需要与后台服务器进行通讯以获得有关用户帐号的相关信息。</p>
<br />
<img height="178" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image010.gif" width="456" border="0" /> <br />
<p><strong>2.1.1 系统边界决定了参与者</strong> </p>
<p>参与者是由系统的边界所决定的，如果我们所要定义的系统边界仅限于ATM机本身，那么后台服务器就是一个外部的系统，可以抽象为一个参与者。</p>
<br />
<img height="91" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image012.gif" width="341" border="0" /> <br />
<p>如果我们所要定义的系统边界扩大至整个银行系统，ATM机和后台服务器都是整个银行系统的一部分，这时候后台服务器就不再被抽象成为一个参与者。</p>
<br />
<img height="104" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image014.gif" width="370" border="0" /> <br />
<p>值得注意的是，用例建模时不要将一些系统的组成结构作为参与者来进行抽象，如在ATM机系统中，打印机只是系统的一个组成部分，不应将它抽象成一个独立的参与者；在一个MIS管理系统中，数据库系统往往只作为系统的一个组成部分，一般不将其单独抽象成一个参与者。</p>
<p><strong>2.1.2 特殊的参与者――系统时钟</strong> </p>
<p>有时候我们需要在系统内部定时地执行一些操作，如检测系统资源使用情况、定期地生成统计报表等等。从表面上看，这些操作并不是由外部的人或系统触发的，应该怎样用用例方法来表述这一类功能需求呢？对于这种情况，我们可以抽象出一个系统时钟或定时器参与者，利用该参与者来触发这一类定时操作。从逻辑上，这一参与者应该被理解成是系统外部的，由它来触发系统所提供的用例对话。</p>
<br />
<img height="88" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image016.gif" width="262" border="0" /> <br />
<p><a name="N10172"><span class="smalltitle">2.2 确定用例</span></a></p>
<p>找到参与者之后，我们就可以根据参与者来确定系统的用例，主要是看各参与者需要系统提供什么样的服务，或者说参与者是如何使用系统的。寻找用例可以从以下问题入手（针对每一个参与者）：</p>
<ul>
    <li>参与者为什么要使用该系统？
    <li>参与者是否会在系统中创建、修改、删除、访问、存储数据？如果是的话，参与者又是如何来完成这些操作的？
    <li>参与者是否会将外部的某些事件通知给该系统？
    <li>系统是否会将内部的某些事件通知该参与者？ </li>
</ul>
<p>综合以上所述，ATM系统的用例图可表示如下，</p>
<br />
<img height="279" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image018.gif" width="403" border="0" /> <br />
<p>在用例的抽取过程中，必须注意：用例必须是由某一个主角触发而产生的活动，即每个用例至少应该涉及一个主角。如果存在与主角不进行交互的用例，就可以考虑将其并入其他用例；或者是检查该用例相对应的参与者是否被遗漏，如果是，则补上该参与者。反之，每个参与者也必须至少涉及到一个用例，如果发现有不与任何用例相关联的参与者存在，就应该考虑该参与者是如何与系统发生对话的，或者由参与者确定一个新的用例，或者该参与者是一个多余的模型元素，应该将其删除。</p>
<p>可视化建模的主要目的之一就是要增强团队的沟通，用例模型必须是易于理解的。用例建模往往是一个团队开发的过程，系统分析员在建模过程中必须注意参与者和用例的名称应该符合一定的命名约定，这样整个用例模型才能够符合一定的风格。如参与者的名称一般都是名词，用例名称一般都是动宾词组等。</p>
<p>对于同一个系统，不同的人对于参与者和用例都可能有不同的抽象结果，因而得到不同的用例模型。我们需要在多个用例模型方案中选择一种"最佳"（或"较佳"）的结果，一个好的用例模型应该能够容易被不同的涉众所理解，并且不同的涉众对于同一用例模型的理解应该是一致的。</p>
<p><a name="N101A7"><span class="smalltitle">2.3 描述用例规约</span></a></p>
<p>应该避免这样一种误解――认为由参与者和用例构成的用例图就是用例模型，用例图只是在总体上大致描述了系统所能提供的各种服务，让我们对于系统的功能有一个总体的认识。除此之外，我们还需要描述每一个有例的详细信息，这些信息包含在用例规约中，用例模型是由用例图和每一个用例的详细描述――用例规约所组成的。RUP中提供了用例规约的模板，每一个用例的用例规约都应该包含以下内容：</p>
<ul>
    <li>简要说明 (Brief Description) <br />
    简要介绍该用例的作用和目的。
    <li>事件流 (Flow of Event) <br />
    包括基本流和备选流，事件流应该表示出所有的场景。
    <li>用例场景 (Use-Case Scenario) <br />
    包括成功场景和失败场景，场景主要是由基本流和备选流组合而成的。
    <li>特殊需求 (Special Requirement) <br />
    描述与该用例相关的非功能性需求（包括性能、可靠性、可用性和可扩展性等）和设计约束（所使用的操作系统、开发工具等）。
    <li>前置条件 (Pre-Condition) <br />
    执行用例之前系统必须所处的状态。
    <li>后置条件 (Post-Condition) <br />
    用例执行完毕后系统可能处于的一组状态。 </li>
</ul>
<p>用例规约基本上是用文本方式来表述的，为了更加清晰地描述事件流，也可以选择使用状态图、活动图或序列图来辅助说明。只要有助于表达的简洁明了，就可以在用例中任意粘贴用户界面和流程的图形化显示方式，或是其他图形。如活动图有助于描述复杂的决策流程，状态转移图有助于描述与状态相关的系统行为，序列图适合于描述基于时间顺序的消息传递。</p>
<p><strong>2.3.1 基本流</strong> </p>
<p>基本流描述的是该用例最正常的一种场景，在基本流中系统执行一系列活动步骤来响应参与者提出的服务请求。我们建议用以下格式来描述基本流：</p>
<p>1) 每一个步骤都需要用数字编号以清楚地标明步骤的先后顺序。</p>
<p>2) 用一句简短的标题来概括每一步骤的主要内容，这样阅读者可以通过浏览标题来快速地了解用例的主要步骤。在用例建模的早期，我们也只需要描述到事件流步骤标题这一层，以免过早地陷入到用例描述的细节中去。</p>
<p>3) 当整个用例模型基本稳定之后，我们再针对每一步骤详细描述参与者和系统之间所发生的交互。建议采用双向(roundtrip)描述法来保证描述的完整性，即每一步骤都需要从正反两个方面来描述:(1)参与者向系统提交了什么信息；(2)对此系统有什么样的响应。具体例子请参见附录。</p>
<p>在描述参与者和系统之间的信息交换时，需指出来回传递的具体信息。例如，只表述参与者输入了客户信息就不够明确，最好明确地说参与者输入了客户姓名和地址。通常可以利用词汇表让用例的复杂性保持在可控范围内，可以在词汇表中定义客户信息等内容，使用例不至于陷入过多的细节。</p>
<p><strong>2.3.2 备选流</strong> </p>
<p>备选流负责描述用例执行过程中异常的或偶尔发生的一些情况，备选流和基本流的组合应该能够覆盖该用例所有可能发生的场景。在描述备选流时，应该包括以下几个要素：</p>
<p>1) 起点：该备选流从事件流的哪一步开始；</p>
<p>2) 条件：在什么条件下会触发该备选流；</p>
<p>3) 动作：系统在该备选流下会采取哪些动作；</p>
<p>4) 恢复：该备选流结束之后，该用例应如何继续执行。</p>
<p>备选流的描述格式可以与基本流的格式一致，也需要编号并以标题概述其内容，编号前可以加以字母前缀A(Alternative)以示与基本流步骤相区别。</p>
<p><strong>2.3.3 用例场景</strong> </p>
<p>用例在实际执行的时候会有很多的不同情况发生，称之为用例场景；也可以说场景是用例的实例，我们在描述用例的时候要覆盖所有的用例场景，否则就有可能导致需求的遗漏。在用例规约中，场景的描述可以由基本流和备选流的组合来表示。场景既可以帮助我们防止需求的遗漏，同时也可以对后续的开发工作起到很大的帮助：开发人员必须实现所有的场景、测试人员可以根据用例场景来设计测试用例。</p>
<p><strong>2.3.4 特殊需求</strong> </p>
<p>特殊需求通常是非功能性需求，它为一个用例所专有，但不适合在用例的事件流文本中进行说明。特殊需求的例子包括法律或法规方面的需求、应用程序标准和所构建系统的质量属性（包括可用性、可靠性、性能或支持性需求等）。此外，其他一些设计约束，如操作系统及环境、兼容性需求等，也可以在此节中记录。</p>
<p>需要注意的是，这里记录的是专属于该用例的特殊需求；对于一些全局的非功能性需求和设计约束，它们并不是该用例所专有的，应把它们记录在《补充规约》中。</p>
<p><strong>2.3.5 前置和后置条件</strong> </p>
<p>前置条件是执行用例之前必须存在的系统状态，后置条件是用例一执行完毕后系统可能处于的一组状态。</p>
<p><a name="N1021F"><span class="smalltitle">2.4 检查用例模型</span></a></p>
<p>用例模型完成之后，可以对用例模型进行检查，看看是否有遗漏或错误之处。主要可以从以下几个方面来进行检查：</p>
<ul>
    <li>功能需求的完备性 <br />
    现有的用例模型是否完整地描述了系统功能，这也是我们判断用例建模工作是否结束的标志。如果发现还有系统功能没有被记录在现有的用例模型中，那么我们就需要抽象一些新的用例来记录这些需求，或是将他们归纳在一些现有的用例之中。
    <li>模型是否易于理解 <br />
    用例模型最大的优点就在于它应该易于被不同的涉众所理解，因而用例建模最主要的指导原则就是它的可理解性。用例的粒度、个数以及模型元素之间的关系复杂程度都应该由该指导原则决定。
    <li>是否存在不一致性 <br />
    系统的用例模型是由多个系统分析员协同完成的，模型本身也是由多个工件所组成的，所以我们要特别注意不同工件之前是否存在前后矛盾或冲突的地方，避免在模型内部产生不一致性。不一致性会直接影响到需求定义的准确性。
    <li>避免二义性语义 <br />
    好的需求定义应该是无二义性的，即不同的人对于同一需求的理解应该是一致的。在用例规约的描述中，应该避免定义含义模糊的需求，即无二义性。 </li>
</ul>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N1023F"><span class="atitle">3. 系统需求</span></a></p>
<p>RUP中根据FURPS+模型将系统需求分为以下几类：</p>
<ul>
    <li>功能(Functionality)
    <li>可用性(Usability)
    <li>可靠性(Reliability)
    <li>性能(Performance)
    <li>可支持性(Supportability)
    <li>设计约束等 </li>
</ul>
<p>除了第一项功能性需求之外的其他需求都归之为非功能性需求。</p>
<p><a name="N10260"><span class="smalltitle">3.1 需求工件集</span></a></p>
<p>用例模型主要用于描述系统的功能性需求，对于其他的非功能性需要用其他文档来记录。RUP中定义了如下的需求工件集合。</p>
<ul>
    <li>用例模型：记录功能性需求
    <ul>
        <li>用例图：描述参与者和用例之间的关系
        <li>用例规约：描述每一个用例的细节信息 </li>
    </ul>
    <li>补充规约：记录一些全局性的功能需求、非功能性需求和设计约束等
    <li>词汇表：记录一些系统需求相关的术语 </li>
</ul>
<p>在实际应用中，除了这些工件之外，我们还可以根据实际需求灵活选用其他形式的文档来补充说明需求。并不是所有的系统需求都适保合用用例模型来描述的，如编译器，我们很难用用例方法来表述它所处理的语言的方法规则，在这种情况下，采用传统的BNF范式来表述更加合适一些。在电信软件行业中，很多电信标准都是采用SDL语言来描述的，我们也不必用UML来改写这些标准（UML对SDL存在着这样的兼容性），只需将SDL形式的电信标准作为需求工件之一，在其他工件中对其加以引用就可以了。总之，万万不可拘泥于用例建模的形式，应灵活运用各种方式的长处。</p>
<p><a name="N10281"><span class="smalltitle">3.2 补充规约</span></a></p>
<p>补充规约记录那些在用例模型中不易表述的系统需求，主要包括以下内容。</p>
<ul>
    <li>功能性 <br />
    功能性需求主要在用例模型中刻画，但是也有部分需求不适合在用例中表述。有些功能性需求是全局性的，适用于所有的用例，如出错处理、I18N支持等，我们不需要在所有的用例中描述这些功能性需求，只需要在补充规约中统一描述就可以了。
    <li>可用性 <br />
    记录所有可用性相关的需求，如系统的使用者所需要的培训时间、是否应附合一些常见的可用性标准如Windows界面风格等。
    <li>可靠性 <br />
    定义系统可靠性相关的各种指标，包括： <br />
    <ul>
        <li>可用性：指出可用时间百分比(xx.xx%)，系统处于使用、维护、降级模式等操作的小时数；
        <li>平均故障间隔时间(MTBF)：通常表示为小时数，但也可表示为天数、月数或年数；
        <li>平均修复时间(MTTR)：系统在发生故障后可以暂停运行的时间；
        <li>精确度：指出系统输出要求具备的精密度（分辨率）和精确度（按照某一已知的标准）；
        <li>最高错误或缺陷率：通常表示为bugs/KLOC（每千行代码的错误数目）或bugs/function-point（每个功能点的错误数目）。 </li>
    </ul>
    <li>性能 <br />
    记录系统性能相关的各种指标，包括： <br />
    <ul>
        <li>对事务的响应时间（平均、最长）；
        <li>吞吐量（例如每秒处理的事务数）；
        <li>容量（例如系统可以容纳的客户或事务数）；
        <li>降级模式（当系统以某种形式降级时可接受的运行模式）；
        <li>资源利用情况：内存、磁盘、通信等。 </li>
    </ul>
    <li>可支持性 <br />
    定义所有与系统的可支持性或可维护性相关的需求，其中包括编码标准、命名约定、类库、如何来对系统进行维护操作和相应的维护实用工具等。
    <li>设计约束 <br />
    设计约束代表已经批准并必须遵循的设计决定，其中包括软件开发流程、开发工具、系统构架、编程语言、第三方构件类库、运行平台和数据库系统等等。 </li>
</ul>
<p><a name="N102D3"><span class="smalltitle">3.3 词汇表</span></a></p>
<p>词汇表主要用于定义项目特定的术语，它有助于开发人员对项目中所用的术语有统一的理解和使用，它也是后续阶段中进行对象抽象的基础。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N102DC"><span class="atitle">4. 调整用例模型</span></a></p>
<p>在一般的用例图中，我们只表述参与者和用例之间的关系，即它们之间的通讯关联。除此之外，我们还可以描述参与者与参与者之间的泛化(generalization)、用例和用例之间的包含(include)、扩展(extend)和泛化(generalization)关系。我们利用这些关系来调整已有的用例模型，把一些公共的信息抽取出来重用，使得用例模型更易于维护。但是在应用中要小心选用这些关系，一般来说这些关系都会增加用例和关系的个数，从而增加用例模型的复杂度。而且一般都是在用例模型完成之后才对用例模型进行调整，所以在用例建模的初期不必要急于抽象用例之间的关系。</p>
<p><a name="N102E5"><span class="smalltitle">4.1 参与者之间的关系</span></a></p>
<p>参与者之间可以有泛化(Generalization)关系（或称为"继承"关系）。例如在需求分析中常见的权限控制问题（如下图所示），一般的用户只可以使用一些常规的操作，而管理员除了常规操作之外还需要进行一些系统管理工作，操作员既可以进行常规操作又可以进行一些配置操作。</p>
<br />
<img height="271" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image020.gif" width="289" border="0" /> <br />
<p>在这个例子中我们会发现管理员和操作员都是一种特殊的用户，他们拥有普通用户所拥有的全部权限，此外他们还有自己独有的权限。这里我们可进一步把普通用户和管理员、操作员之间的关系抽象成泛化(Generalization)关系，管理员和操作员可以继承普通用户的全部特性（包括权限），他们又可以有自己独有的特性（如操作、权限等）。这样可以显著减速少用例图中通讯关联的个数，简化用例模型，使之更易于理解。</p>
<br />
<img height="270" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image022.gif" width="325" border="0" /> <br />
<p><a name="N10313"><span class="smalltitle">4.2 用例之间的关系</span></a></p>
<p>用例描述的是系统外部可见的行为，是系统为某一个或几个参与者提供的一段完整的服务。从原则上来讲，用例之间都是并列的，它们之间并不存在着包含从属关系。但是从保证用例模型的可维护性和一致性角度来看，我们可以在用例之间抽象出包含(include)、扩展(extend)和泛化(generalization)这几种关系。这几种关系都是从现有的用例中抽取出公共的那部分信息，然后通后过不同的方法来重用这部公共信息，以减少模型维护的工作量。</p>
<p><strong>4.2.1 包含(include)</strong> </p>
<p>包含关系是通过在关联关系上应用&lt;&lt;include&gt;&gt;构造型来表示的，如下图所示。它所表示的语义是指基础用例(Base)会用到被包含用例(Inclusion)，具体地讲，就是将被包含用例的事件流插入到基础用例的事件流中。</p>
<br />
<img height="80" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image024.gif" width="393" border="0" /> <br />
<p>包含关系是UML1.3中的表述，在UML1.1中，同等语义的关系被表述为使用(uses)，如下图。</p>
<br />
<img height="67" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image026.gif" width="333" border="0" /> <br />
<p>在ATM机中，如果查询、取现、转帐这三个用例都需要打印一个回执给客户，我们就可以把打印回执这一部分内容提取出来，抽象成为一个单独的用例"打印回执"，而原有的查询、取现、转帐三个例都会包含这个用例。每当以后要对打印回执部分的需求进行修改时，就只需要改动一个用例，而不用在每一个用例都作相应修改，这样就提高了用例模型的可维护性。</p>
<br />
<img height="229" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image028.gif" width="417" border="0" /> <br />
<p>在基础用例的事件流中，我们只需要引用被包含用例即可。</p>
<p>查询-基本事件流</p>
<p>1. 用户插入信用卡</p>
<p>2. 输入密码</p>
<p>3. 选择查询</p>
<p>4. 查看帐号余额</p>
<p>5. 包含用例"打印回执"</p>
<p>6. 退出系统，取回信用卡</p>
<p>在这个例子中，多个用例需要用到同一段行为，我们可以把这段共同的行为单独抽象成为一个用例，然后让其他的用例来包含这一用例。从而避免在多个用例中重复性地描述同一段行为，也可以防止该段行为在多个用例中的描述出现不一致性。当需要修改这段公共的需求时，我们也只需要修改一个用例，避免同时修改多个用例而产生的不一致性和重复性工作。</p>
<p>有时当某一个用例的事件流过于复杂时，为了简化用例的描述，我们也可以把某一段事件流抽象成为一个被包含的用例。这种情况类似于在过程设计语言中，将程序的某一段算法封装成一个子过程，然后再从主程序中调用这一子过程。</p>
<p><strong>4.2.2 扩展(extend)</strong> </p>
<p>扩展（extend）关系如下图所示，基础用例(Base)中定义有一至多个已命名的扩展点，扩展关系是指将扩展用例(Extension)的事件流在一定的条件下按照相应的扩展点插入到基础用例(Base)中。对于包含关系而言，子用例中的事件流是一定插入到基础用例中去的，并且插入点只有一个。而扩展关系可以根据一定的条件来决定是否将扩展用例的事件流插入基础用例事件流，并且插入点可以有多个。</p>
<br />
<img height="66" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image030.gif" width="327" border="0" /> <br />
<p>例如对于电话业务，可以在基本通话(Call)业务上扩展出一些增值业务如：呼叫等待(Call Waiting)和呼叫转移(Call Transfer)。我们可以用扩展关系将这些业务的用例模型描述如下。</p>
<br />
<img height="159" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image032.gif" width="356" border="0" /> <br />
<br />
<img height="250" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/2.jpg" width="637" border="0" /> <br />
<p>在这个例子中，呼叫等待和呼叫转移都是对基本通话用例的扩展，但是这两个用例只有在一定的条件下（如应答方正忙或应答方无应答）才会将被扩展用例的事件流嵌入基本通话用例的扩展点，并重用基本通话用例中的事件流。</p>
<p>值得注意的是扩展用例的事件流往往可以也可抽象为基础用例的备选流，如上例中的呼叫等待和呼叫转移都可以作为基本通话用例的备选流而存在。但是基本通话用例已经是一个很复杂的用例了，选用扩展关系将增值业务抽象成为单独的用例可以避免基础用例过于复杂，并且把一些可选的操作独立封装在另外的用例中。</p>
<p><strong>4.2.3 泛化(generalization)</strong> </p>
<p>当多个用例共同拥有一种类似的结构和行为的时候，我们可以将它们的共性抽象成为父用例，其他的用例作为泛化关系中的子用例。在用例的泛化关系中，子用例是父用例的一种特殊形式，子用例继承了父用例所有的结构、行为和关系。在实际应用中很少使用泛化关系，子用例中的特殊行为都可以作为父用例中的备选流存在。</p>
<br />
<img height="148" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image034.gif" width="299" border="0" /> <br />
<p>以下是一个用例泛化关系的例子，执行交易是一种交易抽象，执行房产交易和执行证券交易都是一种特殊的交易形式。</p>
<p>用例泛化关系中的事件流示例如下：</p>
<br />
<img height="312" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/3.gif" width="637" border="0" /> <br />
<p><a name="N103F2"><span class="smalltitle">4.3 调整用例模型</span></a></p>
<p>用例模型建成之后，我们可以对用例模型进行检视，看是否可以进一步简化用例模型、提高重用程度、增加模型的可维护性。主要可以从以下检查点(checkpoints)入手:</p>
<ul>
    <li>用例之间是否相互独立？如果两个用例总是以同样的顺序被激活，可能需要将它们合并为一个用例。
    <li>多个用例之间是否有非常相似的行为或事件流？如果有，可以考虑将它们合并为一个用例。
    <li>用例事件流的一部分是否已被构建为另一个用例？如果是，可以让该用例包含(include)另一用例。
    <li>是否应该将一个用例的事件流插入另一个用例的事件流中？如果是，利用与另一个用例的扩展关系(extend)来建立此模型。 </li>
</ul>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right">
    <tbody>
        <tr align="right">
            <td><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N1040A"><span class="atitle">5. 管理用例模型复杂度</span></a></p>
<p>一般小型的系统，其用例模型中包含的参与者和用例不会太多，一个用例图就可以容纳所有的参与者，所有的参与者和用例也可以并存于同一个层次结构中。对于较复杂的大中型系统，用例模型中的参与者和用例会大大增加，我们需要一些方法来有效地管理由于规模上升而造成的复杂度。</p>
<p><a name="N10413"><span class="smalltitle">5.1 用例包</span></a></p>
<p>包(Package)是UML中最常用的管理模型复杂度的机制，包也是UML中语义最简单的一种模型元素，它就是一种容器，在包中可以容纳其他任意的模型元素（包括其他的包）。在用例模型中，我们可以用构造型(Sterotype)&lt;&lt;use case&gt;&gt;来扩展标准UML包的语义，这种新的包叫作用例包(Use Case Package)，用于分类管理用例模型中的模型元素。</p>
<p>我们可以根据参与者和用例的特性来对它们进行分类，分别置于不同的用例包管理之下。例如对于一个大型的企业管理信息系统，我们可以根据参与者和用例的内容将它们分别归于人力资源、财务、采购、销售、客务服务这些用例包之下。这样我们将整个用例模型划分成为两个层次，在第一层次我们看到的是系统功能总共分为五部分，在第二层次我们可以分别看到每一用例包内部的参与者和用例。</p>
<br />
<img height="192" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image038.gif" width="272" border="0" /> <br />
<p>一个用例模型需要有多少个用例包取决你想怎么样来管理用例模型的复杂度（包括参与者和用例的个数，以及它们之间的相互关系）。UML中的包其实就类似于文件系统中的目录，文件数量少的时候不需要额外的目录，文件数量一多就需要有多个目录来分类管理，同样一组文件不同的人会创建不同的目录结构来进行管理，关键是要保证在目录结构下每一个文件都要易于访问。同样的道理存在于用例建模之中，如何创建用例包以及用例包的个数取决于不同的系统和系统分析员，但要保证整个用例模型易于理解。</p>
<p><a name="N10433"><span class="smalltitle">5.2 用例的粒度</span></a></p>
<p>我的系统需要有多少个用例？这是很多人在用例建模时会产生的疑惑。描述同一个系统，不同的人会产生不同的用例模型。例如对于各种系统中常见的"维护用户"用例，它里面包含了添加用户、修改用户信息、删除用户等操作，这些操作在该用例的事件流可以表述成为基本流的子事件流(subflow)。</p>
<br />
<img height="88" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image040.gif" width="288" border="0" /> <br />
<p>维护用户-基本事件流</p>
<p>该基本流由三个子事件流构成：</p>
<p>1) 添加用户子事件流 <br />
&#8230; </p>
<p>2) 修改用户 子事件流 <br />
&#8230; </p>
<p>3) 删除用户子事件流 <br />
&#8230; </p>
<p>但是你也可以根据该用例中的具体操作把它抽象成为三个用例，它所表示的系统需求和单个用例的模型是完全一样的。</p>
<br />
<img height="189" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image042.gif" width="300" border="0" /> <br />
<p>应该如何确定用例的粒度呢？在一次技术研讨会上，有人问起Ivar Jacoboson博士，一个系统需要有多少个用例？大师的回答是20个，当然他的意思是最好将用例模型的规模控制在几十个用例左右，这样比较容易来管理用例模型的复杂度。在用例个数大致确定的条件下，我们就很容易来确定用例粒度的大小。对于较复杂的系统，我们需要控制用例模型一级的复杂度，所以可以将复杂度适当地移往每一个用例的内部，也就是让一个用例包含较多的需求信息量。对于比较简单的系统，我们则可以将复杂度适度地曝露在模型一级，也就是我们可以将较复杂的用例分解成为多个用例。</p>
<p>用例的粒度不但决定了用例模型级的复杂度，而且也决定了每一个用例内部的复杂度。我们应该根据每个系统的具体情况，因时因宜地来把握各个层次的复杂度，在尽可能保证整个用例模型的易理解性前提下决定用例的大小和数目。</p>
<p><a name="N1047C"><span class="smalltitle">5.3 用例图</span></a></p>
<p>用例图的主要作用是描述参与者和用例之间的关系，简单的系统中只需要有一个用例图就可以把所有的关系都描述清楚。复杂的系统中可以有多个用例图，例如每个用例包都可以有一个独立的用例图来描述该用例包中所有的参与者和用例的关系。</p>
<p>在一个用例模型中，如果参与者和用例之间存在着多对多的关系，并且他们之间的关系比较复杂，如果在同一个用例图中表述所有的参与者和用例就显得不够清晰，这时我们可创建多个用例图来分别表示各种关系。</p>
<br />
<img height="265" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image044.gif" width="406" border="0" /> <br />
<p>如果想要强调某一个参与者和多个用例的关系，你就可以以该参与者为中心，用一个用例图表述出该参与者和多个用例之间的关系。在这个用例图中，我们强调的是该参与者会使用系统所提供的哪些服务。</p>
<br />
<img height="228" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image046.gif" width="308" border="0" /> <br />
<p>如果想要强调某一个用例和多个参与者之间的关系，你就可以以该用例为中心，用一个用例图表述出该用例和多个参与者之间的关系。在这个用例图中，我们强调的是该用例会涉及到哪些参与者，或者说该用例所表示的系统服务有哪些使用者。</p>
<br />
<img height="203" alt="" src="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/images/image048.gif" width="369" border="0" /> <br />
<p>总之在用例建模过程中，你可以根据自己的需要创建任意多个用例图，用不同的用例来强调参与者和用例之间不同的关系。但是最重要的是要考虑整个用例模型的可理解性，如果可以用一个用例图把意思表述清楚，就不要再用第二个，因为越是简洁的模型越易于理解。</p>
<br />
<br />
<p><a name="resources"><span class="atitle">参考资料 </span></a></p>
<ul>
    <li><a href="http://www-128.ibm.com/developerworks/cn/rational/r-usecase-atm/ATM.zip" cmimpressionsent="1">样例代码</a> <br />
    <br />
    <br />
    <br />
    <li>Jeffrey Friedl, Mastering Regular Expressions, O'Reilly<br />
    <br />
    <li>Mendel Cooper, Advanced Bash-Scripting Guide<br />
    <br />
    <li>Michael Jang, Mastering Redhat 9<br />
    </li>
</ul>
<br />
<br />
<p><a name="author"><span class="atitle">关于作者</span></a></p>
<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td colspan="3"><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /></td>
        </tr>
        <tr valign="top" align="left">
            <td>
            <p>&nbsp;</p>
            </td>
            <td><img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" /></td>
            <td width="100%">
            <p>傅纯一，IBM中国有限公司软件部Rational中国区技术销售经理</p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/xinwuhen/aggbug/211808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xinwuhen/" target="_blank">心无痕</a> 2008-07-01 09:26 <a href="http://www.blogjava.net/xinwuhen/archive/2008/07/01/211808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搭建MyEclipse+Tomcat开发环境</title><link>http://www.blogjava.net/xinwuhen/archive/2008/06/30/211769.html</link><dc:creator>心无痕</dc:creator><author>心无痕</author><pubDate>Mon, 30 Jun 2008 14:26:00 GMT</pubDate><guid>http://www.blogjava.net/xinwuhen/archive/2008/06/30/211769.html</guid><wfw:comment>http://www.blogjava.net/xinwuhen/comments/211769.html</wfw:comment><comments>http://www.blogjava.net/xinwuhen/archive/2008/06/30/211769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xinwuhen/comments/commentRss/211769.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xinwuhen/services/trackbacks/211769.html</trackback:ping><description><![CDATA[<p align="left">本文转自:http://esoft.bokee.com/5081515.html</p>
<p>一、安装JDK<br />
首先下载JDK 5.0 Update7（JDK 5.0 Update7的下载页面为：<br />
<a href="http://java.sun.com/javase/downloads/index.jsp">http://java.sun.com/javase/downloads/index.jsp</a>）；<br />
然后运行JDK 5.0安装程序jdk-1_5_0_07-windows-i586-p.exe，安装过程中所有选项保持默认；<br />
最后配置JDK的环境变量：在&#8220;我的电脑&#8221;上点右键—&gt;&#8220;属性&#8221;—&gt;&#8220;高级&#8221;—&gt; &#8220;环境变量(N)&#8221;。<br />
<img alt=" " src="http://esoft.bokee.com/inc/J2EE_01.jpg" onload="function anonymous()&#13;&#10;{&#13;&#10;function anonymous()&#13;&#10;{&#13;&#10;function onload(event) {&#13;&#10;&#13;&#10;    function anonymous() {&#13;&#10;&#13;&#10;        function anonymous() {&#13;&#10;&#13;&#10;            function anonymous() {&#13;&#10;&#13;&#10;                function anonymous() {&#13;&#10;&#13;&#10;                    function anonymous() {&#13;&#10;&#13;&#10;                        function anonymous() {&#13;&#10;&#13;&#10;                            function anonymous() {&#13;&#10;&#13;&#10;                                function anonymous() {&#13;&#10;&#13;&#10;                                    function anonymous() {&#13;&#10;&#13;&#10;                                        function anonymous() {&#13;&#10;&#13;&#10;                                            function anonymous() {&#13;&#10;                                                img_auto_size(this, 450, true);&#13;&#10;                                            }&#13;&#10;&#13;&#10;                                        }&#13;&#10;&#13;&#10;                                    }&#13;&#10;&#13;&#10;                                }&#13;&#10;&#13;&#10;                            }&#13;&#10;&#13;&#10;                        }&#13;&#10;&#13;&#10;                    }&#13;&#10;&#13;&#10;                }&#13;&#10;&#13;&#10;            }&#13;&#10;&#13;&#10;        }&#13;&#10;&#13;&#10;    }&#13;&#10;&#13;&#10;}&#13;&#10;}&#13;&#10;}" align="bottom" twffan="done" /></p>
<p>新建系统变量JAVA_HOME：C:\Program Files\Java\jdk1.5.0_06<br />
新建系统变量CLASSPATH：.;%JAVA_HOME%\lib;（注意：点号表示当前目录，不能省略）<br />
在系统变量Path的值的<strong>前面</strong>加入以下内容：%JAVA_HOME%\bin;(注意:这里的分号不能省略)<br />
到这里，JDK安装完毕。<br />
下面我们测试一下JDK是否安装成功：<br />
将以下内容复制到记事本中：<br />
public class HelloJAVA<br />
{<br />
public static void main(String srg[])<br />
{<br />
System.out.println("Hello JAVA!");<br />
}<br />
}<br />
另存为&#8220;HelloJAVA.java&#8221;（不含引号，下同），并保存到D盘根目录下。<br />
在命令行依次输入下图中红线所标注的命令：<br />
<img alt=" " src="http://esoft.bokee.com/inc/J2EE_02.jpg" onload="function anonymous()&#13;&#10;{&#13;&#10;function anonymous()&#13;&#10;{&#13;&#10;function onload(event) {&#13;&#10;&#13;&#10;    function anonymous() {&#13;&#10;&#13;&#10;        function anonymous() {&#13;&#10;&#13;&#10;            function anonymous() {&#13;&#10;&#13;&#10;                function anonymous() {&#13;&#10;&#13;&#10;                    function anonymous() {&#13;&#10;&#13;&#10;                        function anonymous() {&#13;&#10;&#13;&#10;                            function anonymous() {&#13;&#10;&#13;&#10;                                function anonymous() {&#13;&#10;&#13;&#10;                                    function anonymous() {&#13;&#10;&#13;&#10;                                        function anonymous() {&#13;&#10;&#13;&#10;                                            function anonymous() {&#13;&#10;                                                img_auto_size(this, 450, true);&#13;&#10;                                            }&#13;&#10;&#13;&#10;                                        }&#13;&#10;&#13;&#10;                                    }&#13;&#10;&#13;&#10;                                }&#13;&#10;&#13;&#10;                            }&#13;&#10;&#13;&#10;                        }&#13;&#10;&#13;&#10;                    }&#13;&#10;&#13;&#10;                }&#13;&#10;&#13;&#10;            }&#13;&#10;&#13;&#10;        }&#13;&#10;&#13;&#10;    }&#13;&#10;&#13;&#10;}&#13;&#10;}&#13;&#10;}" align="bottom" twffan="done" /></p>
<p>如果出现上图红框中所标注的内容，则说明JDK安装成功！</p>
<p>注意:如果以后要安装诸如Eclipse、Borland JBuilder、JCreator、IntelliJ IDEA等集成开发环境(IDE,Integrated Development Environment),应该在IDE中编译运行一个简单的HelloWorld程序，以保证IDE可以识别出JDK的位置。</p>
<p>二、安装Tomcat<br />
首先下载jakarta-tomcat-5.0.30.zip，之所以下载免安装版的好处是可以使用多个Tomcat（jakarta-tomcat-5.0.30.zip的下载页面为：<br />
<a href="http://apache.linuxforum.net/tomcat/tomcat-5/v5.0.30/bin/">http://apache.linuxforum.net/tomcat/tomcat-5/v5.0.30/bin/</a>）；<br />
然后将jakarta-tomcat-5.0.30.zip直接解压到D盘根目录：</p>
<p><img alt=" " src="http://esoft.bokee.com/inc/J2EE_03.jpg" onload="function anonymous()&#13;&#10;{&#13;&#10;function anonymous()&#13;&#10;{&#13;&#10;function onload(event) {&#13;&#10;&#13;&#10;    function anonymous() {&#13;&#10;&#13;&#10;        function anonymous() {&#13;&#10;&#13;&#10;            function anonymous() {&#13;&#10;&#13;&#10;                function anonymous() {&#13;&#10;&#13;&#10;                    function anonymous() {&#13;&#10;&#13;&#10;                        function anonymous() {&#13;&#10;&#13;&#10;                            function anonymous() {&#13;&#10;&#13;&#10;                                function anonymous() {&#13;&#10;&#13;&#10;                                    function anonymous() {&#13;&#10;&#13;&#10;                                        function anonymous() {&#13;&#10;&#13;&#10;                                            function anonymous() {&#13;&#10;                                                img_auto_size(this, 450, true);&#13;&#10;                                            }&#13;&#10;&#13;&#10;                                        }&#13;&#10;&#13;&#10;                                    }&#13;&#10;&#13;&#10;                                }&#13;&#10;&#13;&#10;                            }&#13;&#10;&#13;&#10;                        }&#13;&#10;&#13;&#10;                    }&#13;&#10;&#13;&#10;                }&#13;&#10;&#13;&#10;            }&#13;&#10;&#13;&#10;        }&#13;&#10;&#13;&#10;    }&#13;&#10;&#13;&#10;}&#13;&#10;}&#13;&#10;}" align="bottom" twffan="done" /></p>
<p>最后配置Tomcat的环境变量：在&#8220;我的电脑&#8221;上点右键—&gt;&#8220;属性&#8221;—&gt;&#8220;高级&#8221;—&gt; &#8220;环境变量(N)&#8221;。<br />
新建系统变量CATALINA_HOME：D:\jakarta-tomcat-5.0.30<br />
在系统变量CLASSPATH的值的<strong>后面</strong>加入：%CATALINA_HOME%\common\lib;<br />
在系统变量Path的值中"%JAVA_HOME%\bin;"的<strong>后面</strong>加入以下内容：%CATALINA_HOME%\bin;</p>
<p>到这里，Tomcat安装完毕。</p>
<p>相关链接：<br />
<a href="http://www.coreservlets.com/Apache-Tomcat-Tutorial/Tomcat-5.0and-4.0.html"><font color="#3300ff">Tomcat 4和Tomcat 5安装配置指南<br />
</font></a><a href="http://www.coreservlets.com/Apache-Tomcat-Tutorial/"><font color="#0000ff">Tomcat 5.5安装配置指南</font></a> </p>
<p>进行完一、二两步的设置以后，各系统变量的值如下：</p>
<p>JAVA_HOME:C:\Program Files\Java\jdk1.5.0_06<br />
CATALINA_HOME:D:\jakarta-tomcat-5.0.30<br />
CLASSPATH:.;%JAVA_HOME%\lib;%CATALINA_HOME%\common\lib;<br />
Path:%JAVA_HOME%\bin;%CATALINA_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem</p>
<p>三、安装Eclipse<br />
首先下载eclipse-SDK-3.1.2-win32.zip（eclipse-SDK-3.1.2-win32.zip下载地址为：<br />
<a href="http://www.eclipse.org/downloads/">http://www.eclipse.org/downloads/</a>）；<br />
然后将eclipse-SDK-3.1.2-win32.zip直接解压到D盘根目录：<br />
<img alt=" " src="http://esoft.bokee.com/inc/J2EE_04.jpg" onload="function anonymous()&#13;&#10;{&#13;&#10;function anonymous()&#13;&#10;{&#13;&#10;function onload(event) {&#13;&#10;&#13;&#10;    function anonymous() {&#13;&#10;&#13;&#10;        function anonymous() {&#13;&#10;&#13;&#10;            function anonymous() {&#13;&#10;&#13;&#10;                function anonymous() {&#13;&#10;&#13;&#10;                    function anonymous() {&#13;&#10;&#13;&#10;                        function anonymous() {&#13;&#10;&#13;&#10;                            function anonymous() {&#13;&#10;&#13;&#10;                                function anonymous() {&#13;&#10;&#13;&#10;                                    function anonymous() {&#13;&#10;&#13;&#10;                                        function anonymous() {&#13;&#10;&#13;&#10;                                            function anonymous() {&#13;&#10;                                                img_auto_size(this, 450, true);&#13;&#10;                                            }&#13;&#10;&#13;&#10;                                        }&#13;&#10;&#13;&#10;                                    }&#13;&#10;&#13;&#10;                                }&#13;&#10;&#13;&#10;                            }&#13;&#10;&#13;&#10;                        }&#13;&#10;&#13;&#10;                    }&#13;&#10;&#13;&#10;                }&#13;&#10;&#13;&#10;            }&#13;&#10;&#13;&#10;        }&#13;&#10;&#13;&#10;    }&#13;&#10;&#13;&#10;}&#13;&#10;}&#13;&#10;}" align="bottom" twffan="done" /> </p>
<p>到这里， Eclipse安装完毕。</p>
<p>四、安装MyEclipse<br />
首先下载EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe（EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe 的下载地址为：<br />
<a href="http://www.myeclipseide.com/ContentExpress-display-ceid-10.html"><span style="text-decoration: underline" twffan="done">http://www.myeclipseide.com/ContentExpress-display-ceid-10.html</span></a>）；<br />
然后安装EnterpriseWorkbenchInstaller_4.1.1GA_E3.1.exe。注意：当安装到下图所示的步骤的时候要选择Eclipse的安装路径（如图），其他选项保持默认。<br />
<img alt=" " src="http://esoft.bokee.com/inc/J2EE_05.jpg" onload="function anonymous()&#13;&#10;{&#13;&#10;function anonymous()&#13;&#10;{&#13;&#10;function onload(event) {&#13;&#10;&#13;&#10;    function anonymous() {&#13;&#10;&#13;&#10;        function anonymous() {&#13;&#10;&#13;&#10;            function anonymous() {&#13;&#10;&#13;&#10;                function anonymous() {&#13;&#10;&#13;&#10;                    function anonymous() {&#13;&#10;&#13;&#10;                        function anonymous() {&#13;&#10;&#13;&#10;                            function anonymous() {&#13;&#10;&#13;&#10;                                function anonymous() {&#13;&#10;&#13;&#10;                                    function anonymous() {&#13;&#10;&#13;&#10;                                        function anonymous() {&#13;&#10;&#13;&#10;                                            function anonymous() {&#13;&#10;                                                img_auto_size(this, 450, true);&#13;&#10;                                            }&#13;&#10;&#13;&#10;                                        }&#13;&#10;&#13;&#10;                                    }&#13;&#10;&#13;&#10;                                }&#13;&#10;&#13;&#10;                            }&#13;&#10;&#13;&#10;                        }&#13;&#10;&#13;&#10;                    }&#13;&#10;&#13;&#10;                }&#13;&#10;&#13;&#10;            }&#13;&#10;&#13;&#10;        }&#13;&#10;&#13;&#10;    }&#13;&#10;&#13;&#10;}&#13;&#10;}&#13;&#10;}" align="bottom" twffan="done" /></p>
<p>安装完毕之后，将MyEclipse安装目录下的features和plugins这2个目录覆盖到Eclipse的安装目录下。<br />
最后将刚才安装的 MyEclipse 卸载。<br />
解释一下上面这样做的原因： 因为MyEclipse是Eclipse的插件，所以只要把features和plugins这2个目录覆盖到Eclipse的安装目录，Eclipse就会自动认出这些插件。 <br />
到这里，MyEclipse安装完毕。</p>
<p>五、破解MyEclipse<br />
运行MyEclipse4.1.1注册机MyEclipseKeyGen.exe，选择MyEclipse的版本号，输入注册名，生成序列号。（MyEclipse4.x注册机的下载地址为：<br />
<a href="http://esoft.g8.com.cn/UploadFiles/2006-5/520753587.rar">http://esoft.g8.com.cn/UploadFiles/2006-5/520753587.rar</a>）<br />
运行eclipse.exe（首次运行要求指定Workspace），依次点击Window ----&gt; Preferences ----&gt;MyEclipse----&gt;Subscription ----&gt; Enter Subscription，输入注册名以及注册机生成的注册码。<br />
到这里，MyEclipse破解完毕。</p>
<p>六、指定Eclipse+MyEclipse的JRE 和Tomcat 服务器<br />
1.设定Eclipse+MyEclipse的JRE<br />
一般情况下，Eclipse可以自动找到JRE，我们不用进行过多的设置。<br />
2.设定Eclipse+MyEclipse的Tomcat 服务器<br />
只需设置图中所标注的两处即可，图中其余部分是自动生成的。<br />
<img alt=" " src="http://esoft.bokee.com/inc/J2EE_06.jpg" onload="function anonymous()&#13;&#10;{&#13;&#10;function anonymous()&#13;&#10;{&#13;&#10;function onload(event) {&#13;&#10;&#13;&#10;    function anonymous() {&#13;&#10;&#13;&#10;        function anonymous() {&#13;&#10;&#13;&#10;            function anonymous() {&#13;&#10;&#13;&#10;                function anonymous() {&#13;&#10;&#13;&#10;                    function anonymous() {&#13;&#10;&#13;&#10;                        function anonymous() {&#13;&#10;&#13;&#10;                            function anonymous() {&#13;&#10;&#13;&#10;                                function anonymous() {&#13;&#10;&#13;&#10;                                    function anonymous() {&#13;&#10;&#13;&#10;                                        function anonymous() {&#13;&#10;&#13;&#10;                                            function anonymous() {&#13;&#10;                                                img_auto_size(this, 450, true);&#13;&#10;                                            }&#13;&#10;&#13;&#10;                                        }&#13;&#10;&#13;&#10;                                    }&#13;&#10;&#13;&#10;                                }&#13;&#10;&#13;&#10;                            }&#13;&#10;&#13;&#10;                        }&#13;&#10;&#13;&#10;                    }&#13;&#10;&#13;&#10;                }&#13;&#10;&#13;&#10;            }&#13;&#10;&#13;&#10;        }&#13;&#10;&#13;&#10;    }&#13;&#10;&#13;&#10;}&#13;&#10;}&#13;&#10;}" align="bottom" twffan="done" /></p>
<p>到这里，我们的Eclipse+MyEclipse开发环境就搭建完毕了！</p>
<p>七、新建一个项目来测试一下Eclipse+MyEclipse开发环境是否搭建成功<br />
1.在Eclipse中依次点击&#8220; File ----&gt; New ----&gt; Project&#8221; , 在弹出的&#8220;New Project&#8221;对话框中依次点击&#8220;Web Project ----&gt;MyEclipse----&gt;J2EE Projects----&gt;Web Project&#8221;， 再点&#8220;Next&#8221;，在&#8220;Project Name&#8221;中输入项目的名字&#8220;test&#8221;,最后点&#8220;Finish&#8221;。<br />
2.在Eclipse左边Package Explorer列表中点击&#8220;test&#8221;，将项目test展开。右键点击 WebRoot ----&gt; New ----&gt; JSP , 新建一个名为hello.jsp的 JSP 页面 。 代码如下图（图中标注部分需要我们手动添加，其余部分是系统自动生成的）：</p>
<p><img alt=" " src="http://esoft.bokee.com/inc/J2EE_07.png" onload="function anonymous()&#13;&#10;{&#13;&#10;function anonymous()&#13;&#10;{&#13;&#10;function onload(event) {&#13;&#10;&#13;&#10;    function anonymous() {&#13;&#10;&#13;&#10;        function anonymous() {&#13;&#10;&#13;&#10;            function anonymous() {&#13;&#10;&#13;&#10;                function anonymous() {&#13;&#10;&#13;&#10;                    function anonymous() {&#13;&#10;&#13;&#10;                        function anonymous() {&#13;&#10;&#13;&#10;                            function anonymous() {&#13;&#10;&#13;&#10;                                function anonymous() {&#13;&#10;&#13;&#10;                                    function anonymous() {&#13;&#10;&#13;&#10;                                        function anonymous() {&#13;&#10;&#13;&#10;                                            function anonymous() {&#13;&#10;                                                img_auto_size(this, 450, true);&#13;&#10;                                            }&#13;&#10;&#13;&#10;                                        }&#13;&#10;&#13;&#10;                                    }&#13;&#10;&#13;&#10;                                }&#13;&#10;&#13;&#10;                            }&#13;&#10;&#13;&#10;                        }&#13;&#10;&#13;&#10;                    }&#13;&#10;&#13;&#10;                }&#13;&#10;&#13;&#10;            }&#13;&#10;&#13;&#10;        }&#13;&#10;&#13;&#10;    }&#13;&#10;&#13;&#10;}&#13;&#10;}&#13;&#10;}" align="bottom" twffan="done" /><br />
<br />
3. 再用同样的方法， 新建一个叫 hello_result.jsp 的JSP文件， 代码如下图：<br />
<img alt=" " src="http://esoft.bokee.com/inc/J2EE_08.png" onload="function anonymous()&#13;&#10;{&#13;&#10;function anonymous()&#13;&#10;{&#13;&#10;function onload(event) {&#13;&#10;&#13;&#10;    function anonymous() {&#13;&#10;&#13;&#10;        function anonymous() {&#13;&#10;&#13;&#10;            function anonymous() {&#13;&#10;&#13;&#10;                function anonymous() {&#13;&#10;&#13;&#10;                    function anonymous() {&#13;&#10;&#13;&#10;                        function anonymous() {&#13;&#10;&#13;&#10;                            function anonymous() {&#13;&#10;&#13;&#10;                                function anonymous() {&#13;&#10;&#13;&#10;                                   function anonymous() {&#13;&#10;&#13;&#10;                                        function anonymous() {&#13;&#10;&#13;&#10;                                            function anonymous() {&#13;&#10;                                                img_auto_size(this, 450, true);&#13;&#10;                                            }&#13;&#10;&#13;&#10;                                        }&#13;&#10;&#13;&#10;                                    }&#13;&#10;&#13;&#10;                                }&#13;&#10;&#13;&#10;                            }&#13;&#10;&#13;&#10;                        }&#13;&#10;&#13;&#10;                    }&#13;&#10;&#13;&#10;                }&#13;&#10;&#13;&#10;            }&#13;&#10;&#13;&#10;        }&#13;&#10;&#13;&#10;    }&#13;&#10;&#13;&#10;}&#13;&#10;}&#13;&#10;}" align="bottom" twffan="done" /></p>
<p>4. deploy（部署）项目。 <br />
点击 deploy 按钮（用红线画了的按钮就是 deploy 按钮）， 在弹出的窗口中点击Add， 部署test项目（如图所示）。<br />
<img alt=" " src="http://esoft.bokee.com/inc/J2EE_09.jpg" onload="function anonymous()&#13;&#10;{&#13;&#10;function anonymous()&#13;&#10;{&#13;&#10;function onload(event) {&#13;&#10;&#13;&#10;    function anonymous() {&#13;&#10;&#13;&#10;        function anonymous() {&#13;&#10;&#13;&#10;            function anonymous() {&#13;&#10;&#13;&#10;                function anonymous() {&#13;&#10;&#13;&#10;                    function anonymous() {&#13;&#10;&#13;&#10;                        function anonymous() {&#13;&#10;&#13;&#10;                            function anonymous() {&#13;&#10;&#13;&#10;                                function anonymous() {&#13;&#10;&#13;&#10;                                    function anonymous() {&#13;&#10;&#13;&#10;                                        function anonymous() {&#13;&#10;&#13;&#10;                                            function anonymous() {&#13;&#10;                                                img_auto_size(this, 450, true);&#13;&#10;                                            }&#13;&#10;&#13;&#10;                                        }&#13;&#10;&#13;&#10;                                    }&#13;&#10;&#13;&#10;                                }&#13;&#10;&#13;&#10;                            }&#13;&#10;&#13;&#10;                        }&#13;&#10;&#13;&#10;                    }&#13;&#10;&#13;&#10;                }&#13;&#10;&#13;&#10;            }&#13;&#10;&#13;&#10;        }&#13;&#10;&#13;&#10;    }&#13;&#10;&#13;&#10;}&#13;&#10;}&#13;&#10;}" align="bottom" twffan="done" /></p>
<p>5. 启动Tomcat服务器。<br />
如下图所示（用红线画了的按钮就是 启动Tomcat 的按钮）：</p>
<p><img alt=" " src="http://esoft.bokee.com/inc/J2EE_10.jpg" onload="function anonymous()&#13;&#10;{&#13;&#10;function anonymous()&#13;&#10;{&#13;&#10;function onload(event) {&#13;&#10;&#13;&#10;    function anonymous() {&#13;&#10;&#13;&#10;        function anonymous() {&#13;&#10;&#13;&#10;            function anonymous() {&#13;&#10;&#13;&#10;                function anonymous() {&#13;&#10;&#13;&#10;                    function anonymous() {&#13;&#10;&#13;&#10;                        function anonymous() {&#13;&#10;&#13;&#10;                            function anonymous() {&#13;&#10;&#13;&#10;                                function anonymous() {&#13;&#10;&#13;&#10;                                    function anonymous() {&#13;&#10;&#13;&#10;                                        function anonymous() {&#13;&#10;&#13;&#10;                                            function anonymous() {&#13;&#10;                                                img_auto_size(this, 450, true);&#13;&#10;                                            }&#13;&#10;&#13;&#10;                                        }&#13;&#10;&#13;&#10;                                    }&#13;&#10;&#13;&#10;                                }&#13;&#10;&#13;&#10;                            }&#13;&#10;&#13;&#10;                        }&#13;&#10;&#13;&#10;                    }&#13;&#10;&#13;&#10;                }&#13;&#10;&#13;&#10;            }&#13;&#10;&#13;&#10;        }&#13;&#10;&#13;&#10;    }&#13;&#10;&#13;&#10;}&#13;&#10;}&#13;&#10;}" align="bottom" twffan="done" /></p>
<p>Tomcat 启动输出信息如下图：<br />
<img alt=" " src="http://esoft.bokee.com/inc/J2EE_11.jpg" onload="function anonymous()&#13;&#10;{&#13;&#10;function anonymous()&#13;&#10;{&#13;&#10;function onload(event) {&#13;&#10;&#13;&#10;    function anonymous() {&#13;&#10;&#13;&#10;        function anonymous() {&#13;&#10;&#13;&#10;            function anonymous() {&#13;&#10;&#13;&#10;                function anonymous() {&#13;&#10;&#13;&#10;                    function anonymous() {&#13;&#10;&#13;&#10;                        function anonymous() {&#13;&#10;&#13;&#10;                            function anonymous() {&#13;&#10;&#13;&#10;                                function anonymous() {&#13;&#10;&#13;&#10;                                    function anonymous() {&#13;&#10;&#13;&#10;                                        function anonymous() {&#13;&#10;&#13;&#10;                                            function anonymous() {&#13;&#10;                                                img_auto_size(this, 450, true);&#13;&#10;                                            }&#13;&#10;&#13;&#10;                                        }&#13;&#10;&#13;&#10;                                    }&#13;&#10;&#13;&#10;                                }&#13;&#10;&#13;&#10;                            }&#13;&#10;&#13;&#10;                        }&#13;&#10;&#13;&#10;                    }&#13;&#10;&#13;&#10;                }&#13;&#10;&#13;&#10;            }&#13;&#10;&#13;&#10;        }&#13;&#10;&#13;&#10;    }&#13;&#10;&#13;&#10;}&#13;&#10;}&#13;&#10;}" align="bottom" twffan="done" /></p>
<p>6.项目test的运行结果：<br />
<img alt=" " src="http://esoft.bokee.com/inc/J2EE_12.jpg" onload="function anonymous()&#13;&#10;{&#13;&#10;function anonymous()&#13;&#10;{&#13;&#10;function onload(event) {&#13;&#10;&#13;&#10;    function anonymous() {&#13;&#10;&#13;&#10;        function anonymous() {&#13;&#10;&#13;&#10;            function anonymous() {&#13;&#10;&#13;&#10;                function anonymous() {&#13;&#10;&#13;&#10;                    function anonymous() {&#13;&#10;&#13;&#10;                        function anonymous() {&#13;&#10;&#13;&#10;                            function anonymous() {&#13;&#10;&#13;&#10;                                function anonymous() {&#13;&#10;&#13;&#10;                                    function anonymous() {&#13;&#10;&#13;&#10;                                        function anonymous() {&#13;&#10;&#13;&#10;                                            function anonymous() {&#13;&#10;                                                img_auto_size(this, 450, true);&#13;&#10;                                            }&#13;&#10;&#13;&#10;                                        }&#13;&#10;&#13;&#10;                                    }&#13;&#10;&#13;&#10;                                }&#13;&#10;&#13;&#10;                            }&#13;&#10;&#13;&#10;                        }&#13;&#10;&#13;&#10;                    }&#13;&#10;&#13;&#10;                }&#13;&#10;&#13;&#10;            }&#13;&#10;&#13;&#10;        }&#13;&#10;&#13;&#10;    }&#13;&#10;&#13;&#10;}&#13;&#10;}&#13;&#10;}" align="bottom" twffan="done" /> </p>
<p>我们可以去Eclipse的Workspace目录下看看test项目的代码，也可以去Tomcat的webapps目录下，看看部署之后的 test项目的结构。<br />
</p>
<img src ="http://www.blogjava.net/xinwuhen/aggbug/211769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xinwuhen/" target="_blank">心无痕</a> 2008-06-30 22:26 <a href="http://www.blogjava.net/xinwuhen/archive/2008/06/30/211769.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目管理方法论</title><link>http://www.blogjava.net/xinwuhen/archive/2008/06/28/211293.html</link><dc:creator>心无痕</dc:creator><author>心无痕</author><pubDate>Sat, 28 Jun 2008 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/xinwuhen/archive/2008/06/28/211293.html</guid><wfw:comment>http://www.blogjava.net/xinwuhen/comments/211293.html</wfw:comment><comments>http://www.blogjava.net/xinwuhen/archive/2008/06/28/211293.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xinwuhen/comments/commentRss/211293.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xinwuhen/services/trackbacks/211293.html</trackback:ping><description><![CDATA[<p style="text-justify: inter-ideograph; margin: 0cm 0cm 0pt; text-indent: 21pt; line-height: 150%; text-align: justify"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">企业项目管理体系建设的核心是建立企业的项目管理方法，目前,大部分组织缺乏系统的、统一的项目管理方法。在我们咨询的几家公司中，我们常常会听到这样的质疑声：一套方法怎么可以管所有的项目吗？特别是IT项目，技术过程都不统一，如何用一套方法来管所有的项目，由此我们也看到很多朴素的管理方法在各个项目组织中自由成长，但在一个企业内，项目间的联系是不可避免的，相互间的协作、配合由于缺少系统的管理方法，往往顾此失彼，矛盾此起彼伏，项目经理和公司领导成为消防队员，责权不明，协调不畅, 常常陷于项目经理无法，公司管理层无奈，项目成员无所适从的状态，给项目成功实施带来了潜在的风险。是什么原因导致这样的问题呢，是否有可行的办法来解决这个问题呢？</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 0pt; text-indent: 21pt; line-height: 150%; text-align: justify"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">一个完善的项目管理体系建设是与企业本身的行业背景、业务领域是分不开的，出现上面的问题的根本原因就在于项目管理和业务流程的交叉，导致项目管理过程复杂化，不可控，这也就是为什么大家说一套方法不可以适用所有的项目的根本原因。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 0pt; text-indent: 21pt; line-height: 150%; text-align: justify"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">企业的项目运作包括业务流程、项目管理、技术工作三个方面，业务流程是如何运作业务，是由企业的行业特点、业务背景所决定，项目管理是如何管理项目，而技术工作则是实现项目目标所需要的技术手段。对于一个企业而言，建立企业的项目管理方法论就需要依照企业的业务流程、技术手段来设计相应的管理方法。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 0pt; text-indent: 21pt; line-height: 150%; text-align: justify"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">项目管理方法是一个结构化的方法，</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">是可以在大部分项目中应用的方法，具体实践过程中，项目管理方法需要针对行业特点，建立适合行业特色的项目管理体系。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 0pt; text-indent: 21pt; line-height: 150%; text-align: justify"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">依照项目管理理论，项目管理过程按阶段划分为启动、计划、实施、收尾，对于任何一个项目我们都可以依此进行阶段的划分，这是项目的共性，而对于项目中的个性就是项目的业务和技术层面，对于具体的企业，项目阶段划分就需要由业务流程和技术方法决定，在实施过程中，针对具体的项目进行客户化，项目管理方法论的核心就是综合所有项目的特点，建立一套包括技术、工具、管理技巧在内的一站式服务的指南和模板。这种将项目管理方法和业务流程相互配合，并在实践中进行优化的管理方法，就是项目管理方法论。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 0pt; line-height: 150%; text-align: justify"><font face="Times New Roman" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">项目管理体方法论的重要表现形式是项目管理手册，这是组织规范项目标准管理过程的重要手段，通</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">过正确的决策、高效的流程、标准的操作、可控的过程，确保项目的有效实施。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: 150%; text-align: justify"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">企业项目管理手册编制的基本方法可分为三个层面，一是项目管理理论知识体系，目前世界范围内比较通用的主流项目管理知识体系，包括美国项目管理协会（</span><span style="font-size: 12pt; line-height: 150%"><font face="Times New Roman">PMI</font></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">）推出的《项目管理知识体系指南</span><span style="font-size: 12pt; line-height: 150%"><font face="Times New Roman">PMBOK</font></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">》，英国商务部开发的项目管理方法《</span><span style="font-size: 12pt; line-height: 150%"><font face="Times New Roman">PRINCE2</font></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">成功的项目管理》可作为理论支撑。二是在管理方法上跨国企业实施项目的管理方法，中国著名企业的项目管理经验可作为最佳实践基础，在此基础上则是对企业本身项目管理实践经验的总结。从三个层面对企业的项目管理过程进行梳理、定义、借鉴，即可固化出企业本身的项目管理方法。</span></p>
<p style="text-justify: inter-ideograph; margin: 0cm 0cm 0pt; text-indent: 24pt; line-height: 150%; text-align: justify"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">具体到项目管理手册内容就是描述项目输入转变为输出的过程。通过项目阶段过程的定义，将项目管理过程、项目实施支撑、项目监控方法及项目作业指导，系统化地与项目管理理论及产品要求融入到具体的操作实践过程中。具体包括以下主要内容：</span><span style="font-size: 12pt; line-height: 150%"><font face="Times New Roman"> <br />
</font></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">　　</span><span style="font-size: 12pt; line-height: 150%"><font face="Times New Roman">1.&nbsp;</font></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">项目过程控制阶段划分：通常需要考虑两类过程，一是按照项目的管理过程，对项目过程进行阶段划分；另外是按照项目的技术过程，将项目过程进行阶段划分。企业的业务流程，主要关注项目的管理阶段划分，而项目经理执行和管理项目时，必须将项目的管理阶段和项目的技术阶段划分结合起来，进行项目管理。</span><span style="font-size: 12pt; line-height: 150%"><br />
</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">　　</span><span style="font-size: 12pt; line-height: 150%"><font face="Times New Roman">2.&nbsp;</font></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">阶段输入和输出：包括数据和信息、计划和报告、风险及可以交付的成果等；</span><span style="font-size: 12pt; line-height: 150%"><font face="Times New Roman"> <br />
</font></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">　　</span><span style="font-size: 12pt; line-height: 150%"><font face="Times New Roman">3.&nbsp;</font></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">过程控制：包括工作流程，工作方法、操作规则和作业指导；</span><span style="font-size: 12pt; line-height: 150%"><font face="Times New Roman"> <br />
</font></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">　　</span><span style="font-size: 12pt; line-height: 150%"><font face="Times New Roman">4.&nbsp;</font></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">角色职责：在实践中，项目管理职责，不能简单归于项目经理一个人，而是由一组角色共同完成，包括职能部门和角色对项目阶段和实施步骤的贡献。</span><span style="font-size: 12pt; line-height: 150%"><br />
</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体">　　依照项目管理方法论编制的项目管理手册，将项目实施过程中的项目管理方法与企业的业务流程、技术方法有机地集成起来，从而建立以项目管理为核心的业务流程。</span></p>
<img src ="http://www.blogjava.net/xinwuhen/aggbug/211293.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xinwuhen/" target="_blank">心无痕</a> 2008-06-28 11:26 <a href="http://www.blogjava.net/xinwuhen/archive/2008/06/28/211293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目管理的三角难题与解法</title><link>http://www.blogjava.net/xinwuhen/archive/2008/06/26/210922.html</link><dc:creator>心无痕</dc:creator><author>心无痕</author><pubDate>Thu, 26 Jun 2008 11:09:00 GMT</pubDate><guid>http://www.blogjava.net/xinwuhen/archive/2008/06/26/210922.html</guid><wfw:comment>http://www.blogjava.net/xinwuhen/comments/210922.html</wfw:comment><comments>http://www.blogjava.net/xinwuhen/archive/2008/06/26/210922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xinwuhen/comments/commentRss/210922.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xinwuhen/services/trackbacks/210922.html</trackback:ping><description><![CDATA[项目管理的三角难题与解法&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;要马儿好，又要马儿不吃草&#8221;这句话不知是谁&#8220;发明&#8221;的；发明这句话的人，想来是项目管理的高手。为什么？因为项目管理的精义，就是&#8220;又要马儿好，又要马儿不吃草。&#8221;&nbsp;一个成功的项目，通常有三个要素：</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>时间的要素──完成的时间要&#8220;快&#8221;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 成本的要素──完成的成本要&#8220;便宜&#8221;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 效果的要素──完成后的表现要&#8220;好&#8221;</strong></p>
<strong></strong>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这三个彼此互斥的要素，就像一个等边三角形的三边一样，缺了一边，或任何一边比其它两面边短，我们就不能再称这个三角形为等边三角形了。在我的经验中，如果在这三个要素中袛要做到一项的话，这种专案好做，百分之八、九十以上的项目经理大概都可以胜任愉快。如果在三个要素中要做到两项，就不是一般的项目经理能胜任的了。在比率上，我认为能把以上三个要素中的任何两项做到的项目经理，大概不会超过百分之五十。真正能够把项目中三个主要需求都能做到的高手，在一百位项目经理中，最多不到十个。 有人听我这么说也许会不服气，认为我在这里危言耸听，乱吓唬人。他们不了解我的本意。我的本意祗有两点：</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一、项目成功的要素，彼此之间是鱼与熊掌的关系。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二、要兼顾的难度，是照几何级数上升而不是按算术级数上升。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样一个三角难题，要我们怎么去解呢？我如果是个项目经理，一定要问：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。什么是&#8220;好&#8221;？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。什么是&#8220;快&#8221;？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。什么是&#8220;便宜&#8221;？</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;好&#8221;字咱们中国人用来真是千变万化，神奇不已。有时用来作副词，像说：这颜色&#8220;好&#8221;漂亮。有时用来做动词；说那个家伙很&#8220;好&#8221;色，可不是什么恭维之词。&#8220;好&#8221;字用到恰处，又变成了另外意思的代名词了。别人问：&#8220;这个女孩子怎么样？&#8221;你说：&#8220;她很好&#8221;，言下之意，就是不很漂亮。别人问：&#8220;这个人怎么样？&#8221;，你回答：&#8220;他很好&#8221;，言下之意，就是他不太能干。同时，某一个人认为好的，另外一个并不认为好，这是我们日常生活中常遭遇到的问题。&nbsp;在项目管理中，好就是好，不好就是不好，这没有什么主观或客观的差异，也没有什么明示或暗示的问题存在。要谈到项目管理中&#8220;好&#8221;的定义，第一个条件就是要看它是不是有用。&#8220;有用&#8221;和&#8220;能用&#8221;是两回事。很多&#8220;能用的&#8221;东西不一定&#8220;有用&#8221;，这牵涉到客观价值的问题。有一天，我在台北的街上看到一个年轻人开了一部德国制的跑车，车尾上还有一块压风板的那型。我心想，在台北这种交通堵塞、寸步难行的情况下，开这种跑车真是龙游浅水，英雄无用武之地。这部跑车算不算是部好车呢？当然算。但在台北街头这种客观环境之下，它还算不算是部好车？当然不算。 我从前有一只瑞士制的名表，是属于那种很贵，很多仿制品那型。因为要动，它才会上炼，不动它，隔一阵就停了。我后来不胜其烦，换了一个日本制的石英表，价钱祗有那只瑞士表的几十分之一，不但不用上炼，并且有两个时间，能让我不用花脑筋就可以同时知道台湾和美国加州的时间。早上六点它会把我闹醒，打球、洗澡也懒得把它脱掉，并且是夜明的。你说这两个表那个比较好？我可以很坦白地告诉你，因为后者比较有用，后者比较好。因此，在项目管理上，关于&#8220;好&#8221;的定义，是&#8220;有用&#8221;而非&#8220;能用&#8221;。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8220;好&#8221;的第二个条件，要看它是不是能达到原先要达到的目的。如果说目的是代步，汽车比脚踏车好；如果说目的是运动，脚踏车却比汽车好。在日常生活中，有人叫你去买苹果，结果你买了橘子回来。苹果和橘子虽然不是一样，但也许还勉强可以混过去。在项目管理上，如果要的是苹果，交货的时候却变成了橘子，这就不能算是一个成功的项目。为了避免这种错误，项目经理必须在项目设计时把项目结果的规格先弄清楚。口说无凭，要的东西都要写下来。交货的时候，如果我交给你的是规格上写明的东西，那我就算给你一个&#8220;好&#8221;东西。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不管项目的成果是什么，也许是一套软件系统，或一部新的机器，或一条新修的铁路。。。。凡是好的东西，一定是容易用的东西。当录像机刚出来旳时候，懂得怎么用它去录电视节目，真是一门大学问。在我的朋友中，大多数人都不会用，尤其是太太们，十有九人不会用它。不会用、不敢用之人中，很多还都拥有博士学位哩。为什么？因为它设计得太复杂，太不容易用了。后来有两个中国工程师，想出一个办法，请每个电视台把每个节目都用一个不同的数字来代替，到时候任何人祗要把他想录节目的代号输进录像控制器中，节目时间一到，录像开始，这样一来，人人会用录像机。从项目管理&#8220;好&#8221;的定义来看，简单、好用的东西，就是&#8220;好&#8221;的东西。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个项目的产品，除了有用和好用之外，还要具有可塑性和可扩展的弹性。前者表示它的功能，在必要时可以加以改变。后者表示在时间上，它不但可以持久并能扩展。美国的超级公路，是艾森豪主政时的德政，在设计上，考虑到必要时可供喷射战斗机起落。扩充性比可塑性更重要。如果说一套计算机实用软件的设计，在开发完成上线不久，就不能满足公司业务上的新需要的话，设计这套系统的项目还够格称为一个好项目吗？当然，未来的需要也许不是目前能预料的，为了不可预测的将来而牺牲了现在的需要当然不对，但无论如何，一个好的项目，它所设计的产品必须具有容易修改，可以扩充，并且不会马上就失效的弹性。缺乏有这种弹性的产品，就不是一个好的产品。一个生产没有弹性产品的项目，就不能算是一个好的项目。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是一般所谓好的项目，究竟指的是什么呢？换句话说，怎么知道这个项目是成功的项目或失败的项目呢？你祗要问：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项目的结果能否使公司的收入增加？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项目的结果能否使公司的支出减少？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项目的结果能否使公司的服务加强？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 能达到这三个目的，就是好的项目。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接着，让我们来谈谈什么是&#8220;快&#8221;？在我们日常的生活中，&#8220;快&#8221;和&#8220;好&#8221;一样，往往是主观的而非客观的。有时它又是凭感觉而非凭理性的。小时候写作文，常喜欢用&#8220;光阴似箭&#8221;来破题。遇到做自己不喜欢做的事情，老喜欢用&#8220;度日如年&#8221;来形容。在项目管理上，时间是绝对的，而非凭感觉的──能在半年内完工，就是比在九个月内完工要快三个月。但这个项目能在半年内完工就算快吗？谁说的？我们搞项目管理的人常讲一个笑话：&#8220;如果你问你的老板他希望什么时候要这个项目完工，他一定会回答说：昨天。&#8221;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此，项目经理最容易犯的一个错误，就是在完工日期的预测上，为了讨好上司的要求而尽量乐观。同时，老是用历史的数据或别人的经验来影响自己的预测，殊不知每个项目的客观条件和外在环境都不一样。项目经理在作完工预测时，千万要记得一个教训：你的老板或客户不会记得你告诉他多快可以完工，因为再快他们都会嫌慢，但如果你告诉他们该完工的时候完不了工，那你的麻烦可大了。所以在预估时，胆子放小点，时间放长些。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;还有一点更重要：老板们当然不喜欢听坏消息，但更不喜欢听出人意外的坏消息，因此当完工的预测如果出问题的时候，绝不能隐瞒，硬着头皮也要让老板知道。&nbsp; 要达到预期完工的要求，项目经理一定要懂得怎么把一个规模大、时间长的项目，分成不同的阶段来完成。在每个阶段中，又要根据每阶段不同的重点分别来作完工预测。工程分得越细，预测的准确性就越高。这道理很普通，但做起来却很困难，因为需要很周详的计划和分析。计划和分析要花脑筋，可不是每个人都能做到的。说了半天，快字诀祗有一点，如果一切按照计划，这就合乎快的原则，否则就是不快。该完工时完工就是快，否则就是慢。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 至于什么是&#8220;便宜&#8221;？我以为省钱不是项目管理中最重要的目的。一个项目该花多少钱，是应该早就算出来的。一般来说，如果实际的花费和预估的花费差别在三○％左右，应该是能接受的范围；超过百分之三十，表示预算做得不彻底。 在项目管理里，最难预估的不是完工的时间，而是项目的预算。项目经理在这方面遭受的压力，比什么都大，因此，在做预算的时候，必须面对现实，既不能故意灌水，也不能故意过份乐观。 一个聪明的主管，要重视的是产品的价值，而非只是重视价钱。不懂得在价值上动脑筋，祗懂得在价钱上打算盘的项目经理，前途不乐观。但是价值有两种：有形的价值和无形的价值。在项目管理中，强调无形价值是致命伤。坦白地说，如果一个项目没有有形价值当后台，其存在的价值就很有限。在我刚才提到那三个项目的目的中，增加收入和减少支出属于有形价值，增强服务属于无形价值。有形价值高的项目，就是&#8220;便宜&#8221;的项目。否则，就是不便宜的项目。</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项目经理了解项目管理三角关系的定义之后，至少对项目追求的目标不会太迷糊。但这不能担保从此就天下太平。任何项目经理都想把他的项目管得又快、又好、又便宜，但事实上，不是每个项目都能达到这个境界，有时候，也并非一定要达到这个境界不可。 一位有经验的项目经理，一定要懂得怎么做&#8220;取舍分析&#8221;(Trade-offAnalysis)；换言之，懂得&#8220;弃车保帅&#8221;的重要性。如果我们用我提到过的&#8220;快、好、便宜&#8221;来作标准，有的时候三者可以祗取其一，或者祗取其二，这就是我们所谓的&#8220;取舍分析&#8221;。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;现在，让我举几个例子来说明一下，我在这方面的看法：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 一般来说，凡是属于研究发展的项目，尤其是有关药品方面的研究发展，钱和时间都很有弹性，但对项目产品的品质却没有任何弹性。换句话说，快、好、便宜的这个三角形，&#8220;好&#8221;的那边比什么都重要。反过来说，一般重工业机械或房屋建筑等有关项目，&#8220;快&#8221;却是最重要的因素，因为祗有在项目结束交货后，才能收款来继续以后的项目。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 再看有关制造环保控制机器的发展项目，由于它的订价和效果已经按法律的规定而不能再有太多弹性，但在交货的时间上，快不快并不是那么重要。相反地，所有的咨询项目，在时间和价钱上没什么弹性，但在成品的品质方面，好不好就大有融通的余地。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 有些项目是没有什么&#8220;弃车保帅&#8221;那套的。一九六○年代初期，美国受苏联发射史泼尼克号人造卫星的刺激，甘乃迪总统下命令要在一九六○年代结束前把人送上月球，并安全地带回来。这个庞大的专案，在时间上要快，必须赶在苏联之前完成；要好，绝不能出现任何差错；并且在预算上有限制，因为预算来自老百姓交的税，经国会通过才行。结果，美国果真抢先把人类送上月球，并平安地带回来。在历史上可以和这个项目媲美的，大概祗有造原子弹的曼哈顿项目了。<br />
&nbsp;&nbsp;</p>
<p>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 我提到&#8220;弃车保帅&#8221;的观念，并不是要国内的项目经理们放弃理想，不追求项目三角关系的完美。我祗是强调一点：当这个三角难题无解的时候，要懂得顾全大局，两害相权取其轻。很多时候，由于外在和内在的压力，&#8220;取舍分析&#8221;是免不了的。要做好取舍分析，项目经理至少要懂得六件事：</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一，要很清楚地了解项目冲突的基本原因。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二，重新确认项目的目的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第三，了解项目现处的环境及目前状况。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第四，寻求可行的其它方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第五，选择最佳的其它方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第六，重新策划项目计画。<br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项目的目的，不外乎增加公司收入、节省公司支出和提升公司服务水准三者。项目的成功与否，取决于项目完成是否又快又好又便宜。这个三角关系虽然难解，但并非无解。运用之妙，存乎一心。我在此文中谈到的一些技巧，有点像野人献曝，希望有些参考价值。</p>
<img src ="http://www.blogjava.net/xinwuhen/aggbug/210922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xinwuhen/" target="_blank">心无痕</a> 2008-06-26 19:09 <a href="http://www.blogjava.net/xinwuhen/archive/2008/06/26/210922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正确的方法来写出质量好的软件的75条体会</title><link>http://www.blogjava.net/xinwuhen/archive/2008/06/26/210912.html</link><dc:creator>心无痕</dc:creator><author>心无痕</author><pubDate>Thu, 26 Jun 2008 09:59:00 GMT</pubDate><guid>http://www.blogjava.net/xinwuhen/archive/2008/06/26/210912.html</guid><wfw:comment>http://www.blogjava.net/xinwuhen/comments/210912.html</wfw:comment><comments>http://www.blogjava.net/xinwuhen/archive/2008/06/26/210912.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xinwuhen/comments/commentRss/210912.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xinwuhen/services/trackbacks/210912.html</trackback:ping><description><![CDATA[2006.05.28&nbsp;&nbsp;&nbsp;&nbsp;郁也风<br />
<br />
<br />
<br />
MVM曾经发了篇题为《如何用正确的方法来写出质量好的软件的75条体会》的blog，后来他又给出了相应的回答：《七十五条》的解释 。而我亦给出了我自己的答案，有些不错，有些差强人意，有些则非常不足了。为便于比较，我的答案附在了MVM答案的后面。<br />
<br />
<br />
<br />
1. 你们的项目组使用源代码管理工具了么？<br />
MVM : 应该用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的选择是VSS。<br />
郁也风 : 公司使用的是VSS，在网上与朋友玩的就是CVS了。 <br />
<br />
<br />
<br />
2. 你们的项目组使用缺陷管理系统了么？<br />
MVM : 应该用。ClearQuest太复杂，我的推荐是BugZilla。<br />
郁也风 : 嫌BugZilla安装太费事，界面太简陋，我选择的是Jira的破解版。<br />
<br />
<br />
<br />
3. 你们的测试组还在用Word写测试用例么？<br />
MVM : 不要用Word写测试用例（Test Case）。应该用一个专门的系统，可以是Test Manager，也可以是自己开发一个ASP.NET的小网站。主要目的是Track和Browse。<br />
郁也风 : 用Word，而且测试工作很是不上台面（中国软件的通病，所以我们公司也没少得了犯）。<br />
<br />
<br />
<br />
4. 你们的项目组有没有建立一个门户网站？<br />
MVM : 要有一个门户网站，用来放Contact Info、Baselined Schedule、News等等。推荐Sharepoint Portal Server 2003来实现，15分钟就搞定。买不起SPS 2003可以用WSS (Windows Sharepoint Service)。<br />
郁也风 : 没有，不过看你这么介绍，回头试试去。<br />
<br />
<br />
<br />
5. 你们的项目组用了你能买到最好的工具么？<br />
MVM : 应该用尽量好的工具来工作。比如，应该用VS.NET而不是Notepad来写C#。用Notepad写程序多半只是一种炫耀。但也要考虑到经费，所以说是&#8220;你能买到最好的&#8221;。<br />
郁也风 : 我一向认为所谓的Notepad开发是自虐狂的不良嗜好。我们使用Eclipse，不要钱的，但我认为是java开发最好的工具了。<br />
<br />
<br />
<br />
6. 你们的程序员工作在安静的环境里么？<br />
MVM : 需要安静环境。这点极端重要，而且要保证每个人的空间大于一定面积。<br />
郁也风 : 看来这位兄台是看过人件了，可惜我们公司的办公环境只能说是一般，极为一般。<br />
<br />
<br />
<br />
7. 你们的员工每个人都有一部电话么？<br />
MVM : 需要每人一部电话。而且电话最好是带留言功能的。当然，上这么一套带留言电话系统开销不小。不过至少每人一部电话要有，千万别搞得经常有人站起来喊：&#8220;某某某电话&#8221;。《人件》里面就强烈谴责这种做法。<br />
郁也风 : 你果然看了人件了，但请认清形式吧，那是美国，这是中国，&#8220;中国国情&#8221;四个字会噎死你的，现在的实际情况是很多公司都不让用QQ，MSN（肯定包括我们公司了）。<br />
<br />
<br />
<br />
8. 你们每个人都知道出了问题应该找谁么？<br />
MVM : 应该知道。任何一个Feature至少都应该有一个Owner，当然，Owner可以继续Dispatch给其他人。<br />
郁也风 : 我们知道去找谁，但这不代表就能解决问题。<br />
<br />
<br />
<br />
9. 你遇到过有人说&#8220;我以为&#8230;&#8221;么？<br />
MVM : 要消灭&#8220;我以为&#8221;。Never assume anything。<br />
郁也风 : 我也经常说&#8220;我认为&#8221;，尤其在我验证之前。当然，我会考虑改正。<br />
<br />
<br />
<br />
10. 你们的项目组中所有的人都坐在一起么？<br />
MVM : 需要。我反对Virtual Team，也反对Dev在美国、Test在中国这种开发方式。能坐在一起就最好坐在一起，好处多得不得了。<br />
郁也风 : 需要，很多问题不是面对面的话，还真无法解决，或是有时候面对面更能开拓思路，也能更好地交互。<br />
<br />
<br />
<br />
11. 你们的进度表是否反映最新开发进展情况？ <br />
MVM : 应该反映。但是，应该用Baseline的方法来管理进度表：维护一份稳定的Schedule，再维护一份最新更改。Baseline的方法也应该用于其它的Spec。Baseline是变更管理里面的一个重要手段。<br />
郁也风 : 这是我一直很头疼的问题，如何维护一个有效的进度表不亚于任何一个模块的开发啊。<br />
<br />
<br />
<br />
12. 你们的工作量是先由每个人自己估算的么？<br />
MVM : 应该让每个人自己估算。要从下而上估算工作量，而不是从上往下分派。除非有其他原因，比如政治任务工期固定等。<br />
郁也风 : 可惜我们的任务多是政治任务，工期固定的就像螺丝钉。<br />
<br />
<br />
<br />
13. 你们的开发人员从项目一开始就加班么？<br />
MVM : 不要这样。不要一开始就搞疲劳战。从项目一开始就加班，只能说明项目进度不合理。当然，一些对日软件外包必须天天加班，那属于剥削的范畴。<br />
郁也风 : 我们加班是很多是因为资源的到位晚导致的，无可奈何。谁都知道问题的所在，谁都找不到解决问题的方法。<br />
<br />
<br />
<br />
14. 你们的项目计划中Buffer Time是加在每个小任务后面的么？<br />
MVM : 不要。Buffer Time加在每个小任务后面，很容易轻易的就被消耗掉。Buffer Time要整段的加在一个Milestone或者checkpoint前面。<br />
郁也风 : 我们尽量这么做了。<br />
<br />
<br />
<br />
15. 值得再多花一些时间，从95%做到100%好<br />
MVM : 值得，非常值得。尤其当项目后期人困马乏的时候，要坚持。这会给产品带来质的区别。<br />
郁也风 : 我们多是在客户的逼迫下完成那最后的5%的。而且100%并不代表Over，而是另一个100%的开始，成就了一个完美的恶性循环。<br />
<br />
<br />
<br />
16. 登记新缺陷时，是否写清了重现步骤？<br />
MVM : 要。这属于Dev和Test之间的沟通手段。面对面沟通需要，详细填写Repro Steps也需要。<br />
郁也风 : 绝对要，理由同上。<br />
<br />
<br />
<br />
17. 写新代码前会把已知缺陷解决么？<br />
MVM : 要。每个人的缺陷不能超过10个或15个，否则必须先解决老的bug才能继续写新代码。<br />
郁也风 : 没别的说的，一定要。<br />
<br />
<br />
<br />
18. 你们对缺陷的轻重缓急有事先的约定么？<br />
MVM : 必须有定义。Severity要分1、2、3，约定好：蓝屏和Data Lost算Sev 1，Function Error算Sev 2，界面上的算Sev 3。但这种约定可以根据产品质量现状适当进行调整。<br />
郁也风 : 知道需要，但是做的相当不够，需要努力改进。<br />
<br />
<br />
<br />
19. 你们对意见不一的缺陷有三国会议么？<br />
MVM : 必须要有。要有一个明确的决策过程。这类似于CCB (Change Control Board)的概念。<br />
郁也风 : 要由最后拍板的。而且不能陷入争论的泥淖。<br />
<br />
<br />
<br />
20. 所有的缺陷都是由登记的人最后关闭的么？<br />
MVM : Bug应该由Opener关闭。Dev不能私自关闭Bug。<br />
郁也风 : 同意。<br />
<br />
<br />
<br />
21. 你们的程序员厌恶修改老的代码么？<br />
MVM : 厌恶是正常的。解决方法是组织Code Review，单独留出时间来。XP也是一个方法。<br />
郁也风 : Code Review？我们老板不喜欢。<br />
<br />
<br />
<br />
22. 你们项目组有Team Morale Activity么？<br />
MVM : 每个月都要搞一次，吃饭、唱歌、Outing、打球、开卡丁车等等，一定要有。不要剩这些钱。<br />
郁也风 : 这点绝对不会少的，至少我带过的团队的凝聚力还是不错的。<br />
<br />
<br />
<br />
23. 你们项目组有自己的Logo么？<br />
MVM : 要有自己的Logo。至少应该有自己的Codename。<br />
郁也风 : 没想过，今天头要搞个我们部门的文化衫，我强烈反对了。不过Logo可以考虑。<br />
<br />
<br />
<br />
24. 你们的员工有印有公司Logo的T-Shirt么？<br />
MVM : 要有。能增强归属感。当然，T-Shirt要做的好看一些，最好用80支的棉来做。别没穿几次就破破烂烂的。<br />
郁也风 : 哦，前一个我说了，我反对了。我不喜欢千人一面的感觉。<br />
<br />
<br />
<br />
25. 总经理至少每月参加次项目组会议<br />
MVM : 要的。要让team member觉得高层关注这个项目。<br />
郁也风 : 好像是个不可能完成的任务。不知别的公司如何。<br />
<br />
<br />
<br />
26. 你们是给每个Dev开一个分支么？<br />
MVM : 反对。Branch的管理以及Merge的工作量太大，而且容易出错。<br />
郁也风 : 反对，管理困难，也没有必要，可以加Lable。<br />
<br />
<br />
<br />
27. 有人长期不Check-In代码么？<br />
MVM : 不可以。对大部分项目来说，最多两三天就应该Check-In。<br />
郁也风 : 不可以，我每天都监控VSS的。<br />
<br />
<br />
<br />
28. 在Check-In代码时都填写注释了么？<br />
MVM : 要写的，至少一两句话，比如&#8220;解决了Bug No.225&#8221;。如果往高处拔，这也算做&#8220;配置审计&#8221;的一部分。<br />
郁也风 : 要写！<br />
<br />
<br />
<br />
29. 有没有设定每天Check-In的最后期限？<br />
MVM : 要的，要明确Check-In Deadline。否则会Build Break。<br />
郁也风 : 没有，整合就是个明确的Deadline了。<br />
<br />
<br />
<br />
30. 你们能把所有源码一下子编译成安装文件吗？ <br />
MVM : 要的。这是每日编译（Daily Build）的基础。而且必须要能够做成自动的。<br />
郁也风 : 当然，我不喜欢出现源码和类文件不匹配。<br />
<br />
<br />
<br />
31. 你们的项目组做每日编译么？<br />
MVM : 当然要做。有三样东西是软件项目/产品开发必备的：1. bug management; 2. source control; 3. daily build。<br />
郁也风 : 至少项目负责人要做。<br />
<br />
<br />
<br />
32. 你们公司有没有积累一个项目风险列表？<br />
MVM : 要。Risk Inventory。否则，下个项目开始的时候，又只能拍脑袋分析Risk了。<br />
郁也风 : 没有。也是一个需要考虑的内容。<br />
<br />
<br />
<br />
33. 设计越简单越好<br />
MVM : 越简单越好。设计时候多一句话，将来可能就带来无穷无尽的烦恼。应该从一开始就勇敢的砍。这叫scope management。<br />
郁也风 : 不同意，过度简单就成了简陋了。而且什么样的叫简单？没有一个量的界定。设计是需要让别人看明白的。<br />
<br />
<br />
<br />
34. 尽量利用现有的产品、技术、代码<br />
MVM : 千万别什么东西都自己Coding。BizTalk和Sharepoint就是最好的例子，有这两个作为基础，可以把起点提高很多。或者可以尽量多用现成的Control之类的。或者尽量用XML，而不是自己去Parse一个文本文件；尽量用RegExp，而不是自己从头操作字符串，等等等等。这就是&#8220;软件复用&#8221;的体现。<br />
郁也风 : 同意，我的原则是：有稳定的，经过实践验证的开源组件或产品的话，绝对不再自己搭炉灶。<br />
<br />
<br />
<br />
35. 你们会隔一段时间就停下来夯实代码么？<br />
MVM : 要。最好一个月左右一次。传言去年年初Windows组在Stevb的命令下停过一个月增强安全。Btw，&#8220;夯&#8221;这个字念&#8220;hang&#8221;，第一声。<br />
郁也风 : 肯定做了，不过可能并不是有意识地去做的。<br />
<br />
<br />
<br />
36. 你们的项目组每个人都写Daily Report么？<br />
MVM : 要写。五分钟就够了，写10句话左右，告诉自己小组的人今天我干了什么。一则为了沟通，二则鞭策自己（要是游手好闲一天，自己都会不好意思写的）。<br />
郁也风 : 这是公司的规定。也是少有的能让我支持的规定。<br />
<br />
<br />
<br />
37. 你们的项目经理会发出Weekly Report么？<br />
MVM : 要。也是为了沟通。内容包括目前进度，可能的风险，质量状况，各种工作的进展等。<br />
郁也风 : 也是公司的规定。<br />
<br />
<br />
<br />
38. 你们项目组是否至少每周全体开会一次？<br />
MVM : 要。一定要开会。程序员讨厌开会，但每个礼拜开会时间加起来至少应该有4小时。包括team meeting, spec review meeting, bug triage meeting。千万别大家闷头写code。<br />
郁也风 : 要，至少这点我们实施的还可以。<br />
<br />
<br />
<br />
39. 你们项目组的会议、讨论都有记录么？<br />
MVM : 会前发meeting request和agenda，会中有人负责主持和记录，会后有人负责发meeting minutes，这都是effective meeting的要点。而且，每个会议都要形成agreements和action items。<br />
郁也风 : 有记录，最后要形成会议纪要的。<br />
<br />
<br />
<br />
40. 其他部门知道你们项目组在干什么么？<br />
MVM : 要发一些Newsflash给整个大组织。Show your team&#8217;s value。否则，当你坐在电梯里面，其他部门的人问：&#8220;你们在干嘛&#8221;，你回答&#8220;ABC项目&#8221;的时候，别人全然不知，那种感觉不太好。<br />
郁也风 : 我们公司的项目开始时要求所有的技术骨干坐在一起评审的，别人想不知道都难。<br />
<br />
<br />
<br />
41. 通过Email进行所有正式沟通<br />
MVM : Email的好处是免得抵赖。但也要避免矫枉过正，最好的方法是先用电话和当面说，然后Email来确认。<br />
郁也风 : 很少使用Email，更多是当面解决问题，毕竟都在一个办公室。<br />
<br />
<br />
<br />
42. 为项目组建立多个Mailing Group<br />
MVM : 如果在AD+Exchange里面，就建Distribution List。比如，我会建ABC Project Core Team，ABC Project Dev Team，ABC Project All Testers，ABC Project Extended Team等等。这样发起Email来方便，而且能让该收到email的人都收到、不该收到不被骚扰。<br />
郁也风 : 没有这个条件，这个更应该根据项目组的规模来进行吧。<br />
<br />
<br />
<br />
43. 每个人都知道哪里可以找到全部的文档么？<br />
MVM : 应该每个人都知道。这叫做知识管理（Knowledge Management）。最方便的就是把文档放在一个集中的File Share，更好的方法是用Sharepoint。<br />
郁也风 : 所有需要的开发文档都放在一个统一的地方，这是规定。<br />
<br />
<br />
<br />
44. 你做决定、做变化时，告诉大家原因了么？<br />
MVM : 要告诉大家原因。Empower team member的手段之一是提供足够的information，这是MSF一开篇的几个原则之一。的确如此，tell me why是人之常情，tell me why了才能有understanding。中国人做事喜欢搞限制，限制信息，似乎能够看到某一份文件的人就是有身份的人。大错特错。权威、权力，不在于是不是能access information/data，而在于是不是掌握资源。<br />
郁也风 : 对我们来说，需做变化时，也就是临时会议的需要进行的时候。<br />
<br />
<br />
<br />
45. Stay agile and expect change<br />
MVM : 要这样。需求一定会变的，已经写好的代码一定会被要求修改的。做好心理准备，对change不要抗拒，而是expect change。<br />
郁也风 : 这点只能说谈何容易。希望能做到吧。<br />
<br />
<br />
<br />
46. 你们有没有专职的软件测试人员？<br />
MVM : 要有专职测试。如果人手不够，可以peer test，交换了测试。千万别自己测试自己的。<br />
郁也风 : 我们都知道需要，可是往往实际情况差强人意。<br />
<br />
<br />
<br />
47. 你们的测试有一份总的计划来规定做什么和怎么做么？<br />
MVM : 这就是Test Plan。要不要做性能测试？要不要做Usability测试？什么时候开始测试性能？测试通过的标准是什么？用什么手段，自动的还是手动的？这些问题需要用Test Plan来回答。<br />
郁也风 : 知道需要，可实际情况同46。<br />
<br />
<br />
<br />
48. 你是先写Test Case然后再测试的么？<br />
MVM : 应该如此。应该先设计再编程、先test case再测试。当然，事情是灵活的。我有时候在做第一遍测试的同时补上test case。至于先test case再开发，我不喜欢，因为不习惯，太麻烦，至于别人推荐，那试试看也无妨。<br />
郁也风 : 至少目前的习惯和你类似，将来打算试试TDD。<br />
<br />
<br />
<br />
49. 你是否会为各种输入组合创建测试用例？<br />
MVM : 不要，不要搞边界条件组合。当心组合爆炸。有很多test case工具能够自动生成各种边界条件的组合——但要想清楚，你是否有时间去运行那么多test case。<br />
郁也风 : 不会，没那个精力先。<br />
<br />
<br />
<br />
50. 你们的程序员能看到测试用例么？<br />
MVM : 要。让Dev看到Test Case吧。我们都是为了同一个目的走到一起来的：提高质量。<br />
郁也风 : 当然能够，项目中所有的东西都是对大家透明的。<br />
<br />
<br />
<br />
51. 你们是否随便抓一些人来做易用性测试？ <br />
MVM : 要这么做。自己看自己写的程序界面，怎么看都是顺眼的。这叫做审美疲劳——臭的看久了也就不臭了，不方便的永久了也就习惯了。<br />
郁也风 : 我是非常推荐这样的测试的，很多时候，客户也会参与进来。<br />
<br />
<br />
<br />
52. 你对自动测试的期望正确么？<br />
MVM : 别期望太高。依我看，除了性能测试以外，还是暂时先忘掉&#8220;自动测试&#8221;吧，忘掉WinRunner和LoadRunner吧。对于国内的软件测试的现状来说，只能&#8220;矫枉必须过正&#8221;了。<br />
郁也风 : 从不期望。<br />
<br />
<br />
<br />
53. 你们的性能测试是等所有功能都开发完才做的么？<br />
MVM : 不能这样。性能测试不能被归到所谓的&#8220;系统测试&#8221;阶段。早测早改正，早死早升天。<br />
郁也风 : 同意，非常同意。<br />
<br />
<br />
<br />
54. 你注意到测试中的杀虫剂效应了么？<br />
MVM : 虫子有抗药性，Bug也有。发现的新Bug越来越少是正常的。这时候，最好大家交换一下测试的area，或者用用看其他工具和手法，就又会发现一些新bug了。<br />
郁也风 : 同意。<br />
<br />
<br />
<br />
55. 你们项目组中有人能说出产品的当前整体质量情况么？<br />
MVM : 要有。当老板问起这个产品目前质量如何，Test Lead/Manager应该负责回答。<br />
郁也风 : 这当然是TL/PM的活了。<br />
<br />
<br />
<br />
56. 你们有单元测试么？<br />
MVM : 单元测试要有的。不过没有单元测试也不是不可以，我做过没有单元测试的项目，也做成功了——可能是侥幸，可能是大家都是熟手的关系。还是那句话，软件工程是非常实践、非常工程、非常灵活的一套方法，某些方法在某些情况下会比另一些方法好，反之亦然。<br />
郁也风 : 我同意，虽然我们做的很不好。<br />
<br />
<br />
<br />
57. 你们的程序员是写完代码就扔过墙的么？<br />
MVM : 大忌。写好一块程序以后，即便不做单元测试，也应该自己先跑一跑。虽然有了专门的测试人员，做开发的人也不可以一点测试都不做。微软还有Test Release Document的说法，程序太烂的话，测试有权踢回去。<br />
郁也风 : 这样的选手是要挨骂的。<br />
<br />
<br />
<br />
58. 你们的程序中所有的函数都有输入检查么？<br />
MVM : 不要。虽然说做输入检查是write secure code的要点，但不要做太多的输入检查，有些内部函数之间的参数传递就不必检查输入了，省点功夫。同样的道理，未必要给所有的函数都写注释。写一部分主要的就够了。<br />
郁也风 : 更多的时候是在最外面进行检查。太多的检查没有意义。<br />
<br />
<br />
<br />
59. 产品有统一的错误处理机制和报错界面么？<br />
MVM : 要有。最好能有统一的error message，然后每个error message都带一个error number。这样，用户可以自己根据error number到user manual里面去看看错误的具体描述和可能原因，就像SQL Server的错误那样。同样，ASP.NET也要有统一的Exception处理。可以参考有关的Application Block。<br />
郁也风 : 有，这也是j2ee 的规范了。<br />
<br />
<br />
<br />
60. 你们有统一的代码书写规范么？<br />
MVM : 要有。Code Convention很多，搞一份来发给大家就可以了。当然，要是有FxCop这种工具来检查代码就更好了。<br />
郁也风 : 有，首先是IDE的format工具，然后是Checkstyle之类的检查工具在每天的day build之前使用。<br />
<br />
<br />
<br />
61. 你们的每个人都了解项目的商业意义么？<br />
MVM : 要。这是Vision的意思。别把项目只当成工作。有时候要想着自己是在为中国某某行业的信息化作先驱者，或者时不时的告诉team member，这个项目能够为某某某国家部门每年节省多少多少百万的纳税人的钱，这样就有动力了。平凡的事情也是可以有个崇高的目标的。<br />
郁也风 : 刚才说了，我们的项目的每个部分对每个人都是透明的。<br />
<br />
<br />
<br />
62. 产品各部分的界面和操作习惯一致么？<br />
MVM : 要这样。要让用户觉得整个程序好像是一个人写出来的那样。<br />
郁也风 : 需要，这也是规范的一部分。<br />
<br />
<br />
<br />
63. 有可以作为宣传亮点的Cool Feature么？<br />
MVM : 要。这是增强团队凝聚力、信心的。而且，&#8220;一俊遮百丑&#8221;，有亮点就可以掩盖一些问题。这样，对于客户来说，会感觉产品从质量角度来说还是acceptable的。或者说，cool feature或者说亮点可以作为质量问题的一个事后弥补措施。<br />
郁也风 : 同意，我前一个项目的界面风格，被客户定为其它项目的参考标准了^_^。<br />
<br />
<br />
<br />
64. 尽可能缩短产品的启动时间<br />
MVM : 要这样。软件启动时间（Start-Up time）是客户对性能好坏的第一印象。<br />
郁也风 : 需要，另外一方面，等待对我们开发方也是一种折磨。<br />
<br />
<br />
<br />
65. 不要过于注重内在品质而忽视了第一眼的外在印象<br />
MVM : 程序员容易犯这个错误：太看重性能、稳定性、存储效率，但忽视了外在感受。而高层经理、客户正相反。这两方面要兼顾，协调这些是PM的工作。<br />
郁也风 : 这也是我在最近的项目中转变最大的方面。<br />
<br />
<br />
<br />
66. 你们根据详细产品功能说明书做开发么？<br />
MVM : 要这样。要有设计才能开发，这是必须的。设计文档，应该说清楚这个产品会怎么运行，应该采取一些讲故事的方法。设计的时候千万别钻细节，别钻到数据库、代码等具体实现里面去，那些是后面的事情，一步步来不能着急。<br />
郁也风 : 我更喜欢迭代，你的设计是根据需求，而需求是来自客户，而客户。。。永远不变的是变化。<br />
<br />
<br />
<br />
67. 开始开发和测试之前每个人都仔细审阅功能设计么？<br />
MVM : 要做。Function Spec review是用来统一思想的。而且，review过以后形成了一致意见，将来再也没有人可以说&#8220;你看，当初我就是反对这么设计的，现在吃苦头了吧&#8221;<br />
郁也风 : 要做，而且要求每个人都提出意见，这是开发工作开始之前，开始之后，我更倾向于&#8220;一言堂&#8221;了。<br />
<br />
<br />
<br />
68. 所有人都始终想着The Whole Image么？<br />
MVM : 要这样。项目里面每个人虽然都只是在制造一片叶子，但每个人都应该知道自己在制造的那片叶子所在的树是怎么样子的。我反对软件蓝领，反对过分的把软件制造看成流水线、车间。参见第61条。<br />
郁也风 : 我也同样反对&#8220;软件蓝领&#8221;，一向唾弃这个学院派制造的名词。我们采取的方式也同样可以参加61。<br />
<br />
<br />
<br />
69. Dev工作的划分是单纯纵向或横向的么？<br />
MVM : 不能单纯的根据功能模块分，或者单纯根据表现层、中间层、数据库层分。我推荐这么做：首先根据功能模块分，然后每个&#8220;层&#8221;都有一个Owner来Review所有人的设计和代码，保证consistency。 <br />
郁也风 : 同意。<br />
<br />
<br />
<br />
70. 你们的程序员写程序设计说明文档么？<br />
MVM : 要。不过我听说微软的程序员1999年以前也不写。所以说，写不写也不是绝对的，偷懒有时候也是可以的。参见第56条。<br />
郁也风 : 做的不够，我们从来没写过。<br />
<br />
<br />
<br />
71. 你在招人面试时让他写一段程序么？<br />
MVM : 要的。我最喜欢让人做字符串和链表一类的题目。这种题目有很多循环、判断、指针、递归等，既不偏向过于考算法，也不偏向过于考特定的API。<br />
郁也风 : 我认为交流更能看出一个人的实际情况。<br />
<br />
<br />
<br />
72. 你们有没有技术交流讲座？<br />
MVM : 要的。每一两个礼拜搞一次内部的Tech Talk或者Chalk Talk吧。让组员之间分享技术心得，这笔花钱送到外面去培训划算。<br />
郁也风 : 同意，也在着手准备启动。<br />
<br />
<br />
<br />
73. 你们的程序员都能专注于一件事情么？<br />
MVM : 要让程序员专注一件事。例如说，一个部门有两个项目和10个人，一种方法是让10个人同时参加两个项目，每个项目上每个人都花50%时间；另一种方法是5 个人去项目A，5个人去项目B，每个人都100%在某一个项目上。我一定选后面一种。这个道理很多人都懂，但很多领导实践起来就把属下当成可以任意拆分的资源了。<br />
郁也风 : 我也懂，可实际情况是，现在有4个项目和我有关联。<br />
<br />
<br />
<br />
74. 你们的程序员会夸大完成某项工作所需要的时间么？<br />
MVM : 会的，这是常见的，尤其会在项目后期夸大做某个change所需要的时间，以次来抵制change。解决的方法是坐下来慢慢磨，磨掉程序员的逆反心理，一起分析，并把估算时间的颗粒度变小。<br />
郁也风 : 会的，就算我在上报工作量的时候也会夸大的。对下，我采取的措施同你；上面对我，采取的措施是打折。<br />
<br />
<br />
<br />
75. 尽量不要用Virtual Heads<br />
MVM : 最好不要用Virtual Heads。Virtual heads意味着resource is not secure，shared resource会降低resource的工作效率，容易增加出错的机会，会让一心二用的人没有太多时间去review spec、review design。一个dedicated的人，要强过两个只能投入50%时间和精力的人。我是吃过亏的：7个part time的tester，发现的Bug和干的活，加起来还不如两个full-time的。参见第73条。73条是针对程序员的，75条是针对 Resource Manager的。<br />
郁也风 : 我想说的同73。<br />
<br />
原文blog地址：http://someok.blogbus.com/logs/2004/06/
<img src ="http://www.blogjava.net/xinwuhen/aggbug/210912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xinwuhen/" target="_blank">心无痕</a> 2008-06-26 17:59 <a href="http://www.blogjava.net/xinwuhen/archive/2008/06/26/210912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用DTree实现树型结构数据展现</title><link>http://www.blogjava.net/xinwuhen/archive/2008/06/03/205483.html</link><dc:creator>心无痕</dc:creator><author>心无痕</author><pubDate>Tue, 03 Jun 2008 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/xinwuhen/archive/2008/06/03/205483.html</guid><wfw:comment>http://www.blogjava.net/xinwuhen/comments/205483.html</wfw:comment><comments>http://www.blogjava.net/xinwuhen/archive/2008/06/03/205483.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xinwuhen/comments/commentRss/205483.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xinwuhen/services/trackbacks/205483.html</trackback:ping><description><![CDATA[<div class="postbody clearfix">这两天发现了dtree,做的很不错,想和大家交流一下 <br />
下载地址：<a href="http://www.destroydrop.com/javascripts/tree/dtree.zip" target="_blank">http://www.destroydrop.com/javascripts/tree/dtree.zip</a> <br />
或从附件里下载 <br />
看看里面的example01.html例子。 <br />
在这个基础上我做了一个动态的树型结构数据的展现（其实就是动态生成js代码而已）。 <br />
java类代码 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/32245#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">import</span><span>&nbsp;java.io.Serializable; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;TreeNode&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Serializable{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;id&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//节点编号 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;pid&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//父节点编号 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;name&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//节点名称 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;url&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//链接地址 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;title&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//节点描述 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;target&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//Target </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;icon&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//图标路径 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;iconOpen&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//展开状态下的图标路径 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;open&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//是否展开 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//构造函数 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;TreeNode(){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;=&nbsp;</span><span class="string">""</span><span>&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pid&nbsp;=&nbsp;</span><span class="string">""</span><span>&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;=&nbsp;</span><span class="string">""</span><span>&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;=&nbsp;</span><span class="string">""</span><span>&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title&nbsp;=&nbsp;</span><span class="string">""</span><span>&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target&nbsp;=&nbsp;</span><span class="string">""</span><span>&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;icon&nbsp;=&nbsp;</span><span class="string">""</span><span>&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconOpen&nbsp;=&nbsp;</span><span class="string">""</span><span>&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;open&nbsp;=&nbsp;</span><span class="string">""</span><span>&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//------get&nbsp;set&nbsp;functions</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">import java.io.Serializable;
public class TreeNode implements Serializable{
private String id ;          //节点编号
private String pid ;         //父节点编号
private String name ;        //节点名称
private String url ;         //链接地址
private String title ;       //节点描述
private String target ;      //Target
private String icon ;        //图标路径
private String iconOpen ;    //展开状态下的图标路径
private String open ;        //是否展开
//构造函数
public TreeNode(){
id = "" ;
pid = "" ;
name = "" ;
url = "" ;
title = "" ;
target = "" ;
icon = "" ;
iconOpen = "" ;
open = "" ;
}
//------get set functions
</pre>
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/32245#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;TreeNodeUtil&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//返回js代码 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;String&nbsp;createJsArray(TreeNode[]&nbsp;tn&nbsp;,&nbsp;String&nbsp;dtree)&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(tn&nbsp;==&nbsp;</span><span class="keyword">null</span><span>&nbsp;||&nbsp;tn.length&nbsp;==&nbsp;</span><span class="number">0</span><span>&nbsp;){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"TreeNode&nbsp;is&nbsp;empty"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="string">""</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;contents&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;StringBuffer(</span><span class="number">100</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(</span><span class="string">"new&nbsp;dTree('"</span><span>+dtree+</span><span class="string">"');"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;tn.length;&nbsp;i++)&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(</span><span class="string">"\n"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(dtree+</span><span class="string">".add('"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(tn[i].getId()); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(</span><span class="string">"','"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(tn[i].getPid()); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(</span><span class="string">"','"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(tn[i].getName()); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(</span><span class="string">"','"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(tn[i].getUrl()); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(</span><span class="string">"','"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(tn[i].getTitle()); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(</span><span class="string">"','"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(tn[i].getTarget()); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(</span><span class="string">"','"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(tn[i].getIcon()); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(</span><span class="string">"','"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(tn[i].getIconOpen()); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(</span><span class="string">"','"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(tn[i].getOpen()); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contents.append(</span><span class="string">"');"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;contents.toString(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">public class TreeNodeUtil {
//返回js代码
public static String createJsArray(TreeNode[] tn , String dtree) {
if(tn == null || tn.length == 0 ){
System.out.println("TreeNode is empty");
return "";
}
StringBuffer contents = new StringBuffer(100);
contents.append("new dTree('"+dtree+"');");
for (int i = 0; i &lt; tn.length; i++) {
contents.append("\n");
contents.append(dtree+".add('");
contents.append(tn[i].getId());
contents.append("','");
contents.append(tn[i].getPid());
contents.append("','");
contents.append(tn[i].getName());
contents.append("','");
contents.append(tn[i].getUrl());
contents.append("','");
contents.append(tn[i].getTitle());
contents.append("','");
contents.append(tn[i].getTarget());
contents.append("','");
contents.append(tn[i].getIcon());
contents.append("','");
contents.append(tn[i].getIconOpen());
contents.append("','");
contents.append(tn[i].getOpen());
contents.append("');");
}
return contents.toString();
}
}
</pre>
<br />
根据实际情况生成TreeNode对象 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/32245#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;execute()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;EpochalException&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql&nbsp;=&nbsp;</span><span class="string">""</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;url&nbsp;=&nbsp;</span><span class="string">""</span><span>&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;</span><span class="string">"SELECT&nbsp;id,parentId,name,seq&nbsp;,remark&nbsp;FROM&nbsp;t_testtree&nbsp;ORDER&nbsp;BY&nbsp;&nbsp;seq&nbsp;DESC"</span><span>&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;TableData&nbsp;tableData&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode[]&nbsp;treeNodes&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tableData&nbsp;=&nbsp;TableSelector.select(sql); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(tableData!=</span><span class="keyword">null</span><span>){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;treeNodes&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;TreeNode[tableData.getRowCount()]&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&lt;tableData.getRowCount();i++){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;treeNodes[i]&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;TreeNode(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;treeNodes[i].setId(tableData.getString(i,</span><span class="string">"id"</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;treeNodes[i].setName(tableData.getString(i,</span><span class="string">"name"</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;treeNodes[i].setPid(tableData.getString(i,</span><span class="string">"parentId"</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//根据实际情况生成连接地址 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;=&nbsp;</span><span class="string">"programList.x?category="</span><span>+tableData.getString(i,</span><span class="string">"name"</span><span>)&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;treeNodes[i].setUrl(url); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;treeNodes[i].setTitle(tableData.getString(i,</span><span class="string">"remark"</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;treeNodes[i].setTarget(</span><span class="string">"_blank"</span><span>);</span><span class="comment">//打开新窗口 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataBean.setParameter(</span><span class="string">"treeNodeArray"</span><span>,treeNodes)&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">catch</span><span>(Exception&nbsp;e){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e.toString()); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">public void execute() throws EpochalException {
// TODO Auto-generated method stub
String sql = "";
String url = "" ;
sql = "SELECT id,parentId,name,seq ,remark FROM t_testtree ORDER BY  seq DESC" ;
TableData tableData = null;
TreeNode[] treeNodes = null;
try{
tableData = TableSelector.select(sql);
if(tableData!=null){
treeNodes = new TreeNode[tableData.getRowCount()] ;
for(int i = 0; i&lt;tableData.getRowCount();i++){
treeNodes[i] = new TreeNode();
treeNodes[i].setId(tableData.getString(i,"id"));
treeNodes[i].setName(tableData.getString(i,"name"));
treeNodes[i].setPid(tableData.getString(i,"parentId"));
//根据实际情况生成连接地址
url = "programList.x?category="+tableData.getString(i,"name") ;
treeNodes[i].setUrl(url);
treeNodes[i].setTitle(tableData.getString(i,"remark"));
treeNodes[i].setTarget("_blank");//打开新窗口
}
dataBean.setParameter("treeNodeArray",treeNodes) ;
}
}catch(Exception e){
System.out.println(e.toString());
}
}
</pre>
<br />
jsp这边取"treeNodeArray"后通过TreeNodeUtil类生成js代码 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/32245#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;% &nbsp;&nbsp;</span></span></li>
    <li><span>TreeNode[]&nbsp;treeNodes&nbsp;=&nbsp;(TreeNode[])dataBean.getParameterObject(</span><span class="string">"treeNodeArray"</span><span>)&nbsp;; &nbsp;&nbsp;</span></span></li>
    <li><span>%&gt; &nbsp;&nbsp;</span></li>
    <li><span>&lt;p&gt;&lt;a&nbsp;href=</span><span class="string">"javascript:&nbsp;d.openAll();"</span><span>&gt;全部展开&lt;/a&gt;&nbsp;|&nbsp;&lt;a&nbsp;href=</span><span class="string">"javascript:&nbsp;d.closeAll();"</span><span>&gt;全部关闭&lt;/a&gt;&lt;/p&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>&lt;script&nbsp;language=</span><span class="string">"javascript"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>d&nbsp;=&nbsp;&lt;%=TreeNodeUtil.createJsArray(treeNodes,</span><span class="string">"d"</span><span>)%&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>document.write(d); &nbsp;&nbsp;</span></li>
    <li><span>&lt;/script&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&lt;%
TreeNode[] treeNodes = (TreeNode[])dataBean.getParameterObject("treeNodeArray") ;
%&gt;
&lt;p&gt;&lt;a href="javascript: d.openAll();"&gt;全部展开&lt;/a&gt; | &lt;a href="javascript: d.closeAll();"&gt;全部关闭&lt;/a&gt;&lt;/p&gt;
&lt;script language="javascript"&gt;
d = &lt;%=TreeNodeUtil.createJsArray(treeNodes,"d")%&gt;
document.write(d);
&lt;/script&gt;
</pre>
<br />
客户端生成的js代码 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/32245#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;script&nbsp;language=</span><span class="string">"javascript"</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li><span>d&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;dTree(</span><span class="string">'d'</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'1'</span><span>,</span><span class="string">'-1'</span><span>,</span><span class="string">'栏目'</span><span>,</span><span class="string">'programList.x?category=栏目'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'2'</span><span>,</span><span class="string">'1'</span><span>,</span><span class="string">'电影'</span><span>,</span><span class="string">'programList.x?category=电影'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'3'</span><span>,</span><span class="string">'1'</span><span>,</span><span class="string">'电视剧'</span><span>,</span><span class="string">'programList.x?category=电视剧'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'4'</span><span>,</span><span class="string">'1'</span><span>,</span><span class="string">'专题'</span><span>,</span><span class="string">'programList.x?category=专题'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'5'</span><span>,</span><span class="string">'1'</span><span>,</span><span class="string">'远程教育'</span><span>,</span><span class="string">'programList.x?category=远程教育'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'6'</span><span>,</span><span class="string">'1'</span><span>,</span><span class="string">'期刊'</span><span>,</span><span class="string">'programList.x?category=期刊'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'7'</span><span>,</span><span class="string">'2'</span><span>,</span><span class="string">'动作片'</span><span>,</span><span class="string">'programList.x?category=动作片'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'8'</span><span>,</span><span class="string">'2'</span><span>,</span><span class="string">'喜剧片'</span><span>,</span><span class="string">'programList.x?category=喜剧片'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'9'</span><span>,</span><span class="string">'2'</span><span>,</span><span class="string">'鬼片'</span><span>,</span><span class="string">'programList.x?category=鬼片'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'10'</span><span>,</span><span class="string">'3'</span><span>,</span><span class="string">'韩剧'</span><span>,</span><span class="string">'programList.x?category=韩剧'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'11'</span><span>,</span><span class="string">'3'</span><span>,</span><span class="string">'古装剧'</span><span>,</span><span class="string">'programList.x?category=古装剧'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'12'</span><span>,</span><span class="string">'5'</span><span>,</span><span class="string">'英语沙龙'</span><span>,</span><span class="string">'programList.x?category=英语沙龙'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'13'</span><span>,</span><span class="string">'4'</span><span>,</span><span class="string">'热门推荐'</span><span>,</span><span class="string">'programList.x?category=热门推荐'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'14'</span><span>,</span><span class="string">'7'</span><span>,</span><span class="string">'港台片'</span><span>,</span><span class="string">'programList.x?category=港台片'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'15'</span><span>,</span><span class="string">'7'</span><span>,</span><span class="string">'欧美片'</span><span>,</span><span class="string">'programList.x?category=欧美片'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'16'</span><span>,</span><span class="string">'14'</span><span>,</span><span class="string">'成龙全集'</span><span>,</span><span class="string">'programList.x?category=成龙全集'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>d.add(</span><span class="string">'17'</span><span>,</span><span class="string">'14'</span><span>,</span><span class="string">'李连杰全集'</span><span>,</span><span class="string">'programList.x?category=李连杰全集'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">'_blank'</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>,</span><span class="string">''</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>document.write(d); &nbsp;&nbsp;</span></li>
    <li><span>&lt;/script&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&lt;script language="javascript"&gt;
d = new dTree('d');
d.add('1','-1','栏目','programList.x?category=栏目','','_blank','','','');
d.add('2','1','电影','programList.x?category=电影','','_blank','','','');
d.add('3','1','电视剧','programList.x?category=电视剧','','_blank','','','');
d.add('4','1','专题','programList.x?category=专题','','_blank','','','');
d.add('5','1','远程教育','programList.x?category=远程教育','','_blank','','','');
d.add('6','1','期刊','programList.x?category=期刊','','_blank','','','');
d.add('7','2','动作片','programList.x?category=动作片','','_blank','','','');
d.add('8','2','喜剧片','programList.x?category=喜剧片','','_blank','','','');
d.add('9','2','鬼片','programList.x?category=鬼片','','_blank','','','');
d.add('10','3','韩剧','programList.x?category=韩剧','','_blank','','','');
d.add('11','3','古装剧','programList.x?category=古装剧','','_blank','','','');
d.add('12','5','英语沙龙','programList.x?category=英语沙龙','','_blank','','','');
d.add('13','4','热门推荐','programList.x?category=热门推荐','','_blank','','','');
d.add('14','7','港台片','programList.x?category=港台片','','_blank','','','');
d.add('15','7','欧美片','programList.x?category=欧美片','','_blank','','','');
d.add('16','14','成龙全集','programList.x?category=成龙全集','','_blank','','','');
d.add('17','14','李连杰全集','programList.x?category=李连杰全集','','_blank','','','');
document.write(d);
&lt;/script&gt;
</pre>
<br />
<br />
感觉使用很方便，数据量不是很大（一般的树型结构的数据量不会很大的，数据量大了就不直观了）的情况下能够满足大多数人的需要。 <br />
<strong><span style="color: red">注意的是root节点的pid必须为'-1'</span></strong> </div>
<div class="attachments">
<ul>
    <li><a href="http://www.javaeye.com/topics/download/147c9004-69f4-41f9-bcab-cd2f38fd6135">dtree.zip</a> (14.6 KB)
    <li>描述: dtree.zip
    <li>下载次数: 507 </li>
</ul>
</div>
<div id="topic_copyright">声明：JavaEye文章版权属于作者，受法律保护。没有作者书面许可不得转载。 </div>
 <img src ="http://www.blogjava.net/xinwuhen/aggbug/205483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xinwuhen/" target="_blank">心无痕</a> 2008-06-03 09:48 <a href="http://www.blogjava.net/xinwuhen/archive/2008/06/03/205483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软硬碰撞---纯软构架呼叫中心与传统呼叫中心的对比</title><link>http://www.blogjava.net/xinwuhen/archive/2008/05/21/201828.html</link><dc:creator>心无痕</dc:creator><author>心无痕</author><pubDate>Wed, 21 May 2008 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/xinwuhen/archive/2008/05/21/201828.html</guid><wfw:comment>http://www.blogjava.net/xinwuhen/comments/201828.html</wfw:comment><comments>http://www.blogjava.net/xinwuhen/archive/2008/05/21/201828.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xinwuhen/comments/commentRss/201828.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xinwuhen/services/trackbacks/201828.html</trackback:ping><description><![CDATA[<p align="center">2008/05/04
<center></center>
<p>&nbsp;</p>
<p class="menu2">　　随着计算机技术的不断革新，出现了很多种呼叫中心平台的架构方式，从架构的实现方式归纳起来，无外乎两种：基于交换机、板卡的硬件架构呼叫中心平台和纯软件架构的呼叫中心平台。呼叫中心发展到现在，已经进入到重应用、轻技术的阶段，但在同等规模、同样应用的呼叫中心平台下，我们选择什么样的架构呢？以下就是纯软件架构方式与基于硬件的传统架构方式的对比： </p>
<table height="667" cellspacing="0" cellpadding="0" width="88%" align="center" border="1">
    <tbody>
        <tr>
            <td class="menu2" width="16%" height="21">
            <div align="center"><strong>项目</strong></div>
            </td>
            <td class="menu2" valign="middle" width="41%">
            <div align="center"><strong>纯软构架方式</strong></div>
            </td>
            <td class="menu2" width="43%">
            <div align="center"><strong>传统方式</strong></div>
            </td>
        </tr>
        <tr>
            <td class="menu2">
            <div align="center"><strong>硬件相关性</strong></div>
            </td>
            <td class="menu2">　　完全与硬件松耦合，排除与硬件厂商品牌的相关性，用户完全可以自主选择适合的硬件设备支持，甚至可以同时使用不同厂商生产的同一功能的设备。</td>
            <td class="menu2"><br />
            　　传统呼叫中心由PBX、CTI服务器、语音板卡、应用服务器等硬件设备组成，功能实现完全基于硬件设备，对于设备的扩展、更换、升级都造成了一定的难度。<br />
            </td>
        </tr>
        <tr>
            <td class="menu2" height="90">
            <div align="center"><strong>接口灵活度</strong></div>
            </td>
            <td class="menu2">　　与第三方的数据及功能接口自然都是由软件方式实现，这样就可以灵活的为第三方系统定制接口，同时也可以灵活应用其他系统所提供的数据及功能接口。</td>
            <td class="menu2">　　硬件构成较为复杂，各个功能模块或子系统都是独立存在的，因此，对于数据及功能接口也是相对分散、繁琐的，这样，当需要与第三方系统关联的时候，交互工作是极其复杂的，甚至由于设计上的缺陷，很多功能是无法实现的。</td>
        </tr>
        <tr>
            <td class="menu2" height="82">
            <div align="center"><strong>功能升级</strong></div>
            </td>
            <td class="menu2" valign="middle">　　所有的功能实现都是软件方式，使得呼叫中心平台的升级操作极为简便、快速，就像安装其他软件一样升级更新包即可。</td>
            <td class="menu2" valign="middle">　 各功能模块都固化在PBX或CTI服务器中，因此，用户定制的很多个性化功能无法实现，这就使得呼叫中心平台具有很大的局限性，无法修改在使用过程中发现的问题。 </td>
        </tr>
        <tr>
            <td class="menu2" height="92">
            <div align="center"><strong>规模扩展</strong></div>
            </td>
            <td class="menu2" valign="middle">　　纯软件构建的呼叫中心平台对各种资源（IVR通道、座席通道、传真通道等等）的限制是采用许可的方式，因此当用户的客户服务中心需要扩展规模的时候，只需要增加资源许可，在系统不停机的情况下，5分钟就可以完成。</td>
            <td class="menu2" valign="middle">　　传统呼叫中心平台多采用交换机或者板卡方式，各种资源都是基于硬件的，当需要进行规模扩展的时候，必须增加新的硬件，并且需要停机安装，周期也很长，对于客户服务中心的运作极为不利。</td>
        </tr>
        <tr>
            <td class="menu2" height="73">
            <div align="center"><strong>系统整合度</strong></div>
            </td>
            <td class="menu2" valign="middle">　　高度整合各子系统及功能模块，使架构更加合理、优化，便于进行系统的维护、配置、以及功能模块的修改。</td>
            <td class="menu2" valign="middle"><br />
            　　各项功能都是依赖于硬件的，而且是相互独立的，这样，无法对系统进行整体的管理与维护，同时对系统的功能升级也有很大的局限性。</td>
        </tr>
        <tr>
            <td class="menu2" height="118">
            <div align="center"><strong>融合多种媒体</strong></div>
            </td>
            <td class="menu2" valign="middle">　　随着呼叫中心应用的不断革新，电话接入方式已经无法满足需求，各种媒体方式都不断的融入到呼叫中心，例如：短信、传真、Email、Web呼叫等等，对于纯软件构架的呼叫中心平台，融合各种媒体的接入不费吹灰之力，无需添加硬件设备即可实现，是真正的全媒体呼叫中心的构架方式。</td>
            <td class="menu2" valign="middle">　　媒体接入的方式非常单一，只支持对电话和传真的接入。随着技术的不断发展，基于硬件构架的呼叫中心也开始融入新生媒体的接入，但每一种媒体都是需要一个独立设备来支持的，这样，使得整个系统变得非常繁琐，也增加维护工作量。</td>
        </tr>
        <tr>
            <td class="menu2">
            <div align="center"><strong>建设成本</strong></div>
            </td>
            <td class="menu2" valign="middle">　　平台建设只需要一台服务器和一台中继接入设备就完全可以满足呼叫中心的建设，对于其他媒体（Email、传真、短信、Web呼叫）的处理也一并由呼叫中心服务器来完成，大大节省了硬件采购和实施成本。</td>
            <td class="menu2" valign="middle"><br />
            　　以交换机方式支撑的呼叫中心平台成本最高，交换机设备的成本远远高于板卡和软件架构的服务器；而采用板卡方式构建的呼叫中心平台，虽然其成本与软件架构相仿，但如果需要支持其他媒体接入，则要单独购置相应的硬件设备。<br />
            </td>
        </tr>
    </tbody>
</table>
<br />
　　过以上几点对比不难看出，纯软件架构的呼叫中心平台无论是在建设、维护还是升级都是具有绝对优势的，这也是呼叫中心技术发展的趋势。展望软件呼叫中心平台就是基于这种纯软件的架构方式，经过长期的研发和众多的应用案例足以证明纯软件架构方式的先进性，在此基础上，我们将一如既往的坚持呼叫中心平台的纯软件构架，并逐渐将其产品化，使之符合各种行业及规模的应用。<br />
<p align="right">CTI论坛编辑</p>
<img src ="http://www.blogjava.net/xinwuhen/aggbug/201828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xinwuhen/" target="_blank">心无痕</a> 2008-05-21 09:40 <a href="http://www.blogjava.net/xinwuhen/archive/2008/05/21/201828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈IP呼叫中心</title><link>http://www.blogjava.net/xinwuhen/archive/2008/05/21/201827.html</link><dc:creator>心无痕</dc:creator><author>心无痕</author><pubDate>Wed, 21 May 2008 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/xinwuhen/archive/2008/05/21/201827.html</guid><wfw:comment>http://www.blogjava.net/xinwuhen/comments/201827.html</wfw:comment><comments>http://www.blogjava.net/xinwuhen/archive/2008/05/21/201827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xinwuhen/comments/commentRss/201827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xinwuhen/services/trackbacks/201827.html</trackback:ping><description><![CDATA[<p align="center">2002/03/08</p>
<p>　　经过50年的发展，呼叫中心的服务内容、服务方式、服务技术以及服务领域等各方面都发生了巨大变化。Internet的崛起，以及数据、话音和视频传输网络三网合一技术的发展，给呼叫中心的应用带来了新的空间。尤其体现在呼入呼出功能实现上，由原来只能通过电话一种方式，发展到通过电话、网络电话、Email、传真、留言等多种方式，由此Call Center也就演变成现在的Contact Center。</p>
<p>　　在呼叫中心的发展历程中，最早出现的是基于PBX的呼叫中心，通常称为传统型或常规型呼叫中心，它尚未引入Internet。这类呼叫中心一般成本较高，客户对象为电信及大中型企业。随着计算机和电信技术的发展，开始引入CTI技术（计算机电话集成，Computer Telephony Integration），此时的呼叫中心不仅可以实现人工和自动服务，也可以让用户的语音、文字在任意客服人员之间进行互相转接，提高了系统的服务质量。这种方案的特点是规模小，价格便宜，但不适合于较大的应用场合。第三种呼叫中心是随着Internet的广泛应用产生的，称为基于Internet的呼叫中心。但大多数厂家仍然是将来自Internet的呼叫请求通过一个电话网关，转换成普通的电话请求，再接回到原有的呼叫系统中。IP呼叫中心的出现不再是简单地把Internet信息提供给呼叫中心，而是把呼叫中心与Internet融合为一体。这样的系统中充分利用了VoIP技术，达到节省成本的目的；同时把呼叫中心与互联网集成为一个整体，互联网上的用户请求和电话请求完全等同对待 ，并且支持宽带多媒体呼叫。</p>
<p>　　IP呼叫中心作为一个现代化的呼叫中心，不仅能支持语音电话，还能提供包括音频视频在内的多媒体通信；不仅能支持传统的电话终端，还能支持来自Internet的文字、语音、短消息等交互方式；不仅提供了完整的坐席功能，还具有实用的呼叫中心管理体系。由于采用了先进的VoIP及软件交换技术，就能为电话和Internet的客户提供统一的客户服务。因此相比较传统呼叫中心，IP呼叫中心将更具有的成本优势，同时处理能力也将大幅度提升。</p>
<p>　　相对与传统的呼叫中心而言，&#8220;IP呼叫中心&#8221;有着不可比拟的优势：</p>
<p>
<ul>
    <li><strong>分布式支持</strong> </li>
</ul>
<p>&nbsp;</p>
<p>　　&#8220;IP呼叫中心&#8221;系统采用全分布式结构，可以实现多点的、虚拟统一的客户服务中心，座席人员不必拘泥于地理位置，随时随地可以接入呼叫中心为客户提供服务，实现了真正意义上的移动办公。</p>
<p>
<ul>
    <li><strong>易于面向NGN的升级</strong> </li>
</ul>
<p>&nbsp;</p>
<p>　　下一代网络（NGN）的发展已经越来越成熟，&#8220;三网合一&#8221;也将变为现实，而这一切都是建立在IP的基础之上。从NGN的特点我们不难看出，&#8220;IP呼叫中心&#8221;符合NGN体系结构，所以&#8220;IP呼叫中心&#8221;是很容易向NGN进行过渡和升级的。</p>
<p>
<ul>
    <li><strong>极强的系统扩充能力</strong> </li>
</ul>
<p>&nbsp;</p>
<p>　　随着新技术和新产品层出不穷的推出，企业客户服务的任务加剧，呼叫中心的升级就是不可避免的，为了避免升级带来的损失，企业在选择呼叫中心产品时，都异常地谨慎，非常关注其扩展性。这一点对于资金薄弱的中小企业来说尤其重要。IP呼叫中心具有优秀的可扩充性，系统中的每一个组件都是相互独立的，组件之间的通讯采用了国际标准的通讯协议H.323，MGCP，RTP等。对语音媒体的压缩也采用了国际上通用的G.711、G.723.1和G.729。这表明系统中的任何一个部件都可以单独进行升级，并且可以与其它公司符合国际标准的设备进行通信，具有非常好的扩展性。</p>
<p>　　同时，IP呼叫中心也极易根据客户的需要集成其它富有科技含量的模块，如：声纹识别系统和自然语言自动应答系统。通过声纹识别，系统可以通过说话人声音的基本特征来判断其身份，而不只是仅仅依赖于来电号码。自然语言应答系统则支持中文自然语言的语音、文字请求，可自动给出答案。</p>
<p>
<ul>
    <li><strong>低成本</strong> </li>
</ul>
<p>&nbsp;</p>
<p>　　从技术实现角度来看，&#8220;IP呼叫中心&#8221;相对于传统的呼叫中心而言，由于充分利用了VoIP技术，因此在整个系统中处理的完全是数据，这样很多功能便可以通过软件来实现，比如：ACD、IVR、ServiceSwitch等核心处理模块，省去了大量的硬件投资，同时系统处理流程也得到了进一步优化。</p>
<p>　　除了以上这些优势以外，&#8220;IP呼叫中心&#8221;在系统功能上具备了传统呼叫中心的一切功能外，还提供了极具特色的一些功能模块：</p>
<p>&nbsp;</p>
<p>
<ul>
    <li><strong>IP-IVR</strong> </li>
</ul>
<p>&nbsp;</p>
<p>　　IVR（交互语音应答系统）是呼叫中心系统较重要的一部分。IP呼叫中心利用了IP技术来实现IVR的功能。</p>
<p>　　IP-IVR是一个IP驱动的交互式语音响应（IVR）解决方案，可以提供一个开放、可扩展和功能丰富的媒体服务器，通过标准协议访问控制。通过与用户的自主交互，IP IVR能够实现电话处理的自动化。IP-IVR显著地减少了部署传统IVR/专用分支交换机（PBX）集成所需要的成本高昂的T1设备。</p>
<p>　　IP-IVR还充分支持VoiceXML（Voice Extensible Markup Language）语言，可快速完成应用构建；不要求用户学习复杂的高级语言，就可灵活扩充新业务。IP-IVR支持通过开放数据库连接（ODBC）访问数据库, 根据数据库中的内容自动更新语音提示,只需要网络接入，不要求数字信号处理器（DSP）卡。同时，IP-IVR还提供了基于Web的激活和管理功能。</p>
<p>　　另外，可视化的定制方式，使得部署IVR变得异常的简单和容易。</p>
<p>
<ul>
    <li><strong>移动办公</strong> </li>
</ul>
<p>&nbsp;</p>
<p>　　IP呼叫中心支持多种移动平台的接入：PDA、手机、笔记本电脑，WEB化的管理模式，使得异地管理变为现实，只要连入Internet，便可实现呼叫中心服务的支持和管理。</p>
<p>
<ul>
    <li><strong>穿越防火墙</strong> </li>
</ul>
<p>&nbsp;</p>
<p>　　目前国际上的VoIP的产品已经很多，比如NetMeeting、Net2Phone等，但这些产品无一例外的都不支持防火墙的穿透，这就使得服务无法为很多在企业防火墙内部的用户使用，而这个问题在&#8220;IP呼叫中心&#8221;中得到了很好的解决，通过虚拟代理和IP隧道的手段，系统可以突破VoIP应用瓶颈，顺利穿越防火墙和NAT,并且支持多层防火墙和NAT嵌套的复杂网络环境。</p>
<p>　　几种呼叫中心的比较：</p>
<table bordercolor="#008000" cellspacing="2" cellpadding="7" width="591" border="1">
    <tbody>
        <tr>
            <td valign="middle" width="15%">
            <p><font lang="ZH-CN" face="System,黑体"></font><font lang="ZH-CN" face="宋体">　</font> </p>
            </td>
            <td valign="middle" width="28%">
            <p><font lang="ZH-CN" face="宋体">PBX Call Center</font> </p>
            </td>
            <td valign="middle" width="20%">
            <p><font lang="ZH-CN" face="宋体">CTI Call Center</font> </p>
            </td>
            <td valign="top" width="19%">
            <p><font lang="ZH-CN" face="宋体">Internet Call Center</font> </p>
            </td>
            <td valign="middle" width="19%" bgcolor="#00ffff">
            <p><font lang="ZH-CN" face="宋体">IP呼叫中心</font> </p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="15%">
            <p><font lang="ZH-CN" face="宋体">支持分布式支持管理</font> </p>
            </td>
            <td valign="top" width="28%">
            <p><font lang="ZH-CN" face="宋体">是，但费用高，需要专用DDN或VoIP线路</font> </p>
            </td>
            <td valign="top" width="20%">
            <p><font lang="ZH-CN" face="宋体">否</font> </p>
            </td>
            <td valign="top" width="19%">
            <p>
            <hr align="left" width="2%" size="0" />
            </td>
            <td valign="top" width="19%" bgcolor="#00ffff">
            <p><font lang="ZH-CN" face="宋体">是</font> </p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="15%" height="47">
            <p><font lang="ZH-CN" face="宋体">WebChat、WebPhone、同步浏览</font> </p>
            </td>
            <td valign="top" width="28%" height="47">
            <p><font lang="ZH-CN" face="宋体">否</font> </p>
            </td>
            <td valign="top" width="20%" height="47">
            <p><font lang="ZH-CN" face="宋体">否</font> </p>
            </td>
            <td valign="top" width="19%" height="47">
            <p><font lang="ZH-CN" face="宋体">是</font> </p>
            </td>
            <td valign="top" width="19%" bgcolor="#00ffff" height="47">
            <p><font lang="ZH-CN" face="宋体">是</font> </p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="15%" height="36">
            <p><font lang="ZH-CN" face="宋体">WebPhone支持二次拨号/防火墙</font> </p>
            </td>
            <td valign="top" width="28%" height="36">
            <p>
            <hr align="left" width="2%" size="0" />
            </td>
            <td valign="top" width="20%" height="36">
            <p>
            <hr align="left" width="2%" size="0" />
            </td>
            <td valign="top" width="19%" height="36">
            <p><font lang="ZH-CN" face="宋体">一般不支持</font> </p>
            </td>
            <td valign="top" width="19%" bgcolor="#00ffff" height="36">
            <p><font lang="ZH-CN" face="宋体">是</font> </p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="15%">
            <p><font lang="ZH-CN" face="宋体">支持电信级方案</font> </p>
            </td>
            <td valign="top" width="28%">
            <p><font lang="ZH-CN" face="宋体">是</font> </p>
            </td>
            <td valign="top" width="20%">
            <p><font lang="ZH-CN" face="宋体">否</font> </p>
            </td>
            <td valign="top" width="19%">
            <p>
            <hr align="left" width="2%" size="0" />
            </td>
            <td valign="top" width="19%" bgcolor="#00ffff">
            <p><font lang="ZH-CN" face="宋体">是</font> </p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="15%">
            <p><font lang="ZH-CN" face="宋体">支持ASP模式</font> </p>
            </td>
            <td valign="top" width="28%">
            <p><font lang="ZH-CN" face="宋体">否</font> </p>
            </td>
            <td valign="top" width="20%">
            <p><font lang="ZH-CN" face="宋体">否</font> </p>
            </td>
            <td valign="top" width="19%">
            <p><font lang="ZH-CN" face="宋体">否</font> </p>
            </td>
            <td valign="top" width="19%" bgcolor="#00ffff">
            <p><font lang="ZH-CN" face="宋体">是</font> </p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="15%" height="35">
            <p><font lang="ZH-CN" face="宋体">支持信令</font> </p>
            </td>
            <td valign="top" width="28%" height="35">
            <p><font lang="ZH-CN" face="宋体">SS7, R2, DSS1, 模拟</font> </p>
            </td>
            <td valign="top" width="20%" height="35">
            <p><font lang="ZH-CN" face="宋体">R2, DSS1, 模拟</font> </p>
            </td>
            <td valign="top" width="19%" height="35">
            <p>
            <hr align="left" width="2%" size="0" />
            </td>
            <td valign="top" width="19%" bgcolor="#00ffff" height="35">
            <p><font lang="ZH-CN" face="宋体">SS7,R2,DSS1, 模拟</font> </p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="15%">
            <p><font lang="ZH-CN" face="宋体">成本</font> </p>
            </td>
            <td valign="top" width="28%">
            <p><font lang="ZH-CN" face="宋体">高</font> </p>
            </td>
            <td valign="top" width="20%">
            <p><font lang="ZH-CN" face="宋体">一般</font> </p>
            </td>
            <td valign="top" width="19%">
            <p>
            <hr align="left" width="2%" size="0" />
            </td>
            <td valign="top" width="19%" bgcolor="#00ffff">
            <p><font lang="ZH-CN" face="宋体">根据配置</font> </p>
            </td>
        </tr>
    </tbody>
</table>
<p>　　IP呼叫中心为融合通信环境提供了统一的IP业务支持平台，同时从营销的角度看，IP呼叫中心产品无疑会开辟一个更为广阔的市场，企业可以利用电信运营商提供的服务平台开展各种更具吸引力的新业务，实现更远的腾飞目标！</p>
<p align="right">南京北极星公司供稿　CTI论坛编辑</p>
<img src ="http://www.blogjava.net/xinwuhen/aggbug/201827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xinwuhen/" target="_blank">心无痕</a> 2008-05-21 09:40 <a href="http://www.blogjava.net/xinwuhen/archive/2008/05/21/201827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP数据导出到EXCEL简便方法</title><link>http://www.blogjava.net/xinwuhen/archive/2008/05/19/201363.html</link><dc:creator>心无痕</dc:creator><author>心无痕</author><pubDate>Mon, 19 May 2008 04:55:00 GMT</pubDate><guid>http://www.blogjava.net/xinwuhen/archive/2008/05/19/201363.html</guid><wfw:comment>http://www.blogjava.net/xinwuhen/comments/201363.html</wfw:comment><comments>http://www.blogjava.net/xinwuhen/archive/2008/05/19/201363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xinwuhen/comments/commentRss/201363.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xinwuhen/services/trackbacks/201363.html</trackback:ping><description><![CDATA[<p>试试看从网页中把表格直接生成excel，虽然不是直接从sql到excel，不过反而更加方便而且人性化。。</p>
<p>网上倒是找到了不少的资料，发现一段javascript的功能实现代码，很不错：<br />
var elTable = document.getElementById("tb"); <br />
var oRangeRef = document.body.createTextRange(); <br />
oRangeRef.moveToElementText( elTable ); <br />
oRangeRef.execCommand( "Copy" ); <br />
<br />
var appExcel = new ActiveXObject( "Excel.Application" ); <br />
appExcel.Visible = true; <br />
appExcel.Workbooks.Add().Worksheets.Item(1).Paste(); <br />
appExcel = null;</p>
<p>实现功能就是把id为tb的表格内的数据都生成为excel，我试试了可行，但是放到服务器来运行就是script error的提示，然后网上到处求问，也找了百度空间的几位高手朋友问了下，可是还是不得其法。。不过还是很感谢他们的热心帮助</p>
<p>没办法，我只能用别的方法来实现了，其实满喜欢上面的这个javascript的功能的，比较人性化。。可惜我黔驴技穷，无法用上它，哎！~</p>
<p>既然我帮客户用jsp写的程序，那么我就还是用jsp来实现这个功能吧。。</p>
<p>于是找到了这么一个方法：<br />
<font color="#808080" size="2">原文出自：</font><a href="http://www.jsp.mlc.edu.tw/viewitem.jsp?itemid=0000000065"><font color="#808080" size="2">http://www.jsp.mlc.edu.tw/viewitem.jsp?itemid=0000000065</font></a><br />
</p>
<p><font size="2"><font color="#ff0000">***************************************************************************************************</font><br />
一、将网页资料以excel报表以线上浏览方式呈现 <br />
<font face="Courier New">xls651.jsp原始码如下 </font></font></p>
<font size="2"><font face="Courier New">
<p><br />
&lt;%@ page contentType="application/msexcel; <font style="background-color: #c7edcc">charset=gb2312</font>" %&gt;<br />
&lt;!-- 以上这行设定本网页为excel格式的网页 --&gt;<br />
&lt;%<br />
&nbsp;&nbsp; response.setHeader("Content-disposition","inline; filename=test1.xls");<br />
&nbsp;&nbsp; //以上这行设定传送到前端浏览器时的档名为test1.xls<br />
&nbsp;&nbsp; //就是靠这一行，让前端浏览器以为接收到一个excel档 <br />
%&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Excel档案呈现方式&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&nbsp; &lt;table border="1" width="100%"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;姓名&lt;/td&gt;&lt;td&gt;身份证字号&lt;/td&gt;&lt;td&gt;生日&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;李玟&lt;/td&gt;&lt;td&gt;N111111111&lt;/td&gt;&lt;td&gt;1900/11/12&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;梁静如&lt;/td&gt;&lt;td&gt;N222222222&lt;/td&gt;&lt;td&gt;1923/10/1&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;张惠妹&lt;/td&gt;&lt;td&gt;N333333333&lt;/td&gt;&lt;td&gt;1934/12/18&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp; &lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>二、将网页资料以excel报表以下载的方式呈现<br />
这个jsp档和上一个差不多，只有差别在这一行：<br />
线上浏览的方式： response.setHeader("Content-disposition","<font color="#ff0000">inline</font>; filename=test1.xls"); <br />
下载的方式： response.setHeader("Content-disposition","<font color="#ff0000">attachment</font>; filename=test2.xls"); <br />
附注： 1.以上纯以静态网页的方式呈现excel档，配合资料库，你便能以动态的报表方式做出excel报表了<br />
2.完全不用安装任何元件，或只能受限於win平台，一个简单的方式解决你的报表需求 <br />
3.聪明的你，应该能举一反三，知道如何将网页资料以word的doc格式展现了吧！<br />
(是不是只要把contentType改成"application/msword"以及filename的副档名改成.doc就可以了！)</p>
</font></font>
<img src ="http://www.blogjava.net/xinwuhen/aggbug/201363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xinwuhen/" target="_blank">心无痕</a> 2008-05-19 12:55 <a href="http://www.blogjava.net/xinwuhen/archive/2008/05/19/201363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>