<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3979145966556781804</id><updated>2011-04-21T11:25:38.883-07:00</updated><title type='text'>未来世界</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-5113143084391218479</id><published>2008-11-18T06:24:00.001-08:00</published><updated>2008-11-18T06:24:03.200-08:00</updated><title type='text'>兰迪语录：真正实现你的童年梦想</title><content type='html'> &lt;h1 id="xgsv" style=" vertical-align: bottom;"&gt;&lt;b&gt;&lt;font size="5"&gt;兰迪语录：真正实现你的童年梦想&lt;/font&gt;&lt;/b&gt;&lt;/h1&gt;&lt;br id="xgsv0"&gt;&lt;br id="xgsv1"&gt;&lt;br id="xgsv2"&gt;Brick walls are there for a reason: they let us prove how badly we want things.&lt;br /&gt;&lt;br id="xgsv3"&gt;人生路上有阻挡你梦想的砖墙，那是有原因的。这些砖墙让我们来证明我们究竟有多么想要得到我们所需要的。 &lt;br /&gt;&lt;br id="xgsv4"&gt;&lt;br /&gt;&lt;br id="xgsv5"&gt;Experience is what you get when you didn't get what you wanted.&lt;br /&gt;&lt;br id="xgsv6"&gt;当你得不到你想的到的东西时，你会得到经验。 &lt;br /&gt;&lt;br id="xgsv7"&gt;&lt;br /&gt;&lt;br id="xgsv8"&gt;Never lose the child-like wonder.&lt;br /&gt;&lt;br id="xgsv9"&gt;永远不要失去孩童一样的好奇心。 &lt;br /&gt;&lt;br id="xgsv10"&gt;&lt;br /&gt;&lt;br id="xgsv11"&gt;If we do something which is pioneering, we will get arrows in the&lt;br /&gt;back. But at the end of the day, whether we succeed or not, the journey&lt;br /&gt;will be worthwhile.&lt;br /&gt;&lt;br id="xgsv12"&gt;当我们做一些前人没做过的事情时，有人会放冷箭。然而，最后的结果是，无论我们是否成功，过程都是值得的。 &lt;br /&gt;&lt;br id="xgsv13"&gt;&lt;br /&gt;&lt;br id="xgsv14"&gt;Be good at something; it makes you valuable.&lt;br /&gt;&lt;br id="xgsv15"&gt;在某些方面要能&lt;nobr id="clickeyekey3" style="border-bottom: 1px dotted rgb(102, 0, 255); color: rgb(102, 0, 255); background-color: transparent;"&gt;&lt;u&gt;突出&lt;/u&gt;&lt;/nobr&gt;你的专才，这会使你有价值。 &lt;br /&gt;&lt;br id="xgsv17"&gt;&lt;br /&gt;&lt;br id="xgsv18"&gt;If you live your life the right way, the karma will take care of itself, and the dreams will come to you.&lt;br /&gt;&lt;br id="xgsv19"&gt;如果你用正确方式地去度过你的一生，命运会让合适的梦想会来到你身边。 &lt;br /&gt;&lt;br id="xgsv20"&gt;&lt;br /&gt;&lt;br id="xgsv21"&gt;Stay positive no matter what, but not in denial.&lt;br /&gt;&lt;br id="xgsv22"&gt;无论发生什么事情，一定要往好的方面想，但是不要拒绝接受事实。 &lt;br /&gt;&lt;br id="xgsv23"&gt;&lt;br /&gt;&lt;br id="xgsv24"&gt;Make things fun.&lt;br /&gt;&lt;br id="xgsv25"&gt;凡事尽量弄得有趣些。 &lt;br /&gt;&lt;br id="xgsv26"&gt;&lt;br /&gt;&lt;br id="xgsv27"&gt;Dream a big dream.&lt;br /&gt;&lt;br id="xgsv28"&gt;有大的梦想。 &lt;br /&gt;&lt;br id="xgsv29"&gt;&lt;br /&gt;&lt;br id="xgsv30"&gt;Learn from all the people in your life.&lt;br /&gt;&lt;br id="xgsv31"&gt;向你生活中所有的人&lt;nobr id="clickeyekey2" style="border-bottom: 1px dotted rgb(102, 0, 255); color: rgb(102, 0, 255); background-color: transparent;"&gt;&lt;u&gt;学习&lt;/u&gt;&lt;/nobr&gt;。 &lt;br /&gt;&lt;br id="xgsv33"&gt;&lt;br /&gt;&lt;br id="xgsv34"&gt;Be dare to do things differently.&lt;br /&gt;&lt;br id="xgsv35"&gt;大胆去用不同的方式来做事情。 &lt;br /&gt;&lt;br id="xgsv36"&gt;&lt;br /&gt;&lt;br id="xgsv37"&gt;Find the right place to nurture your dreams.&lt;br /&gt;&lt;br id="xgsv38"&gt;找一个适合你培养梦想的地方。 &lt;br /&gt;&lt;br id="xgsv39"&gt;&lt;br /&gt;&lt;br id="xgsv40"&gt;If you screwed up, and no one cares to say anything, that means you have been dropped. Criticism is your best friend.&lt;br /&gt;&lt;br id="xgsv41"&gt;如果你做错了，没人说你什么，那是因为别人已放弃了你。批评才是你最好的朋友。 &lt;br /&gt;&lt;br id="xgsv42"&gt;&lt;br /&gt;&lt;br id="xgsv43"&gt;Life is a gift. Find the good things from others. If you can wait long enough, the good side of other people will show.&lt;br /&gt;&lt;br id="xgsv44"&gt;生命是一个礼物。看别人好的一面。如果你给别人时间的话，他们好的一面会展现出来。 &lt;br /&gt;&lt;br id="xgsv45"&gt;&lt;br /&gt;&lt;br id="xgsv46"&gt;Don't go the short-cut, always tell the truth.&lt;br /&gt;&lt;br id="xgsv47"&gt;不要投机取巧，要永远说真话。 &lt;br /&gt;&lt;br id="xgsv48"&gt;&lt;br /&gt;&lt;br id="xgsv49"&gt;Don't complain, just work harder.&lt;br /&gt;&lt;br id="xgsv50"&gt;遇到困难，不要抱怨，要更加努力地去作。 &lt;br /&gt;&lt;br id="xgsv51"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-5113143084391218479?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/5113143084391218479/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=5113143084391218479' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/5113143084391218479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/5113143084391218479'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/11/blog-post_6629.html' title='兰迪语录：真正实现你的童年梦想'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-6692618855086390962</id><published>2008-11-18T06:23:00.003-08:00</published><updated>2008-11-18T06:23:30.367-08:00</updated><title type='text'>深入浅析：面向对象编程四大原则</title><content type='html'> 深入浅析：面向对象编程四大原则&lt;br id="irpq"&gt;&lt;br id="irpq0"&gt;在面向对象&lt;nobr id="clickeyekey0" style="border-bottom: 1px dotted rgb(102, 0, 255); color: rgb(102, 0, 255); background-color: transparent;"&gt;&lt;u&gt;设计&lt;/u&gt;&lt;/nobr&gt;中，如何通过很小的设计改变就可以应对设计需求的变化，这是令设计者极为关注的问题。为此不少OO先驱提出了很多有关面向对象的设计原则用于&lt;nobr id="clickeyekey1" style="border-bottom: 1px dotted rgb(102, 0, 255); color: rgb(102, 0, 255); background-color: transparent;"&gt;&lt;u&gt;指导&lt;/u&gt;&lt;/nobr&gt;OO的设计和开发。下面是几条与类设计相关的设计原则。&lt;br /&gt;&lt;p id="g_-b0"&gt;　　1. 开闭原则(the Open Closed Principle OCP)&lt;/p&gt;&lt;br /&gt;&lt;p id="g_-b1"&gt;　　一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。因此在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态技术。该原则同样适合于非面向对象设计的方法，是&lt;a id="g_-b2" href="http://www.csai.cn/incsearch/search.asp?key=%C8%ED%BC%FE%B9%A4%B3%CC" target="_blank"&gt;软件工程&lt;/a&gt;设&lt;br /&gt;计方法的重要原则之一。我们以收音机的例子为例，讲述面向对象的开闭原则。我们收听节目时需要打开收音机电源，对准电台频率和进行音量调节。但是对于不同&lt;br /&gt;的收音机，实现这三个步骤的细节往往有所不同。比如自动收缩电台的收音机和按钮式收缩在操作细节上并不相同。因此，我们不太可能针对每种不同类型的收音机&lt;br /&gt;通过一个收音机类来实现(通过重载)这些不同的操作方式。但是我们可以定义一个收音机接口，提供开机、关机、增加频率、降低频率、增加音量、降低音量六个&lt;br /&gt;抽象方法。不同的收音机继承并实现这六个抽象方法。这样新增收音机类型不会影响其它原有的收音机类型，收音机类型扩展极为方便。此外，已存在的收音机类型&lt;br /&gt;在修改其操作方法时也不会影响到其它类型的收音机。&lt;/p&gt;&lt;br /&gt;&lt;p id="g_-b3"&gt;　　2. 替换原则 (the Liskov Substitution Principle LSP)&lt;/p&gt;&lt;br /&gt;&lt;p id="g_-b4"&gt;　　子类应当可以替换父类并出现在父类能够出现的任何地方。这个原则是Liskov于1987年提出的设计原则。它同样可以从Bertrand Meyer 的DBC (Design by Contract) 的概念推出。&lt;/p&gt;&lt;br /&gt;&lt;p id="g_-b5"&gt;　　我们以学生为例，夜校生为学生的子类，因此在任何学生可以出现的地方，夜校生均可出现。这个例子有些牵强，一个能够反映这个原则的例子时圆和椭圆，圆是椭圆的一个特殊子类。因此任何出现椭圆的地方，圆均可以出现。但反过来就可能行不通。&lt;/p&gt;&lt;br /&gt;&lt;p id="g_-b6"&gt;　　运用替换原则时，我们尽量把类B设计为抽象类或者接口，让C类继承类B(接口B)并实现操作A和操作B，运行时，类C实例替换B，这样我们即可进行新类的扩展(继承类B或接口B)，同时无须对类A进行修改。&lt;/p&gt;&lt;br /&gt;&lt;p id="g_-b7"&gt;　　3. 依赖原则 (the Dependency Inversion Principle DIP)&lt;/p&gt;&lt;br /&gt;&lt;p id="g_-b8"&gt;　　在进行业务设计时，与特定业务有关的依赖关系应该尽量依赖接口和抽象类，而不是依赖于具体类。具体类只负责相关业务的实现，修改具体类不影响与特定业务有关的依赖关系。&lt;/p&gt;&lt;br /&gt;&lt;p id="g_-b9"&gt;　　在结构化设计中，我们可以看到底层的模块是对高层抽象模块的实现(高层抽象模块通过调用底层模块)，这说明，抽象的模块要依赖具体实现相关的模块，底层模块的具体实现发生变动时将会严重影响高层抽象的模块，显然这是结构化方法的一个"硬伤"。&lt;/p&gt;&lt;br /&gt;&lt;p id="g_-b10"&gt;　　面向对象方法的依赖关系刚好相反，具体实现类依赖于抽象类和接口。&lt;/p&gt;&lt;br /&gt;&lt;p id="g_-b11"&gt;　　为此，我们在进行业务设计时，应尽量在接口或抽象类中定义业务方法的原型，并通过具体的实现类(子类)来实现该业务方法，业务方法内容的修改将不会影响到运行时业务方法的调用。&lt;/p&gt;&lt;br /&gt;&lt;p id="g_-b12"&gt;　　4. 接口分离原则(the Interface Segregation Principle ISP)&lt;/p&gt;&lt;br /&gt;&lt;p id="g_-b13"&gt;　　采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。&lt;/p&gt;&lt;br /&gt;&lt;p id="g_-b14"&gt;　　ISP原则是另外一个支持诸如COM等组件化的使能技术。缺少ISP，组件、类的可用性和移植性将大打折扣。&lt;/p&gt;&lt;br /&gt;&lt;p id="g_-b15"&gt;　　这个原则的本质相当简单。如果你拥有一个针对多个客户的类，为每一个客户创建特定业务接口，然后使该客户类继承多个特定业务接口将比直接加载客户所需所有方法有效。&lt;/p&gt;&lt;br /&gt;&lt;p id="g_-b16"&gt;　　以上四个原则是面向对象中常常用到的原则。此外，除上述四原则外，还有一些常用的经验诸如类结构层次以三到四层为宜、类的职责明确化(一个类对&lt;br /&gt;应一个具体职责)等可供我们在进行面向对象设计参考。但就上面的几个原则看来，我们看到这些类在几何分布上呈现树型拓扑的关系，这是一种良好、开放式的线&lt;br /&gt;性关系、具有较低的设计复杂度。一般说来，在软件设计中我们应当尽量避免出现带有闭包、循环的设计关系，它们反映的是较大的耦合度和设计复杂化。&lt;/p&gt;&lt;br id="irpq1"&gt;      &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-6692618855086390962?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/6692618855086390962/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=6692618855086390962' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/6692618855086390962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/6692618855086390962'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/11/blog-post_8459.html' title='深入浅析：面向对象编程四大原则'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-5277687285475933962</id><published>2008-11-18T06:23:00.001-08:00</published><updated>2008-11-18T06:23:15.567-08:00</updated><title type='text'>小公司如何做项目管理</title><content type='html'> &lt;div id="ou5f" class="Section0"&gt;&lt;br /&gt;&lt;p id="ou5f0" class="0"&gt;&lt;a id="ou5f1" href="http://www.javaeye.com/topic/216779"&gt;小公司如何做项目管理&lt;/a&gt;&lt;/p&gt;&lt;p id="ou5f2" class="0"&gt;&lt;span id="ou5f3" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f4" style="font-family: 宋体;"&gt;http://www.javaeye.com/topic/216779&lt;br id="ou5f5"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p id="ou5f6" class="0"&gt;&lt;span id="ou5f7" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f8" style="font-family: 宋体;"&gt;&lt;br id="ou5f9"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p id="ou5f10" class="0"&gt;&lt;span id="ou5f11" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f12" style="font-family: 宋体;"&gt;我所在的公司和大多数国内IT公司一样，十几到几十人的规模，每次在做完项目过程中我们都会感觉&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f13" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f14" style="font-family: 宋体;"&gt;很&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f15" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f16" style="font-family: 宋体;"&gt;累，老板其实也很累，在小公司老板更像是一个项目经理的角色，很多东西都没有流程化的东西可走，所以很多事情都要等老板拍板后才可以继续下去，员工在很多时候就会感到迷茫，随着公司规模的扩大，公司也意识到没有一套规范的项目管理方案是万万不行的&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f17" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f18" style="font-family: 宋体;"&gt;，自己在这方面也摸索的一段时间。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ou5f19" class="0"&gt;&lt;span id="ou5f20" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f21" style="font-family: 宋体;"&gt;我&lt;br /&gt;首先接触的是敏捷开发的方法，但很快我就感觉这个方法行不通，至少对于我们是这样，因为我们无法保证和客户以及业务人员及时沟通，一个月见几次面就很不错&lt;br /&gt;了，而且我们的开发人员也并不具有敏捷能力。后来接触了下CMMI，CMMI对于小公司就更不靠谱了，它庞大的身躯足以把一个小公司压垮，如果仅为一个证&lt;br /&gt;书的话，我建议完全可以向o6z订购，但不可否认的是CMMI也有很多优秀的地方可以借鉴。那么我对小公司项目管理的看法是一定要精简，做到不是傻瓜都能&lt;br /&gt;够理解并且能够执行，况且很多项目经理（老板）也并不是领域专家。在此我想简单谈谈我对适合小公司的项目管理方案的一些想法&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f22" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f23" style="font-family: 宋体;"&gt;，&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f24" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f25" style="font-family: 宋体;"&gt;所谓基本适合就是80%适合，我要是说100%适合那我是在扯淡，另外20%怎么办？那就像06z所说的那样，靠经验这个王道。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ou5f26" class="0"&gt;&lt;span id="ou5f27" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f28" style="font-family: 宋体;"&gt;首先&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f29" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f30" style="font-family: 宋体;"&gt;要谈的是&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f31" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f32" style="font-family: 宋体;"&gt;需&lt;br /&gt;求这个东西，那么什么是需求？需求就是掏钱买你产品的人一些需要，只要是客户的需要，不管是合理不合理那都是需求。其实很多开发人员都意识需求的重要性，&lt;br /&gt;那么真正去做需求的人有多少呢？需求应该是包括需求开发和需求管理这两个过程，这里有个特别的情况是对于自主研发的项目，&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f33" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f34" style="font-family: 宋体;"&gt;我接触的项目也是这种情况居多，于是&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f35" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f36" style="font-family: 宋体;"&gt;我们认为自己就是客户，所以需求开发做&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f37" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f38" style="font-family: 宋体;"&gt;的&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f39" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f40" style="font-family: 宋体;"&gt;很简单甚至跳过去，结果后期的需求管理非常混乱，我&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f41" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f42" style="font-family: 宋体;"&gt;觉得&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f43" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f44" style="font-family: 宋体;"&gt;既然自己是客户，那就要当好客户这个角色，在做客户时应完全忘却自己是个开发人员&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f45" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f46" style="font-family: 宋体;"&gt;，同样要把需求做全面&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f47" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f48" style="font-family: 宋体;"&gt;。很多教科书上都说应该做需求，但关于怎么做的问题上却和实际情况差别比较大，以下是我关于需求该做什么以及怎么做到一些看法。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ou5f49" class="0"&gt;&lt;span id="ou5f50" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;1&amp;nbsp;&lt;/font&gt;&lt;span id="ou5f51" style="font-family: 宋体;"&gt;需求调研&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ou5f52" class="0"&gt;&lt;span id="ou5f53" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f54" style="font-family: 宋体;"&gt;我觉得需求调研非常的重要，&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f55" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;1&lt;/font&gt;&lt;/span&gt;&lt;span id="ou5f56" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f57" style="font-family: 宋体;"&gt;年前我还打算做一个在线教育服务平台，理念就是淘宝在网上卖商品，我在网上卖教育资源，我提供网上交易场所，签约的老师、学校以及培训机构提供&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f58" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f59" style="font-family: 宋体;"&gt;可交易的&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f60" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f61" style="font-family: 宋体;"&gt;服务，这种服务可以通过视频、音频、在线PPT、文本的形式展现。忙活了好一阵，发现这个市场早就有很多人做了，而且这个市场并不是很好做，首先在网上学习的人有几个？并且先不说前期推广需要海量资金就是所需要的那么些高性能服务器丫也买不起！这件事就此搁浅，&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f62" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f63" style="font-family: 宋体;"&gt;结果&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f64" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f65" style="font-family: 宋体;"&gt;信了马云&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f66" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f67" style="font-family: 宋体;"&gt;的邪&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f68" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f69" style="font-family: 宋体;"&gt;，2年后你&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f70" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f71" style="font-family: 宋体;"&gt;还&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f72" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f73" style="font-family: 宋体;"&gt;想&lt;br /&gt;创业你在创业！我觉得这就是典型的需求调研没做好，没有对用户需求做调查，没有考虑同行竞争，没有考虑可行性！另外还要考虑括行业标准和法律规定，比如前&lt;br /&gt;些时候国家就出台了关于办视频网站的政策，我觉得你丫没有足够的背景就不要往火坑里跳楼。总之根据所做行业情况尽可能的把需求调研做全面，这样才可以保证&lt;br /&gt;项目首先是可以赚钱的。那么文档要写吗？我觉得可以不要正式的文档，小公司的人手本来就不够用，要把主要文档&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f74" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f75" style="font-family: 宋体;"&gt;化工作&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f76" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f77" style="font-family: 宋体;"&gt;集中在重要的环节上，对于需求调研，本来就很杂乱，完全可以记在工作笔记上，放到需求分析的时候整理。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ou5f78" class="0"&gt;&lt;span id="ou5f79" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;2&amp;nbsp;&lt;/font&gt;&lt;span id="ou5f80" style="font-family: 宋体;"&gt;需求分析&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ou5f81" class="0"&gt;&lt;span id="ou5f82" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f83" style="font-family: 宋体;"&gt;为了得到用户的金钱，我们总是在说，用户是上帝，用户永远是对的，尽管背地里在说客户端坏话：“你丫钱给的倒不多，要求还真少，这需求根本不合理，是正常人的逻辑吗？”，如果你想活下去，最终我们还是要想方设法满足用户的要求。&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f84" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f85" style="font-family: 宋体;"&gt;用户&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f86" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f87" style="font-family: 宋体;"&gt;是个外界因素，我们&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f88" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f89" style="font-family: 宋体;"&gt;是&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f90" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f91" style="font-family: 宋体;"&gt;无法控制&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f92" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f93" style="font-family: 宋体;"&gt;的&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f94" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f95" style="font-family: 宋体;"&gt;，&lt;br /&gt;那么我们只有尽可能改进需求分析的方法来尽量减少不必要的麻烦。那么我觉得日本人做法倒是可以借鉴，在有条件的情况下派专人去现场，随时记录关键性的需&lt;br /&gt;求，即使不能去现场也尽可能的获取尽可能多大信息，不要指望开发后去获取什么有价值的东西。那么是否应该做个原型给客户看看？我是觉得这不大合适，因为如&lt;br /&gt;果项目周期短的话，等你做好原型，黄花菜都凉了。但我觉得等到需求做到差不多的时候可以做用户界面，所谓用户界面就是用户接口，是和用户打交道的地方，所&lt;br /&gt;谓一图解千言，有了界面用户会清楚自己所买的东西在未来会是个什么样的东西，再者开发几个有说明性都界面倒是不会暂用很多时间。等到需求确定下来后&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f96" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f97" style="font-family: 宋体;"&gt;就&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f98" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f99" style="font-family: 宋体;"&gt;要整理成文档了，这个是很重要的一步，是做设计时候的重要凭证和依据，这个文档就是用户规格说明书，所谓规格就是有规范的格式和内容。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ou5f100" class="0"&gt;&lt;span id="ou5f101" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;3 &lt;/font&gt;&lt;span id="ou5f102" style="font-family: 宋体;"&gt;需求评审&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ou5f103" class="0"&gt;&lt;span id="ou5f104" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f105" style="font-family: 宋体;"&gt;我&lt;br /&gt;们已经有了较正规的文档了，那么下一步就是召集所有开发人员开会，最好有客户代表参加，尽管我是很厌烦开会，但该开的会还是要开到，因为之前我遇到这种情&lt;br /&gt;况，开发人员根据设计文档写代码，可是他并不知道自己在开发什么，站在自己的角度想一下，如果自己都不确定自己做的东西，即使有再完备的设计，也会对开发&lt;br /&gt;毫无兴趣，只会让自己觉得自己是个代码机器。所以所有人员参加需求评审是让大家知道自己在做一件有意义的事情，自己正在满足社会的需要，自己在为和谐社会&lt;br /&gt;做贡献，即使你从没那么想过，那你敢保证的你的潜意识没那么想过吗？人是要有社会满足感的吧。另外开会前一定要准备关键有价值的议题，据我观察需求评审会&lt;br /&gt;最容易扯到不着边的话题，所以主持人要控制话题，会议控制在2-3个钟头，&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f106" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f107" style="font-family: 宋体;"&gt;最好做成幸运52的形式，所有人员一定要互动起来，&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f108" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f109" style="font-family: 宋体;"&gt;否则&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f110" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f111" style="font-family: 宋体;"&gt;就&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f112" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f113" style="font-family: 宋体;"&gt;变成了&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f114" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f115" style="font-family: 宋体;"&gt;个人演讲&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f116" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f117" style="font-family: 宋体;"&gt;。需求也做了，会也开了，那么要求客户签字吧。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ou5f118" class="0"&gt;&lt;span id="ou5f119" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;4&amp;nbsp;&lt;/font&gt;&lt;span id="ou5f120" style="font-family: 宋体;"&gt;需求管理&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ou5f121" class="0"&gt;&lt;span id="ou5f122" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f123" style="font-family: 宋体;"&gt;需求管理是在开发开始之后进行的，这也是另所有人头疼的一件事，之前做完一个项目后，客户经常打电话找我们，改过来改过去，后&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f124" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f125" style="font-family: 宋体;"&gt;来&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f126" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f127" style="font-family: 宋体;"&gt;我听到电话，血压都要&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f128" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f129" style="font-family: 宋体;"&gt;升&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f130" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f131" style="font-family: 宋体;"&gt;高50个百分点，后来索性就不接电话，客户就在网上找我，搞的我连QQ都不敢登，但躲是躲不掉滴，客户直接打我手机，丫的真烦人，见过难缠的，没见过这么难缠的。后来转念一想，难道这种情况真的不能避免吗？至少是可以大幅度的缓解&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f132" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f133" style="font-family: 宋体;"&gt;的&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f134" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f135" style="font-family: 宋体;"&gt;吧。这就是我们需求管理中的变更管理没做好，&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f136" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f137" style="font-family: 宋体;"&gt;改了哪些地方自己都忘记了，最后是跟着感觉走，拆东墙补西墙。&lt;/span&gt;&lt;/span&gt;&lt;span id="ou5f138" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f139" style="font-family: 宋体;"&gt;在&lt;br /&gt;这里我建议要建立需求跟踪矩阵表，有了这个表我们至少可以对要修改的地方有了依据，迫使我们去调查到底是改什么地方，怎么改，最后改成了什么样。可能你会&lt;br /&gt;说客户需要大幅度修改原有计划，很难跟踪到具体某一项需求，那么我觉得这是由于前期的需求开发没有做好，在后期客户进行实质性的修改的几率是很小的，比如&lt;br /&gt;客户要求我们做个OA系统，最后总不会要我们改成个门户网站吧，在举个例子，在比如你开发一个ERP系统，客户自己的业务流程不会轻易的改变吧，总不至于&lt;br /&gt;把盘点这个业务改成一个报表系统吧。如果真是这样，我们完全有理由告诉客户，你丫乖乖掏银子，我们再给你们开发2期工程，要改，没门！&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ou5f140" class="0"&gt;&lt;span id="ou5f141" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ou5f142" style="font-family: 宋体;"&gt;大家开始拍砖吧，有时间继续……&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p id="kyw7" class="0"&gt;&lt;br id="kyw70"&gt;&lt;span id="kyw71" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="kyw72" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p id="kyw73" class="0"&gt;&lt;br id="kyw74"&gt;&lt;span id="kyw75" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="kyw76" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p id="kyw77" class="0"&gt;很多东西说不清楚.  就需求管理本身,在我们这种环境里面就说不清楚了.  如果直接跳到后面, 当然会死得更惨. 可如何走好第一步呢?  需求跟踪矩阵如何用呢?  呵呵.... 看的都晕. &lt;br id="kyw78"&gt;&lt;/p&gt;&lt;p id="kyw79" class="0"&gt;&lt;br id="kyw710"&gt;&lt;/p&gt;&lt;p id="ekej" class="0"&gt;我之前的想法和你一样，由于很多东西说不清，所以干脆不说，所以我们逃避，可是需求管理是躲不了的，否则就像你说的死得更惨，我也想听听你更好的建议：），就像牛根生所说的，办法总比问题多。&lt;br /&gt;&lt;br id="kyw711"&gt;需求管理难做和做不做是2回事，我觉得只要你认真去做，总会有收获，需求跟踪矩阵怎么用？那要看你要怎么用，变更总要有原因吧，针对变更总得有解决措施吧，你的后续修改工作总得有个依据吧，修改完之后总得有个结果记录吧，附上需求变更表一份。&lt;br /&gt;    &lt;br id="ekej0"&gt;&lt;span id="ekej1" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ekej2" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p id="ekej3" class="0"&gt;&lt;br id="ekej4"&gt;&lt;span id="ekej5" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ekej6" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p id="ekej7" class="0"&gt;&lt;br id="ekej8"&gt;&lt;span id="ekej9" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ekej10" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p id="ekej11" class="0"&gt;&lt;br id="ekej12"&gt;&lt;span id="ekej13" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ekej14" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p id="ekej15" class="0"&gt;&lt;br id="ekej16"&gt;&lt;span id="ekej17" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ekej18" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p id="ekej19" class="0"&gt;&lt;br id="ekej20"&gt;&lt;span id="ekej21" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ekej22" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p id="ekej23" class="0"&gt;&lt;br id="ekej24"&gt;&lt;span id="ekej25" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;span id="ekej26" style="font-family: 宋体;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p id="ekej27" class="0"&gt;&lt;span id="ekej28" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;在上篇文章里，我简要谈了项目管理中的需求开发和管理，那么在这篇文章里就和各位以闲话家常的方式讨论下项目规划和项目监控。项目规划、项目监控其实也是项目管理中比较核心的工作，也是很多开发人员最敏感的话题，因为这两个东西与公司的领导和员工关系都非常的密切。&lt;/font&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p id="ekej29" class="0" style="margin-top: 5pt; margin-bottom: 5pt;"&gt;&lt;span id="ekej30" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;先从我以前的学校说起，以前我们学校有片荒地，当时的领导觉得学校应该搞绿化，于是组织在荒地上植树，不到一年换了一个校长，这位校长觉得学校应该抓体育&lt;br /&gt;运动，决定再造一个足球场，于是把树移走，造了一个足球场，再后来北京奥运会来了，学习为了迎合绿色奥运的理念又开始植树，这就是没有规划和监控的典型例&lt;br /&gt;子，结果是劳民又伤财。当然对于学校来说，有国家财政的支持，有资本这么折腾，可是对于小公司做项目来说，这么折腾几下估计很快就要牺牲了。&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ekej31" class="0" style="margin-top: 5pt; margin-bottom: 5pt;"&gt;&lt;span id="ekej32" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;事实求是的说大多数小公司在这两个方面做得很少有令人的满意的，小公司的老板其实也会意识到公司在项目规划和监控方面做得不咋地，但很少能做到有效的改&lt;br /&gt;进，其实这个也是有很多方面的原因的，以我自作多情的猜测主要有以下两个原因，对于小公司，尽管盈利不是很多，但基本还是可以撑下去的，老板会觉得管他乱&lt;br /&gt;不乱，公司总之每个月还是有盈利的，少就少点吧，多干几年自己的下半辈子基本有别墅有车了，所以比较保守，要是改革吧，万一鸡飞蛋打怎么办？还是本分点&lt;br /&gt;好，小心使得万年船。其实是对项目规划和监控其实需要大量的成本，老板觉得钱应该花在刀刃上，搞这些东西就是在务虚。再者更恶劣的老板有病就乱烧香，就有&lt;br /&gt;想想借助CMMI这个洋玩意治病的，其实很多老板都蛮喜欢CMMI的，CMMI就是假定人就是一个机器的部件，可以替换可以不停的运转，总之管机器总比管&lt;br /&gt;人省心吧，结果是万分的矛盾，银子撒了一大把，收效却甚微，甚至比以前更乱，大家做的都不开心。与其听咨询师们拿什么高深的方法论来瞎掰，不如我们谈点实&lt;br /&gt;际的，想就以下议题来和各位消遣。&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ekej33" class="0" style="margin-top: 5pt; margin-bottom: 5pt;"&gt;&lt;span id="ekej34" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;1&amp;nbsp;工作量估算&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ekej35" class="0" style="margin-top: 5pt; margin-bottom: 5pt;"&gt;&lt;span id="ekej36" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;对于工作量估算很多项目经理（老板）喜欢用数学公式来计算，可能数学公式更加的客观和科学，ok,，看看市面流行的计算方法吧，最常见的是基于代码行的数&lt;br /&gt;学模型，那么这里存在不少问题，工作量估算主要是为了在项目进行中进行有效的项目监控，那么软件开发尚未结束，谁知道最后的代码行有多大？代码经常会被修&lt;br /&gt;改，那么修改的代码算不算？如果算，那么代码修改越多难道能说明工作量越大？代码效率的区别也是很大的，假如一个10行代码可以实现的东西被写成50行，&lt;br /&gt;难道能客观的反映工作量？还有2种比较高级点的方法是基于功能点和COCOMO的方法，那么我想问的是它们的公式中的系数该怎么定？那么不少咨询师忽悠我&lt;br /&gt;说，根据自己的实际情况来定呗，那么我想问的是，算命是迷信，电脑意味着科学，那么用电脑算命算不算迷信?所以我是主张这里还是要靠人的经验来估算，大家&lt;br /&gt;可以在项目周会上对工作量进行充分的估算，在估算时要同时考虑到项目执行的难度，根据经验给出合理的评估。&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ekej37" class="0" style="margin-top: 5pt; margin-bottom: 5pt;"&gt;&lt;span id="ekej38" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;2&amp;nbsp;任务分配&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ekej39" class="0" style="margin-top: 5pt; margin-bottom: 5pt;"&gt;&lt;span id="ekej40" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;大多数的做法是将整个项目划分成一个个可以独立执行的原子任务，这些任务要划分优先级和难度，至少心理有个数，并且每项任务要制定负责人。那么问题就出在&lt;br /&gt;这个任务分配上了，软件开发是一项智力创造的活动，如果按CMMI假设的那样，在分配任务时忽略人的因素是万万不可取的，我就有血的教训，不久之前做一个&lt;br /&gt;ruby的项目，然后开始在公司内部随便抓了几个有点ruby基础的人，也没太顾忌别人的想法。做着做着，觉得他们有点心在曹营心在汉，平时还是抱着本&lt;br /&gt;thinking&amp;nbsp;in&amp;nbsp;java看，做ruby也是在敷衍了事，结果是代码质量不行，需要大规模的修改。当然按理说员工应该服从公司的安排，做一样就要&lt;br /&gt;做好一样，但员工也有员工的规划，你去叫他做他压根就不喜欢的事只能说明管理有问题。&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ekej41" class="0" style="margin-top: 5pt; margin-bottom: 5pt;"&gt;&lt;span id="ekej42" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;另外还有一个普遍性的问题是能者多劳，有个朋友刚进公司动手能力很强，也非常的积极，每次做项目都分给他最难最累的任务，做着做着也就厌倦了，这时老板会&lt;br /&gt;忽悠你说，你能力强，要挑起公司的大梁，以后公司壮大了给你个什么职位，我觉得这就是在扯淡，这就是我经常见到的忽悠式的管理，很多管理手段完全靠人情，&lt;br /&gt;很多人都是在这种环境中被忽悠长大，到最后怎么样？被忽悠了几年还不是另谋高就了，所以指望人情化管理的公司很难长大。我觉得该讲原则的地方就要讲原则，&lt;br /&gt;在任务分配上给能力强的分配少而精的任务，而且要考虑到员工自己的想法，有些人想做java架构师，你叫他做oracle&amp;nbsp;dba就不合适，有些对ui设&lt;br /&gt;计感兴趣，你叫他做系统分析员也不合适，有些人就喜欢搞技术，你硬要叫他做管理也是不合适。&lt;/font&gt;&lt;/span&gt;&lt;span id="ekej43" style=" font-family: &amp;#39;Arial&amp;#39;;"&gt;&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ekej44" class="0" style="margin-top: 5pt; margin-bottom: 5pt;"&gt;&lt;span id="ekej45" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;3&amp;nbsp;进度管理&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ekej46" class="0" style="margin-top: 5pt; margin-bottom: 5pt;"&gt;&lt;span id="ekej47" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;在做进度之前，一项最重要的任务是识别关键任务，很多进度表进行任务安排时将各项任务平均分的特点为觉得极不合适，有些任务比较难处理，而且许多后续任务&lt;br /&gt;依赖于该项任务，那么这项任务就应该配备更精良的人手和充裕的时间，依我的经验80%的时间都是在处理这些20%的关键任务上。这里还有个比较重要的问题&lt;br /&gt;是时间安排，我听很多项目经理说时间安排要尽可能的紧，也就是比预计要靠前，这样员工才有紧迫感。我觉得这是不可取的，首先即使你按原计划进行，八成也是&lt;br /&gt;要要延期的，那么这就会导致项目严重延期，长此以往，项目延期成了家常便饭，不延期反而不正常，于是大家都成了老油条，那么进度表不就是废纸一张，毫无约&lt;br /&gt;束力而言吗！我觉得根据实际情况指定个合理的进度表是比较重要的，或许你会说项目还是在延期，那我觉得是你项目估算没有做好，项目延期在10%左右比较正&lt;br /&gt;常，否则就可以调查是什么原因导致进度滞后，如果是客观原因，以后完全可以延长项目时间，总之一个合理的进度表比较重要。&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ekej48" class="0" style="margin-top: 5pt; margin-bottom: 5pt;"&gt;&lt;span id="ekej49" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;4&amp;nbsp;项目奖金&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ekej50" class="0" style="margin-top: 5pt; margin-bottom: 5pt;"&gt;&lt;span id="ekej51" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;这里牵扯到一个钱的问题，据我了解国内大多小公司很少有项目奖金这么一说，年底给点路费就不错了！国内的大多数项目经理更像是一个技术负责人，根本没有用&lt;br /&gt;钱的权利，我就曾像公司申请项目奖金，结果计划全盘泡汤，给的理由很荒唐，说项目奖金不好分配，给张三多一点吧，李四不爽，反之亦然。我心理暗自想：“你&lt;br /&gt;丫不想给就直说呗！”，这里会导致一个问题，就是“项目经理”凭什么约束成员，大锅饭的道理我也不想再解释了，总之结果就是3个月的项目就得做个5个月，&lt;br /&gt;其实老板的小算盘看似很精明，其实未见得，虽然项目奖金能省就省了，那么工作效率的下降所带来的成本的提高，孰轻孰重？长远一点说，产品质量的下滑导致的&lt;br /&gt;项目维护的成本你计算过吗？依我的经验，3个月的有效工作时间其实也就是1个月，这已经不错了。不过项目奖金的分配确实是个难问题，但有没有项目奖金和分&lt;br /&gt;配合理与否是2码子事吧？由于我也没有能耐申请到项目奖金所以也就没有深入研究这个问题，只得望梅止渴，看看人家华为了，员工根据能力分等级，加上年限、&lt;br /&gt;加班、表现得出个权值来计算。总之现有鸡才能有蛋，这个问题需要更深入的讨论。&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="ekej52" class="0" style="margin-top: 5pt; margin-bottom: 5pt;"&gt;&lt;span id="ekej53" style=" font-family: &amp;#39;宋体&amp;#39;;"&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 先写那么多，有时间继续……&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;      &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-5277687285475933962?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/5277687285475933962/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=5277687285475933962' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/5277687285475933962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/5277687285475933962'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/11/blog-post_18.html' title='小公司如何做项目管理'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-4590739036596030027</id><published>2008-11-18T06:22:00.003-08:00</published><updated>2008-11-18T06:22:59.912-08:00</updated><title type='text'>URL重写</title><content type='html'>       &lt;h1 id="artibodyTitle"&gt;Apache伪静态html(URL Rewrite)设置法&lt;/h1&gt;&lt;br /&gt;    &lt;div id="conauthor"&gt;2007-02-12 10:41作者：出处：天极网责任编辑：龙犊&lt;/div&gt;&lt;br /&gt;&lt;div id="kd7g3" class="topadbg"&gt;&lt;br /&gt;&lt;div id="ad9ad"&gt;&lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;div id="kd7g7" class="guanggao"&gt; &lt;br /&gt;  &lt;br id="kd7g15"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p id="kd7g17"&gt;一 打开 Apache 的配置文件 httpd.conf 。&lt;br id="kd7g18"&gt;二 将#LoadModule rewrite_module modules/mod_rewrite前面的#去掉&lt;br id="kd7g19"&gt;三 在 httpd.conf中添加：&lt;br id="kd7g20"&gt;&amp;lt;IfModule mod_rewrite.c&amp;gt;&lt;br id="kd7g21"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RewriteEngine On&lt;br id="kd7g22"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #RewriteCond %{ENV:SCRIPT_URL} (?:index|dispbbs)[-0-9]+\.html&lt;br id="kd7g23"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RewriteRule ^(.*?(?:index|dispbbs))-([-0-9]+)\.html$ $1.php?__is_apache_rewrite=1&amp;amp;__rewrite_arg=$2&lt;br id="kd7g24"&gt;&amp;lt;/IfModule&amp;gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="kd7g25"&gt;四 要实现asp帖子URL到php帖子的映射，在 第三步的&amp;lt;IfModule mod_rewrite.c&amp;gt;和&amp;lt;/IfModule&amp;gt;之间添加：&lt;br id="kd7g26"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RewriteMap tolowercase int:tolower&lt;br id="kd7g27"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RewriteCond %{QUERY_STRING} (?:boardid|page|id|replyid|star|skin)\=\d+ [NC]&lt;br id="kd7g28"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RewriteRule ^(.*(?:index|dispbbs))\.asp$ $1.php?${tolowercase:%{QUERY_STRING}}&amp;amp;__is_apache_rewrite=1&lt;/p&gt;&lt;br /&gt;&lt;p id="kd7g29"&gt;五 保存httpd.conf并重启Apache。&lt;/p&gt;&lt;p id="kd7g30"&gt;&lt;br id="kd7g31"&gt;&lt;/p&gt;&lt;p id="kd7g32"&gt;&lt;br id="kd7g33"&gt;&lt;/p&gt;&lt;p id="kd7g34"&gt;Url Rewrite Filter 是一个基于java的 URL rewrite 一个包。 使用它后就可以使用一些友好的URL来代替 ?&amp;amp;组成的URL了。 例如可以把 &lt;a id="kd7g35" href="http://www.cngump.com/world/china/guangzhou"&gt;http://www.cngump.com/world/china/guangzhou&lt;/a&gt; 转换为 &lt;a id="kd7g36" href="http://www.cngump.com/world.jsp?country=china&amp;amp;city=guangzhou"&gt;http://www.cngump.com/world.jsp?country=china&amp;amp;city=guangzhou&lt;/a&gt;&lt;br id="kd7g37"&gt;&lt;br /&gt;            步骤如下：&lt;br id="kd7g38"&gt;&lt;br /&gt;            1. 下载和安装 Tomcat&lt;br id="kd7g39"&gt;&lt;br /&gt;            2.&amp;nbsp; 部署一个空白的 Java Web Application.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span id="kd7g40" class="hilite1"&gt;urlrewrite&lt;/span&gt;.war&amp;nbsp;&amp;nbsp;&lt;br id="kd7g41"&gt;&lt;br /&gt;            3.&amp;nbsp; 下载&amp;nbsp; Url Rewrite Filter &lt;a id="kd7g42" href="http://tuckey.org/urlrewrite/"&gt;http://tuckey.org/&lt;span id="kd7g43" class="hilite1"&gt;urlrewrite&lt;/span&gt;/&lt;/a&gt;&lt;br id="kd7g44"&gt;&lt;br /&gt;            4.&amp;nbsp; 解压 下载后的 &lt;span id="kd7g45" class="hilite1"&gt;urlrewrite&lt;/span&gt;filter-2.6.zip 到 TOMCAT_HOME\webapps\&lt;span id="kd7g46" class="hilite1"&gt;urlrewrite&lt;/span&gt;\ 下&lt;br id="kd7g47"&gt;&lt;br /&gt;            5.&amp;nbsp; 修改 web.xml 如下&lt;/p&gt;&lt;br /&gt;            &lt;p id="kd7g48"&gt;&amp;nbsp;&amp;nbsp; ＜?xml version=”1.0″ encoding=”UTF-8″?＞&lt;br id="kd7g49"&gt;&lt;br /&gt;            ＜web-app id=”WebApp_9″ version=”2.4″ xmlns=”&lt;a id="kd7g50" href="http://java.sun.com/xml/ns/j2ee"&gt;http://java.sun.com/xml/ns/j2ee&lt;/a&gt;”&lt;br id="kd7g51"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi=”&lt;a id="kd7g52" href="http://www.w3.org/2001/XMLSchema-instance"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/a&gt;”&lt;br id="kd7g53"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation=”&lt;a id="kd7g54" href="http://java.sun.com/xml/ns/j2ee"&gt;http://java.sun.com/xml/ns/j2ee&lt;/a&gt; &lt;a id="kd7g55" href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&lt;/a&gt;“＞&lt;/p&gt;&lt;br /&gt;            &lt;p id="kd7g56"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ＜display-name＞Url Rewrite＜/display-name＞&lt;/p&gt;&lt;br /&gt;            &lt;p id="kd7g57"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ＜filter＞&lt;br id="kd7g58"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ＜filter-name＞&lt;span id="kd7g59" class="hilite1"&gt;UrlRewrite&lt;/span&gt;Filter＜/filter-name＞&lt;br id="kd7g60"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ＜filter-class＞org.tuckey.web.filters.&lt;span id="kd7g61" class="hilite1"&gt;urlrewrite&lt;/span&gt;.&lt;span id="kd7g62" class="hilite1"&gt;UrlRewrite&lt;/span&gt;Filter＜/filter-class＞&lt;br id="kd7g63"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp; ＜/filter＞&lt;br id="kd7g64"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp; ＜filter-mapping＞&lt;br id="kd7g65"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ＜filter-name＞&lt;span id="kd7g66" class="hilite1"&gt;UrlRewrite&lt;/span&gt;Filter＜/filter-name＞&lt;br id="kd7g67"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ＜url-pattern＞/*＜/url-pattern＞&lt;br id="kd7g68"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp; ＜/filter-mapping＞&lt;br id="kd7g69"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;            &lt;p id="kd7g70"&gt;＜/web-app＞&lt;br id="kd7g71"&gt;&lt;br /&gt;            6. 在更目录新建一个 world.jsp 文件。代码如下：&lt;br id="kd7g72"&gt;&lt;br /&gt;            ＜html＞&lt;br id="kd7g73"&gt;&lt;br /&gt;            &amp;nbsp;＜header＞&lt;br id="kd7g74"&gt;&lt;br /&gt;            &amp;nbsp; ＜title＞world＜/title＞&lt;br id="kd7g75"&gt;&lt;br /&gt;            &amp;nbsp;＜/header＞&lt;br id="kd7g76"&gt;&lt;br /&gt;            &amp;nbsp;＜body＞&lt;br id="kd7g77"&gt;&lt;br /&gt;            &amp;nbsp;＜%&lt;br id="kd7g78"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String country = request.getParameter(”country”);&lt;br id="kd7g79"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String city = request.getParameter(”city”);&lt;br id="kd7g80"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.write(”Country=” + country);&lt;br id="kd7g81"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; out.write(”＜br＞city=” + city);&lt;br id="kd7g82"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp; %＞&lt;/p&gt;&lt;br /&gt;            &lt;p id="kd7g83"&gt;&amp;nbsp;＜/body＞&lt;br id="kd7g84"&gt;&lt;br /&gt;            ＜/html＞&lt;/p&gt;&lt;br /&gt;            &lt;p id="kd7g85"&gt;7. 修改 WEB-INF 下的 &lt;span id="kd7g86" class="hilite1"&gt;urlrewrite&lt;/span&gt;.xml: (使用正则式进行解释)&lt;/p&gt;&lt;br /&gt;            &lt;p id="kd7g87"&gt;＜&lt;span id="kd7g88" class="hilite1"&gt;urlrewrite&lt;/span&gt;＞&lt;br id="kd7g89"&gt;&lt;br /&gt;            ＜rule＞&lt;br id="kd7g90"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp; ＜from＞/world/([0-9]+)/([0-9]+)＜/from＞&lt;br id="kd7g91"&gt;&lt;br /&gt;            &amp;nbsp;&amp;nbsp;&amp;nbsp; ＜to＞/world.jsp?country=$1&amp;amp;city=$2＜/to＞&lt;br id="kd7g92"&gt;&lt;br /&gt;            ＜/rule＞&lt;/p&gt;&lt;br /&gt;            &lt;p id="kd7g93"&gt;＜/&lt;span id="kd7g94" class="hilite1"&gt;urlrewrite&lt;/span&gt;＞&lt;/p&gt;&lt;br /&gt;            &lt;p id="kd7g95"&gt;8.&amp;nbsp; 重新加载 &lt;span id="kd7g96" class="hilite1"&gt;urlrewrite&lt;/span&gt; 后测试:&lt;/p&gt;&lt;br /&gt;            &lt;a id="kd7g97" href="http://localhost:8080/urlrewrite/world/china/guangzhou"&gt;http://localhost:8080/&lt;span id="kd7g98" class="hilite1"&gt;urlrewrite&lt;/span&gt;/world/china/guangzhou&lt;/a&gt;&lt;br id="kd7g99"&gt;&lt;br /&gt;            和&lt;a id="kd7g100" href="http://localhost:8080/urlrewrite/world.jsp?country=china&amp;amp;city=guangzhou"&gt;http://localhost:8080/&lt;span id="kd7g101" class="hilite1"&gt;urlrewrite&lt;/span&gt;/world.jsp?country=china&amp;amp;city=guangzhou&lt;/a&gt;效果一样&lt;p id="kd7g102"&gt;&lt;br id="kd7g103"&gt;&lt;/p&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-4590739036596030027?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/4590739036596030027/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=4590739036596030027' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/4590739036596030027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/4590739036596030027'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/11/url.html' title='URL重写'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-3269429649037678582</id><published>2008-11-18T06:22:00.001-08:00</published><updated>2008-11-18T06:22:41.328-08:00</updated><title type='text'>Acegi框架介绍</title><content type='html'>&lt;br /&gt;					&lt;div class="l2 f16"&gt;&lt;h1&gt;Acegi框架介绍&lt;/h1&gt;&lt;br&gt;&lt;b&gt;&amp;nbsp; 概述&lt;/b&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;【IT168 专稿】&lt;/b&gt;对于任何一个完整的应用系统，完&lt;br /&gt;善的认证和授权机制是必不可少的。Acegi&lt;br /&gt;Security（以下简称Acegi）是一个能为基于Spring的企业应用提供强大而灵活安全访问控制解决方案的框架，Acegi已经成为&lt;br /&gt;Spring官方的一个子项目，所以也称为Spring&lt;br /&gt;Security。它通过在Spring容器中配置一组Bean，充分利用Spring的IoC和AOP功能，提供声明式安全访问控制的功能。虽然，现在&lt;br /&gt;Acegi也可以应用到非Spring的应用程序中，但在Spring中使用Acegi是最自然的方式。 &lt;br&gt;Acegi可以实现业务对象方法级的安全访问控制粒度，它提供了以下三方面的应用程序的安全： &lt;br&gt;&lt;br&gt;&lt;b&gt;? URL资源的访问控制&lt;/b&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如所有用户（包括其名用户）可以访问index.jsp登录页面，而只有授权的用户可以访问/user/addUser.jsp页面。Acegi允许通过正则表达式或Ant风格的路径表达式定义URL模式，让授权用户访问某一URL匹配模式下的对应URL资源。 &lt;br&gt;&lt;br&gt;? &lt;b&gt;业务类方法的访问控制 &lt;/b&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Spring容器中所有Bean的方法都可以被Acegi管理，如所有用户可以调用BbtForum#getRefinedTopicCount()方法，而只有授权用户可以调用BbtForum#addTopic()方法。 &lt;br&gt;&lt;br&gt;&lt;b&gt;? 领域对象的访问控制&lt;/b&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;业务类方法代表一个具体的业务操作，比如更改、删除、审批等，业务类方法访问控制解决了用户是否有调用某种操作的权限，但并未对操作的客体（领域对象）进&lt;br /&gt;行控制。对于我们的论坛应用来说，用户可以调用BbtForum#updateUser(User&lt;br /&gt;user)方法更改用户注册信息，但应该仅限于更改自己的用户信息，也即调用BbtForum#updateUser()所操作的User这个领域对象必&lt;br /&gt;须是受限的。 &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Acegi通过多个不同用途的Servlet过滤器对URL资源进行保护，在请求受保护的URL资源前，Acegi的Servlet过滤器判断用户是否有权访问目标资源，授权者被开放访问，而未未被授权者将被阻挡在大门之外。 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Acegi通过Spring AOP对容器中Bean的受控方法进行拦截，当用户的请求引发调用Bean的受控方法时，Acegi的方法拦截器开始工作，阻止未授权者的调用。&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;对领域对象的访问控制建立在对Bean方法保护的基础上，在最终开放目标Bean方法的执行前，Acegi将检查用户的ACL（Aeccess&lt;br /&gt;Control&lt;br /&gt;List：访问控制列表）是否包含正要进行操作的领域对象，只有领域对象被授权时，用户才可以使用Bean方法对领域对象进行处理。此外，Acegi还可&lt;br /&gt;以对Bean方法返回的结果进行过滤，将一些不在当前用户访问权限范围内的领域对象剔除掉——即传统的数据可视域范围的控制。一般来说，使用Acegi控&lt;br /&gt;制数据可视域未非理想的选择，相反通过传统的动态SQL的解决方案往往更加简单易行。 &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;从本质特性上来说，Servlet过滤器就是最原始的原生态AOP，所以我们可以说Acegi不但对业务类方法、领域对象访问控制采用了AOP技术方案，&lt;br /&gt;对URL资源的访问控制也使用了AOP的技术方案。使用AOP技术方案的框架是令人振奋的，这意味着，开发者可以在应用程序业务功能开发完毕后，轻松地通&lt;br /&gt;过Acegi给应用程序穿上安全保护的“铁布衫”。&lt;br&gt;&lt;b&gt;Acegi体系结构&lt;/b&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;乘飞机前需要通过安检，乘客必须提供身份证以验证其身份。在通过安检进入候机室后，国航、海航、南航等不同航空公司的飞机陆续到达，但你只能登上机票上对&lt;br /&gt;应航班的飞机。在登机后，只能坐在机票对应的座位上——你不能抢占他人的座位，你不能在座位上刻字留念、你不能要求空姐打开机窗…… &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 乘飞机的过程最能体现安全控制的流程，我们可以从中找到身份认证、资源访问控制、领域对象安全控制的对应物：安检对应身份认证，登机对应资源访问控制而按号就座则对应领域对象安全控制。 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Acegi通过两个组件对象完成以上安全问题的处理：AuthenticationManager（认证管理器）、AccessDecisionManager（访问控制管理器），如图 1所示： &lt;br /&gt;&lt;p align="center"&gt;&lt;img alt="" src="http://image.it168.com/cms/2007-5-18/Image/2007518101053.JPG" width="450" height="249"&gt;&lt;br&gt;图 1 Acegi体系结构 &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;SecurityContextHolder是框架级的容器，它保存着和所有用户关联SecurityContext实&lt;br /&gt;例，SecurityContext承载着用户（也称认证主体）的身份信息的权限信息，&lt;br /&gt;AuthenticationManager、AccessDecisionManager将据此进行安全访问控制。 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;SecurityContext的认证主体安全信息在一个HTTP请求线程的多个调用之间是共享的（通过ThreadLocal），但它不能在多个请求之&lt;br /&gt;间保持共享。为了解决这个问题，Acegi将认证主体安全信息缓存于HttpSession中，当用户请求一个受限的资源时，Acegi通过&lt;br /&gt;HttpSessionContextIntegrationFilter将认证主体信息从HttpSession中加载到&lt;br /&gt;SecurityContext实例中，认证主体关联的SecurityContext实例保存在Acegi容器级的&lt;br /&gt;SecurityContextHolder里。当请求结束之后，HttpSessionContextIntegrationFilter执行相反的操&lt;br /&gt;作，将SecurityContext中的认证主体安全信息重新转存到HttpSession中，然后从SecurityContextHolder中清&lt;br /&gt;除对应的SecurityContext实例。通过HttpSession转存机制，用户的安全信息就可以在多个HTTP请求间共享，同时保证&lt;br /&gt;SecurityContextHolder中仅保存当前有用的用户安全信息，其整体过程如图 2所示：&lt;/p&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;img alt="" src="http://image.it168.com/cms/2007-5-22/Image/2007522113014.JPG" width="441" height="385"&gt;&lt;br&gt;图 2 SecurityContext在HttpSession和请求线程间的转交过程 &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;当用户请求一个受限的资源时，AuthenticationManager首先开始工作，它象一个安检入口，对用户身份进行核查，用户必须提供身份认证的&lt;br /&gt;凭证（一般是用户名/密码）。在进行身份认证时，AuthenticationManager将身份认证的工作委托给多个&lt;br /&gt;AuthenticationProvider。因为在具体的系统中，用户身份可能存储在不同的用户信息安全系统中（如数据库、CA中心、LDAP服务&lt;br /&gt;器），不同用户信息安全系统需要不同的AuthenticationProvider执行诸如用户信息查询、用户身份判断、用户授权信息获取等工作。只要&lt;br /&gt;有一个AuthenticationProvider可以识别用户的身份，AuthenticationManager就通过用户身份认证，并将用户的授&lt;br /&gt;权信息放入到SecurityContext中。 &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;当用户通过身份认证后，试图访问某个受限的程序资源时，AccessDecisionManager开始工作。&lt;br /&gt;AccessDecisionManager采用民主决策机制判断用户是否有权访问目标程序资源，它包含了多个AccessDecisionVoter。&lt;br /&gt;在访问决策时每个AccessDecisionVoter都拥有投票权，AccessDecisionManager统计投票结果，并按照某种决策方式根&lt;br /&gt;据这些投票结果决定最终是否向用户开放受限资源的访问。 &lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;重要组件类介绍&lt;/b&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 每个框架都有一些核心的概念，这些概念被固化为类和接口，成为框架的重要组件类。框架的管理类、操作类都在这些组件类的基础上进行操作。在进入Acegi框架的具体学习前，有必要事先了解一下这些承载Acegi框架重要概念的组件类。 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 首先，我们要接触是UserDetails接口，它代表一个应用系统的用户，该接口定义了用户安全相关的信息，如用户名/密码，用户是否有效等信息，你可以根据以下接口方法进行相关信息的获取： &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String getUsername()：获取用户名；&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String getPassword()：获取密码；&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boolean isAccountNonExpired()：用户帐号是否过期；&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; boolean isAccountNonLocked()：用户帐号是否锁定；&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;boolean isCredentialsNonExpired()：用户的凭证是否过期；&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;boolean isEnabled()：用户是否处于激活状态。 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当以上任何一个判断用户状态的方法都返回false时，用户凭证就被视为无效。 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;UserDetails还定义了获取用户权限信息的方法：GrantedAuthority[]&lt;br /&gt;getAuthorities()，GrantedAuthority代表用户权限信息，它定义了一个获取权限描述信息（以字符串表示，如&lt;br /&gt;PRIV_COMMON）的方法：String getAuthority()。 &lt;br /&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;img alt="" src="http://image.it168.com/cms/2007-5-22/Image/200752214189.JPG" width="347" height="131"&gt;&lt;br&gt;图 3 用户和权限 &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;在未使用Acegi之前，我们可能通过类似User、Customer等领域对象表示用户的概念，并在程序中编写相应的用户认证的逻辑。现在，你要做的一&lt;br /&gt;个调整是让原先这些代表用户概念的领域类实现UserDetails接口，这样，Acegi就可以通过UserDetails接口访问到用户的信息了。&amp;nbsp;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;UserDetails可能从数据库、LDAP等用户信息资源中返回，这要求有一种机制来完成这项工作，UserDetailsService正是充当这&lt;br /&gt;一角色的接口。UserDetailsService接口很简单，仅有一个方法：UserDetails&lt;br /&gt;loadUserByUsername(String username) ，这个方法通过用户名获取整个UserDetails对象。 &lt;br&gt;Authentication代表一个和应用程序交互的待认证用户，Acegi从类似于登录页面、Cookie等处获取待认证的用户信息（一般是用户名密码）自动构造Authentication实例。 &lt;/p&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;img alt="" src="http://image.it168.com/cms/2007-5-22/Image/2007522142056.JPG" width="325" height="102"&gt;&lt;br&gt;图 4 Acegi的认证用户 &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Authentication可以通过Object&lt;br /&gt;getPrincipal()获取一个代表用户的对象，这个对象一般可以转换为UserDetails，从中可以取得用户名/密码等信息。在&lt;br /&gt;Authentication被AuthenticationManager认证之前，没有任何权限的信息。在通过认证之后，Acegi通过&lt;br /&gt;UserDetails将用户对应的权限信息加载到Authentication中。Authentication拥有一个&lt;br /&gt;GrantedAuthority[] getAuthorities()方法，通过该方法可以得到用户对应的权限信息。 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;Authentication和UserDetails很容易被混淆，因为两者都有用户名/密码及权限的信息，接口方法也很类似。其实&lt;br /&gt;Authentication是Acegi进行安全访问控制真正使用的用户安全信息的对象，它拥有两个状态：未认证和已认证。UserDetails是代&lt;br /&gt;表一个从用户安全信息源（数据库、LDAP服务器、CA中心）返回的真正用户，Acegi需要将未认证的Authentication和代表真实用户的&lt;br /&gt;UserDetails进行匹配比较，通过匹配比较（简单的情况下是用户名/密码是否一致）后，Acegi将UserDetails中的其它安全信息（如&lt;br /&gt;权限、ACL等）拷贝到Authentication中。这样，Acegi安全控制组件在后续的安全访问控制中只和Authentication进行交&lt;br /&gt;互。 &lt;br&gt;&lt;/p&gt;&lt;p&gt; 由于Acegi对程序资源进行访问安全控制时，一定要事先获取和请求用户对应的Authentication，Acegi框架必须为Authentication提供一个“寓所”，以便在需要时直接从“寓所”把它请出来，作为各种安全管理器决策的依据。 &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;SecurityContextHolder就是Authentication容身的“寓所”，你可以通过&lt;br /&gt;SecurityContextHolder.getContext().getAuthenication()代码获取Authentication。&lt;br /&gt;细心观察一下这句代码，你会发现在SecurityContextHolder和Authentication之间存在一个getContext()中&lt;br /&gt;介，这个方法返回SecurityContext对象。SecurityContext这个半路杀出来的程咬金有什么特殊的用途呢？我们知道&lt;br /&gt;Authentication是用户安全相关的信息，请求线程其它信息（如登录验证码等）则放置在SecurityContext中，构成了一个完整的安&lt;br /&gt;全信息上下文。SecurityContext接口提供了获取和设置Authentication的方法： &lt;br&gt; Authentication getAuthentication() &lt;br&gt; void setAuthentication(Authentication authentication) &lt;br /&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;img alt="" src="http://image.it168.com/cms/2007-5-22/Image/2007522142528.JPG" width="376" height="119"&gt;&lt;br&gt;图 5 认证用户信息存储器&lt;/p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;SecurityContextHolder是Acegi框架级的对象，它在内部通过ThreadLocal为请求线程提供线程绑定的&lt;br /&gt;SecurityContext对象。这样，任何参与当前请求线程的Acegi安全管理组件、业务服务对象等都可以直接通过&lt;br /&gt;SecurityContextHolder.getContext()获取线程绑定的SecurityContext，避免通过方法入参的方式获取用户&lt;br /&gt;相关的SecurityContext。 &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;线程绑定模式对于大多数应用来说是适合的，但是应用本身会创建其它的线程，那么只有主线程可以获得线程绑定SecurityContext，而主线程衍生&lt;br /&gt;出的新线程则无法得到线程绑定的SecurityContext。Acegi考虑到了这些不同应用情况，提供了三种绑定SecurityContext的&lt;br /&gt;模式： &lt;br&gt; SecurityContextHolder.MODE_THREADLOCAL：SecurityContext绑定到主线程，这是默认的模式； &lt;br&gt; SecurityContextHolder.MODE_GLOBAL：SecurityContext绑定到JVM中，所有线程都使用同一个SecurityContext； &lt;br&gt; SecurityContextHolder.MODE_INHERITABLETHREADLOCAL：：SecurityContext绑定到主线程及由主线程衍生的线程中。 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 你可以通过SecurityContextHolder.setStrategyName(String strategyName)方法指定SecurityContext的绑定模式。 &lt;br&gt;&lt;b&gt;用户认证过程&lt;/b&gt; &lt;br&gt;　　Acegi支持多种方式的用户认证：如典型的基于数据库的认证、基于LDAP的认证、基于Yale中心认证等方式。不同的认证环境拥有不同的用户认证方式，现在我们先抛开这些具体的细节，考察一下Acegi对受限资源进行访问控制的典型过程： &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1．你点击一个链接访问一个网页； &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2．浏览器发送一个请求到服务器，服务器判断出你正在访问一个受保护的资源； &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3．如果此时你并未通过身份认证，服务器发回一个响应提示你进行认证——这个响应可能是一个HTTP响应代码，抑或重定向到一个指定页面； &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4．根据系统使用认证机制的不同，浏览器或者重定向到一个登录页面中，或者由浏览器通过一些其它的方式获取你的身份信息（如通过BASIC认证对话框、一个Cookie或一个X509证书）； &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5．浏览器再次将用户身份信息发送到服务器上（可能是一个用户登录表单的HTTP POST信息、也可能是包含认证信息的HTTP报文头）； &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6．服务器判断用户认证信息是否有效，如果无效，一般情况下，浏览器会要求你继续尝试，这意味着返回第3步。如果有效，则到达下一步； &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 7．服务器重新响应第2步所提交的原始请求，并判断该请求所访问的程序资源是否在你的权限范围内，如果你有权访问，请求将得到正确的执行并返回结果。否则，你将收到一个HTTP 403错误，这意味着你被禁止访问。 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Acegi框架里，你可以找到对应以上大多数步骤的类，其中ExceptionTranslationFilter、AuthenticationEntryPoint、AuthenticationProvider以及Acegi的认证机制是其中的代表者。 &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;ExceptionTranslationFilter是一个Acegi的Servlet过滤器，它负责探测抛出的安全异常。当一个未认证用户访问服务器&lt;br /&gt;时，Acegi将引发一个Java异常。Java异常本身对HTTP请求以及如何认证用户是一无所知&lt;br /&gt;的，ExceptionTranslationFilter适时登场，对这个异常进行处理，启动用户认证的步骤（第3步）。如果已认证用户越权访问一个资&lt;br /&gt;源，Acegi也将引发一个Java异常，ExceptionTranslationFilter则将这个异常转换为HTTP&lt;br /&gt;403响应码（第7步）。可见，Acegi通过异常进行通讯，&lt;br&gt;ExceptionTranslationFilter接收这些异常并作出相应的动作。 &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;当ExceptionTranslationFilter通过Java异常发现用户还未认证时，它到底会将请求重定向哪个页面以要求用户提供认证信息呢？&lt;br /&gt;这通过咨询AuthenticationEntryPoint来达到目的——Acegi通过AuthenticationEntryPoint描述登录页&lt;br /&gt;面。 &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;当你的浏览器通过HTTP表单或HTTP报文头向服务器提供用户认证信息时，Acegi需要将这些信息收集到Authentication中，Acegi&lt;br /&gt;用“认证机制”描述这一过程。此时，这个新生成Authentication只包含用户提供的认证信息，但并未通过认证。&lt;br&gt;AuthenticationProvider&lt;br /&gt;负责对Authentication进行认证。AuthenticationProvider究竟如何完成这一过程呢？请回忆一下上节我们所介绍的&lt;br /&gt;UserDetails和UserDetailsService，大多数AuthenticationProvider通过&lt;br /&gt;UserDetailsService获取和未认证的Authentication对应的UserDetails并进行匹配比较来完成这一任务。当用户认&lt;br /&gt;证信息匹配时，Authentication被认为是有效的，AuthenticationProvider进一步将UserDetails中权限、&lt;br /&gt;ACL等信息拷贝到Authentication。 &lt;br&gt;当Acegi通过认证机制收集到用户认证信息并填充好Authentication后，Authentication将被保存到SecurityContextHolder中并处理用户的原始请求（第7步）。 &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 你完全可以抛开Acegi的安全机制，编写自己的Servlet过滤器，使用自己的方案构建Authentication对象并将其放置到SecurityContextHolder中。也许你使用了CMA（Container &lt;br&gt;Managed Authentication：容器管理认证），CMA允许你从ThreadLocal或JNDI中获取用户认证信息，这时你只要获取这些信息并将其转换为Authentication就可以了。 &lt;br&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; 安全对象访问控制 &lt;br&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;Acegi称受保护的应用资源为“安全对象”，这包括URL资源和业务类方法。我们知道在Spring&lt;br /&gt;AOP中有前置增强、后置增强、异常增强和环绕增强，其中环绕增强的功能最为强大——它不但可以在目标方法被访问前拦截调用，还可以在调用返回前改变返回&lt;br /&gt;的结果，甚至抛出异常。Acegi使用环绕增强对安全对象进行保护。 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Acegi通过AbstractSecurityInterceptor为安全对象访问提供一致的工作模型，它按照以下流程进行工作： &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1． 从SecurityContext中取出已经认证过的Authentication（包括权限信息）； &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2． 通过反射机制，根据目标安全对象和“配置属性”得到访问目标安全对象所需的权限； &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3． AccessDecisionManager根据Authentication的授权信息和目标安全对象所需权限做出是否有权访问的判断。如果无权访问，Acegi将抛出AccessDeniedException异常，否则到下一步； &lt;br&gt;4． 访问安全对象并获取结果（返回值或HTTP响应）； &lt;br&gt;5． AbstractSecurityInterceptor可以在结果返回前进行处理：更改结果或抛出异常。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Acegi称受保护的应用资源为“安全对象”，这包括URL资源和业务类方法。我们知道在Spring&lt;br /&gt;AOP中有前置增强、后置增强、异常增强和环绕增强，其中环绕增强的功能最为强大——它不但可以在目标方法被访问前拦截调用，还可以在调用返回前改变返回&lt;br /&gt;的结果，甚至抛出异常。Acegi使用环绕增强对安全对象进行保护。 &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;Acegi通过AbstractSecurityInterceptor为安全对象访问提供一致的工作模型，它按照以下流程进行工作： &amp;nbsp;&amp;nbsp;&amp;nbsp; 1．&lt;br /&gt;从SecurityContext中取出已经认证过的Authentication（包括权限信息）； &amp;nbsp;&amp;nbsp;&amp;nbsp; 2．&lt;br /&gt;通过反射机制，根据目标安全对象和“配置属性”得到访问目标安全对象所需的权限； &amp;nbsp;&amp;nbsp;&amp;nbsp; 3．&lt;br /&gt;AccessDecisionManager根据Authentication的授权信息和目标安全对象所需权限做出是否有权访问的判断。如果无权访&lt;br /&gt;问，Acegi将抛出AccessDeniedException异常，否则到下一步； 4． 访问安全对象并获取结果（返回值或HTTP响应）；&lt;br /&gt;5． AbstractSecurityInterceptor可以在结果返回前进行处理：更改结果或抛出异常。&lt;br /&gt;&lt;p align="center"&gt;&lt;img alt="" src="http://image.it168.com/cms/2007-5-22/Image/2007522143216.JPG" width="450" height="187"&gt;&lt;br&gt;图 6 AbstractSecurityInterceptor工作流程 &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;安全对象和一般对象的区别在于前者通过Acegi的“配置属性”进行了描述，如“/view.jsp=PRIV_COMMON”配置属性就将“&lt;br /&gt;/view.jsp”这个URL资源标识为安全对象，它表示用户在访问/view.jsp时，必须拥有PRIV_COMMON这个权限。配置属性通过&lt;br /&gt;XML配置文件，注解、数据库等方式提供。安全对象通过配置属性表示为一个权限，这样，Acegi就可以根据Authentication的权限信息获知&lt;br /&gt;用户可以访问的哪些安全对象。 &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 根据安全对象的性质以及具体实现技术，AbstractSecurityInterceptor拥有以下三个实现类： &lt;br&gt; FilterSecurityInterceptor：对URL资源的安全对象进行调用时，通过该拦截器实施环绕切面。该拦截器使用Servlet过滤器实现AOP切面，它本身就是一个Servlet过滤器； &lt;br&gt; MethodSecurityInterceptor：当调用业务类方法的安全对象时，可通过该拦截器类实施环绕切面； &lt;br&gt; AspectJSecurityInterceptor：和MethodSecurityInterceptor类似，它是针对业务类方法的拦截器，只不过它通过AspectJ实施AOP切面。&lt;/p&gt;&lt;p&gt;&lt;b&gt;Acegi版本升级的一些重大变化&amp;nbsp;&lt;br&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;Acegi项目开始于2003年，Acegi团队在发布新版本时非常谨慎，在本书写作之时，Acegi最新版本为1.0.3。在此之前Acegi已经发布&lt;br /&gt;了10多个预览版本，由于Acegi框架优异的表现，许多大型应用早在Acegi&lt;br /&gt;1.0正式版本发布之前（2006年5月），就已经采用Acegi框架作为其安全访问控制的解决方案。&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在Acegi社区里，来自世界各地众多优秀的安全领域专家对Acegi的改进和发展献计献策，Acegi团队广泛听取并吸收各种有益的建议，将它们融入到Acegi的框架中，使Acegi成为构建在Spring基础上企业应用的首选安全控制框架。 &lt;br&gt;Acegi 1.0.3版本相比于早期预览版本发生了很大的变化，对于需要进行Acegi版本的项目来说，了解这一变化特别重要。下面，我们列出Acegi的一些重大的升级更新： &lt;br&gt;&lt;br /&gt;包名的更新：在0.9.0及之前的版本中，Acegi采用net.sf.acegisecurity包名前缀，在1.0.0版本之后更改为&lt;br /&gt;org.acegisecurity（Hibernate也走过相同的道路，好在Acegi在正式版本发布之时就完成了这种转变）； &lt;br&gt;&lt;br&gt;&lt;br /&gt;ACL模块的调整：ACL模块发生了重大的调整，Acegi团队接收了社区大量关于ACL模块的反馈意见，重新设计了ACL模块的底层结构，在性能、封装&lt;br /&gt;性、灵活性上得到了质的提升。事实上，Acegi使用org.acegisecurity.acls包代替了原来的&lt;br /&gt;org.acegisecurity.acl包，后者将在后期的版本中删除，由于这种伤筋动骨的变化，将很难兼容原来ACL模块。不过，目前基于新框架的&lt;br /&gt;ACL模块还没有进行充分的测试，Acegi承诺在1.1.0版本发布时提供最终的实现； &lt;br&gt;&lt;br&gt;&lt;br /&gt;删除了ContextHolder及其相关类：在Acegi&lt;br /&gt;0.9版本中，ContextHolder及其相关类被彻底从Acegi项目中删除。ContextHolder可以在多个HTTP请求中共享同一个&lt;br /&gt;ThreadLocal，这和Spring提倡的ThreadLocal只应在同一线程中共享相悖。现在，Acegi使用&lt;br /&gt;SecurityContextHolder替换ContextHolder，它的生命周期是一个HTTP 请求； &lt;br&gt;&lt;br&gt;&lt;br /&gt;使用FilterChainProxy同时代理多个过滤器：在早期的版本中，Acegi通过FilterToBeanProxy将web.xml中的&lt;br /&gt;Servlet过滤器定义转移到Spring容器中。这比直接在web.xml中配置Servlet过滤器要方便一些，但是Acegi框架往往需要定义多&lt;br /&gt;个Servlet过滤器，使web.xml配置文件变得冗长难看。在Acegi&lt;br /&gt;0.8版本中提供FilterChainProxy，它可以同时代理多个Servlet过滤器并保证过滤器的顺序。因此在新版本&lt;br /&gt;中，FilterChainProxy成为推荐的选择。 &lt;br&gt;&lt;br&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 小结&lt;/b&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;Acegi是Spring项目下一个成熟的安全访问控制框架，它允许利用了Spring&lt;br /&gt;IoC的AOP的功能完成安全对象的访问控制。在Acegi框架中，SecurityContextHolder处于非常核心的位置，它是存放认证管理器&lt;br /&gt;用户安全信息SecurityContext的“容器”，SecurityContext保存着用户安全访问控制所需的信息，直接被访问决策管理器使用。&lt;br /&gt;HttpSessionContextIntegrationFilter通过在SecurityContextHolder和HttpSession中&lt;br /&gt;摆渡SecurityContext，使多个请求线程可以共享同一个SecurityContext。 &lt;br&gt;&lt;/p&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;         &lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-3269429649037678582?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/3269429649037678582/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=3269429649037678582' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/3269429649037678582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/3269429649037678582'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/11/acegi_628.html' title='Acegi框架介绍'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-336906432999554349</id><published>2008-11-18T06:21:00.003-08:00</published><updated>2008-11-18T06:21:45.050-08:00</updated><title type='text'>使用Acegi进行身份认证（之一）</title><content type='html'> 使用Acegi进行身份认证（之一）&lt;br&gt;&lt;br&gt;&lt;b&gt;【IT168 技术文档】概述&lt;/b&gt; &lt;br&gt;&lt;br&gt;Acegi是专门为Spring Web应用提供&lt;a href="http://safe.it168.com/" target="_blank" style="color: rgb(0, 0, 0);" title="安全"&gt;安全&lt;/a&gt;保护的开源框架，它通过配置的方式就可以对业已存在的应用实施安全控制。在Acegi实施安全控制之前，必须获取操作者的身份，并进一步获知用户的权限，这样Acegi才可能对应用资源实施安全控制。在本文中，我们将介绍Acegi如何对操作者进行身份认证的内容。 &lt;br&gt;&lt;br&gt;&lt;b&gt;将Acegi集成到Web应用程序中&lt;/b&gt; &lt;br&gt;&lt;br&gt;Acegi&lt;br /&gt;通过多个不同用途的Servlet过滤器截取HTTP请求，实施访问安全的控制。按照传统的方式，我们应该在web.xml配置文件中通&lt;br /&gt;过&amp;lt;filter&amp;gt;定义Servlet过滤器并使用&amp;lt;filter-mapping&amp;gt;元素定义过滤器对应的URL匹配模式。 &lt;br&gt;&lt;br&gt;由于这些过滤器需要Spring容器中其它Bean的支持完成访问权限控制，最原始的方式是在过滤器中通过硬编码的方式访问Spring容器中的Bean： &lt;br&gt;&lt;br&gt;WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext); &lt;br&gt;FooBean foo = (FooBean)ctx.getBean(“foo”); &lt;br&gt;&lt;br&gt;这种硬编码的方式显然不太方便，如何让过滤器既能够正确工作又能享受到Spring IoC的好处呢？Acegi通过“过滤器代理”来解决这个问题。 &lt;br&gt;&lt;br&gt;&lt;b&gt;代理Acegi的过滤器 &lt;br&gt;&lt;/b&gt;&lt;br&gt;org.acegisecurity.util.FilterToBeanProxy&lt;br /&gt;使用Spring容器中的Bean代理过滤器，FilterToBeanProxy是一个标准的Servlet过滤器。在内部&lt;br /&gt;FilterToBeanProxy通过WebApplicationContext访问Spring容器，并将过滤器处理逻辑委托给一个Spring容&lt;br /&gt;器中的Bean。这样，我们就可以在web.xml中定义FilterToBeanProxy，声明过滤器匹配的URL模式，并在Spring容器中充分&lt;br /&gt;利用IoC进行定义委托的Bean。 &lt;br&gt;&lt;br&gt;FilterToBeanProxy支持两个初始化参数：&lt;br&gt;&lt;br&gt;l&lt;br /&gt;targetClass：委托Bean的全限定类名，委托类必须实现过滤器接口。你必须在Spring容器中至少定义一个该类的Bean，否则将抛出异&lt;br /&gt;常。当Spring容器中拥有多个该委托类的Bean时，FilterToBeanProxy选择第一个委托类的Bean（这种情况应该避免）； &lt;br&gt;&lt;br&gt;l targetBean：当然你也可以通过一个Bean名指定委托的Bean。&lt;br&gt;图 1说明了Acegi是如何通过FilterToBeanProxy将Servlet容器和Spring容器结合起来共同定义一个功能齐备的Servlet过滤器的： &lt;img alt="" src="http://image.it168.com/cms/2007-10-8/Image/2007108163221.jpg" width="443" height="438"&gt;&lt;br&gt;图 1 通过过滤器代理将Servlet容器和Spring容器结合起来 &lt;br&gt;&lt;br&gt;org.acegisecurity.securechannel.ChannelProcessingFilter&lt;br /&gt;是一个Acegi的过滤器，它负责处理安全通道的转换。如果直接在web.xml中定义ChannelProcessingFilter，我们将很难在不&lt;br /&gt;编写代码的情况下，使其引用Spring容器中的Bean。借助FilterToBeanProxy的帮助，我们就可以放心地在Spring容器中配置&lt;br /&gt;ChannelProcessingFilter，得到一个完整可用实例。当然ChannelProcessingFilter是需要服务于特定URL请&lt;br /&gt;求的，而过滤器URL映射只能在Servlet容器的web.xml中定义，这个工作由FilterToBeanProxy对应的&amp;lt;filter-&lt;br /&gt;mapping&amp;gt;元素完成。 &lt;br&gt;&lt;br&gt;如果我们将Servlet容器和Spring容器比作牛郎和织女，那么&lt;br /&gt;FilterToBeanProxy无疑就是鹊桥了。事实上，Acegi本身并不依赖于FilterToBeanProxy，它是一种充分利用&lt;br /&gt;Spring容器依赖注入好处配置Servlet过滤器的一个方法，正因为如此，所以Acegi社区中有很多开发者建议&lt;br /&gt;FilterToBeanProxy应该从Acegi中剥离出来，将其加入到Spring的核心类库中。&lt;br&gt;&lt;div class="memo"&gt;&lt;div id="1"&gt;&lt;b&gt;使用代理过滤器链对处理HTTP请求&lt;/b&gt; &lt;br&gt;&lt;br&gt;Acegi通过众多的过滤器完成不同&lt;a href="http://safe.it168.com/" target="_blank" style="color: rgb(0, 0, 0);" title="安全"&gt;安全&lt;/a&gt;控&lt;br /&gt;制的任务，在前面我们提到了三个过滤器：HttpSessionContextIntegrationFilter、&lt;br /&gt;ExceptionTranslationFilter和ChannelProcessingFilter。除此以外，还有LogoutFilter、&lt;br /&gt;AuthenticationProcessingFilter等不下10个的过滤器。 &lt;br&gt;&lt;br&gt;当需要配置多个Servlet过滤器时，虽然&lt;br /&gt;我们可以通过FilterToBeanProxy分别进行配置，但这将导致冗长难看的web.xml，同时还需要小心谨慎地通过过滤器的配置顺序保证它们&lt;br /&gt;的调用顺序。为了解决这个问题，Acegi在0.8版本中添加了一个org.acegisecurity.util.FilterChainProxy。&lt;br /&gt;FilterChainProxy可以同时指定多个过滤器并将它们组成一个过滤器链，而FilterToBeanProxy只要将代理目标设置为&lt;br /&gt;FilterChainProxy就可以了。来看下面的配置： &lt;br&gt;&lt;br&gt;代码清单 1 web.xml &lt;br&gt;&lt;pre style="border: 1px solid black; padding: 4px; background-color: rgb(237, 237, 237);"&gt;&lt;div&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;web&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;app&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;context&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;param&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ①指定Spring配置文件&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;param&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;contextConfigLocation&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;param&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;param&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;classpath:applicationContext.xml,&lt;br&gt;classpath:applicationContext&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;acegi&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;plugin.xml&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;param&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;context&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;param&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;filter&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;②将过滤器委托给FilterChainProxy&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;filter&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;AcegiFilterChainProxy&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;filter&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;filter&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;org.acegisecurity.util.FilterToBeanProxy&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;filter&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;init&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;param&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;param&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;targetClass&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;param&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;param&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;org.acegisecurity.util.FilterChainProxy&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;param&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;init&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;param&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;filter&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;filter&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;mapping&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;③对所有的URL进行过滤&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;filter&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;AcegiFilterChainProxy&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;filter&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;url&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;pattern&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;/*&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&amp;lt;/url-pattern&amp;gt;&lt;br&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br&gt;&amp;lt;listener&amp;gt;&lt;br&gt;&amp;lt;listener-class&amp;gt;&lt;br&gt;org.springframework.web.context.ContextLoaderListener&lt;br&gt;&amp;lt;/listener-class&amp;gt;&lt;br&gt;&amp;lt;/listener&amp;gt;&lt;br&gt;…&lt;br&gt;&amp;lt;/web-app&amp;gt; &lt;/span&gt;&lt;/div&gt;&lt;br&gt;&lt;/pre&gt;在web.xml中我们首先需要定义Spring的配置文件，以便将Spring容器集成到Servlet容器中。紧接着，我们定义一个&lt;br /&gt;FilterToBeanProxy的过滤器拦截所有URL请求并委托给FilterChainProxy进行处理。FilterChainProxy在&lt;br /&gt;Spring容器中定义如下所示： &lt;br&gt;&lt;br&gt;代码清单 2 applicationContext-acegi-plugin.xml &lt;br&gt;&lt;pre style="border: 1px solid black; padding: 4px; background-color: rgb(237, 237, 237);"&gt;&lt;div&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;beans&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bean id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;filterChainProxy&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.acegisecurity.util.FilterChainProxy&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;①目标委托的Bean&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;filterInvocationDefinitionSource&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;CONVERT_URL_TO_UPPERCASE_BEFORE_COMPARISON&lt;br&gt;PATTERN_TYPE_APACHE_ANT&lt;br&gt;②多个过滤器组成的过滤器链&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;/*&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;*=channelProcessingFilter,httpSessionContextIntegrationFilter,logoutFilter&lt;br&gt;&amp;lt;/value&amp;gt;&lt;br&gt;&amp;lt;/property&amp;gt;&lt;br&gt;&amp;lt;/bean&amp;gt;&lt;br&gt;&amp;lt;bean id="channelProcessingFilter" ③过滤器链中的过滤器(1)&lt;br&gt;class="org.acegisecurity.securechannel.ChannelProcessingFilter"&amp;gt;&lt;br&gt;…&lt;br&gt;&amp;lt;/bean&amp;gt;&lt;br&gt;&amp;lt;bean id="httpSessionContextIntegrationFilter" ④过滤器链中的过滤器(2)&lt;br&gt;class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"&amp;gt;&lt;br&gt;…&lt;br&gt;&amp;lt;/bean&amp;gt;&lt;br&gt;…&lt;br&gt;&amp;lt;/beans&amp;gt; &lt;/span&gt;&lt;/div&gt;&lt;br&gt;&lt;/pre&gt;在①处定义的FilterChainProxy&lt;br /&gt;Bean是web.xml的FilterToBeanProxy的委托目标。FilterChainProxy通过&lt;br /&gt;filterInvocationDefinitionSource定义多个相互链接的过滤器，如②所示。这些过滤器以逗号分隔，它表示web.xml中&lt;br /&gt;定义的匹配URL(/*)请求将分别通过channelProcessingFilter、&lt;br /&gt;httpSessionContextIntegrationFilter及logoutFilter这三个过滤器的拦截处理。这个过滤器链通过过滤器对&lt;br /&gt;应的Bean名字（如③和④）进行定义，过滤器都实现了javax.servlet&lt;br /&gt;.Filter接口。你完全可以参照实例方式定义多组滤器链，以便处理不同URL请求。不过，在一般情况下，你只要配置一个过滤器链就可以了。&lt;br&gt;&lt;br&gt;filterInvocationDefinitionSource属性由两类信息组成：其一是指令信息，如&lt;br&gt;&lt;br&gt;CONVERT_URL_TO_UPPERCASE_BEFORE_COMPARISON&lt;br /&gt;表示判断URL匹配时，首先将URL转变为大写的格式，如果设置为&lt;br /&gt;CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON则表示比较前事先转换为小写的形式。而&lt;br /&gt;PATTERN_TYPE_APACHE_ANT表示使用Ant路径风格进行匹配URL的描述，如果不提供这个指令，Acegi使用正则表达式来解析&lt;br /&gt;URL路径映射。&lt;/div&gt;&lt;div id="ParagraphCount"&gt;1&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;			&lt;br&gt;&lt;div id="1"&gt;&lt;p&gt;&lt;b&gt;身份认证管理&lt;/b&gt; &lt;br&gt;&lt;br&gt;使用Acegi保护应用程序的第一步是根据用户提供的认证信息进行身份认证，以确定用户的身份，获取对应的权限信息，准备好Authentication。通过认证的Authentication拥有权限信息，它是Acegi进行后续&lt;a href="http://safe.it168.com/" target="_blank" style="color: rgb(0, 0, 0);" title="安全"&gt;安全&lt;/a&gt;对象访问安全控制的依据。 &lt;br&gt;&lt;br&gt;Acegi&lt;br /&gt;对所有类型安全对象的访问控制机制基本相同：判断Authentication是否已经包含访问安全对象所需的权限。但Acegi进行身份认证的方式则多&lt;br /&gt;姿多彩、五花八门，身份认证方式的多样性源于认证系统的多样性。由于篇幅所限，不可能面面俱到的逐一讲解所有的认证方式，我们将以最常见的基于数据库的认&lt;br /&gt;证方式并对其它的认证方式进行简单的概述。 &lt;br&gt;&lt;br&gt;&lt;b&gt;基于&lt;a href="http://product.it168.com/list/b/0205_1.shtml" target="_blank" style="color: rgb(0, 0, 0);" title="内存"&gt;内存&lt;/a&gt;&lt;a href="http://storage.it168.com/" target="_blank" style="color: rgb(0, 0, 0);" title="存储"&gt;存储&lt;/a&gt;用户信息的身份认证&lt;/b&gt; &lt;br&gt;&lt;br&gt;如果你开发的系统仅有少数几个固定的用户，且用户信息管理的功能很简单，这时你可以将用户直接保存在配置文件中，在系统启动将使用户信息常驻于内存中。下面，我们就从这个最简单的身份认证方式出发开始学习Acegi实际应用的征程。 &lt;br&gt;代码清单 3 applicationContext-acegi-plugin.xml &lt;br&gt;身份认证过滤器 &lt;/p&gt;&lt;pre style="border: 1px solid black; padding: 4px; background-color: rgb(237, 237, 237);"&gt;&lt;div&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;beans&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bean id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;filterChainProxy&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.acegisecurity.util.FilterChainProxy&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;filterInvocationDefinitionSource&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;…&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;/*&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;*=authenticationProcessingFilter ①使用认证处理过滤器处理匹配的URL&lt;br&gt;&amp;lt;/value&amp;gt;&lt;br&gt;&amp;lt;/property&amp;gt;&lt;br&gt;&amp;lt;/bean&amp;gt;&lt;br&gt;&amp;lt;bean id="authenticationProcessingFilter" ②认证处理过滤器&lt;br&gt;class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"&amp;gt;&lt;br&gt;②-1过滤器处理的URL&lt;br&gt;&amp;lt;property name="filterProcessesUrl" value="/j_acegi_security_check"/&amp;gt;&lt;br&gt;&amp;lt;property name="defaultTargetUrl" value="/main.jsp"/&amp;gt; ②-2认证成功后转向的URL&lt;br&gt;②-3认证失败后转向的URL&lt;br&gt;&amp;lt;property name="authenticationFailureUrl" value="/index.jsp?login_error=1"/&amp;gt;&lt;br&gt;&amp;lt;/bean&amp;gt;&lt;br&gt;&amp;lt;/beans&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;首先，在①处通过FilterChainProxy定义了仅包含一个authenticationProcessingFilter的过滤器链。这&lt;br /&gt;个过滤器链匹配于所有URL的请求，换句话说，authenticationProcessingFilter有机会对所有URL请求进行拦截处理，而在&lt;br /&gt;这所有这些URL请求中，究竟哪个URL请求才是用户身份认证的请求呢？如果你心中也拥有这个疑问，则说明你正走在正确的理解问题的思路上。 &lt;br&gt;&lt;br&gt;authenticationProcessingFilter&lt;br /&gt;在②-1、2、3处，定义了一些URL，它们分别对应身份认证请求的URL、认证成功后转向的URL以及认证失败后转向的URL。其中②-1处的&lt;br /&gt;filterProcessesUrl属性表示这个URL是用户提交身份信息并要求进行身份认证的HTTP请求（一般是一个包含用户名/密码的表单&lt;br /&gt;HTTP&lt;br /&gt;POST请求），“/j_acegi_security_check”是默认的设置，之所以在此显式给出设置值，是为了说明你可以根据实际需要进行调整。&lt;br /&gt;&lt;br&gt;&lt;br&gt;现在，authenticationProcessingFilter已经知道了申请进行用户身份认证URL，但它如何知道这个HTTP&lt;br /&gt;请求分别通过什么参数代表用户名和密码呢？Acegi框架规定必须使用j_username和j_password作为用户名和密码的HTTP参数名。这&lt;br /&gt;两个参数名是固定的，Acegi不允许对此进行配置，不过这种约定俗成而非事事配置的风格正渐渐成为流行的设计模式。 &lt;br&gt;&lt;br&gt;我们来看一下提供用户名/密码输入表单的登录页面： &lt;br&gt;代码清单 4 index.jsp：登录页面&lt;/p&gt;&lt;pre style="border: 1px solid black; padding: 4px; background-color: rgb(237, 237, 237);"&gt;&lt;div&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;@ page contentType&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;text/html;charset=UTF-8&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;@ taglib prefix&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;c&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; uri&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;http://java.sun.com/jsp/jstl/core&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;html&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;body&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;c:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; test&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;${not empty param.login_error}&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ①&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;font color&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;red&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;用户名或密码错误。&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;font&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;c:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;②处理用户身份认证服务所对应的URL&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;form name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;form1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; method&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;post&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; action&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;c:url value=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;j_acegi_security_check&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;用户名：&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;input type&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;text&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;j_username&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;br&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;③用户名的参数名&lt;br&gt;密 码：&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;input type&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;password&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;j_password&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;br&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;④用户密码的参数名&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;input type&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;submit&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;登录&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;form&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;body&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;html&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;/div&gt;&lt;br&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;②处对应代码清单&lt;br /&gt;3中②-1处的设置值，它表示处理用户身份认证服务所在的URL，而③和④是Acegi规定的承载用户名、密码的参数名。当这个表单提交后&lt;br /&gt;authenticationProcessingFilter将从请求中抽取j_username和j_password参数的值，两者组成了代表请求&lt;br /&gt;认证的用户信息，Acegi使用这个信息构造Authenticaion实例，并封装成SecurityContext放入到&lt;br /&gt;SecurityContextHolder中，然后启动用户身份认证的流程。当认证成功后，页面转向代码清单&lt;br /&gt;3中②-2处所定义的/main.jsp，如果认证失败则转向代码清单&lt;br /&gt;3中②-3处所定义的/index.jsp?login_error=1。由于登录失败后也转向index.jsp页面，所以代码清单&lt;br /&gt;4的①处专门对此进行了处理，当发现请求参数包含login_error时，打出一行提示登录失败的信息。&lt;br&gt;&lt;br&gt;现在，我们已经了解了&lt;br /&gt;authenticationProcessingFilter从何处获取需要进行认证的用户信息，并对认证成功和失败后的转向进行了定义。那么&lt;br /&gt;authenticationProcessingFilter究竟如何对用户信息（用户名/密码）的合法性进行认证呢？&lt;br&gt;&lt;br&gt;authenticationProcessingFilter其实只负责获取需要认证的用户信息并根据结果完成页面转向，它相当于一个客户受理的窗口，真正的用户身份认证工作则交由后台的AuthenticationManager完成。 &lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;p&gt;下面，我们为authenticationProcessingFilter注入AuthenticationManager，后者将完成具体的身份认证工作： &lt;br&gt;代码清单 5 applicationContext-acegi-plugin.xml &lt;br&gt;认证管理器的配置 &lt;/p&gt;&lt;pre style="border: 1px solid black; padding: 4px; background-color: rgb(237, 237, 237);"&gt;&lt;div&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;beans&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;…&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bean id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;authenticationProcessingFilter&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.acegisecurity.ui.webapp.AuthenticationProcessingFilter&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;filterProcessesUrl&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/j_acegi_security_check&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;defaultTargetUrl&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/main.jsp&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;authenticationFailureUrl&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/index.jsp?login_error=1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;①注入认证管理器&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;authenticationManager&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ref&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;authenticationManager&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bean&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;②认证管理器&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bean id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;authenticationManager&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.acegisecurity.providers.ProviderManager&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;providers&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;list&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;②&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;1使用基于DAO的认证提供者提供认证服务&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;ref local&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;daoAuthenticationProvider&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;list&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bean&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bean id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;daoAuthenticationProvider&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ③基于DAO的认证提供者&lt;br&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.acegisecurity.providers.dao.DaoAuthenticationProvider&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;③&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;1根据用户名获取系统中真实UserDetails 对象的服务类&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;userDetailsService&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ref&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;userDetailsService&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bean&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;④ 该服务类根据缓存在&lt;a href="http://product.it168.com/list/b/0205_1.shtml" target="_blank" style="color: rgb(0, 0, 0);" title="内存"&gt;内存&lt;/a&gt;中的用户信息列表获取userDetails对象&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bean id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;userDetailsService&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.acegisecurity.userdetails.memory.InMemoryDaoImpl&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;userMap&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ④&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;1用户信息&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;john&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;john,PRIV_COMMON,PRIV_1&lt;br&gt;tom&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;tom,PRIV_COMMON,PRIV_1,PRIV_2&lt;br&gt;peter&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;peter,disabled,PRIV_COMMON,PRIV_1&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bean&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;beans&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;/div&gt;&lt;br&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;在①处，我们为authenticationProcessingFilter注入了一个AuthenticationManager Bean。AuthenticationManager有两个实现类： &lt;br&gt;l MockAuthenticationManager：这个实现类用于开发时的测试环境，它将所有待认证的用户标志为有效有户； &lt;br&gt;l ProviderManager：该实现类将用户身份认证的工作委托给多个提供者来完成。 &lt;br&gt;&lt;br&gt;这&lt;br /&gt;里，我们使用ProviderManager来定义一个AuthenticationManager&lt;br /&gt;Bean，如②所示。可以通过ProviderManager的providers属性配置多个认证提供者，认证提供者必须实现&lt;br /&gt;org.acegisecurity.providers.AuthenticationProvider接口。身份认证的多样性通过&lt;br /&gt;AuthenticationProvider接口实现类的多样性体现出来，Acegi针对不同的&lt;a href="http://safe.it168.com/" target="_blank" style="color: rgb(0, 0, 0);" title="安全"&gt;安全&lt;/a&gt;系统提供了10多个不同的认证提供者。这些不同的认证提供者在表 1中进行说明：&amp;nbsp;&lt;br&gt;&lt;img alt="" src="http://image.it168.com/cms/2007-10-8/Image/2007108164424.jpg" width="565" height="526"&gt;&lt;br&gt;这里，我们使用DaoAuthenticationProvider，在②-1所示。它负责从数据库或其它保存用户信息的媒介中获取用户信息进行认证。 &lt;br&gt;&lt;br&gt;DaoAuthenticationProvider&lt;br /&gt;首先从SecurityContextHolder的Authentication中得到待认证的用户名，并根据该用户名获取保存在数据库或其它媒介中代&lt;br /&gt;表真正系统用户的UserDetails对象。紧接着比较Authentication和UserDetails的匹配关系（如看密码是否相等），如果两&lt;br /&gt;者匹配，认证成功，并将UserDetails的权限信息将拷贝到Authentication中。如果不匹配，认证将失败。&lt;br&gt;&lt;br&gt;DaoAuthenticationProvider通过UserDetailsService完成UserDetails的获取工作，根据&lt;a href="http://storage.it168.com/" target="_blank" style="color: rgb(0, 0, 0);" title="存储"&gt;存储&lt;/a&gt;用户信息媒介的不同，Acegi提供了两个UserDetailsService的实现类： &lt;br&gt;&lt;br&gt;l InMemoryDaoImpl：该实现类负责从内存中获取用户的信息，它允许通过UserMap或Properties直接在Spring配置文件中定义系统用户信息。 &lt;br&gt;&lt;br&gt;l JdbcDaoImpl：该实现类从数据库中获取用户的信息。我们将在下一节讨论该实现类的使用方法。 &lt;br&gt;&lt;br&gt;在&lt;br /&gt;这里，我们使用InMemoryDaoImpl获取UserDetails，如③-1所示并通过userMap属性定义系统用户信息，如④-1所示。&lt;br /&gt;userMap属性的类型为UserMap，Acegi已经向Spring注册了对应的编辑器，所以我们可以通过格式化的字符串为UserMap类型的属&lt;br /&gt;性提供配置值。在④-1处，我们提供了几行键值对的配置值，每一行代表一个用户及其对应的权限信息。下面我们通过图&lt;br /&gt;2来了解代表一个用户的字符串的格式： &lt;br&gt;&lt;br&gt;&lt;img alt="" src="http://image.it168.com/cms/2007-10-8/Image/200710816427.jpg" width="325" height="106"&gt;&lt;br&gt;&lt;img class="FCK__Anchor" src="http://cms.it168.com/fckeditor/editor/images/spacer.gif" width="1" height="1"&gt;8 &lt;span style="font-family: 宋体;"&gt;用户配置信息&lt;/span&gt;&lt;br&gt;&lt;br&gt;我&lt;br /&gt;们通过④-1定义了三个用户，john、tom和peter，它们对应的密码和用户名相同。其中john和tom是激活的用户，而peter用户处于非激&lt;br /&gt;活状态。john和peter都拥有PRIV_COMMON,PRIV_1权限，而tom额外拥有PRIV_2的权限。 &lt;br&gt;&lt;br&gt;如果用户数比较多，在Spring中直接进行配置未免不太雅观，这时，你可以将用户信息转移到一个属性文件中，并通过userProperties进行加载： &lt;br&gt;&lt;br&gt;&amp;lt;bean id="userDetailsService" &lt;br&gt;&lt;br&gt;class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl"&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;property name="userProperties"&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;bean class="org.springframework.beans.factory.config.PropertiesFactoryBean"&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;property name="location" value="/WEB-INF/users.properties" /&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;/bean&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;/property&amp;gt; &lt;br&gt;&lt;br&gt;&amp;lt;/bean&amp;gt; &lt;br&gt;&lt;br&gt;users.properties文件内容的格式和刚才我们介绍的方式相同，既每一个用户对应一行格式化配置串。 &lt;br&gt;&lt;br&gt;通过以上分析后，我们可以理出参与用户身份认证所涉及到4个Bean，它们之间的关系可通过图 9来描述： &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img alt="" src="http://image.it168.com/cms/2007-10-8/Image/2007108164146.jpg" width="264" height="247"&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;图 9 基于内存用户信息认证的主要Bean之间的关系 &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;我们知道，大部分应用系统的用户信息并非一个小小的属性&lt;br /&gt;文件可以应付的，它们一般保存在数据库中。InMemoryDaoImpl存在的更多意义在于方便程序测试——你可以不依赖外部数据库环境完成测试。在生&lt;br /&gt;产环境下，我们应该使用JdbcDaoImpl这个UserDetailsService实现类从数据库中获取UserDetails。 &lt;br&gt;&lt;/p&gt;&lt;div id="1"&gt;&lt;b&gt;基于数据库&lt;a href="http://storage.it168.com/" target="_blank" style="color: rgb(0, 0, 0);" title="存储"&gt;存储&lt;/a&gt;用户信息的认证&lt;/b&gt; &lt;br&gt;&lt;br&gt;使用JdbcDaoImpl和InMemoryDaoImpl类似，它们的基本原理都是根据Authentication中待认证的用户名查询出代表真实系统用户的UserDetails对象。只不过，InMemoryDaoImpl通过查询驻留于&lt;a href="http://product.it168.com/list/b/0205_1.shtml" target="_blank" style="color: rgb(0, 0, 0);" title="内存"&gt;内存&lt;/a&gt;中的格式化用户信息列表完成的，而JdbcDaoImpl则通过查询数据库达到目的。 &lt;br&gt;&lt;br&gt;在介绍JdbcDaoImpl的具体使用之前，我们先在数据库中创建用户信息表和用户权限表，并初始化一些测试的用户数据： &lt;br&gt;&lt;br&gt;代码清单 6 创建用户及权限的SQL脚本 &lt;br&gt;&lt;pre style="border: 1px solid black; padding: 4px; background-color: rgb(237, 237, 237);"&gt;&lt;div&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;CREATE TABLE T_USER ( ①用户信息表 &lt;br&gt;&lt;br&gt;USER_ID INTEGER NOT NULL AUTO_INCREMENT, &lt;br&gt;&lt;br&gt;USERNAME VARCHAR(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;30&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) NOT NULL, &lt;br&gt;&lt;br&gt;PASSWORD VARCHAR(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;30&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) DEFAULT NULL, &lt;br&gt;&lt;br&gt;STATUS TINYINT(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) NOT NULL DEFAULT '&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;', &lt;br&gt;&lt;br&gt;PRIMARY KEY (`USER_ID`), &lt;br&gt;&lt;br&gt;UNIQUE KEY `USERNAME` (`USERNAME`) &lt;br&gt;&lt;br&gt;); &lt;br&gt;&lt;br&gt;CREATE TABLE T_USER_PRIV (②用户权限表 &lt;br&gt;&lt;br&gt;USER_ID INTEGER NOT NULL DEFAULT '&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;', &lt;br&gt;&lt;br&gt;PRIV_NAME VARCHAR(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;30&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) DEFAULT NULL, &lt;br&gt;&lt;br&gt;PRIMARY KEY (USER_ID, PRIV_NAME) &lt;br&gt;&lt;br&gt;); &lt;br&gt;&lt;br&gt;INSERT INTO T_USER (USER_ID, USERNAME, PASSWORD, STATUS) VALUES ③用户数据 &lt;br&gt;&lt;br&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,'tom','tom',&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;), &lt;br&gt;&lt;br&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,'john','john',&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;); &lt;br&gt;&lt;br&gt;INSERT INTO T_USER_PRIV (USER_ID, PRIV_NAME) VALUES ④用户授权表 &lt;br&gt;&lt;br&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,'PRIV_1'), &lt;br&gt;&lt;br&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,'PRIV_2'), &lt;br&gt;&lt;br&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,'PRIV_COMMON'), &lt;br&gt;&lt;br&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,'PRIV_1'), &lt;br&gt;&lt;br&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;,'PRIV_COMMON'); &lt;br&gt;&lt;br&gt;COMMIT; &lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;你可以简单地运行随书光盘的chapter17/schema/mysql/db.sql脚本文件完成用户&lt;a href="http://safe.it168.com/" target="_blank" style="color: rgb(0, 0, 0);" title="安全"&gt;安全&lt;/a&gt;相关信息表的创建工作。 &lt;br&gt;&lt;br&gt;下面，我们用JdbcDaoImpl替换InMemoryDaoImpl，从数据库中获取UserDetails对象，其代码如代码清单 7所示： &lt;br&gt;&lt;br&gt;代码清单 7 applicationContext-acegi-plugin.xml &lt;br&gt;&lt;br&gt;基于数据库存储的用信息获取 &lt;pre style="border: 1px solid black; padding: 4px; background-color: rgb(237, 237, 237);"&gt;&lt;div&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;…&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bean id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;daoAuthenticationProvider&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.acegisecurity.providers.dao.DaoAuthenticationProvider&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;①调整为从数据库获取UserDetails对象的服务类&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;userDetailsService&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ref&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;userDetailsService&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bean&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bean id&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;userDetailsService&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;org.acegisecurity.userdetails.jdbc.JdbcDaoImpl&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;②&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;dataSource&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ref&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;dataSource&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ②&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; 数据源&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;usersByUsernameQuery&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ②&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; 根据用户名查询用户的SQL语句&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;SELECT username,password, status FROM t_user WHERE username &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;?&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;authoritiesByUsernameQuery&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; ②&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;-&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;3&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; 根据用户名查询用户权限记录的SQL语句&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;SELECT u.username,p.priv_name FROM t_user u,t_user_priv p&lt;br&gt;WHERE u.user_id &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;p.user_id AND u.username &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;?&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;property&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bean&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;/span&gt;&lt;/div&gt;&lt;br&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;这种替换的难度很小，仅需要配置一个JdbcDaoImpl Bean并将其作为daoAuthenticationProvider的userDetailsService的实现即可。 &lt;br&gt;&lt;br&gt;JdbcDaoImpl&lt;br /&gt;其实是基于Spring&lt;br /&gt;JDBC技术进行数据库访问的，它继承于org.springframework.jdbc.core.support.JdbcDaoSupport。&lt;br /&gt;所以JdbcDaoImpl必不可少的一个属性是dataSource，它指定一个保存用户信息的数据源。 &lt;br&gt;&lt;br&gt;JdbcDaoImpl通过usersByUsernameQuery和authoritiesByUsernameQuery属性定义查询用户信息和用户权限的SQL语句。实际上，JdbcDaoImpl为以上两个属性提供了默认的SQL语句，分别是： &lt;br&gt;&lt;br&gt;"SELECT username,password,enabled FROM users WHERE username = ?" &lt;br&gt;&lt;br&gt;和 &lt;br&gt;&lt;br&gt;"SELECT username,authority FROM authorities WHERE username = ?" &lt;br&gt;&lt;br&gt;一&lt;br /&gt;般情况下，我们会使用自己的用户和权限表，所以你需要自定义以上两个属性。JdbcDaoImpl将Authentication中待认证用户名作为这两&lt;br /&gt;个SQL语句的username参数值，并执行查询返回结果，然后根据列索引的方式从结果集中取得数据构造UserDetails对象，所以在构造SQL&lt;br /&gt;语句时必须保持用户信息字段位于正确的列位置，字段名可以任意指定。 &lt;br&gt;&lt;br&gt;应该说，JdbcDaoImpl还不是非常实用的&lt;br /&gt;UserDetailsService实现类，因为用户对象（UserDetails）除包含用户名/密码、是否激活、权限等信息外，还经常需要包含一些&lt;br /&gt;诸如email、telephone等业务相关的信息。而JdbcDaoImpl通用类并不知道我们具体的业务需求，所以我们往往需要通过实现&lt;br /&gt;UserDetailsService接口提供自己的实现类来完成这些工作。编写一个自己的UserDetailsService实现类不费什么力气，你&lt;br /&gt;只要实现接口中的UserDetails loadUserByUsername(String&lt;br /&gt;username)方法根据用户名获取UserDetails对象即可。在编写好自己的UserDetailsService后，在Spring配置并替&lt;br /&gt;换①处的userDetailsService属性即可，限于篇幅，我们不再展开论述，读者可以试着自行完成。 &lt;br&gt;&lt;br&gt;&lt;b&gt;小结&lt;/b&gt; &lt;br&gt;Acegi通过过滤器对请求实施拦截，当发现用户没有登录时，将强制用户进行系统登录，通过一定的接口规范，Acegi就可以获取操作者的用户身份，并进而获取用户的权限。在下一篇文章中，我们将接着介绍身份认证的高级话题。 &lt;/p&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-336906432999554349?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/336906432999554349/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=336906432999554349' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/336906432999554349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/336906432999554349'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/11/acegi_18.html' title='使用Acegi进行身份认证（之一）'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-8266375214684889632</id><published>2008-11-18T06:21:00.001-08:00</published><updated>2008-11-18T06:21:21.174-08:00</updated><title type='text'>Acegi学习小结</title><content type='html'>         &lt;a href="http://www.javaeye.com/topic/48104"&gt;Acegi学习小结&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;一、基本原理&lt;/b&gt;&lt;br /&gt;&lt;br&gt;Acegi认证授权主要基于两大技术，一是Filter机制，二是AOP的拦截机制。通过FilterSecurityInterceptor很&lt;br /&gt;好地实现了对URI的保护，通过MethodSecurityInterceptor实现了对Service的方法的拦截保护，通过ACL&lt;br /&gt;实现了对prototype类型的Object进行过滤和保护。&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;b&gt;二、基本概念&lt;/b&gt;&lt;br /&gt;&lt;br&gt;HttpSessionContextIntegrationFilter 存储SecurityContext in HttpSession&lt;br /&gt;&lt;br&gt;ChannelProcessingFilter 重定向到另一种协议，如http到https&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;ConcurrentSessionFilter&lt;br /&gt;因为不使用任何SecurityContextHolder的功能，但是需要更新SessionRegistry来表示当前的发送请求的&lt;br /&gt;principal，通过在web.xml中注册Listener监听Session事件，并发布相关消息，然后由SessionRegistry获得消&lt;br /&gt;息以判断当前用户的Session数量。&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;AuthenticationProcessingFilter 普通认证机制(大多数用这个)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;CasProcessingFilter&amp;nbsp; CAS认证机制&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;BasicProcessingFilter Http协议的Basic认证机制&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;HttpRequestIntegrationFilter Authentication 从容器的HttpServletRequest.getUserPrincipal()获得&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;JbossIntegrationFilter 与Jboss相关。&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;SecurityContextHolderAwareRequestFilter 与servlet容器结合使用。&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;RememberMeProcessingFilter 基于Cookies方式进行认证。&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;AnonymousProcessingFilter 匿名认证。&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;ExceptionTranslationFilter 捕获所有的Acegi Security 异常，这样要么返回一个HTTP错误响应或者加载一个对应的AuthenticationEntryPoint&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;AuthenticationEntryPoint 认证入口&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;b&gt;三、Acegi认证授权流程&lt;/b&gt;&lt;br /&gt;&lt;br&gt;1、FilterToBeanProxy 负责代理请求给FilterChainProxy&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;2、FilterChainProxy 方便的将多个Filter串联起来，如上面基本概念中提到的各种Filter，当然如果对URI进行授权保护，也可以包含FilterSecurityInterceptor。注意各Filter的顺序。&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;3、AbstractSecurityInterceptor 调度中心。负责调用各模块完成相应功能。&lt;br /&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; FilterSecurityInterceptor 对URI进行拦截保护&lt;br /&gt;&lt;br&gt;	AspectJSecurityInterceptor 对方法进行拦截保护&lt;br /&gt;&lt;br&gt;	MethodSecurityInterceptor 对方法进行拦截保护&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;4、AuthenticationManager 用户认证&lt;br /&gt;&lt;br&gt;	-&amp;gt; AuthenticationProvider 实际进行用户认证的地方(多个)。&lt;br /&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt; UserDetailsService 返回带有GrantedAuthority的UserDetail或者抛出异常。&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;5、AccessDecisionManager(UnanimousBased/AffirmativeBased/ConsensusBased) 授权&lt;br /&gt;&lt;br&gt; 	-&amp;gt; AccessDecisionVoter(RoleVoter/BaseAclEntryVoter) 实际投票的Voter(多个).&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;6、RunAsManager 变更GrantedAuthority&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;7、AfterInvocationManager 变更返回的对象&lt;br /&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; -&amp;gt; BaseInvocationProvider 实际完成返回对象变更的地方(多个)。&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;b&gt;四、Acegi实例&lt;/b&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;a href="http://www.javaeye.com/topic/43341" target="_blank"&gt;http://www.javaeye.com/topic/43341&lt;/a&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;      &lt;div id="topic_copyright"&gt;声明：JavaEye文章版权属于作者，受法律保护。没有作者书面许可不得转载。 &lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-8266375214684889632?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/8266375214684889632/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=8266375214684889632' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/8266375214684889632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/8266375214684889632'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/11/acegi.html' title='Acegi学习小结'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-4970141401456304033</id><published>2008-11-18T05:54:00.003-08:00</published><updated>2008-11-18T05:54:56.464-08:00</updated><title type='text'>javascript 处理 JSON</title><content type='html'>                 &lt;br&gt;&lt;h3 class="" title=""&gt;&lt;a href="http://jelly.javaeye.com/blog/138707"&gt;&lt;span class="hilite1"&gt;javascript&lt;/span&gt; 处理 &lt;span class="hilite2"&gt;JSON&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;h3 class="" title=""&gt;&lt;a href="http://jelly.javaeye.com/blog/138707"&gt;用 &lt;span class="hilite1"&gt;javascript&lt;/span&gt; 处理 &lt;span class="hilite2"&gt;JSON&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;br /&gt;        &lt;b&gt;关键字: &lt;span class="hilite2"&gt;json&lt;/span&gt; &lt;span class="hilite1"&gt;javascript&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;div class="blog_content"&gt;&lt;br /&gt;    &amp;nbsp;&amp;nbsp;&amp;nbsp; 因为&lt;span class="hilite2"&gt;JSON&lt;/span&gt; 是 &lt;span class="hilite1"&gt;javascript&lt;/span&gt; 的一个子集，所以，在&lt;span class="hilite1"&gt;javascript&lt;/span&gt; 中使用&lt;span class="hilite2"&gt;JSON&lt;/span&gt;是非常简单的。&lt;br&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;div class="code_title"&gt;js 代码&lt;/div&gt;&lt;br /&gt;&lt;div class="dp-highlighter"&gt;&lt;br /&gt;&lt;div class="bar"&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;my&lt;span class="hilite2"&gt;JSON&lt;/span&gt;Object&amp;nbsp;=&amp;nbsp;{&lt;span class="string"&gt;"bindings"&lt;/span&gt;:&amp;nbsp;[&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span class="string"&gt;"ircEvent"&lt;/span&gt;:&amp;nbsp;&lt;span class="string"&gt;"PRIVMSG"&lt;/span&gt;,&amp;nbsp;&lt;span class="string"&gt;"method"&lt;/span&gt;:&amp;nbsp;&lt;span class="string"&gt;"newURI"&lt;/span&gt;,&amp;nbsp;&lt;span class="string"&gt;"regex"&lt;/span&gt;:&amp;nbsp;&lt;span class="string"&gt;"^http://.*"&lt;/span&gt;},&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span class="string"&gt;"ircEvent"&lt;/span&gt;:&amp;nbsp;&lt;span class="string"&gt;"PRIVMSG"&lt;/span&gt;,&amp;nbsp;&lt;span class="string"&gt;"method"&lt;/span&gt;:&amp;nbsp;&lt;span class="string"&gt;"deleteURI"&lt;/span&gt;,&amp;nbsp;&lt;span class="string"&gt;"regex"&lt;/span&gt;:&amp;nbsp;&lt;span class="string"&gt;"^delete.*"&lt;/span&gt;},&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;span class="string"&gt;"ircEvent"&lt;/span&gt;:&amp;nbsp;&lt;span class="string"&gt;"PRIVMSG"&lt;/span&gt;,&amp;nbsp;&lt;span class="string"&gt;"method"&lt;/span&gt;:&amp;nbsp;&lt;span class="string"&gt;"randomURI"&lt;/span&gt;,&amp;nbsp;&lt;span class="string"&gt;"regex"&lt;/span&gt;:&amp;nbsp;&lt;span class="string"&gt;"^random.*"&lt;/span&gt;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class="alt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;]&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li class=""&gt;};&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;在上面的例子中，我们创建了只包含一个成员 &lt;span class="string"&gt;"bindings" &lt;/span&gt;的一个对象，&lt;span class="string"&gt;bindings 则包含了一个由3个对象组成的数组。这3个对象都包含3个成员：&lt;/span&gt;&lt;span class="string"&gt;"ircEvent"，&lt;/span&gt; &lt;span class="string"&gt;"method"&lt;/span&gt;，"regex"。&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;在&lt;span class="hilite1"&gt;javascript&lt;/span&gt; 中， 成员可以通过“点号”来获取。&lt;br&gt;&lt;br /&gt;比如：&lt;br&gt;&lt;br /&gt;&lt;div class="code_title"&gt;js 代码&lt;/div&gt;&lt;br /&gt;&lt;div class="dp-highlighter"&gt;&lt;br /&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;my&lt;span class="hilite2"&gt;JSON&lt;/span&gt;Object.bindings[0].method&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;通过eval() 函数可以将&lt;span class="hilite2"&gt;JSON&lt;/span&gt;字符串转化为对象。&lt;br&gt;&lt;br /&gt;&lt;div class="code_title"&gt;js 代码&lt;/div&gt;&lt;br /&gt;&lt;div class="dp-highlighter"&gt;&lt;br /&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;myObject&amp;nbsp;=&amp;nbsp;eval('('&amp;nbsp;+&amp;nbsp;my&lt;span class="hilite2"&gt;JSON&lt;/span&gt;text&amp;nbsp;+&amp;nbsp;')');&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;eval 函数非常快，但是它可以编译任何 javascirpt 代码，这样的话就可能产生安全的问题。eval 的使用是基于传入的代码参数是可靠的假设的，有一些情况下，可能客户端是不可信任的。&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;如果基于安全的考虑的话，最好是使用一个 &lt;span class="hilite2"&gt;JSON&lt;/span&gt; 解析器。 一个 &lt;span class="hilite2"&gt;JSON&lt;/span&gt; 解析器将只接受 &lt;span class="hilite2"&gt;JSON&lt;/span&gt; 文本。所以是更安全的。&lt;br&gt;&lt;br /&gt;&lt;div class="code_title"&gt;js 代码&lt;/div&gt;&lt;br /&gt;&lt;div class="dp-highlighter"&gt;&lt;br /&gt;&lt;div class="bar"&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;myObject&amp;nbsp;=&amp;nbsp;&lt;span class="hilite2"&gt;JSON&lt;/span&gt;.parse(my&lt;span class="hilite2"&gt;JSON&lt;/span&gt;text,&amp;nbsp;filter);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;可选的 filter 参数将遍历每一个value key 值对， 并进行相关的处理。如：&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code_title"&gt;js 代码&lt;/div&gt;&lt;br /&gt;&lt;div class="dp-highlighter"&gt;&lt;br /&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;myData&amp;nbsp;=&amp;nbsp;&lt;span class="hilite2"&gt;JSON&lt;/span&gt;.parse(text,&amp;nbsp;&lt;span class="keyword"&gt;function&lt;/span&gt;&amp;nbsp;(key,&amp;nbsp;value)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;ol&gt;&lt;li class="alt"&gt;&lt;span class="keyword"&gt;return&lt;/span&gt;&amp;nbsp;key.indexOf('date')&amp;nbsp;&amp;gt;=&amp;nbsp;0&amp;nbsp;?&amp;nbsp;&lt;span class="keyword"&gt;new&lt;/span&gt;&amp;nbsp;Date(value)&amp;nbsp;:&amp;nbsp;value;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&amp;nbsp; &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;    &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;span class="string"&gt;stringifier 函数的作用跟 parse 相反， 用来将一个js对象转换为 &lt;span class="hilite2"&gt;JSON&lt;/span&gt; 文本。&lt;/span&gt;&lt;br&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code_title"&gt;js 代码&lt;/div&gt;&lt;br /&gt;&lt;div class="dp-highlighter"&gt;&lt;br /&gt;&lt;ol class="dp-c" start="1"&gt;&lt;li class="alt"&gt;&lt;span class="keyword"&gt;var&lt;/span&gt;&amp;nbsp;my&lt;span class="hilite2"&gt;JSON&lt;/span&gt;Text&amp;nbsp;=&amp;nbsp;&lt;span class="hilite2"&gt;JSON&lt;/span&gt;.stringifier(myObject);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;这里是一个开源的 &lt;a href="http://www.json.org/json2.js"&gt;&lt;span class="hilite2"&gt;JSON&lt;/span&gt; parser and &lt;span class="hilite2"&gt;JSON&lt;/span&gt; stringifier&lt;/a&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;div class="attachments"&gt;&lt;br /&gt;  &lt;br /&gt;    &lt;br /&gt;      &lt;ul&gt;&lt;li&gt;&lt;a href="http://jelly.javaeye.com/topics/download/dad0ce41-cacc-461b-b89e-9151d48a810c"&gt;&lt;span class="hilite2"&gt;json&lt;/span&gt;2.rar&lt;/a&gt; (3.2 KB)&lt;/li&gt;&lt;li&gt;描述: 一个开源的 &lt;span class="hilite2"&gt;JSON&lt;/span&gt; parser and &lt;span class="hilite2"&gt;JSON&lt;/span&gt; stringifier&lt;/li&gt;&lt;li&gt;下载次数: 272&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;    &lt;br /&gt;  &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;              &lt;br /&gt;  &lt;div class="blog_bottom"&gt;&lt;br /&gt;    &lt;ul&gt;&lt;li&gt;11:07&lt;/li&gt;&lt;li&gt;浏览 (1973)&lt;/li&gt;&lt;li&gt;&lt;a href="http://jelly.javaeye.com/blog/138707#comments"&gt;评论&lt;/a&gt; (2)&lt;/li&gt;&lt;li&gt;分类: &lt;a href="http://jelly.javaeye.com/category/9710"&gt;AJAX&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.javaeye.com/topic/138707"&gt;进入论坛&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://heimazhao.javaeye.com/admin/user_favorites?user_favorite%5Btitle%5D=%E7%94%A8+javascript+%E5%A4%84%E7%90%86+JSON&amp;amp;user_favorite%5Burl%5D=http%3A%2F%2Fjelly.javaeye.com%2Fblog%2F138707" target="_blank"&gt;收藏&lt;/a&gt;&lt;/li&gt;&lt;li class="last"&gt;&lt;a href="http://www.javaeye.com/wiki/topic/138707" target="_blank" class="more"&gt;相关推荐&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;              &lt;br /&gt;  &lt;div class="blog_comment"&gt;&lt;br /&gt;    &lt;h5&gt;评论&lt;/h5&gt;&lt;br /&gt;    &lt;a id="comments" name="comments"&gt;&lt;/a&gt;&lt;br /&gt;    &lt;div id="bc668914"&gt;&lt;br /&gt;  &lt;div class="comment_title"&gt;&lt;br /&gt;    &lt;a href="http://tonyhelp.javaeye.com/" target="_blank"&gt;tonyhelp&lt;/a&gt;&lt;br /&gt;    2008-09-17&lt;br /&gt;    &lt;a href="http://jelly.javaeye.com/blog/138707#"&gt;引用&lt;/a&gt;&lt;br /&gt;    &lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;  &lt;div class="comment_content"&gt;我也翻译过这篇文章&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;我也用过 DOJO ,现在改用 jQuery了&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div id="bc640378"&gt;&lt;br /&gt;  &lt;div class="comment_title"&gt;&lt;br /&gt;    &lt;a href="http://wangsong76.javaeye.com/" target="_blank"&gt;wangsong76&lt;/a&gt;&lt;br /&gt;    2008-08-22&lt;br /&gt;    &lt;a href="http://jelly.javaeye.com/blog/138707#"&gt;引用&lt;/a&gt;&lt;br /&gt;    &lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;  &lt;div class="comment_content"&gt;我也翻译过这篇文章&lt;img src="http://jelly.javaeye.com/images/smiles/icon_biggrin.gif"&gt;&lt;br&gt;&lt;br&gt;我也用过 DOJO ,现在改用 jQuery了。&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;  &lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;在异步应用程序中发送和接收信息时，可以选择以纯文本和 XML 作为数据格式。掌握 Ajax 的这一期讨论另一种有用的数据格式 JavaScript Object Notation（JSON），以及如何使用它更轻松地在应用程序中移动数据和对象。&lt;br&gt;&lt;br&gt;　　如果您阅读了本系列前面的文章，那么应已对数据格式有了相当的认识。前面的文章解释了在许多异步应用程序中如何恰当地使用纯文本和简单的名称/值对。可以将数据组合成下面这样的形式：&lt;br&gt;&lt;br /&gt;&lt;div class="code"&gt;firstName=Brett&amp;amp;lastName=McLaughlin&amp;amp;email=brett@newInstance.com&lt;/div&gt;&lt;br /&gt;&lt;br&gt;　　这样就行了，不需要再做什么了。实际上，Web 老手会意识到通过 GET 请求发送的信息就是采用这种格式。&lt;br&gt;&lt;br&gt;　　然后，本系列讨论了 XML。显然，XML 得到了相当多的关注（正面和负面的评价都有），已经在 Ajax 应用程序中广泛使用。关于如何使用 XML 数据格式，可以回顾 本系列前面的文章：&lt;br&gt;&lt;br /&gt;&lt;div class="code"&gt;&amp;lt;request&amp;gt;&lt;br&gt;&amp;lt;firstName&amp;gt;Brett&amp;lt;/firstName&amp;gt;&lt;br&gt;&amp;lt;lastName&amp;gt;McLaughlin&amp;lt;/lastName&amp;gt;&lt;br&gt;&amp;lt;email&amp;gt;brett@newInstance.com&amp;lt;/email&amp;gt;&lt;br&gt;&amp;lt;/request&amp;gt;&lt;/div&gt;&lt;br /&gt;&lt;br&gt;&lt;br&gt;　　这里的数据与前面看到的相同，但是这一次采用 XML 格式。这没什么了不起的；这只是另一种数据格式，使我们能够使用 XML 而不是纯文本和名称/值对。&lt;br&gt;&lt;br&gt;　　本文讨论另一种数据格式，JavaScript Object Notation（JSON）。JSON 看起来既熟悉又陌生。它提供了另一种选择，选择范围更大总是好事情。&lt;br&gt;&lt;br&gt;　　选择的意义&lt;br&gt;&lt;br&gt;　&lt;br /&gt;　在深入研究 JSON 格式的细节之前，您应该了解为什么要用两篇文章讨论另一种数据格式（是的，本系列中的下一篇文章也讨论&lt;br /&gt;JSON），尤其在已经了解了如何使用 XML 和纯文本的名称/值对的情况下。其实，原因很简单：解决任何问题的选择越多，找到问题的最佳&lt;br /&gt;解决方案的可能性就越大，这比只能使用一个 解决方案要好得多。&lt;br&gt;&lt;br&gt;&lt;b&gt;回顾名称/值对和 XML&lt;/b&gt;&lt;br&gt;&lt;br&gt;　　本系列已经用了大量篇幅讨论适合使用名称/值对和 XML 的场合。总是应该首先考虑使用名称/值对。对于大多数异步应用程序中的问题，使用名称/值对几乎总是最简单的解决方案，而且它只需要非常基本的 JavaScript 知识。&lt;br&gt;&lt;br&gt;　&lt;br /&gt;　实际上，除非有某种限制迫使您转向 XML，否则用不着考虑使用别的数据格式。显然，如果要向需要 XML&lt;br /&gt;格式的输入的服务器端程序发送数据，那么希望使用 XML 作为数据格式。但是，在大多数情况下，对于需要向应用程序发送多段信息的服务器，XML&lt;br /&gt;是更好的选择；换句话说，XML 通常更适合用来向 Ajax 应用程序做出响应，而不是从 Ajax 应用程序发出请求。&lt;br&gt;&lt;br&gt;&lt;b&gt;添加 JSON&lt;/b&gt;&lt;br&gt;&lt;br&gt;　&lt;br /&gt;　在使用名称/值对或 XML 时，实际上是使用 JavaScript&lt;br /&gt;从应用程序中取得数据并将数据转换成另一种数据格式。在这些情况下，JavaScript 在很大程度上作为一种数据操纵语言，用来移动和操纵来自&lt;br /&gt;Web 表单的数据，并将数据转换为一种适合发送给服务器端程序的格式。&lt;br&gt;&lt;br&gt;　　但是，有时候 JavaScript&lt;br /&gt;不仅仅作为格式化语言使用。在这些情况下，实际上使用 JavaScript 语言中的对象来表示数据，而不仅是将来自 Web&lt;br /&gt;表单的数据放进请求中。在这些情况下，从 JavaScript 对象中提取数据，然后再将数据放进名称/值对或 XML，就有点儿多此一举&lt;br /&gt;了。这时就合适使用 JSON：JSON 允许轻松地将 JavaScript 对象转换成可以随请求发送的数据（同步或异步都可以）。&lt;br&gt;&lt;br&gt;　　JSON 并不是某种魔弹；但是，它对于某些非常特殊的情况是很好的选择。不要认为您不会遇到这些情况。阅读本文和下一篇文章来了解 JSON，这样，遇到这类问题时您就知道该怎么办了。&lt;br&gt;&lt;br&gt;&lt;b&gt;JSON 基础&lt;/b&gt;&lt;br&gt;&lt;br&gt;　&lt;br /&gt;　简单地说，JSON 可以将 JavaScript&lt;br /&gt;对象中表示的一组数据转换为字符串，然后就可以在函数之间轻松地传递这个字符串，或者在异步应用程序中将字符串从 Web&lt;br /&gt;客户机传递给服务器端程序。这个字符串看起来有点儿古怪（稍后会看到几个示例），但是 JavaScript 很容易解释它，而且 JSON&lt;br /&gt;可以表示比名称/值对更复杂的结构。例如，可以表示数组和复杂的对象，而不仅仅是键和值的简单列表。&lt;br&gt;&lt;br&gt;&lt;b&gt;简单 JSON 示例&lt;/b&gt;&lt;br&gt;&lt;br&gt;　　按照最简单的形式，可以用下面这样的 JSON 表示名称/值对：&lt;br&gt;&lt;br /&gt;&lt;div class="code"&gt;{ "firstName": "Brett" }&lt;/div&gt;&lt;br /&gt;&lt;br&gt;　　这个示例非常基本，而且实际上比等效的纯文本名称/值对占用更多的空间：&lt;br&gt;&lt;br /&gt;&lt;div class="code"&gt;firstName=Brett&lt;/div&gt;&lt;br /&gt;&lt;br&gt;　　但是，当将多个名称/值对串在一起时，JSON 就会体现出它的价值了。首先，可以创建包含多个名称/值对的记录，比如：&lt;br&gt;&lt;br /&gt;&lt;div class="code"&gt;{ "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" }&lt;/div&gt;&lt;br /&gt;&lt;br&gt;　　从语法方面来看，这与名称/值对相比并没有很大的优势，但是在这种情况下 JSON 更容易使用，而且可读性更好。例如，它明确地表示以上三个值都是同一记录的一部分；花括号使这些值有了某种联系。&lt;br&gt;&lt;br&gt;&lt;b&gt;值的数组&lt;/b&gt;&lt;br&gt;&lt;br&gt;　&lt;br /&gt;　当需要表示一组值时，JSON 不但能够提高可读性，而且可以减少复杂性。例如，假设您希望表示一个人名列表。在 XML&lt;br /&gt;中，需要许多开始标记和结束标记；如果使用典型的名称/值对（就像在本系列前面文章中看到的那种名称/值对），那么必须建立一种专有的数据格式，或者将键&lt;br /&gt;名称修改为 person1-firstName 这样的形式。&lt;br&gt;&lt;br&gt;　　如果使用 JSON，就只需将多个带花括号的记录分组在一起：&lt;br&gt;&lt;br /&gt;&lt;div class="code"&gt;{ "people": [&lt;br&gt;{ "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" },&lt;br&gt;{ "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" },&lt;br&gt;{ "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" }&lt;br&gt;]}&lt;/div&gt;&lt;br /&gt;&lt;br&gt;　　这不难理解。在这个示例中，只有一个名为 people 的变量，值是包含三个条目的数组，每个条目是一个人的记录，其中包含名、姓和电子邮件地址。上面的示例演示如何用括号将记录组合成一个值。当然，可以使用相同的语法表示多个值（每个值包含多个记录）：&lt;br&gt;&lt;br /&gt;&lt;div class="code"&gt;{ "programmers": [&lt;br&gt;{ "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" },&lt;br&gt;{ "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" },&lt;br&gt;{ "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" }&lt;br&gt;],&lt;br&gt;"authors": [&lt;br&gt;{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },&lt;br&gt;{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },&lt;br&gt;{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }&lt;br&gt;],&lt;br&gt;"musicians": [&lt;br&gt;{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },&lt;br&gt;{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }&lt;br&gt;]&lt;br&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br&gt;　　这里最值得注意的是，能够表示多个值，每个值进而包含多个值。但是还应该注意，在不同的主条目（programmers、authors&lt;br /&gt;和 musicians）之间，记录中实际的名称/值对可以不一样。JSON 是完全动态的，允许在 JSON 结构的中间改变表示数据的方式。&lt;br&gt;&lt;br&gt;　　在处理 JSON 格式的数据时，没有需要遵守的预定义的约束。所以，在同样的数据结构中，可以改变表示数据的方式，甚至可以以不同方式表示同一事物。&lt;br&gt;&lt;br&gt;&lt;b&gt;在 JavaScript 中使用 JSON&lt;/b&gt;&lt;br&gt;&lt;br&gt;　　掌握了 JSON 格式之后，在 JavaScript 中使用它就很简单了。JSON 是 JavaScript 原生格式，这意味着在 JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包。&lt;br&gt;&lt;br&gt;&lt;b&gt;将 JSON 数据赋值给变量&lt;/b&gt;&lt;br&gt;&lt;br&gt;　　例如，可以创建一个新的 JavaScript 变量，然后将 JSON 格式的数据字符串直接赋值给它：&lt;br&gt;&lt;br /&gt;&lt;div class="code"&gt;var people =&lt;br&gt;{ "programmers": [&lt;br&gt;{ "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" },&lt;br&gt;{ "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" },&lt;br&gt;{ "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" }&lt;br&gt;],&lt;br&gt;"authors": [&lt;br&gt;{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },&lt;br&gt;{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },&lt;br&gt;{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }&lt;br&gt;],&lt;br&gt;"musicians": [&lt;br&gt;{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },&lt;br&gt;{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }&lt;br&gt;]&lt;br&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br&gt;　　这非常简单；现在 people 包含前面看到的 JSON 格式的数据。但是，这还不够，因为访问数据的方式似乎还不明显。&lt;br&gt;&lt;br&gt;&lt;b&gt;访问数据&lt;/b&gt;&lt;br&gt;&lt;br&gt;　&lt;br /&gt;　尽管看起来不明显，但是上面的长字符串实际上只是一个数组；将这个数组放进 JavaScript&lt;br /&gt;变量之后，就可以很轻松地访问它。实际上，只需用点号表示法来表示数组元素。所以，要想访问 programmers 列表的第一个条目的姓氏，只需在&lt;br /&gt;JavaScript 中使用下面这样的代码：&lt;br&gt;&lt;br /&gt;&lt;div class="code"&gt;people.programmers[0].lastName;&lt;/div&gt;&lt;br /&gt;&lt;br&gt;　　注意，数组索引是从零开始的。所以，这行代码首先访问 people 变量中的数据；然后移动到称为 programmers 的条目，再移动到第一个记录（[0]）；最后，访问 lastName 键的值。结果是字符串值 “McLaughlin”。&lt;br&gt;&lt;br&gt;　　下面是使用同一变量的几个示例。&lt;br&gt;&lt;br /&gt;&lt;div class="code"&gt;people.authors[1].genre // Value is "fantasy"&lt;br&gt;&lt;br&gt;people.musicians[3].lastName // Undefined. This refers to the fourth entry,&lt;br&gt;and there isn't one&lt;br&gt;&lt;br&gt;people.programmers.[2].firstName // Value is "Elliotte"&lt;/div&gt;&lt;br /&gt;&lt;br&gt;　　利用这样的语法，可以处理任何 JSON 格式的数据，而不需要使用任何额外的 JavaScript 工具包或 API。&lt;br&gt;&lt;br&gt;&lt;b&gt;修改 JSON 数据&lt;/b&gt;&lt;br&gt;&lt;br&gt;　　正如可以用点号和括号访问数据，也可以按照同样的方式轻松地修改数据：&lt;br&gt;&lt;b&gt;people.musicians[1].lastName = "Rachmaninov";&lt;/b&gt;&lt;br&gt;　　在将字符串转换为 JavaScript 对象之后，就可以像这样修改变量中的数据。&lt;br&gt;&lt;br&gt;&lt;b&gt;转换回字符串&lt;/b&gt;&lt;br&gt;&lt;br&gt;　　当然，如果不能轻松地将对象转换回本文提到的文本格式，那么所有数据修改都没有太大的价值。在 JavaScript 中这种转换也很简单：&lt;br&gt;&lt;br /&gt;&lt;div class="code"&gt;String newJSONtext = people.toJSONString();&lt;/div&gt;&lt;br /&gt;&lt;br&gt;　　这样就行了！现在就获得了一个可以在任何地方使用的文本字符串，例如，可以将它用作 Ajax 应用程序中的请求字符串。&lt;br&gt;&lt;br&gt;　　更重要的是，可以将任何 JavaScript 对象转换为 JSON 文本。并非只能处理原来用 JSON 字符串赋值的变量。为了对名为 myObject 的对象进行转换，只需执行相同形式的命令：&lt;br&gt;&lt;br /&gt;&lt;div class="code"&gt;String myObjectInJSON = myObject.toJSONString();&lt;/div&gt;&lt;br /&gt;&lt;br&gt;　　这就是 JSON 与本系列讨论的其他数据格式之间最大的差异。如果使用&lt;br /&gt;JSON，只需调用一个简单的函数，就可以获得经过格式化的数据，可以直接使用了。对于其他数据格式，需要在原始数据和格式化数据之间进行转换。即使使用&lt;br /&gt;Document Object Model 这样的 API（提供了将自己的数据结构转换为文本的函数），也需要学习这个 API 并使用 API&lt;br /&gt;的对象，而不是使用原生的 JavaScript 对象和语法。&lt;br&gt;&lt;br&gt;　　最终结论是，如果要处理大量 JavaScript 对象，那么 JSON 几乎肯定是一个好选择，这样就可以轻松地将数据转换为可以在请求中发送给服务器端程序的格式。&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-4970141401456304033?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/4970141401456304033/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=4970141401456304033' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/4970141401456304033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/4970141401456304033'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/11/javascript-json.html' title='javascript 处理 JSON'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-4404918602880704139</id><published>2008-11-18T05:54:00.001-08:00</published><updated>2008-11-18T05:54:41.805-08:00</updated><title type='text'>针对JSON的基于java和js多种操作与格式转换方法</title><content type='html'> &lt;div class="blog_title"&gt;&lt;h3 class="" title=""&gt;&lt;a href="http://yefeng.javaeye.com/blog/198758"&gt;针对JSON的基于java和js多种操作与格式转换方法&lt;/a&gt;&lt;/h3&gt;&lt;br /&gt;        &lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;div class="blog_content"&gt;&lt;br /&gt;    转&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;org.json包&lt;br /&gt;&lt;br&gt;http://www.json.org/java/index.html &lt;br /&gt;&lt;br&gt;&amp;lt;!--[if !supportLists]--&amp;gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--[endif]--&amp;gt;JSONObject，用一个HashMap来保存一个JSON对象的所有属性。&lt;br /&gt;&lt;br&gt;&amp;lt;!--[if !supportLists]--&amp;gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;lt;!--[endif]--&amp;gt;JSONArray用ArrayList来保存数据。JSON来自javascript，javascript&lt;br /&gt;中Array也是Object，不知这里是如何保存这种关系的。&lt;br /&gt;&lt;br&gt;&amp;lt;!--[if !supportLists]--&amp;gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--[endif]--&amp;gt;一些跟字符串有关的类，以及异常类。&lt;br /&gt;&lt;br&gt;&amp;lt;!--[if !supportLists]--&amp;gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--[endif]--&amp;gt;一些工具类，比如xml和json转换的类，将http头和cookies转换为json的类，&lt;br /&gt;&lt;br&gt; &lt;br /&gt;&lt;br&gt; &lt;br /&gt;&lt;br&gt;基于org.json包的JSON-LIB：bean，map，collection，java array，xml与json间的转换。&lt;br /&gt;&lt;br&gt;http://json-lib.sourceforge.net/ &lt;br /&gt;&lt;br&gt;http://json-lib.sourceforge.net/usage.html&lt;br /&gt;&lt;br&gt; &lt;br /&gt;&lt;br&gt;Stringtree JSON:JSON与java对象间的转换&lt;br /&gt;&lt;br&gt;http://www.stringtree.org/stringtree-json.html &lt;br /&gt;&lt;br&gt;三个关键类：&lt;br /&gt;&lt;br&gt;JSONReader.java &lt;br /&gt;&lt;br&gt;JSONWriter.java &lt;br /&gt;&lt;br&gt;JSONValidator.java &lt;br /&gt;&lt;br&gt;JSONValidator用来检查JSON的有效性。&lt;br /&gt;&lt;br&gt;JSONReader将一个正确形式的JSON字符串转换为一个java对象。&lt;br /&gt;&lt;br&gt;JSONWriter将一个java对象转换为一个JSON字符串。&lt;br /&gt;&lt;br&gt; &lt;br /&gt;&lt;br&gt; &lt;br /&gt;&lt;br&gt;JSONT：基于js和自定义规则，转换JSON为任意其他格式&lt;br /&gt;&lt;br&gt;http://goessner.net/articles/jsont/&lt;br /&gt;  &lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-4404918602880704139?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/4404918602880704139/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=4404918602880704139' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/4404918602880704139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/4404918602880704139'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/11/jsonjavajs.html' title='针对JSON的基于java和js多种操作与格式转换方法'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-8470799214152120383</id><published>2008-11-16T21:20:00.001-08:00</published><updated>2008-11-16T21:20:01.298-08:00</updated><title type='text'>Web 设计:实现干净代码的12条定律</title><content type='html'>&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Web &amp;#35774;&amp;#35745;:&amp;#23454;&amp;#29616;&amp;#24178;&amp;#20928;&amp;#20195;&amp;#30721;&amp;#30340;12&amp;#26465;&amp;#23450;&amp;#24459;&lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="3"&gt;&lt;a class="AttributeUrl" href="http://www.cnbeta.com/articles/69870.htm"&gt;Web &amp;#35774;&amp;#35745;:&amp;#23454;&amp;#29616;&amp;#24178;&amp;#20928;&amp;#20195;&amp;#30721;&amp;#30340;12&amp;#26465;&amp;#23450;&amp;#24459;_cnBeta &amp;#35270;&amp;#28857;&amp;middot;&amp;#35266;&amp;#23519;_cnBeta.COM&lt;/a&gt;&lt;/font&gt;&lt;br&gt;&lt;br /&gt;&lt;p&gt;新闻来源:Smashing Magazine&lt;br&gt;&lt;br /&gt;漂亮的代码是漂亮网站的基础，优秀的 CSS 只存在与同样优秀的 HTML 之上，干净的，语义的 HTML 代码让一个网站更健壮。本文讲述了12个实现干净 Web  设计代码的定律，适合于任何从事 Web 设计的人。&lt;/p&gt;&lt;br /&gt;		&lt;p&gt;1. Strict DOCTYPE &lt;br&gt;&lt;br /&gt;要做就做对的。不管是 HTML 4.01 还是 XHTML 1.0，它们都提供 Strict 模式，使用 Strict 模式可以保证我们的代码不隐藏任何错误。&lt;br&gt;&lt;br /&gt;&lt;img style="width:245px;height:109px" src="http://www.comsharp.com/Writable/Resource/_Random_/2008-11-15/1.gif" alt=""&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;b&gt;参考资料:&lt;/b&gt;&lt;br&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://www.w3.org/QA/2002/04/valid-dtd-list.html"&gt;W3C: Recommended DTDs to use in your Web document&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://www.alistapart.com/stories/doctype/"&gt;Fix Your Site With the Right DOCTYPE!&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://www.456bereastreet.com/archive/200609/no_more_transitional_doctypes_please/"&gt;No more Transitional DOCTYPEs, please&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;2. 字符集声明，特殊字符进行编码处理 &lt;br&gt;&lt;br /&gt;字符集声明应当放在 &amp;lt;hea&amp;gt; 部分的最前面，以便让浏览器知道如何显示网页中的所有内容，包括标题。另外，一些特殊字符，如 &amp;amp; 最好用 &amp;amp;amp; 代替，这是一种最安全的方法。&lt;br&gt;&lt;br /&gt;&lt;img style="width:245px;height:109px" src="http://www.comsharp.com/Writable/Resource/_Random_/2008-11-15/2.gif" alt=""&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;b&gt;参考资料:&lt;/b&gt;&lt;br&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/UTF-8"&gt;Wikipedia: UTF-8&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://www.cs.tut.fi/%7Ejkorpela/chars.html"&gt;A tutorial on character code issues&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://www.ascii-code.com/"&gt;The Extended ASCII table&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;3. 恰当的锁进 &lt;br&gt;&lt;br /&gt;缩进不会影响网页的渲染，但会明显改善阅读源代码时的体验。缩进没有特定的规则，但始终保持一致是个好习惯。&lt;br&gt;&lt;br /&gt;&lt;img style="width:245px;height:203px" src="http://www.comsharp.com/Writable/Resource/_Random_/2008-11-15/3.gif" alt=""&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;b&gt;参考资料:&lt;/b&gt;&lt;br&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://www.w3.org/People/Raggett/tidy/"&gt;Clean up your Web pages with HTML TIDY&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;4. 将 CSS 和 JavaScript 放在外部文件中 &lt;br&gt;&lt;br /&gt;将 CSS 和 JavaScript 放在外部文件中引用，不仅减低单个网页的尺寸，而且意味着其它网页也可以共用这些代码，另外，浏览器的缓存机制可以很好地降低对相同代码的重复下载。&lt;br&gt;&lt;br /&gt;&lt;img style="width:245px;height:151px" src="http://www.comsharp.com/Writable/Resource/_Random_/2008-11-15/4.gif" alt=""&gt;&lt;br&gt;&lt;br /&gt;  5. 正确地嵌套 Tag 标签 &lt;br&gt;&lt;br /&gt;如下图，第一行代码中，&amp;lt;h1&amp;gt;标签嵌套在 &amp;lt;a&amp;gt;标签中，尽管多数浏览器会正确渲染，但这不是好的习惯， 标签是 block 对象，而 是 inline 对象，inline 对象不应该容纳 block 对象。&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;img style="width:245px;height:120px" src="http://www.comsharp.com/Writable/Resource/_Random_/2008-11-15/5.gif" alt=""&gt;&lt;br&gt;&lt;br /&gt;6. 消除不必要的 &amp;lt;div&amp;gt; &lt;br&gt;&lt;br /&gt;&amp;lt;div&amp;gt; 常被滥用（尤其在我们现在所处的 DIV+CSS 神话中 - 译者），人们希望把任何东西都放在 &amp;lt;div&amp;gt;  中以便为它们分配 CSS 式样，这种滥用会导致的臃肿。&lt;br&gt;&lt;br /&gt;&lt;img style="width:245px;height:180px" src="http://www.comsharp.com/Writable/Resource/_Random_/2008-11-15/6.gif" alt=""&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;b&gt;参考资料:&lt;/b&gt;&lt;br&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://csscreator.com/?q=divitis"&gt;Divitis: what it is, and how to cure it.&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;7. 使用更好的命名规则 &lt;br&gt;&lt;br /&gt;如下图，Cat 的 CSS 类被命名为 red italic，暗示着 Cat 使用红色斜体，如果你想将 Cat 改成兰色的粗体呢？&lt;br&gt;&lt;br /&gt;&lt;img style="width:245px;height:108px" src="http://www.comsharp.com/Writable/Resource/_Random_/2008-11-15/7.gif" alt=""&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;8. 尽量使用 CSS 控制文字的排版 &lt;br&gt;&lt;br /&gt;如下图所示，不要直接使用大写，用 CSS 对这些文字排版方面的格式进行控制，这样会更灵活。&lt;br&gt;&lt;br /&gt;&lt;img style="width:245px;height:172px" src="http://www.comsharp.com/Writable/Resource/_Random_/2008-11-15/8.gif" alt=""&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;9. 为 &amp;lt;body&amp;gt; 分配独立的 class/id &lt;br&gt;&lt;br /&gt;为 body Tag 分配一个独立的 class/id，可以很好地定位页面中任何对象，因为页面中所有对象都位于 body 中。&lt;br&gt;&lt;br /&gt;&lt;img style="width:245px;height:135px" src="http://www.comsharp.com/Writable/Resource/_Random_/2008-11-15/9.gif" alt=""&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;b&gt;参考资料:&lt;/b&gt;&lt;br&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://css-tricks.com/id-your-body-for-greater-css-control-and-specificity/"&gt;ID Your Body For Greater CSS Control and Specificity&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://www.37signals.com/svn/archives2/case_study_reusing_styles_with_a_body_class.php"&gt;Case study: Re-using styles with a body class&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;10. 验证 &lt;br&gt;&lt;br /&gt;无需多言，你应当尽可能对网页的代码进行验证，尽管有些代码错误浏览器能自动更正，但有些错误是会带来不好的后果的，尤其当你位于 Strict 模式下。即使什么都不为，看到那个绿色的 W3C 验证标志至少可以让自己舒服一些。&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;W3C 验证是否通过并不一定要什么拘泥，Web 设计中存在更多的考量，只拘泥 W3C 验证结果，可能影响一些更重要的因素，比如，IE6 在&lt;br /&gt;W3C 标准方面存在不少 BUG，如果你为了100%通过 W3C 验证而宣布自己的网站不支持 IE6，至少在国内会得不偿失的 - 译者&lt;br&gt;&lt;br /&gt;&lt;img style="width:245px;height:172px" src="http://www.comsharp.com/Writable/Resource/_Random_/2008-11-15/10.gif" alt=""&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;b&gt;参考资料:&lt;/b&gt;&lt;br&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://validator.w3.org/"&gt;The W3C Markup Validation Service&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://xhtml-css.com/"&gt;XHTML-CSS Validator&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;a href="http://freesitevalidator.com/"&gt;Free Site Validator (checks entire site, not just one page)&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;11. 合理的结构次序 &lt;br&gt;&lt;br /&gt;将网页结构保持一个合乎逻辑的次序。&lt;br&gt;&lt;br /&gt;&lt;img style="width:245px;height:172px" src="http://www.comsharp.com/Writable/Resource/_Random_/2008-11-15/11.gif" alt=""&gt;&lt;br&gt;&lt;br /&gt;12. 尽你所能 &lt;br&gt;&lt;br /&gt;如果你从零开始写，保持以上的原则当然要容易的多，如果要修改旧的代码，将会很痛苦，一些 CMS 系统拙劣的编码会让你陷入泥沼，或者你的网站规模宏大要改动的东西太多，不管怎样，始终保持良好的习惯非常重要。&lt;br&gt;&lt;br /&gt;&lt;img style="width:245px;height:55px" src="http://www.comsharp.com/Writable/Resource/_Random_/2008-11-15/12.gif" alt=""&gt;&lt;br&gt;&lt;br /&gt;&lt;br /&gt;&lt;br&gt;&lt;font color="#006633" size="1"&gt;web&lt;/font&gt;&lt;br /&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-8470799214152120383?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/8470799214152120383/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=8470799214152120383' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/8470799214152120383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/8470799214152120383'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/11/web-12.html' title='Web 设计:实现干净代码的12条定律'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-4147714391789430736</id><published>2008-11-14T21:23:00.000-08:00</published><updated>2008-11-14T21:24:24.936-08:00</updated><title type='text'>中国房地产的实质</title><content type='html'>&lt;span style="font-size: 16px;"&gt;&lt;span style="font-family:黑体;"&gt;   &lt;b&gt;&lt;span style="color:#ff0000;"&gt;猪&lt;/span&gt;&lt;/b&gt;通过勤劳致富有5元钱存在&lt;/span&gt;&lt;span style="font-family:黑体;color:#339966;"&gt;&lt;b&gt;老鼠&lt;/b&gt;&lt;/span&gt;&lt;span style="font-family:黑体;"&gt;开的钱庄里。猪打算拿这5元钱建一个小窝，大盖要花2元买地，花3元搭窝。&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;&lt;span style="color:#ff00ff;"&gt;王八&lt;/span&gt;&lt;/b&gt;是搞工程的，他想在猪身上挣更多的钱，于是找来当投资顾问的&lt;b&gt;&lt;span style="color:#ff9900;"&gt;狐狸&lt;/span&gt;&lt;/b&gt;想办法，狐狸说：这好办。于是找来管地盘的&lt;b&gt;&lt;span style="color:#00ffff;"&gt;狼&lt;/span&gt;&lt;/b&gt;，开钱庄的&lt;b&gt;&lt;span style="color:#0000ff;"&gt;老鼠&lt;/span&gt;&lt;/b&gt;一 起来商议，结果王八从老鼠那里借来200元，用100元卖了狼的地，花了3元把猪窝盖好，花了50元给了狐狸咨询服务费，猪没有地，只好求王八把窝卖给 它，王八要价500元，老猪说只有5元买不起，这时候狐狸说服猪去向老鼠借钱，老鼠答应借500给猪，前提是要他连本带利还600元，可以分10年还清， 并且产权证拿来抵押。结果成交。猪到最后花了600元买来了猪窝，比他原来的计划高了120倍，猪努力了十年去挣钱还贷。在这场交易里面，狼，老鼠，狐狸 还有王八都挣了钱。&lt;br /&gt;&lt;br /&gt;    以后他们就如法炮制。更多的猪去贷款买房子了，这时候，当商人的&lt;b&gt;&lt;span style="color:#808000;"&gt;驴&lt;/span&gt;&lt;/b&gt;看到有机可乘，到老鼠那里贷了好多好多的款，把王八盖的房子都买下来，然后以更高的价格卖给了猪。&lt;br /&gt;&lt;br /&gt;    猪 的还贷期就越来越长，吃的越来越差，小猪崽子也不敢生了。由于猪的数目越来越少，狼觉得这样下去自己没有猪肉吃了，非饿死不可，于是开始调控，不让老鼠再 借钱了。但是王八还没有停止盖房，把自己挣的钱和贷的钱全投入生产了。驴手上的猪窝囤积的很多，卖不动了被套牢了。结果，老鼠，王八，还有驴都挣了好多的 猪窝。&lt;br /&gt;&lt;br /&gt;    钱到最后集中到狼手上。如今，谁都等着狼把钱拿出来救命。&lt;br /&gt;&lt;br /&gt;    聪明的你，如果你是狼，你会拿钱救哪个？&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-4147714391789430736?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/4147714391789430736/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=4147714391789430736' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/4147714391789430736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/4147714391789430736'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/11/blog-post_1184.html' title='中国房地产的实质'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-3756293621213524276</id><published>2008-11-14T21:19:00.001-08:00</published><updated>2008-11-14T21:19:03.965-08:00</updated><title type='text'>SSH整合时Session关闭问题解决之道(原创)</title><content type='html'>                &lt;span style="color: rgb(84, 84, 84)"&gt;&lt;b&gt;SSH整合时Session关闭问题解决之道(原创)&lt;/b&gt;&lt;br&gt;&lt;br&gt;&lt;div style=" color: rgb(84, 84, 84)"&gt;&lt;font size="2"&gt;hibernate的策略是在检索时并不返回完整的类字段，以保证性能，当对具体对象进行实例化的时候，重新连接数据库来填充对象。&lt;/font&gt;&lt;/div&gt;&lt;div style=" color: rgb(84, 84, 84)"&gt;&lt;font size="2"&gt;这在应用初期常出现的问题就是总碰到session is closed的错误提示，其实很简单，hibernate对数据库的连接都是由它的session统一维持的，当一段程序完成后，session已经关闭，这时再进行实例化，就会出现以上错误，因此，需要重新建立一个seesion来完成操作。（啥，把lazy load设置为false不就得了？那还用hibernate干啥？十几个多表关联下来，自己累不死，数据库也累死了）&lt;/font&gt;&lt;/div&gt;&lt;div style=" color: rgb(84, 84, 84)"&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/div&gt;&lt;div style=" color: rgb(84, 84, 84)"&gt;&lt;font size="2"&gt;对于一直使用spring集成hibernate的我，这些事情完全不需要自己来做。&lt;/font&gt;&lt;/div&gt;&lt;div style=" color: rgb(84, 84, 84)"&gt;&lt;font size="2"&gt;首先我从不自己去操作hibernate，全都通过spring的hibernateTemplate来完成。&lt;/font&gt;&lt;/div&gt;&lt;div style=" color: rgb(84, 84, 84)"&gt;&lt;font size="2"&gt;其次，spring的强项就是简易AOP，自然不会坐视俺这样的it小工为此操劳。&lt;/font&gt;&lt;/div&gt;&lt;div style=" color: rgb(84, 84, 84)"&gt;&lt;font size="2"&gt;在spring的orm中，为hibernate提供了三个类来处理lazy load问题：&lt;/font&gt;&lt;/div&gt;&lt;div style=" color: rgb(84, 84, 84)"&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/div&gt;&lt;div style=" color: rgb(84, 84, 84)"&gt;&lt;font size="2"&gt;HibernateInterceptor：处理业务逻辑层的问题（普通应用程序），使用ProxyFactoryBean来配置实际业务中的bean，将HibernateInterceptor注入其interceptorNames属性中，则自己的程序就不必操心session的问题了，需要时，spring会帮你建立一个，不需要时，spring会将其关闭。&lt;/font&gt;&lt;/div&gt;&lt;div style=" color: rgb(84, 84, 84)"&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/div&gt;&lt;div style=" color: rgb(84, 84, 84)"&gt;&lt;font size="2"&gt;OpenSessionInViewInterceptor：在springMVC中使用，SimpleUrlHandlerMapping中注入interceptors属性内，那么在视图（jsp等）里访问实体对象也ok了。&lt;/font&gt;&lt;/div&gt;&lt;div style=" color: rgb(84, 84, 84)"&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;/div&gt;&lt;div style=" color: rgb(84, 84, 84)"&gt;&lt;font size="2"&gt;OpenSessionInViewFilter：不用springMVC的就使这个吧，在web.xml中配置一个过滤器，其他的mvc框架也就不受影响了。&lt;/font&gt;&lt;/div&gt;&lt;/span&gt;&lt;br&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: rgb(84, 84, 84)"&gt;&lt;table cellspacing="0" cellpadding="0" width="760" align="center" bgcolor="#ffffff" border="0" style="border-collapse: collapse; word-wrap: break-word" class="zeroBorder"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="middle" height="30" style=" color: rgb(84, 84, 84)"&gt;&lt;font color="#02368d"&gt;&lt;b&gt;could not initialize proxy - the owning Session wa&lt;/b&gt;&lt;/font&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="middle" height="9" style=" color: rgb(84, 84, 84)"&gt;&lt;img height="9" alt="" src="http://blog.chinaunix.net/templates/default/images/right_line.gif" width="502" border="0"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="middle" style=" color: rgb(84, 84, 84)"&gt;&lt;table cellspacing="0" cellpadding="0" width="740" border="0" style="border-collapse: collapse; word-wrap: break-word" class="zeroBorder"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="740" style=" color: rgb(84, 84, 84)"&gt;&lt;div id="art" width="560" style="margin-top: 15px; margin-right: 15px; margin-bottom: 15px; margin-left: 15px; color: rgb(84, 84, 84)"&gt;&lt;div style=" color: rgb(84, 84, 84)"&gt;&lt;font size="2"&gt;其实这个异常写的非常之清楚，就是会话关闭，无法对Hibernate实体进行操作。造成这样的情况有很多，什么书写错误啊，逻辑错误啊。&lt;br&gt;　　&lt;br&gt;　　但就此说一下关于lazy机制：&lt;br&gt;　　&lt;br&gt;　　延迟初始化错误是运用Hibernate开发项目时最常见的错误。如果对一个类或者集合配置了延迟检索策略，那么必须当代理类实例或代理集合处于持久化状态（即处于Session范围内）时，才能初始化它。如果在游离状态时才初始化它，就会产生延迟初始化错误。&lt;br&gt;　　&lt;br&gt;　　下面把Customer.hbm.xml文件的&amp;lt;class&gt;元素的lazy属性设为true，表示使用延迟检索策略：&lt;br&gt;　　&lt;br&gt;　　&amp;lt;class name="mypack.Customer" table="CUSTOMERS" lazy="true"&gt;&lt;br&gt;　　&lt;br&gt;　　当执行Session的load()方法时，Hibernate不会立即执行查询CUSTOMERS表的select语句，仅仅返回Customer类的代理类的实例，这个代理类具由以下特征：&lt;br&gt;　　&lt;br&gt;　　（1） 由Hibernate在运行时动态生成，它扩展了Customer类，因此它继承了Customer类的所有属性和方法，但它的实现对于应用程序是透明的。&lt;br&gt;　　（2） 当Hibernate创建Customer代理类实例时，仅仅初始化了它的OID属性，其他属性都为null，因此这个代理类实例占用的内存很少。&lt;br&gt;　　（3）当应用程序第一次访问Customer代理类实例时（例如调用customer.getXXX()或customer.setXXX()方法）， Hibernate会初始化代理类实例，在初始化过程中执行select语句，真正从数据库中加载Customer对象的所有数据。但有个例外，那就是当应用程序访问Customer代理类实例的getId()方法时，Hibernate不会初始化代理类实例，因为在创建代理类实例时OID就存在了，不必到数据库中去查询。&lt;br&gt;　　&lt;br&gt;　　提示：Hibernate采用CGLIB工具来生成持久化类的代理类。CGLIB是一个功能强大的Java字节码生成工具，它能够在程序运行时动态生成扩展 Java类或者实现Java接口的代理类。关于CGLIB的更多知识，请参考：&lt;/font&gt;&lt;a target="_blank" href="http://cglib.sourceforge.net/" style="color: rgb(0, 0, 0); text-decoration: none"&gt;http://cglib.sourceforge.net/&lt;/a&gt;&lt;font size="2"&gt;。&lt;br&gt;　　&lt;br&gt;　　以下代码先通过Session的load()方法加载Customer对象，然后访问它的name属性： &lt;br&gt;　　&lt;br&gt;　　tx = session.beginTransaction();&lt;br&gt;　　Customer customer=(Customer)session.load(Customer.class,new Long(1));&lt;br&gt;　　customer.getName();&lt;br&gt;　　tx.commit();&lt;br&gt;　　&lt;br&gt;　　在运行session.load()方法时Hibernate不执行任何select语句，仅仅返回Customer类的代理类的实例，它的OID为1，这是由load()方法的第二个参数指定的。当应用程序调用customer.getName()方法时，Hibernate会初始化Customer代理类实例，从数据库中加载Customer对象的数据，执行以下select语句：&lt;br&gt;　　&lt;br&gt;　　select * from CUSTOMERS where ID=1;&lt;br&gt;　　select * from ORDERS where CUSTOMER_ID=1;&lt;br&gt;　　&lt;br&gt;　　当&amp;lt;class&gt;元素的lazy属性为true，会影响Session的load()方法的各种运行时行为，下面举例说明。&lt;br&gt;　　&lt;br&gt;　　1．如果加载的Customer对象在数据库中不存在，Session的load()方法不会抛出异常，只有当运行customer.getName()方法时才会抛出以下异常：&lt;br&gt;　　&lt;br&gt;　　ERROR LazyInitializer:63 - Exception initializing proxy&lt;br&gt;　　net.sf.hibernate.ObjectNotFoundException: No row with the given identifier exists: 1, of class: &lt;br&gt;　　mypack.Customer&lt;br&gt;　　&lt;br&gt;　　2．如果在整个Session范围内，应用程序没有访问过Customer对象，那么Customer代理类的实例一直不会被初始化，Hibernate不会执行任何select语句。以下代码试图在关闭Session后访问Customer游离对象：&lt;br&gt;　　&lt;br&gt;　　tx = session.beginTransaction();&lt;br&gt;　　Customer customer=(Customer)session.load(Customer.class,new Long(1));&lt;br&gt;　　tx.commit();&lt;br&gt;　　session.close();&lt;br&gt;　　customer.getName();&lt;br&gt;　　&lt;br&gt;　　由于引用变量customer引用的Customer代理类的实例在Session范围内始终没有被初始化，因此在执行customer.getName()方法时，Hibernate会抛出以下异常：&lt;br&gt;　　&lt;br&gt;　　ERROR LazyInitializer:63 - Exception initializing proxy&lt;br&gt;　　net.sf.hibernate.HibernateException: Could not initialize proxy - the owning Session was closed&lt;br&gt;　　&lt;br&gt;　　由此可见，Customer代理类的实例只有在当前Session范围内才能被初始化。&lt;br&gt;　　&lt;br&gt;　　3．net.sf.hibernate.Hibernate类的initialize()静态方法用于在Session范围内显式初始化代理类实例，isInitialized()方法用于判断代理类实例是否已经被初始化。例如：&lt;br&gt;　　&lt;br&gt;　　tx = session.beginTransaction();&lt;br&gt;　　Customer customer=(Customer)session.load(Customer.class,new Long(1));&lt;br&gt;　　if(!Hibernate.isInitialized(customer)) &lt;br&gt;　　Hibernate.initialize(customer);&lt;br&gt;　　tx.commit();&lt;br&gt;　　session.close();&lt;br&gt;　　customer.getName();&lt;br&gt;　　&lt;br&gt;　　以上代码在Session范围内通过Hibernate类的initialize()方法显式初始化了Customer代理类实例，因此当Session关闭后，可以正常访问Customer游离对象。&lt;br&gt;　　&lt;br&gt;　　4．当应用程序访问代理类实例的getId()方法时，不会触发Hibernate初始化代理类实例的行为，例如：&lt;br&gt;　　&lt;br&gt;　　tx = session.beginTransaction();&lt;br&gt;　　Customer customer=(Customer)session.load(Customer.class,new Long(1));&lt;br&gt;　　customer.getId();&lt;br&gt;　　tx.commit();&lt;br&gt;　　session.close();&lt;br&gt;　　customer.getName();&lt;br&gt;　　&lt;br&gt;　　当应用程序访问customer.getId()方法时，该方法直接返回Customer代理类实例的OID值，无需查询数据库。由于引用变量 customer始终引用的是没有被初始化的Customer代理类实例，因此当Session关闭后再执行customer.getName()方法， Hibernate会抛出以下异常：&lt;br&gt;　　&lt;br&gt;　　ERROR LazyInitializer:63 - Exception initializing proxy&lt;br&gt;　　net.sf.hibernate.HibernateException: Could not initialize proxy - the owning Session was closed&lt;br&gt;　　&lt;br&gt;　　&lt;br&gt;　　解决方法：&lt;br&gt;　　&lt;br&gt;　　由于hibernate采用了lazy=true,这样当你用hibernate查询时,返回实际为利用cglib增强的代理类,但其并没有实际填充;当你在前端,利用它来取值(getXXX)时,这时Hibernate才会到数据库执行查询,并填充对象,但此时如果和这个代理类相关的session已关闭掉,就会产生种错误.&lt;br&gt;　　在做一对多时，有时会出现"could not initialize proxy - clothe owning Session was sed,这个好像是hibernate的缓存问题.问题解决:需要在&amp;lt;many-to-one&gt;里设置lazy="false". 但有可能会引发另一个异常叫&lt;br&gt;　　&lt;br&gt;　　failed to lazily initialize a collection of role: XXXXXXXX, no session or session was closed&lt;br&gt;　　&lt;br&gt;　　此异常解决方案请察看本人博客（&lt;/font&gt;&lt;a target="_blank" href="http://hi.baidu.com/kekemao1" style="color: rgb(0, 0, 0); text-decoration: none"&gt;http://hi.baidu.com/kekemao1&lt;/a&gt;&lt;font size="2"&gt;）的Hibernate异常中的《failed to lazily initialize a collection of role异常》&lt;br&gt;　　&lt;br&gt;　　?&lt;br&gt;　　解决方法:在web.xml中加入&lt;br&gt;　　&amp;lt;filter&gt;&lt;br&gt;　　    &amp;lt;filter-name&gt;hibernateFilter&amp;lt;/filter-name&gt;&lt;br&gt;　　    &amp;lt;filter-class&gt;&lt;br&gt;　　     org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;br&gt;　　    &amp;lt;/filter-class&gt;&lt;br&gt;　　&amp;lt;/filter&lt;br&gt;　　&amp;lt;filter-mapping&gt;&lt;br&gt;　　    &amp;lt;filter-name&gt;hibernateFilter&amp;lt;/filter-name&gt;&lt;br&gt;　　    &amp;lt;url-pattern&gt;*.do&amp;lt;/url-pattern&gt;&lt;br&gt;　　&amp;lt;/filter-mapping&gt;&lt;br&gt;　　就可以了;&lt;br&gt;　　&lt;br&gt;　　参考了:&lt;br&gt;　　Hibernate与延迟加载：&lt;br&gt;　　&lt;br&gt;　　Hibernate对象关系映射提供延迟的与非延迟的对象初始化。非延迟加载在读取一个对象的时候会将与这个对象所有相关的其他对象一起读取出来。这有时会导致成百的（如果不是成千的话）select语句在读取对象的时候执行。这个问题有时出现在使用双向关系的时候，经常会导致整个数据库都在初始化的阶段被读出来了。当然，你可以不厌其烦地检查每一个对象与其他对象的关系，并把那些最昂贵的删除，但是到最后，我们可能会因此失去了本想在ORM工具中获得的便利。&lt;br&gt;　　&lt;br&gt;　　&lt;br&gt;　　一个明显的解决方法是使用Hibernate提供的延迟加载机制。这种初始化策略只在一个对象调用它的一对多或多对多关系时才将关系对象读取出来。这个过程对开发者来说是透明的，而且只进行了很少的数据库操作请求，因此会得到比较明显的性能提升。这项技术的一个缺陷是延迟加载技术要求一个Hibernate会话要在对象使用的时候一直开着。这会成为通过使用DAO模式将持久层抽象出来时的一个主要问题。为了将持久化机制完全地抽象出来，所有的数据库逻辑，包括打开或关闭会话，都不能在应用层出现。最常见的是，一些实现了简单接口的DAO实现类将数据库逻辑完全封装起来了。一种快速但是笨拙的解决方法是放弃DAO模式，将数据库连接逻辑加到应用层中来。这可能对一些小的应用程序有效，但是在大的系统中，这是一个严重的设计缺陷，妨碍了系统的可扩展性。&lt;br&gt;　　&lt;br&gt;　　在Web层进行延迟加载&lt;br&gt;　　&lt;br&gt;　　幸运的是，Spring框架为Hibernate延迟加载与DAO模式的整合提供了一种方便的解决方法。对那些不熟悉Spring与Hibernate集成使用的人，我不会在这里讨论过多的细节，但是我建议你去了解Hibernate与Spring集成的数据访问。以一个Web应用为例，Spring提供了OpenSessionInViewFilter和OpenSessionInViewInterceptor。我们可以随意选择一个类来实现相同的功能。两种方法唯一的不同就在于interceptor在Spring容器中运行并被配置在web应用的上下文中，而Filter在Spring之前运行并被配置在web.xml中。不管用哪个，他们都在请求将当前会话与当前（数据库）线程绑定时打开Hibernate会话。一旦已绑定到线程，这个打开了的Hibernate会话可以在DAO实现类中透明地使用。这个会话会为延迟加载数据库中值对象的视图保持打开状态。一旦这个逻辑视图完成了，Hibernate会话会在Filter的doFilter方法或者Interceptor的postHandle方法中被关闭。下面是每个组件的配置示例：&lt;br&gt;　　&lt;br&gt;　　&lt;br&gt;　　&lt;br&gt;　　Interceptor的配置:&lt;br&gt;　　&lt;br&gt;　　&lt;br&gt;　　&amp;lt;beans&gt; &lt;br&gt;　　&amp;lt;bean id="urlMapping" &lt;br&gt;　　class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&gt; &lt;br&gt;　　&amp;lt;property name="interceptors"&gt; &lt;br&gt;　　&amp;lt;list&gt; &lt;br&gt;　　&amp;lt;ref bean="openSessionInViewInterceptor"/&gt; &lt;br&gt;　　&amp;lt;/list&gt; &lt;br&gt;　　&amp;lt;/property&gt; &lt;br&gt;　　&amp;lt;property name="mappings"&gt; &lt;br&gt;　　&lt;br&gt;　　&amp;lt;/bean&gt; &lt;br&gt;　　&lt;br&gt;　　&amp;lt;bean name="openSessionInViewInterceptor" &lt;br&gt;　　class="org.springframework.orm.hibernate.support.OpenSessionInViewInterceptor"&gt; &lt;br&gt;　　&amp;lt;property name="sessionFactory"&gt;&amp;lt;ref bean="sessionFactory"/&gt;&amp;lt;/property&gt; &lt;br&gt;　　&amp;lt;/bean&gt; &lt;br&gt;　　&amp;lt;/beans&gt;&lt;br&gt;　　&lt;br&gt;　　Filter的配置&lt;br&gt;　　&lt;br&gt;　　&lt;br&gt;　　&amp;lt;web-app&gt; &lt;br&gt;　　&lt;br&gt;　　&amp;lt;filter&gt; &lt;br&gt;　　&amp;lt;filter-name&gt;hibernateFilter&amp;lt;/filter-name&gt; &lt;br&gt;　　&amp;lt;filter-class&gt; &lt;br&gt;　　org.springframework.orm.hibernate.support.OpenSessionInViewFilter &lt;br&gt;　　&amp;lt;/filter-class&gt; &lt;br&gt;　　&amp;lt;/filter&gt; &lt;br&gt;　　&lt;br&gt;　　&amp;lt;filter-mapping&gt; &lt;br&gt;　　&amp;lt;filter-name&gt;hibernateFilter&amp;lt;/filter-name&gt; &lt;br&gt;　　&amp;lt;url-pattern&gt;*. spring &amp;lt;/url-pattern&gt; &lt;br&gt;　　&amp;lt;/filter-mapping&gt; &lt;br&gt;　　&lt;br&gt;　　&amp;lt;/web-app&gt;&lt;br&gt;　　&lt;br&gt;　　&lt;br&gt;　　实现Hibernate的Dao接口来使用打开的会话是很容易的。事实上，如果你已经使用了Spring框架来实现你的Hibernate Dao,很可能你不需要改变任何东西。方便的HibernateTemplate公用组件使访问数据库变成小菜一碟，而DAO接口只有通过这个组件才可以访问到数据库。下面是一个示例的DAO：&lt;br&gt;　　&lt;br&gt;　　&lt;br&gt;　　public class HibernateProductDAO extends HibernateDaoSupport implements ProductDAO {&lt;br&gt;　　&lt;br&gt;　　public Product getProduct(Integer productId) { &lt;br&gt;　　return (Product)getHibernateTemplate().load(Product.class, productId); &lt;br&gt;　　}&lt;br&gt;　　&lt;br&gt;　　public Integer saveProduct(Product product) { &lt;br&gt;　　return (Integer) getHibernateTemplate().save(product); &lt;br&gt;　　}&lt;br&gt;　　&lt;br&gt;　　public void updateProduct(Product product) { &lt;br&gt;　　getHibernateTemplate().update(product); &lt;br&gt;　　} &lt;br&gt;　　}&lt;br&gt;　　&lt;br&gt;　　&lt;br&gt;　　在业务逻辑层中使用延迟加载&lt;br&gt;　　&lt;br&gt;　　即使在视图外面，Spring框架也通过使用AOP 拦截器 HibernateInterceptor来使得延迟加载变得很容易实现。这个Hibernate 拦截器透明地将调用配置在Spring应用程序上下文中的业务对象中方法的请求拦截下来，在调用方法之前打开一个Hibernate会话，然后在方法执行完之后将会话关闭。让我们来看一个简单的例子，假设我们有一个接口BussinessObject：&lt;br&gt;　　&lt;br&gt;　　&lt;br&gt;　　public     interface    BusinessObject     { &lt;br&gt;　　public     void    doSomethingThatInvolvesDaos(); &lt;br&gt;　　} &lt;br&gt;　　类BusinessObjectImpl实现了BusinessObject接口:&lt;br&gt;　　&lt;br&gt;　　public     class    BusinessObjectImpl    implements    BusinessObject     { &lt;br&gt;　　public     void    doSomethingThatInvolvesDaos()     { &lt;br&gt;　　//    lots of logic that calls &lt;br&gt;　　//    DAO classes Which access &lt;br&gt;　　//    data objects lazily  &lt;br&gt;　　}  &lt;br&gt;　　}  &lt;br&gt;　　&lt;br&gt;　　&lt;br&gt;　　&lt;br&gt;　　通过在Spring应用程序上下文中的一些配置，我们可以让将调用BusinessObject的方法拦截下来，再令它的方法支持延迟加载。看看下面的一个程序片段：&lt;br&gt;　　&lt;br&gt;　　&lt;br&gt;　　&lt;br&gt;　　&amp;lt;beans&gt; &lt;br&gt;　　&amp;lt;bean id="hibernateInterceptor" class="org.springframework.orm.hibernate.HibernateInterceptor"&gt; &lt;br&gt;　　&amp;lt;property name="sessionFactory"&gt; &lt;br&gt;　　&amp;lt;ref bean="sessionFactory"/&gt; &lt;br&gt;　　&amp;lt;/property&gt; &lt;br&gt;　　&amp;lt;/bean&gt; &lt;br&gt;　　&amp;lt;bean id="businessObjectTarget" class="com.acompany.BusinessObjectImpl"&gt; &lt;br&gt;　　&amp;lt;property name="someDAO"&gt;&amp;lt;ref bean="someDAO"/&gt;&amp;lt;/property&gt; &lt;br&gt;　　&amp;lt;/bean&gt; &lt;br&gt;　　&amp;lt;bean id="businessObject" class="org.springframework.aop.framework.ProxyFactoryBean"&gt; &lt;br&gt;　　&amp;lt;property name="target"&gt;&amp;lt;ref bean="businessObjectTarget"/&gt;&amp;lt;/property&gt; &lt;br&gt;　　&amp;lt;property name="proxyInterfaces"&gt; &lt;br&gt;　　&amp;lt;value&gt;com.acompany.BusinessObject&amp;lt;/value&gt; &lt;br&gt;　　&amp;lt;/property&gt; &lt;br&gt;　　&amp;lt;property name="interceptorNames"&gt; &lt;br&gt;　　&amp;lt;list&gt; &lt;br&gt;　　&amp;lt;value&gt;hibernateInterceptor&amp;lt;/value&gt; &lt;br&gt;　　&amp;lt;/list&gt; &lt;br&gt;　　&amp;lt;/property&gt; &lt;br&gt;　　&amp;lt;/bean&gt; &lt;br&gt;　　&amp;lt;/beans&gt;&lt;br&gt;　　&lt;br&gt;　　当businessObject被调用的时候，HibernateInterceptor打开一个Hibernate会话，并将调用请求传递给BusinessObjectImpl对象。当BusinessObjectImpl执行完成后，HibernateInterceptor透明地关闭了会话。应用层的代码不用了解任何持久层逻辑，还是实现了延迟加载。&lt;br&gt;　　&lt;br&gt;　　&lt;br&gt;　　在单元测试中测试延迟加载&lt;br&gt;　　&lt;br&gt;　　最后，我们需要用J-Unit来测试我们的延迟加载程序。我们可以轻易地通过重写TestCase类中的setUp和tearDown方法来实现这个要求。我比较喜欢用这个方便的抽象类作为我所有测试类的基类。&lt;br&gt;　　&lt;br&gt;　　&lt;br&gt;　　public abstract class MyLazyTestCase extends TestCase {&lt;br&gt;　　&lt;br&gt;　　private SessionFactory sessionFactory; &lt;br&gt;　　private Session session;&lt;br&gt;　　&lt;br&gt;　　public void setUp() throws Exception { &lt;br&gt;　　super.setUp(); &lt;br&gt;　　SessionFactory sessionFactory = (SessionFactory) getBean("sessionFactory"); &lt;br&gt;　　session = SessionFactoryUtils.getSession(sessionFactory, true); &lt;br&gt;　　Session s = sessionFactory.openSession(); &lt;br&gt;　　TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(s));&lt;br&gt;　　&lt;br&gt;　　}&lt;br&gt;　　&lt;br&gt;　　protected Object getBean(String beanName) { &lt;br&gt;　　//Code to get objects from Spring application context &lt;br&gt;　　}&lt;br&gt;　　&lt;br&gt;　　public void tearDown() throws Exception { &lt;br&gt;　　super.tearDown(); &lt;br&gt;　　SessionHolder holder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory); &lt;br&gt;　　Session s = holder.getSession(); &lt;br&gt;　　s.flush(); &lt;br&gt;　　TransactionSynchronizationManager.unbindResource(sessionFactory); &lt;br&gt;　　SessionFactoryUtils.closeSessionIfNecessary(s, sessionFactory); &lt;br&gt;　　} &lt;br&gt;　　}&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-3756293621213524276?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/3756293621213524276/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=3756293621213524276' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/3756293621213524276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/3756293621213524276'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/11/sshsession.html' title='SSH整合时Session关闭问题解决之道(原创)'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-6196436289856258699</id><published>2008-11-14T21:18:00.003-08:00</published><updated>2008-11-14T21:18:38.074-08:00</updated><title type='text'>团队提升 团队培训</title><content type='html'>&lt;DIV&gt;团队提升 团队培训&lt;/DIV&gt;&lt;br /&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;br /&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;br /&gt;&lt;DIV&gt;&lt;br /&gt;&lt;DIV class=articleContent id=articleBody&gt;&lt;br /&gt;&lt;DIV&gt;&lt;br /&gt;&lt;P style="TEXT-ALIGN: center" align=center&gt;&lt;FONT face=宋体&gt;&lt;A href="http://blog.sina.com.cn/u/56c35a55010006z8" target=_blank&gt;&lt;FONT color=#ff0000 size=5&gt;&lt;B&gt;值得分享的一个团队培训小游戏&lt;/B&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;&lt;FONT size=3&gt;昨天，在公司内部的培训交流会上，与下属们分享了一个团队培训的小游戏。今天整理工作日志的时候，愈发感觉这个小游戏值得分享一下。不管是从游戏本身，还是从游戏出发的种种目的和结果，都能令人收益匪浅。&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&amp;nbsp;&lt;WBR&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;&lt;FONT size=3&gt;先介绍一下这个游戏：&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&amp;nbsp;&lt;WBR&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;&lt;FONT size=3&gt;名称：猜猜他是谁？&lt;/FONT&gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;&lt;FONT size=3&gt;道具：一叠空白卡片&lt;/FONT&gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;人数：&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;4&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;－&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;7&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;人。如果有更多参与者，将他们分成人数相等的小组。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;&lt;FONT size=3&gt;游戏过程：&lt;/FONT&gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;　　&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;1.&lt;/FONT&gt; &lt;SPAN style="FONT-FAMILY: 宋体"&gt;事先准备&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;4&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;－&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;6&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;个相关的问题。以我昨天下午的培训为例，准备的六个问题是：&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;　　（&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;1&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;）&lt;/SPAN&gt; &lt;SPAN style="FONT-FAMILY: 宋体"&gt;你觉得搞这个培训交流会最主要的目的是什么？&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;　　（&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;2&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;）&lt;/SPAN&gt; &lt;SPAN style="FONT-FAMILY: 宋体"&gt;对这样的培训交流会你最大的担心是什么？&lt;/SPAN&gt;&lt;/FONT&gt; &lt;FONT size=3&gt;&lt;FONT face="Times New Roman"&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;　　（&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;3&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;）&lt;/SPAN&gt; &lt;SPAN style="FONT-FAMILY: 宋体"&gt;你认为目前互联网行业最热的名词是什么？&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Times New Roman"&gt;&lt;FONT size=3&gt;&amp;nbsp;&lt;WBR&gt;&amp;nbsp;&lt;WBR&gt;&amp;nbsp;&lt;WBR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;&lt;WBR&gt;&amp;nbsp;&lt;WBR&gt; &lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;（&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;4&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;）&lt;/SPAN&gt; &lt;SPAN style="FONT-FAMILY: 宋体"&gt;你认为目前我们所在的行业最大的问题是什么？&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;　　（&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;5&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;）&lt;/SPAN&gt; &lt;SPAN style="FONT-FAMILY: 宋体"&gt;描述一下自己迷人的程度？&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;　　（&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;6&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;）&lt;/SPAN&gt; &lt;SPAN style="FONT-FAMILY: 宋体"&gt;说出一位自己喜欢的明星的名字。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;　　&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;2.&lt;/FONT&gt; &lt;SPAN style="FONT-FAMILY: 宋体"&gt;每人取出一张卡片，写上数字&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;"1"&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;，然后在卡片上写下自己对第一个问题的回答。重复以上步骤，直至答完所有问题。但每张卡片只能有一个问题的答案。将卡片写有答案的一面朝下，放在桌子中间。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;　　&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;3.&lt;/FONT&gt; &lt;SPAN style="FONT-FAMILY: 宋体"&gt;让一位员工将所有卡片打乱。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;　　&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;4.&lt;/FONT&gt; &lt;SPAN style="FONT-FAMILY: 宋体"&gt;由第一位员工任意抽取一张卡片，大声念卡片上的内容。如有需要，可再念一遍。但不能将卡片给任何人看，以防从笔迹中辨认出作者。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;　　&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;5.&lt;/FONT&gt; &lt;SPAN style="FONT-FAMILY: 宋体"&gt;除了朗读者之外，其他员工都猜一猜谁是作者，并由朗读者把大家猜测的名字写下来。（卡片真正的作者不能猜自己，只能随便猜一个另外的人。）&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;　　&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;6.&lt;/FONT&gt; &lt;SPAN style="FONT-FAMILY: 宋体"&gt;记录完之后，每个人轮流解释自己猜测结果地原因。可以有适度的争论。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face="Times New Roman"&gt;7.&lt;/FONT&gt; &lt;SPAN style="FONT-FAMILY: 宋体"&gt;此时，真正的作者可以揭晓谜底。凡是猜对者均可得一分，把分数记录在黑板上。然后将卡片正面朝上放在桌子中间。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;　　&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;8.&lt;/FONT&gt; &lt;SPAN style="FONT-FAMILY: 宋体"&gt;下一位再选择一张卡片，进行同样的过程。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;　　&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;9.&lt;/FONT&gt; &lt;SPAN style="FONT-FAMILY: 宋体"&gt;如果只剩下最后一个针对某一问题的答案，朗读者只需将答案读一遍，然后将卡片放在桌子中间即可。（此次没有必要再猜，因为可通过排除法猜出作者。）&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;　　&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;10.&lt;/FONT&gt; &lt;SPAN style="FONT-FAMILY: 宋体"&gt;结束游戏后，宣布得分最高者获胜。&lt;/SPAN&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;通过这个小游戏，可以达到很多目的或结果：&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;&lt;B&gt;第一：可以获悉团队成员之间的相互了解程度。&lt;/B&gt;我们成天口口声声讲要团队协作。团队协作的最重要前提是什么？是团队成员之间的相互了解。只有建立了相互了解的前提，我们才可能实现团队协作。如果现在让我和隔壁公司的张三合作，我和张三也就是见面点头打个招呼，至于他有什么样背景经验、有什么样的特长、有什么样的喜好，我一无所知，谈得上合作吗？要协作，必须相互了解达到一个程度。通过这个游戏的过程，我们可以发现团队成员之间的相互了解程度。得分最高者可能在了解别人的地方做的好一些，得分低者可能在了解别人方面做得差一些。&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;&lt;B&gt;第二：增进同事之间的关爱。&lt;/B&gt;通过对作者的猜测，有的成员就会发现原来别人对自己喜欢什么明星、对自己平时说话表达的口气、认识问题的方式等各方面都了解得这么多，而自己却对别人了解甚少，从而激发自己更多的去了解同事、关心同事。其实我们每天的生活中，同事之间是相处最多，交流最多的，甚至超过了自己的爱人或男女朋友。同事是我们最需要珍惜的一类群体。&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;&lt;B&gt;第三：这个游戏还能以轻松的方式获得我们所需要获得的信息。&lt;/B&gt;拿我们昨天的游戏内容来说，以这种游戏的方式，可以更好的了解团队成员对这样的培训交流会的看法和担心。同样，也能帮助团队&lt;/SPAN&gt;&lt;FONT face="Times New Roman"&gt;Leader&lt;/FONT&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;更好的获悉团队成员对某些与工作和个人生活相关的问题的看法。与其他获取信息的方法相比，这种方法要有效的多。&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;FONT size=3&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;&lt;B&gt;第四：通过游戏让每个成员清楚了自己被他人了解的程度和他人了解自己的程度。&lt;/B&gt;自己的问题被很多人猜对，说明平时自己和同事沟通比较多；自己的问题如果没有一个猜对作者，那证明你被同事了解的程度太低，那就得想想自己是不是平时与同事沟通太少，或者还是自己不善于表达出来。&lt;B&gt;以后如再举行类似的游戏，可以把每次被猜出来的人数的个数作为该作者的分数，可以统计被人了解的得分情况&lt;/B&gt;。&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;SPAN style="FONT-FAMILY: 宋体"&gt;&lt;FONT size=3&gt;&lt;B&gt;第五：游戏还可以锻炼团队成员的逻辑思维能力、表述能力、整理思维的能力。&lt;/B&gt;从这个角度讲，这个游戏类似于杀人游戏。&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;DIV&gt;&lt;BR&gt;交通阻塞&lt;BR&gt;道具：比参加人数多一个塑胶地垫&lt;BR&gt;说明：&lt;BR&gt;1、将塑胶地垫呈一字型在地上铺开，让学员全部站在地垫上，留中间一个地垫不站人；&lt;BR&gt;2、学员分成两边相对而站，通过中间的空格进行移动，&lt;BR&gt;3、移动的方式是只能前进一格或跳一格，不能后退&lt;BR&gt;4、完成两边人的互换，并且大家维持同一个方向。&lt;BR&gt;规则：&lt;BR&gt;1、学员只能前进不能后退，只要有人后退就要重来&lt;BR&gt;2、当有人知道答案时，我们要每个人都知道答案 &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;迷失丛林&lt;BR&gt;形式：先以个人形式，之后再以5人的小组形式完成&lt;BR&gt;类型：团队建设&lt;BR&gt;时间：30分钟&lt;BR&gt;材料及场地：迷失丛林工作表及专家意见表，教室及会议室&lt;BR&gt;适用对象：所有学员&lt;BR&gt;活动目的：通过具体活动来说明，团队的智慧高于个人智慧的平均组合，只要学会运用团队工作方法，可以达到更好的效果。 &lt;BR&gt;操作程序&lt;BR&gt;1、培训师把“迷失丛林”工作表发给每一位学员，而后讲下面一段故事：&lt;BR&gt;你是一名飞行员，但你驾驶的飞机在飞越非洲丛林上空时飞机突然失事，这时你必须跳伞。与你们一起落在非洲丛林中有14样物品，这时你们必须为生存作出一些决定。&lt;BR&gt;2、在14样物品中，先以个人形式把14样物品以重要顺序排列出来，把答案写在第一栏。&lt;BR&gt;3、当大家都完成之后，培训师把全班学员分为5人一组，让他们开始进行讨论，以小组形式把14样物品重新按重要顺序再排列把答案写在工作表的第二栏，讨论时间为20分钟。&lt;BR&gt;4、当小组完成之后，培训师把专家意见表发给每个小组，小组成员将把专家意见转入第三栏。&lt;BR&gt;5、用第三栏减第一栏，取绝对值得出第四栏，用第三栏减第二栏得出第五栏，把第四栏累加起来得出一个个人得分，第五栏累计起来得出小组得分。&lt;BR&gt;6、培训师把每个小组的分数情况记录在白板上，用于分析： &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;小组 全组个人得分 团队得分 平均分 &lt;BR&gt;1 &lt;BR&gt;2 &lt;BR&gt;3 &lt;BR&gt;4 &lt;BR&gt;&lt;BR&gt;7、培训师在分析时主要掌握两个关键的地方：&lt;BR&gt;1）找出团队得分低于平均分的小组进行分析，说明团队工作的效果（1+1大于2）；&lt;BR&gt;2）找出个人得分最接近团队得分的小组及个人，说明该个人的意见对小组的影响力。 &lt;BR&gt;有关讨论：&lt;BR&gt;1、你对团队工作方法是否有更进一步的认识？&lt;BR&gt;2、你的小组是否有出现意见垄断的现象，为什么？&lt;BR&gt;3、你所在的小组是以什么方法达成共识的？&lt;BR&gt;&lt;BR&gt;将以下内容打印给学员&lt;BR&gt;　 物品清单 1个人顺序 2小组顺序 3专家排列 个人和专家比较（3-1） 小组与专家比较（3-2） &lt;BR&gt;1 药箱 　 　 　 　 &lt;BR&gt;2 手提收音机 　 　 　 　 &lt;BR&gt;3 打火机 　 　 　 　 &lt;BR&gt;4 三只高尔夫球杆 　&lt;/DIV&gt;&lt;br /&gt;&lt;DIV&gt;5 七个大的绿的垃圾袋 　 　 　 　 &lt;BR&gt;6 指南针 　 　 　 　 &lt;BR&gt;7 蜡烛 　 　 　 　 &lt;BR&gt;8 手枪 　 　 　 　 &lt;BR&gt;9 药箱 一瓶驱虫剂 　 　 　 &lt;BR&gt;10 大砍刀 　 　 　 　 &lt;BR&gt;11 蛇咬药箱 　 　 　 　 &lt;BR&gt;12 一盒轻便食物 　 　 　 　 &lt;BR&gt;13 一张防水毛毯 　 　 　 　 &lt;BR&gt;14 一个热水瓶 　 　 　 　 &lt;BR&gt;第6步：计算个人得分（第4步总和）&lt;BR&gt;第7步：计算团队得分（第5步总和）&lt;BR&gt;第8步：统计小组中最低个人得分&lt;BR&gt;第9步：计算个人得分低于团队得分的总和&lt;BR&gt;第10步：计算个人得分的平均数 &lt;BR&gt;&lt;BR&gt;专家选择&lt;BR&gt;药箱6　 手提收音机13　　打火机2　　3支高尔夫球杆11　　7个大绿色垃圾袋7　　指南针（罗盘）14　　蜡烛3　　手枪12　　一瓶驱虫剂5　　大砍刀1　　蛇咬药箱10　　 一盒轻便食物8　　一张防水毛毯4　　一个热水瓶9&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;解手链 &lt;BR&gt;&lt;BR&gt;形式：10人一组为最佳&lt;BR&gt;时间：20分钟&lt;BR&gt;材料：无&lt;BR&gt;适用对象：全体人员 &lt;BR&gt;活动目的：让学员体会在解决团队问题方面都有什么步骤，聆听在沟通中的重要性，以及团队的合作精神。&lt;BR&gt;操作程序&lt;BR&gt;1、培训师让每组圈着站成一个向心圈。&lt;BR&gt;2、培训师说：先举起你的右手，握住对面那个人的手；再举起你的左手，握住另外一个人的手；现在你们面对一个错综复杂的问题，在不松开的情况下，想办法把这张乱网解开&lt;BR&gt;3、告诉大家一定可以解开，但答案会有两种。一种是一个大圈，另外一种是两个套着的环。&lt;BR&gt;4、如果过程中实在解不开，培训师可允许学员决定相邻两只手断开一次，但再次进行时必须马上封闭。 &lt;BR&gt;&lt;BR&gt;有关讨论&lt;BR&gt;你在开始的感觉怎样，是否思路很混乱？&lt;BR&gt;当解开了一点以后，你的想法是否发生了变化？&lt;BR&gt;最后问题得到了解决，你是不是很开心？&lt;BR&gt;在这个过程中，你学到了什么？&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;瞎子走路&lt;BR&gt;&lt;BR&gt;游戏方法：&lt;BR&gt;两人一组（如A与B）&lt;BR&gt;A先闭上眼睛，将手交给B，B可以虚构任何地形或路线，口述注意事项指引A行进。如：“向前走，……迈台阶……跨过一道小沟……向左手拐……”&lt;BR&gt;然后交换角色，B闭眼，A指引B走路&lt;BR&gt;分析：&lt;BR&gt;通过亲身体验，让学员体会信任与被信任的感觉&lt;BR&gt;作为被牵引的一方，应全身心信赖对方，大胆遵照对方的指引行事&lt;BR&gt;而作为牵引者，应对伙伴的安全负起全部的责任，对一举一动的指令均应保证准确、清楚&lt;BR&gt;另外，万一指令有错，信任受到怀疑后很难重建 &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;你说我做&lt;BR&gt;&lt;BR&gt;道具：&amp;nbsp;七彩积木&lt;BR&gt;参加人数：20-30人&lt;BR&gt;用时：约1小时&lt;BR&gt;游戏前准备：培训师先自己用积木做好一个模型。&lt;BR&gt;过程：&lt;BR&gt;1、将参加人员分成若干组，每组4-6人为宜。&lt;BR&gt;2、每组讨论三分钟，根据自己平时的特点分成两队，分别为“指导者”和“操作者”。&lt;BR&gt;3、请每组的“操作者”暂时先到教师外面等候。&lt;BR&gt;4、这时培训师拿出自己做好的模型，让每组剩下的“指导者”观看（不许拆开），并记录下模型的样式。&lt;BR&gt;5、15分钟后，将模型收起，请“操作者”进入教室，每组的“指导者”将刚刚看到的模型描述给“操作者”，由“操作者”搭建一个与模型一模一样的造型。 &lt;BR&gt;6、培训师展示标准模型，用时少且出错率低者为胜。&lt;BR&gt;7、让“指导者”和“操作者”分别将自己的感受用彩笔写在白纸上。&lt;BR&gt;游戏点评：&lt;BR&gt;1、身为指导者的你，体会到什么？&lt;BR&gt;2、身为操作者的你，体会到什么？&lt;BR&gt;3、当操作者没有完全按照你的指导去做的时候，指导者的你有什么感觉？&lt;BR&gt;4、当感觉到你没能完全领会指导者意图的时候，操作者的你有什么感觉？&lt;BR&gt;5、当竞争对手已经做完，欢呼雀跃的时候，你们有什么感受？&lt;BR&gt;6、当看到最后的作品与标准模型不一样的时候，你们有什么感受？&lt;BR&gt;7、是效率给予的压力大，还是安全性给予的压力大？&lt;BR&gt;8、指导者和操作者感受到的压力有什么不一样？ &lt;BR&gt;适用课程：《职业压力》、《团队建设》。 &lt;BR&gt;&lt;BR&gt;&lt;BR&gt;如何建立信任&lt;BR&gt;&lt;BR&gt;带眼罩行走，两人一组&lt;BR&gt;第一阶段：一个人带眼罩行走，另一人手牵手，可以提示；&lt;BR&gt;第二阶段：一人带眼罩行走，另一人在其左右，但不能身体接触，也不能使用语言提示；&lt;BR&gt;第三阶段：一人带眼罩行走，另一人与你保持一定距离，不能使用语言提示。 &lt;BR&gt;游戏说明：&lt;BR&gt;1．领导行为、观点的连续性、一致性，保持沟通，是信任建立的根本保障&lt;BR&gt;2．手把手教—引导—建立信任，授权，同时不断给予指导&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;报数&lt;BR&gt;&lt;BR&gt;所需时间：30-60分钟，由团队的人数的多少决定，培训者打算用多少时间做此练习。&lt;BR&gt;小组人数：越多越好&lt;BR&gt;所需物品：秒表&lt;BR&gt;游戏概述：一个关于促进团队效率游戏&lt;BR&gt;目的：&lt;BR&gt;1、 使团队通过竞争提高他们的效率。&lt;BR&gt;2、 使队员看到团队的责任心&lt;BR&gt;步骤：&lt;BR&gt;1、游戏第一步就是将所有参加的人，要求在两分钟之内分成平均分成两组。&lt;BR&gt;2、挑选男女队长各一名，组织团队进行比赛（队长不参加比赛。）&lt;BR&gt;3、教练要求队长宣誓，问三个问题：“有没有信心战胜对手”、“如果失败，敢不敢于面对队员的指责”、“如果失败，愿不愿意承担由此所带来的一切责任”&lt;BR&gt;4、教练宣布比赛规则：&lt;BR&gt;1）全队学员进行报数，速度越快越好；&lt;BR&gt;2）分别进行8轮比赛，&lt;/DIV&gt;&lt;br /&gt;&lt;DIV&gt;每轮比赛间隔休息3分钟、2分钟（2次）、1分半钟2次、1分钟（2次）&lt;BR&gt;3）每轮比赛进行奖惩。输者，由队长率领队员向对方表示诚服，并对对方队员说：“愿赌服输，恭喜你们！”并有男女队长做俯卧撑10次，如果以后再输，俯卧撑的次数将会乘倍递增。赢者，将全队哈哈大笑，以示胜利。&lt;BR&gt;4）将每轮比赛的结果记录在白板上。&lt;BR&gt;5、游戏结束，播放抒情音乐（熄灯），诵读一篇散文（记述文，并在最后一轮失败的人当中在做俯卧撑的时候，让学员深深感受到责任是一种非常重要的人生）。 &lt;BR&gt;6、诵读结束，教练引导大家讨论： &lt;BR&gt;讨论题目：&lt;BR&gt;1、 每个人都同意所有的意见吗？如果不是，为什么？&lt;BR&gt;2、谈谈责任心对我们人生的体会？&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;6盒冰红茶&lt;BR&gt;&lt;BR&gt;课间休息，林先生在每个桌子分别放上6盒冰红茶，红的、绿的，煞是好看。但是他说：“先不要喝哦，待会儿我们用它来做个游戏。”&lt;BR&gt;　　30名学员分成4个小组，每两个小组又编成两个竞赛小队。一个竞赛小队中的一个组，背着另一组先将自己桌上的6盒冰红茶摆成任意形状，然后，通过语言描述给同队中的另一组，另一组听到描述后即开始摆放。另一队亦然。10分钟后，哪一组摆放图形最相似，就算哪一队为胜者。 &lt;BR&gt;&lt;BR&gt;　　6盒冰红茶拼图？太“小儿科”了。我们组的7个人个个是“赛孔明”，14只手把它们摆成一个立体的“天”字，上下三层，前后三层，够水平的吧？再看看另一队的那个组，他们摆了个最简单正六边形，既没有层次，又缺乏“艺术”，真够笨的。正美哩，我们队另一组的阿红着急了：快点说吧，下一步工序是我们听你们的遥控啦！ &lt;BR&gt;&lt;BR&gt;　　我们这幅够艺术的拼图确实难模仿！7张嘴嚷开了：“有三层”、“是立着的”、“前边不出头”、“两个摆成一横”，……等到阿红她们手忙脚乱地听我们指挥，将6盒冰红茶摆得刚有点模样时，时间到了。&lt;BR&gt;&lt;BR&gt;　　大家先一起评判另一队。他们队的两个拼图完全一样，都是立着的正六边形，汉字标签一律朝外，拼音字母一律向内，红、绿颜色相间，字头咬字尾按顺时针有规律地排列。一 目了然。&lt;BR&gt;&lt;BR&gt;　　再看看我们这一队，大伙儿全乐了，两个组的“天”字怎么比较也不像：一组是红盒，一组是绿盒，一组汉字朝外，一组汉字朝内，一组盒头朝前，一组盒头向后……。&lt;BR&gt;&lt;BR&gt;　　最后，当然我们输了。阿红气得直瞪我们：“就你们能耐，自作聪明！”　这时，林先生开始讲解“沟通的技巧”，他说：“上级给下属布置任务，要简单明了，内部流程不要故意弄得很复杂，人为地设置障碍。指令一定要明确，描述一定要到位……”&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;踩报纸&lt;BR&gt;&lt;BR&gt;参加游戏人员在10人以上，在规定的时间（由讲师视人数多少而定）内全部站到1开的报纸上，（特别说明，全部的脚不能站出报纸的边界）&lt;BR&gt;分析：&lt;BR&gt;解决问题的思路要突破限制，要敢于尝试、大胆想象，并善于实验学员的建议，排除不可行的方案 &lt;/DIV&gt;&lt;BR&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-6196436289856258699?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/6196436289856258699/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=6196436289856258699' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/6196436289856258699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/6196436289856258699'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/11/blog-post_7887.html' title='团队提升 团队培训'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-6296856337409413358</id><published>2008-11-14T21:18:00.001-08:00</published><updated>2008-11-14T21:18:08.038-08:00</updated><title type='text'>金融经济学家解释</title><content type='html'>&lt;FONT COLOR=#ff0000 SIZE=5&gt;&lt;b&gt;&lt;FONT FACE=宋体 SIZE=2&gt;金融经济学家解释经济名词&lt;BR&gt;&lt;br /&gt;&lt;BR&gt;&lt;br /&gt;一男赶集卖猪，天黑遇雨，二十头猪未卖成，到一农家借宿。&lt;BR&gt;&lt;br /&gt;少妇说：家里只一人不便。&lt;BR&gt;&lt;br /&gt;男：求你了大妹子，给猪一头。&lt;BR&gt;&lt;br /&gt;女：好吧，但家只有一床。&lt;BR&gt;&lt;br /&gt;男：我也到床上睡，再给猪一头。&lt;BR&gt;&lt;br /&gt;女：同意。&lt;BR&gt;&lt;br /&gt;半夜男与女商量，我到你上面睡，女不肯。&lt;BR&gt;&lt;br /&gt;男：给猪两头。&lt;BR&gt;&lt;br /&gt;女允，要求上去不能动。&lt;BR&gt;&lt;br /&gt;少顷，男忍不住，央求动一下，女不肯。&lt;BR&gt;&lt;br /&gt;男：动一下给猪两头。女同意。&lt;BR&gt;&lt;br /&gt;男动了八次停下，女问为何不动？&lt;BR&gt;&lt;br /&gt;男说猪没了。&lt;BR&gt;&lt;br /&gt;女小声说：要不我给你猪&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;……&lt;/FONT&gt;&lt;/b&gt;&lt;FONT FACE=宋体 SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;天亮后，男吹着口哨赶&lt;/b&gt;&lt;/FONT&gt;&lt;b&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;30&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;头（含少妇家的&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;10&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;头）猪赶集去了&lt;/FONT&gt;&lt;/b&gt;&lt;b&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;……&lt;BR&gt;&lt;br /&gt;&amp;nbsp;&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;哈佛导师评论：要发现用户潜在需求，前期必须引导，培养用户需求，因此产生的投入是符合发展规律的。&lt;/FONT&gt;&lt;/b&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;另一男得知此事，决意如法炮制，遂赶集卖猪，天黑遇雨，二十头猪未卖成，到一农家借宿&lt;BR&gt;&lt;br /&gt;少妇说：家里只一人不便。&lt;BR&gt;&lt;br /&gt;男：求你了大妹子，给猪一头&lt;BR&gt;&lt;br /&gt;女：好吧，但家只有一床。&lt;BR&gt;&lt;br /&gt;男：我也到床上睡，再给猪一头。&lt;BR&gt;&lt;br /&gt;女：同意。&lt;BR&gt;&lt;br /&gt;半夜男商女，我到你上面睡，女不肯。&lt;BR&gt;&lt;br /&gt;男：给猪两头。&lt;BR&gt;&lt;br /&gt;女允，要求上去不能动。&lt;BR&gt;&lt;br /&gt;少顷，男忍不住，央求动一下，女不肯。&lt;BR&gt;&lt;br /&gt;男：动一下给猪两头。女同意。&lt;BR&gt;&lt;br /&gt;男动了七次停下，女问为何不动？&lt;BR&gt;&lt;br /&gt;男说：完事了～～～女：&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;b&gt;......&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;天亮后，男低著头赶&lt;/b&gt;&lt;/FONT&gt;&lt;b&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;2&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;头猪赶集去了&lt;/FONT&gt;&lt;/b&gt;&lt;b&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;.....&lt;BR&gt;&lt;br /&gt;&amp;nbsp;&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;哈佛导师评论：要结合企业自身规模进行谨慎投资，谨防资金链断裂问题&lt;/FONT&gt;&lt;/b&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/FONT&gt;&lt;b&gt;&lt;FONT FACE=宋体 SIZE=2&gt;又一男得知此事，决意如法炮制兼吸取教训，遂先用一头猪去换一粒伟哥，事必，天亮后，男吹着口哨赶&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;38&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;头（含少妇家的&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;18&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;头）猪赶集去了&lt;/FONT&gt;&lt;/b&gt;&lt;b&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;……&lt;BR&gt;&lt;br /&gt;&amp;nbsp; &lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;哈佛导师评论：企业如果获得金融资本的帮助，自身经营能力将得到倍增。&lt;/FONT&gt;&lt;BR&gt;&lt;br /&gt;&lt;FONT FACE=宋体 SIZE=2&gt;知道此法男多，伟哥供不应求，逐渐要&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;2&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;头，&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;3&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;头猪换一粒伟哥。&lt;/FONT&gt;&lt;/b&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;&lt;b&gt;哈佛导师评论：这就是通货膨胀。&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/FONT&gt;&lt;b&gt;&lt;FONT FACE=宋体 SIZE=2&gt;当猪价格涨到&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;16&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;粒一棵的时候，哈佛导师评论：该男已经进入边际成本，除了拥有对自身能力的自信和未来良好愿望以外，实际现猪流已经为零。&lt;/FONT&gt;&lt;/b&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;&lt;b&gt;但换猪男越来越多，卖伟哥的决定，扩展生产能力，推出一种次级伟哥，如果你缺一头猪，只要你承诺可以到该女房中一夜，就可以先借，事成后补交猪款，这个方法大大促进了伟哥销售。&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;&lt;b&gt;哈佛导师评论：这就是贷款，让企业可以根据未来的收益选择借支流动资金&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/FONT&gt;&lt;b&gt;&lt;BR&gt;&lt;br /&gt;&lt;FONT FACE=宋体 SIZE=2&gt;伟哥专卖店后来在即使你一头猪都没有，只要你承诺可以到该女房中一夜，就可以先借，事成后补交猪款。&lt;/FONT&gt;&lt;/b&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;&lt;b&gt;哈佛导师评论：这就是金融创新，让现在的人花未来的钱，反正等你老了未来的钱你也花不动。&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;&lt;b&gt;消 息一出，换猪男越来越多，有人找伟哥专卖店，这个项目太好了，我们把它变成优质基金，对外销售债卷，你们也就可以分享我的收益，如何？结果伟哥专卖店觉得 甚好，于是该公司把换猪男分三类，一类是拿现猪换的，一类是一部分现猪贷的，一类是完全没有现猪借的，发行三种债卷。大家踊跃而上。纷纷购买伟哥专卖店的 债卷，伟哥专卖店生意太好，就把债卷销售外包给另外一家公司运作，该公司也一并大发其财，公司越做越大，甚至可以脱离实际伟哥销售情况来发行，给自己和伟 哥专卖店带来巨大的现金收益。&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;&lt;b&gt;哈佛导师评论：这就是专业的人做专业的事，从实体经营到资本运作，经济进入了更高的层次。&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;&lt;b&gt;为了防止自己债卷未来有损失，该公司决定给它买上保险，这样债卷销售就更容易，因为一旦债卷出现问题，还可以获得保险公司的赔付，哇，债券公司销售这下子太好了，保险公司也获得巨大平白无故的保险收入。&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;&lt;b&gt;哈佛导师评论：这就是风险对冲，策略联盟，提高了企业的抗风险能力，也保护了消费者利益。&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;&lt;b&gt;换猪男太多，排长队等待，该女无法承受，说老娘不干了，我搬家，一时间有无数拥有伟哥的欠猪男。&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;&lt;b&gt;哈佛导师评论：这是个别现象，属于市场的正常波动，不会影响整个经济。&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/FONT&gt;&lt;b&gt;&lt;FONT FACE=宋体 SIZE=2&gt;结果该女迟迟不肯搬回。一部分欠猪男没有收入，只好赖帐，结果大量债卷到期无法换现猪吃，债卷公司一看，一粒伟哥&lt;/FONT&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;16&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;头猪，这哪里还得起，宣布倒闭。&lt;/FONT&gt;&lt;/b&gt;&lt;FONT FACE="Times New Roman" SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/FONT&gt;&lt;FONT SIZE=2&gt;&lt;b&gt;&lt;FONT FACE=宋体&gt;哈佛导师评论：这是次贷；换嵊跋煺鼋鹑谛幸怠?/FONT&amp;gt;&lt;/FONT&gt;&lt;/b&gt;&lt;FONT SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;&lt;FONT FACE=宋体&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;&lt;b&gt;哪里晓得债卷公司还把债卷上了保险，保险公司一看，这哪里赔得起，于是也宣布要倒闭。&lt;/b&gt;&lt;/FONT&gt;&lt;FONT SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;b&gt;&lt;FONT FACE=宋体&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/b&gt;&lt;/FONT&gt;&lt;FONT FACE=宋体 SIZE=2&gt;&lt;b&gt;哈佛导师评论：这是金融危机，还不会影响整个实体经济。&lt;/b&gt;&lt;/FONT&gt;&lt;FONT SIZE=2&gt;&lt;BR&gt;&lt;br /&gt;&lt;FONT FACE=宋体&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT FACE=宋体&gt;&lt;b&gt;&lt;FONT SIZE=2&gt;后文：据说该女已搬到中国定居。&lt;/FONT&gt;&lt;/b&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-6296856337409413358?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/6296856337409413358/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=6296856337409413358' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/6296856337409413358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/6296856337409413358'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/11/blog-post_14.html' title='金融经济学家解释'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-6566323544593431742</id><published>2008-11-08T22:38:00.001-08:00</published><updated>2008-11-08T22:38:08.027-08:00</updated><title type='text'>教师用机安全管理规定</title><content type='html'>&lt;br /&gt;&lt;DIV TYPE=HEADER&gt;&lt;br /&gt;	&lt;P ALIGN=RIGHT STYLE="margin-bottom: 0.37in; border-top: none; border-bottom: 1px solid #000000; border-left: none; border-right: none; padding-top: 0in; padding-bottom: 0.01in; padding-left: 0in; padding-right: 0in"&gt;&lt;br /&gt;	&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&lt;FONT SIZE=2&gt;&amp;#21271;&amp;#22823;&amp;#38738;&amp;#40479;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT SIZE=2&gt;&lt;font size="2"&gt;APTECH&lt;/font&gt;&lt;/FONT&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&lt;FONT SIZE=2&gt;&amp;#65288;&amp;#38738;&amp;#23707;&amp;#38134;&amp;#27827;&amp;#65289;&amp;#25480;&amp;#26435;&amp;#22521;&amp;#35757;&amp;#20013;&amp;#24515;&lt;/FONT&gt;&lt;/FONT&gt;&lt;IMG src="http://docs.google.com/File?id=dg5b6kgw_324gn6m36d6_b" NAME="graphics1" ALIGN=LEFT HSPACE=13 WIDTH=125 HEIGHT=37 BORDER=0&gt;&lt;/P&gt;&lt;br /&gt;&lt;/DIV&gt;&lt;br /&gt;&lt;P CLASS="western" ALIGN=CENTER STYLE="margin-bottom: 0in"&gt;&lt;FONT FACE="&amp;#40657;&amp;#20307;, SimHei"&gt;&lt;FONT SIZE=3&gt;&lt;B&gt;&amp;#25945;&amp;#24072;&amp;#29992;&amp;#26426;&amp;#23433;&amp;#20840;&amp;#31649;&amp;#29702;&amp;#35268;&amp;#23450;&lt;/B&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P CLASS="western" ALIGN=CENTER STYLE="margin-bottom: 0in"&gt;&lt;BR&gt;&lt;br /&gt;&lt;/P&gt;&lt;br /&gt;&lt;P CLASS="western" ALIGN=LEFT style="margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&lt;B&gt;&amp;#19968;&amp;#12289;&lt;br /&gt;&amp;#30446;&amp;#30340;&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P CLASS="western" style=" margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#20013;&amp;#24515;&amp;#25945;&amp;#23460;&amp;#12289;&amp;#26426;&amp;#25151;&amp;#30340;&amp;#25945;&amp;#24072;&amp;#29992;&amp;#24494;&amp;#26426;&amp;#21450;&amp;#30456;&amp;#20851;&amp;#22806;&amp;#35774;&amp;#12289;&amp;#32593;&amp;#32447;&amp;#19981;&amp;#20801;&amp;#35768;&amp;#23398;&amp;#21592;&amp;#20351;&amp;#29992;&amp;#65307;&amp;#36817;&amp;#26399;&amp;#20013;&amp;#24515;&amp;#21457;&amp;#29616;&amp;#37096;&amp;#20998;&amp;#23398;&amp;#29983;&amp;#31169;&amp;#33258;&amp;#20351;&amp;#29992;&amp;#25945;&amp;#24072;&amp;#26426;&amp;#12289;&amp;#25658;&amp;#24102;&amp;#20010;&amp;#20154;&amp;#31508;&amp;#35760;&amp;#26412;&amp;#30005;&amp;#33041;&amp;#25509;&amp;#20837;&amp;#25945;&amp;#24072;&amp;#26426;&amp;#32593;&amp;#32447;&amp;#65292;&amp;#32473;&amp;#20013;&amp;#24515;&amp;#21150;&amp;#20844;&amp;#32593;&amp;#32476;&amp;#23433;&amp;#20840;&amp;#24102;&amp;#26469;&amp;#20135;&amp;#29983;&amp;#38544;&amp;#24739;&amp;#65307;&amp;#20026;&amp;#26377;&amp;#25928;&amp;#26460;&amp;#32477;&amp;#27492;&amp;#38382;&amp;#39064;&amp;#29305;&amp;#21046;&amp;#23450;&amp;#26412;&amp;#35268;&amp;#23450;&amp;#12290;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P CLASS="western" ALIGN=LEFT style="margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&lt;B&gt;&amp;#20108;&amp;#12289;&lt;br /&gt;&amp;#36866;&amp;#29992;&amp;#33539;&amp;#22260;&amp;#21450;&amp;#36131;&amp;#20219;&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P CLASS="western" ALIGN=LEFT style=" margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#26412;&amp;#35268;&amp;#23450;&amp;#36866;&amp;#29992;&amp;#20110;&amp;#20013;&amp;#24515;&amp;#20840;&amp;#20307;&amp;#21592;&amp;#24037;&amp;#65292;&amp;#20013;&amp;#24515;&amp;#25216;&amp;#26415;&amp;#25903;&amp;#25345;&amp;#36127;&amp;#36131;&amp;#20855;&amp;#20307;&amp;#23454;&amp;#26045;&amp;#19982;&amp;#30417;&amp;#30563;&amp;#65292;&amp;#20013;&amp;#24515;&amp;#34892;&amp;#25919;&amp;#19987;&amp;#21592;&amp;#36127;&amp;#36131;&amp;#30417;&amp;#30563;&amp;#32771;&amp;#26680;&amp;#12290;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P CLASS="western" ALIGN=LEFT style="margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&lt;B&gt;&amp;#19977;&amp;#12289;&lt;br /&gt;&amp;#35268;&amp;#23450;&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P CLASS="western" ALIGN=LEFT style=" margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;&lt;B&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;1&lt;/FONT&gt;&lt;/B&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&lt;B&gt;&amp;#65294;&amp;#20013;&amp;#24515;&amp;#25216;&amp;#26415;&amp;#25903;&amp;#25345;&lt;/B&gt;&lt;/FONT&gt;&lt;B&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;:&lt;/FONT&gt;&lt;/B&gt;&lt;/P&gt;&lt;br /&gt;&lt;OL&gt;&lt;br /&gt;	&lt;LI&gt;&lt;P CLASS="western" ALIGN=LEFT style="margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;	&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#20013;&amp;#24515;&amp;#25216;&amp;#26415;&amp;#25903;&amp;#25345;&amp;#32479;&amp;#19968;&amp;#31649;&amp;#29702;&amp;#25945;&amp;#23460;&amp;#35745;&amp;#31639;&amp;#26426;&amp;#21450;&amp;#20854;&amp;#30456;&amp;#20851;&amp;#35774;&amp;#22791;&amp;#65292;&amp;#20445;&amp;#35777;&amp;#25945;&amp;#23460;&amp;#35745;&amp;#31639;&amp;#26426;&amp;#36816;&amp;#34892;&amp;#33391;&amp;#22909;&amp;#12290;&amp;#22312;&lt;br /&gt;	  &amp;#25945;&amp;#24072;&amp;#26426;&amp;#19978;&amp;#23433;&amp;#35013;&amp;#25945;&amp;#23398;&amp;#24120;&amp;#29992;&amp;#36719;&amp;#20214;&amp;#20197;&amp;#21450;&amp;#25945;&amp;#23398;&amp;#29992;&lt;/FONT&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;PPT&lt;/FONT&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#12290;&amp;#24182;&amp;#19988;&amp;#23433;&amp;#35013;&amp;#30828;&amp;#30424;&amp;#20445;&amp;#25252;&amp;#21345;&amp;#65292;&amp;#20445;&amp;#25252;&amp;#31995;&amp;#32479;&amp;#30424;&amp;#12290;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;	&lt;LI&gt;&lt;P CLASS="western" ALIGN=LEFT style="margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;	&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#20013;&amp;#24515;&amp;#25216;&amp;#26415;&amp;#25903;&amp;#25345;&amp;#22312;&amp;#25945;&amp;#23460;&amp;#26426;&amp;#22120;&amp;#19978;&amp;#24320;&amp;#35774;&amp;#20004;&amp;#20010;&amp;#24080;&amp;#25143;&amp;#65292;&amp;#19968;&amp;#20010;&amp;#32473;&amp;#20219;&amp;#35838;&amp;#25945;&amp;#21592;&amp;#20351;&amp;#29992;&amp;#65292;&amp;#19968;&amp;#20010;&amp;#32473;&amp;#24066;&amp;#22330;&amp;#37096;&amp;#32463;&amp;#29702;&amp;#20351;&amp;#29992;&amp;#65292;&amp;#20998;&amp;#21035;&amp;#35774;&amp;#32622;&amp;#19981;&amp;#21516;&amp;#30340;&amp;#23494;&amp;#30721;&amp;#12290;&amp;#23494;&amp;#30721;&amp;#23450;&amp;#26399;&amp;#20462;&amp;#25913;&amp;#65292;&amp;#20462;&amp;#25913;&amp;#39057;&amp;#29575;&amp;#20026;&amp;#65306;&amp;#26376;&amp;#12290;&amp;#65288;&amp;#23494;&amp;#30721;&amp;#20462;&amp;#25913;&amp;#21069;&amp;#25216;&amp;#26415;&amp;#25903;&amp;#25345;&amp;#24517;&amp;#39035;&amp;#20197;&amp;#37038;&amp;#20214;&amp;#24418;&amp;#24335;&amp;#36890;&amp;#30693;&amp;#23398;&amp;#26415;&amp;#12289;&amp;#24066;&amp;#22330;&amp;#32463;&amp;#29702;&amp;#65292;&amp;#32463;&amp;#29702;&amp;#36127;&amp;#36131;&amp;#36890;&amp;#30693;&amp;#30456;&amp;#20851;&amp;#21592;&amp;#24037;&amp;#65289;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;	&lt;LI&gt;&lt;P CLASS="western" ALIGN=LEFT style="margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;	&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#26816;&amp;#26597;&amp;#19982;&amp;#30417;&amp;#25511;&amp;#65306;&amp;#25216;&amp;#26415;&amp;#25903;&amp;#25345;&amp;#20250;&amp;#23545;&amp;#20840;&amp;#21592;&amp;#30340;&amp;#23494;&amp;#30721;&amp;#20351;&amp;#29992;&amp;#21450;&amp;#23398;&amp;#21592;&amp;#35268;&amp;#33539;&amp;#36827;&amp;#34892;&amp;#20363;&amp;#34892;&amp;#24033;&amp;#26816;&amp;#21450;&amp;#25277;&amp;#26597;&amp;#65292;&amp;#24182;&amp;#23545;&amp;#21457;&amp;#29616;&amp;#30340;&amp;#36829;&amp;#35268;&amp;#36827;&amp;#34892;&amp;#36890;&amp;#25253;&amp;#12290;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;/OL&gt;&lt;br /&gt;&lt;P CLASS="western" ALIGN=LEFT style=" margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;&lt;B&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;2&lt;/FONT&gt;&lt;/B&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&lt;B&gt;&amp;#65294;&amp;#20219;&amp;#35838;&amp;#25945;&amp;#21592;&lt;/B&gt;&lt;/FONT&gt;&lt;B&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;:&lt;/FONT&gt;&lt;/B&gt;&lt;/P&gt;&lt;br /&gt;&lt;OL&gt;&lt;br /&gt;	&lt;OL&gt;&lt;br /&gt;		&lt;LI&gt;&lt;P CLASS="western" ALIGN=LEFT style="margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;		&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#20855;&amp;#22791;&amp;#23433;&amp;#20840;&amp;#38450;&amp;#33539;&amp;#24847;&amp;#35782;&amp;#65292;&amp;#35201;&amp;#22312;&amp;#26085;&amp;#24120;&amp;#23398;&amp;#21592;&amp;#31649;&amp;#29702;&amp;#20013;&amp;#25945;&amp;#32946;&amp;#23398;&amp;#21592;&amp;#19981;&amp;#24471;&amp;#20351;&amp;#29992;&amp;#25945;&amp;#24072;&amp;#24494;&amp;#26426;&amp;#21450;&amp;#20854;&amp;#22806;&amp;#35774;&amp;#65292;&amp;#19968;&amp;#26086;&amp;#21457;&amp;#29616;&amp;#23398;&amp;#29983;&amp;#36829;&amp;#35268;&amp;#20351;&amp;#29992;&amp;#25945;&amp;#24072;&amp;#26426;&amp;#65292;&amp;#24517;&amp;#39035;&amp;#31532;&amp;#19968;&amp;#26102;&amp;#38388;&amp;#21046;&amp;#27490;&amp;#24182;&amp;#32473;&amp;#19982;&amp;#25945;&amp;#32946;&amp;#12290;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;		&lt;LI&gt;&lt;P CLASS="western" ALIGN=LEFT style="margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;		&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#25945;&amp;#21592;&amp;#19981;&amp;#35770;&amp;#20309;&amp;#26102;&amp;#65292;&amp;#31163;&amp;#24320;&amp;#25945;&amp;#23460;&amp;#21069;&amp;#24517;&amp;#39035;&amp;#20851;&amp;#38381;&amp;#25110;&amp;#38145;&amp;#23450;&amp;#35745;&amp;#31639;&amp;#26426;&amp;#65307;&lt;br /&gt;		&lt;/FONT&gt;&lt;br /&gt;		&lt;/P&gt;&lt;br /&gt;		&lt;LI&gt;&lt;P CLASS="western" ALIGN=LEFT style="margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;		&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#25945;&amp;#24072;&amp;#19981;&amp;#24471;&amp;#22312;&amp;#25945;&amp;#23460;&amp;#26426;&amp;#22120;&amp;#23433;&amp;#35013;&amp;#26032;&amp;#36719;&amp;#20214;&amp;#65292;&amp;#33509;&amp;#30830;&amp;#20026;&amp;#38656;&amp;#35201;&amp;#23433;&amp;#35013;&amp;#65292;&amp;#32463;&amp;#20013;&amp;#24515;&amp;#25216;&amp;#26415;&amp;#25903;&amp;#25345;&amp;#21516;&amp;#24847;&amp;#21518;&amp;#30001;&amp;#25216;&amp;#26415;&amp;#25903;&amp;#25345;&amp;#23433;&amp;#35013;&amp;#12290;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;		&lt;LI&gt;&lt;P CLASS="western" ALIGN=LEFT style="margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;		&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#20351;&amp;#29992;&amp;#25945;&amp;#24072;&amp;#26426;&amp;#30340;&amp;#20854;&amp;#20182;&amp;#21592;&amp;#24037;&amp;#25191;&amp;#34892;&amp;#35268;&amp;#33539;&amp;#21516;&amp;#19978;&amp;#12290;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;	&lt;/OL&gt;&lt;br /&gt;&lt;/OL&gt;&lt;br /&gt;&lt;P CLASS="western" ALIGN=LEFT style=" margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;&lt;B&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;3&lt;/FONT&gt;&lt;/B&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&lt;B&gt;&amp;#65294;&amp;#29677;&amp;#20027;&amp;#20219;&lt;/B&gt;&lt;/FONT&gt;&lt;B&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;:&lt;/FONT&gt;&lt;/B&gt;&lt;/P&gt;&lt;br /&gt;&lt;OL&gt;&lt;br /&gt;	&lt;LI&gt;&lt;P CLASS="western" ALIGN=LEFT style="margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;	&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#20855;&amp;#22791;&amp;#23433;&amp;#20840;&amp;#38450;&amp;#33539;&amp;#24847;&amp;#35782;&amp;#65292;&amp;#35201;&amp;#22312;&amp;#26085;&amp;#24120;&amp;#23398;&amp;#21592;&amp;#31649;&amp;#29702;&amp;#20013;&amp;#25945;&amp;#32946;&amp;#23398;&amp;#21592;&amp;#19981;&amp;#24471;&amp;#20351;&amp;#29992;&amp;#25945;&amp;#24072;&amp;#24494;&amp;#26426;&amp;#21450;&amp;#20854;&amp;#22806;&amp;#35774;&amp;#65292;&amp;#19968;&amp;#26086;&amp;#21457;&amp;#29616;&amp;#23398;&amp;#29983;&amp;#36829;&amp;#35268;&amp;#20351;&amp;#29992;&amp;#25945;&amp;#24072;&amp;#26426;&amp;#65292;&amp;#24517;&amp;#39035;&amp;#31532;&amp;#19968;&amp;#26102;&amp;#38388;&amp;#21046;&amp;#27490;&amp;#24182;&amp;#32473;&amp;#19982;&amp;#25945;&amp;#32946;&amp;#12290;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;	&lt;LI&gt;&lt;P CLASS="western" ALIGN=LEFT style="margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;	&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#29677;&amp;#20027;&amp;#20219;&amp;#20005;&amp;#26684;&amp;#25353;&amp;#29031;&amp;#35838;&amp;#31243;&amp;#34920;&amp;#23433;&amp;#25490;&amp;#33258;&amp;#20064;&amp;#25945;&amp;#23460;&amp;#65292;&amp;#21450;&amp;#26102;&amp;#38145;&amp;#38381;&amp;#31354;&amp;#38386;&amp;#25945;&amp;#23460;&amp;#12289;&amp;#26426;&amp;#25151;&amp;#65292;&amp;#30830;&amp;#20445;&amp;#23433;&amp;#20840;&amp;#24182;&amp;#33410;&amp;#32422;&amp;#36164;&amp;#28304;&amp;#12290;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;/OL&gt;&lt;br /&gt;&lt;P CLASS="western" ALIGN=LEFT style="margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&lt;B&gt;&amp;#22235;&amp;#12289;&lt;br /&gt;&amp;#32771;&amp;#26680;&amp;#26041;&amp;#27861;&lt;/B&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P CLASS="western" ALIGN=LEFT style=" margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;1. &lt;/FONT&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#22914;&amp;#36131;&amp;#20219;&amp;#20154;&amp;#36829;&amp;#21453;&amp;#35268;&amp;#23450;&amp;#65292;&amp;#27599;&amp;#27425;&amp;#32473;&amp;#20104;&lt;/FONT&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;30&lt;/FONT&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#20803;&amp;#22788;&amp;#32602;&amp;#65307;&lt;br /&gt;&lt;/FONT&gt;&lt;br /&gt;&lt;/P&gt;&lt;br /&gt;&lt;P CLASS="western" ALIGN=LEFT style=" margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;2. &lt;/FONT&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#22914;&amp;#23398;&amp;#21592;&amp;#36829;&amp;#35268;&amp;#65292;&amp;#31532;&amp;#19968;&amp;#27425;&amp;#21475;&amp;#22836;&amp;#35686;&amp;#21578;&amp;#65292;&amp;#30331;&amp;#35760;&amp;#23398;&amp;#29983;&amp;#22995;&amp;#21517;&amp;#65307;&amp;#31532;&lt;br /&gt;&lt;/FONT&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;2&lt;/FONT&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#27425;&amp;#36829;&amp;#35268;&amp;#35760;&amp;#20837;&amp;#23398;&amp;#29983;&amp;#26723;&amp;#26696;&amp;#65292;&amp;#20943;&amp;#23569;&amp;#19968;&amp;#27425;&amp;#23601;&amp;#19994;&amp;#25512;&amp;#33616;&amp;#12290;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;P CLASS="western" ALIGN=LEFT style=" margin-bottom: 0in; line-height: 125%"&gt;&lt;br /&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;3&lt;SPAN ID="Frame1" DIR="LTR" STYLE="float: left; width: 2.38in; height: 0.43in; border: none; padding: 0in; background: #ffffff"&gt;&lt;br /&gt;	&lt;P CLASS="western" STYLE="margin-bottom: 0in"&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#29256;&amp;#26412;&amp;#26085;&amp;#26399;&amp;#65306;&lt;/FONT&gt;2007&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#24180;&lt;/FONT&gt;11&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#26376;&lt;/FONT&gt;1&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#26085;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;/SPAN&gt;. &lt;/FONT&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#22914;&amp;#23398;&amp;#21592;&amp;#36829;&amp;#35268;&amp;#34987;&amp;#20013;&amp;#24515;&amp;#25216;&amp;#26415;&amp;#25903;&amp;#25345;&amp;#12289;&amp;#34892;&amp;#25919;&amp;#19987;&amp;#21592;&amp;#12289;&amp;#26657;&amp;#38271;&amp;#21457;&amp;#29616;&amp;#65292;&amp;#22312;&amp;#22788;&amp;#32602;&amp;#23398;&amp;#21592;&amp;#30340;&amp;#21516;&amp;#26102;&amp;#65292;&amp;#32473;&amp;#19982;&amp;#23398;&amp;#21592;&amp;#25152;&amp;#22312;&amp;#29677;&amp;#32423;&amp;#30340;&amp;#29677;&amp;#20027;&amp;#20219;&amp;#12289;&amp;#25945;&amp;#21592;&amp;#36830;&amp;#24102;&amp;#22788;&amp;#32602;&amp;#27599;&amp;#27425;&lt;/FONT&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;30&lt;/FONT&gt;&lt;FONT FACE="&amp;#23435;&amp;#20307;, SimSun"&gt;&amp;#20803;&amp;#12290;&lt;/FONT&gt;&lt;br /&gt;&lt;/P&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-6566323544593431742?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/6566323544593431742/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=6566323544593431742' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/6566323544593431742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/6566323544593431742'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/11/blog-post.html' title='教师用机安全管理规定'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-2469544632305415339</id><published>2008-10-29T22:06:00.001-07:00</published><updated>2008-10-29T22:06:42.874-07:00</updated><title type='text'>this is a test</title><content type='html'>this is a test!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-2469544632305415339?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/2469544632305415339/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=2469544632305415339' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/2469544632305415339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/2469544632305415339'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/10/this-is-test.html' title='this is a test'/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-3671182464748460055</id><published>2008-01-22T06:13:00.000-08:00</published><updated>2008-11-06T19:46:56.328-08:00</updated><title type='text'></title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_LecWKEnUnB4/R5X6aCJ8BNI/AAAAAAAAAdY/oJi4EytiWe8/s1600-h/100_0944.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_" style="CLEAR: both; FLOAT: right; MARGIN: 0px 0px 10px 10px" alt="" src="http://4.bp.blogspot.com/_LecWKEnUnB4/R5X6aCJ8BNI/AAAAAAAAAdY/oJi4EytiWe8/s320/100_0944.JPG" border="0" /&gt;&lt;/a&gt;&lt;div style='clear:both; text-align:RIGHT'&gt;&lt;a href='http://picasa.google.com/blogger/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbp.gif' alt='Posted by Picasa' style='border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;' align='middle' border='0' /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-3671182464748460055?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/3671182464748460055/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=3671182464748460055' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/3671182464748460055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/3671182464748460055'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2008/01/blog-post.html' title=''/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_LecWKEnUnB4/R5X6aCJ8BNI/AAAAAAAAAdY/oJi4EytiWe8/s72-c/100_0944.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-7507729076645529230</id><published>2007-12-06T05:50:00.000-08:00</published><updated>2008-10-29T22:06:08.300-07:00</updated><title type='text'></title><content type='html'>&lt;font color="#003399"&gt;TOMCAT集群配置&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;p&gt;我的运行环境:Windows2003 Server SP4 + J2SDK1.5.0 +Tomcat5.5.9&lt;/p&gt; &lt;p&gt;准备软件:Tomcat 5.5.9   JDK1.5.0&lt;/p&gt; &lt;p&gt;一．配置过程&lt;/p&gt; &lt;p&gt;1、安装JDK1.5.0。采用默认安装就可以。&lt;/p&gt; &lt;p&gt;2、安装tomcat到C: tomcat 50，采用完全安装，该程序用于实现负载均衡功能。&lt;/p&gt; &lt;p&gt;3、将tomcat50的内容进行完全复制，生成C: tomcat 51、C: tomcat 52、C: tomcat 53，分别用做集群中的节点。&lt;/p&gt; &lt;p&gt;4、修改负载均衡规则，使其遵循轮循算法（RoundRobin）。&lt;/p&gt; &lt;p&gt;4.1将testLB.jsp复制到c：tomcat50webappsbalancer文件夹中&lt;/p&gt; &lt;p&gt;4.2将文件夹classes复制到c：tomcat50webappsbalancerWEB-INF文件夹中&lt;/p&gt; &lt;p&gt;4.3修改c:webtomcat50webappsbalancerWEB-INFweb.xml文件如下：&lt;br&gt;   &lt;br&gt;    BalancerFilter&lt;br&gt;    /LoadBalancer&lt;br&gt;  &lt;/p&gt; &lt;p&gt;5、在集群中每个节点下，部署clusterapp应用。Clusterapp包含sessiondata.jsp，test.jsp，脚本。 test.jsp是用来验证节点状态的页面；sessiondata.jsp是用来响应用户所发送的请求，同时记录会话ID，会话的起始和最后时间，提供 用户增加、修改、删除会话的属性字段和属性值，可以通过此来判断会话的持续与否。&lt;/p&gt; &lt;p&gt;6、将log4j的log4j-1.2.9.jar复制到每个％tomcat％/common/ lib下，使其将会话日志统一存储到指定的文件中。&lt;/p&gt; &lt;p&gt;7、修改每个tomcat的server.xml配置文件，参数如下表所示。&lt;/p&gt; &lt;p&gt;配置              Instance 1    Instance 2       Instance 3    Instance 4&lt;br&gt;Instance Type    Load Balancer    Node 1       Node 2             Node 3&lt;br&gt;Code name             TC-LB             TC01       TC02             TC03&lt;br&gt;Home Directory    c:/tomcat50    c:/tomcat51      c:/tomcat52    c:/tomcat53&lt;br&gt;Server Port    8005          9005      10005            11005&lt;br&gt;Connector             8080         9080               10080            11080&lt;br&gt;JK2 AJP Connector    8009         9009               10009            11009&lt;br&gt;Cluster mcastAddr    228.0.0.4         228.0.0.4    228.0.0.4           228.0.0.4&lt;br&gt;Cluster mcastPort    45564        45564              45564           45564&lt;br&gt;tcpListenAddress    127.0.0.1        127.0.0.1    127.0.0.1           127.0.0.1&lt;br&gt;Cluster tcpListenPort 4000        4001             4002           4003&lt;/p&gt; &lt;p&gt;8、修改c:webtomcat50webappsbalancerWEB-INFconfigruler.xml文件如下：&lt;/p&gt;  &lt;p&gt;&lt;br&gt;    &lt;br&gt;    &lt;br&gt;        serverInstance="1"&lt;br&gt;        maxServerInstances="3"&lt;br&gt;        tcpListenAddress="127.0.0.1"&lt;br&gt;        tcpListenPort="4001"&lt;br&gt;        testWebPage="http://localhost:9080/clusterapp/test.jsp"&lt;br&gt;        redirectUrl="http://localhost:9080/clusterapp/sessiondata.jsp" /&amp;gt;&lt;br&gt;    &lt;br&gt;        serverInstance="2"&lt;br&gt;        maxServerInstances="3"&lt;br&gt;        tcpListenAddress="127.0.0.1"&lt;br&gt;        tcpListenPort="4002"&lt;br&gt;        testWebPage="http://localhost:10080/clusterapp/test.jsp"&lt;br&gt;    redirectUrl="http://localhost:10080/clusterapp/sessiondata.jsp" /&amp;gt;&lt;/p&gt; &lt;p&gt;    &lt;br&gt;        serverInstance="3"&lt;br&gt;        maxServerInstances="3"&lt;br&gt;        tcpListenAddress="127.0.0.1"&lt;br&gt;        tcpListenPort="4003"&lt;br&gt;        testWebPage="http://localhost:11080/clusterapp/test.jsp"&lt;br&gt;    redirectUrl="http://localhost:11080/clusterapp/sessiondata.jsp" /&amp;gt;&lt;/p&gt; &lt;p&gt;    &lt;br&gt;    &lt;br&gt;        redirectUrl="http://localhost:8080/balancer/testLB.jsp" /&amp;gt;&lt;br&gt;&lt;/p&gt; &lt;p&gt;9、启动tomcat的应用。手动双击每个tomcat/bin的startup.bat程序。&lt;/p&gt; &lt;p&gt;二．Web请求集群环境下流程&lt;/p&gt; &lt;p&gt;1、启动访问起始页（http://localhost:8080/balancer/testLB.jsp）&lt;/p&gt; &lt;p&gt;&lt;br&gt;2、JSP重定向请求到负载均衡过滤文件（http://localhost:8080/balancer/LoadBalancer）&lt;/p&gt; &lt;p&gt;3、负载均衡的tomcat接受请求，根据制定的负载均衡算法，重定向到可用的集群节点（TC01、TC02、TC03）&lt;/p&gt; &lt;p&gt;4、对应集群中节点的sessiondata.jsp（位于clusterapp应用下）页面将启动。&lt;/p&gt; &lt;p&gt;5、sesiondata.jsp将在web上显示会话的详细信息（如会话ID，最后访问时间）&lt;br&gt;在测试的过程中采用RoundRobin算 法，通过对Instance 1发起多个http://localhost:8080/balancer/testLB.jsp测试请求，发现每个请求返回页面的端口号不完全一致，在 9080、10080、11080端口不规则的出现，即客户端的访问请求按照RoundRobin算法被重定向到不同的服务器上进行处理，说明该负载均衡 规则在这个测试中得到正确的体现。在关闭集群中一个节点后再启用它，能够自动发现该节点，并为该节点分配请求。&lt;br&gt;&lt;/p&gt; &lt;div&gt;   &lt;a title="Java频道 中国IT实验室" href="http://java.chinaitlab.com/" target="_blank"&gt;&lt;img src="http://www.chinaitlab.com/cms/images/logo14.gif" border="0" height="14" width="14"&gt;&lt;/a&gt;【责编:Star】&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div style="text-align: left;"&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div class="postText"&gt; 		&lt;p&gt;&lt;font face="Tahoma"&gt;网络上有好多关于 Tomcat 集群配置的文章，但有些是以 Tomcat 4 为基础的，有的并不是讲的很清楚，自己摸索了半天，试验成功了，现把简要过程写出来，让你在几分钟内体验一下 Tomcat Cluster 。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;b&gt;一、配置环境&lt;/b&gt;&lt;/font&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;font face="Tahoma"&gt;下载和安装 JRE 1.5 最新版 （1.5.06）&lt;/font&gt;  &lt;/li&gt;&lt;li&gt;&lt;font face="Tahoma"&gt;下载和安装 Tomcat 最新版 （5.5.12），假定安装目录为 C:Program FilesApache Software FoundationTomcat 5.5&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;b&gt;二、使 Tomcat 集群配置生效&lt;/b&gt;&lt;/font&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;font face="Tahoma"&gt; 修改 Tomcat 安装目录confserver.xml ，把 Server/Service/Engine/Host 下的 Cluster 结点前后的注释符（&amp;lt;!-- 和 --&amp;gt;）删除，并保存&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;b&gt;三、配置第二个 Tomcat 实例&lt;/b&gt;&lt;/font&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;font face="Tahoma"&gt;在 C:Program FilesApache Software Foundation 下新建目录 Tomcat 5.5 Instance1&lt;/font&gt;  &lt;/li&gt;&lt;li&gt;&lt;font face="Tahoma"&gt;将 C:Program FilesApache Software FoundationTomcat 5.5 目录下的全部内容复制到 C:Program FilesApache Software FoundationTomcat 5.5 Instance1&lt;/font&gt;  &lt;/li&gt;&lt;li&gt;&lt;font face="Tahoma"&gt;修改新实例的服务器配置文件 （C:Program FilesApache Software FoundationTomcat 5.5 Instance1confserver.xml），把其中的 Server/Service/Connector 的端口更改，以避免和第一个冲突（8080 -&amp;gt; 9080，8009 -&amp;gt; 9009，8443 -&amp;gt; 9443）&lt;/font&gt;  &lt;/li&gt;&lt;li&gt;&lt;font face="Tahoma"&gt;修改 Cluster/Receiver 结点的 tcpListenPort 端口（此端口用于 Session 复制），以避免和第一个冲突（4001 -&amp;gt; 4002）&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt; &lt;blockquote dir="ltr" style="margin-right: 0px;"&gt; &lt;p&gt;&lt;font face="Tahoma"&gt;注：Tomcat Cluster 默认使用多播来建立成员关系，即两个实例的多播的地址和端口一样，就可以互相认为是同一个 Cluster 的成员。&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;b&gt;四、启动验证两个 Tomcat 实例能否正常工作&lt;/b&gt;&lt;/font&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;font face="Tahoma"&gt; 直接用程序菜单里的 Monitor Tomcat 来启动第一个实例（或在服务器里启动）&lt;/font&gt;  &lt;/li&gt;&lt;li&gt;&lt;font face="Tahoma"&gt;第二个实例启动稍微麻烦一些，在 C:Program FilesApache Software FoundationTomcat 5.5 Instance1Bin 下建一个 startup.bat ，用如下 java 命令来启动：&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt; &lt;blockquote dir="ltr" style="margin-right: 0px;"&gt; &lt;p&gt;&lt;font face="Tahoma"&gt;"C:Program FilesJavaj实re1.5.0_06binjava.exe" -jar .bootstrap.jar -Dcatalina.home="C:Program FilesApache Software FoundationTomcat 5.5 Instance1" -&lt;font face="Tahoma"&gt;Dcatalina.base="C:Program FilesApache Software FoundationTomcat 5.5 Instance1" -Djava.endorsed.dirs="C:Program FilesApache Software FoundationTomcat 5.5&lt;/font&gt;&lt;font face="Tahoma"&gt;commonendorsed" -Djava.io.tmpdir="C:Program FilesApache Software FoundationTomcat 5.5 Instance1temp" -&lt;/font&gt;&lt;font face="Tahoma"&gt;Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="C:Program FilesApache Software FoundationTomcat 5.5 Instance1&lt;/font&gt;&lt;font face="Tahoma"&gt;conflogging.properties" start &lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Tahoma"&gt;看起来挺长，其实主要是第二个实例的安装目录太长的缘故，直接执行此批处理就可以启动第二个实例，如果配置正确，应该可以看到集群管理器启动，并和第一个实例   建立成员关系的信息。&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;b&gt;五、写一个简单Web应用，能显示和设置 Session 属性值，以供测试&lt;/b&gt;&lt;/font&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;font face="Tahoma"&gt;如果有开发工具，新建一个 Web App ，假设为 TomcatDemo &lt;/font&gt;  &lt;/li&gt;&lt;li&gt;&lt;font face="Tahoma"&gt;新增 index.jsp ，加入如下代码：&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;&lt;div&gt;&lt;img id="Codehighlighter_2_67_Open_Image" src="http://blog.joycode.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"&gt;&lt;img id="Codehighlighter_2_67_Closed_Image" src="http://blog.joycode.com/images/OutliningIndicators/ContractedBlock.gif" align="top"&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 0);"&gt;&amp;lt;%&lt;/span&gt;&lt;span id="Codehighlighter_2_67_Closed_Text" style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255);"&gt;...&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;@ page contentType&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;text/html; charset=UTF-8&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; import&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;java.util.*&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 0);"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;html&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;head&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;title&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Cluster App Test&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;title&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;head&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;body&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img id="Codehighlighter_144_211_Open_Image" src="http://blog.joycode.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"&gt;&lt;img id="Codehighlighter_144_211_Closed_Image" src="http://blog.joycode.com/images/OutliningIndicators/ContractedBlock.gif" align="top"&gt;Server Info: &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 0);"&gt;&amp;lt;%&lt;/span&gt;&lt;span id="Codehighlighter_144_211_Closed_Text" style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255);"&gt;...&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; out.print(request.getLocalAddr() &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;+&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; : &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; request.getLocalPort());&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 0);"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img id="Codehighlighter_217_767_Open_Image" src="http://blog.joycode.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"&gt;&lt;img id="Codehighlighter_217_767_Closed_Image" src="http://blog.joycode.com/images/OutliningIndicators/ContractedBlock.gif" align="top"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 0);"&gt;&amp;lt;%&lt;/span&gt;&lt;span id="Codehighlighter_217_767_Closed_Text" style="border: 1px solid rgb(128, 128, 128); background-color: rgb(255, 255, 255);"&gt;...&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; &lt;img src="http://blog.joycode.com/images/OutliningIndicators/InBlock.gif" align="top"&gt;  out.println(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;&amp;lt;br&amp;gt; ID &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; session.getId());&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/InBlock.gif" align="top"&gt;&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/InBlock.gif" align="top"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; 如果有新的 Session 属性设置&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/InBlock.gif" align="top"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(245, 245, 245);"&gt;String&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; dataName &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; request.getParameter(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;dataName&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;);&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/InBlock.gif" align="top"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(245, 245, 245);"&gt;if&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; (dataName !&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255); background-color: rgb(245, 245, 245);"&gt;null&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; dataName.length() &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;) {&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/InBlock.gif" align="top"&gt;     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(245, 245, 245);"&gt;String&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; dataValue &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; request.getParameter(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;dataValue&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;);&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/InBlock.gif" align="top"&gt;     session.setAttribute(dataName, dataValue);&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/InBlock.gif" align="top"&gt;  }&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/InBlock.gif" align="top"&gt;&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/InBlock.gif" align="top"&gt;  out.print(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;&amp;lt;b&amp;gt;Session 列表&amp;lt;/b&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;);&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/InBlock.gif" align="top"&gt;&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/InBlock.gif" align="top"&gt;  Enumeration e &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; session.getAttributeNames();&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/InBlock.gif" align="top"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(245, 245, 245);"&gt;while&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; (e.hasMoreElements()) {&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/InBlock.gif" align="top"&gt;     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(245, 245, 245);"&gt;String&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; name &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(245, 245, 245);"&gt;String&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;)e.nextElement();&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/InBlock.gif" align="top"&gt;     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255); background-color: rgb(245, 245, 245);"&gt;String&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; value &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;=&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; session.getAttribute(name).toString();&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/InBlock.gif" align="top"&gt;     out.println( name &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;+&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;"&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt;+&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(245, 245, 245);"&gt; value);&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"&gt;   }&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 0);"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;form &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;action&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="index.jsp"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; method&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="POST"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;    名称:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;input &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;type&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=text &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;size&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=20 &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="dataName"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;br&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;    值:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;input &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;type&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=text &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;size&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=20 &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="dataValue"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;     &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;br&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;input &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;type&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;=submit&amp;gt;&lt;br&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;   &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;/form&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;body&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;html&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;&lt;br&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt; &lt;blockquote dir="ltr" style="margin-right: 0px;"&gt; &lt;p&gt;&lt;font face="Tahoma"&gt;以上代码主要是显示服务器信息和 Session 值，并包含一个 Form ，可以随时新建一个 Session 属性值&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;ul&gt;&lt;li&gt;&lt;font face="Tahoma"&gt;修改此用应用的 Web.xml ，加入 distributable 属性，表示 Tomcat 要为此 Web 应用复制 Session&lt;/font&gt;     &lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;&lt;div&gt;&lt;font face="Tahoma"&gt;&lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;web-app &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;xmlns&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="http://java.sun.com/xml/ns/j2ee"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; xmlns:xsi&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; xsi:schemaLocation&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; version&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="2.4"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;display-name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;TomcatDemo&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;display-name&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;       &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;distributable&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;web-app&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt;img src="http://blog.joycode.com/images/OutliningIndicators/None.gif" align="top"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;/pre&gt; &lt;ul&gt;&lt;li&gt;&lt;font face="Tahoma"&gt; 将应用打包成 WAR 文件，分别上现两个实例的 Tomcat Manager 来部署&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt; &lt;blockquote dir="ltr" style="margin-right: 0px;"&gt; &lt;p&gt;&lt;font face="Tahoma"&gt; (如果没有 Java 开发工具，可以直接建立一个 TomcatDemo 的目录，用 Notepad 将如上的内容复制并保存成 index.jsp，然后在此目录下新建子目录 WEB-INF，再用 Notepad 新建一 &lt;/font&gt;&lt;font face="Tahoma"&gt;Web.xml 文件，将上面的代码复制保存，然后将此目录压缩成 Zip 文件，再把后缀改成 .war ，或利用 jar 命令来创建 .war 文件）&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;b&gt;六、测试 Tomcat 集群和 Session 复制的是否工作&lt;/b&gt;&lt;/font&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;font face="Tahoma"&gt; 在 IE 中打开第一个实例中的 TomcatDemo （&lt;/font&gt;&lt;a href="http://localhost:8080/TomcatDemo"&gt;&lt;font face="Tahoma"&gt;http://localhost:8080/TomcatDemo&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma"&gt;），在 Form 里随便设置一个 Session 属性，如 MyName = foo&lt;/font&gt;  &lt;/li&gt;&lt;li&gt;&lt;font face="Tahoma"&gt; 将 IE 地址栏中的地址修改为第二个实例中的 TomcatDemo（&lt;/font&gt;&lt;a href="http://localhost:9080/TomcatDemo"&gt;&lt;font face="Tahoma"&gt;http://localhost:9080/TomcatDemo&lt;/font&gt;&lt;/a&gt;&lt;font face="Tahoma"&gt;），刷新，就可以看到注意到 SessionID 不变， MyName 的属性值已有了&lt;/font&gt;  &lt;/li&gt;&lt;li&gt;&lt;font face="Tahoma"&gt; 同样，如果在第二实例中设置的值，在第一个实例的页面中也能看到&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt; &lt;blockquote dir="ltr" style="margin-right: 0px;"&gt; &lt;p&gt;&lt;font face="Tahoma"&gt;注意：必须在同一个 IE 窗口中进行如上测试，以保证是同一个 Session ，如果是两个窗口，则 Session 可能不同，也互相看不到 Session 复制的结果。&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Tahoma"&gt;&lt;b&gt;七、其它工作&lt;/b&gt;&lt;/font&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;font face="Tahoma"&gt;上述只实现了 Session 复制，而没有实现 Load Balance（负载均衡），这可以利用 Apache 等来实现，网上有很多相关文章，可能参考）&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt; 	&lt;/div&gt; 	&lt;div class="postfoot"&gt; 		2005年12月19日 18:48 - (阅读:3941;评论:16) 	&lt;/div&gt;       &lt;a name="feedback"&gt; 	&lt;br&gt; 	&lt;/a&gt; &lt;a name="feedback"&gt;		&lt;/a&gt;&lt;h3&gt;&lt;a name="feedback"&gt;评论&lt;/a&gt;&lt;/h3&gt; &lt;a name="feedback"&gt;		 		 				&lt;/a&gt;&lt;div class="post"&gt; &lt;a name="feedback"&gt;					&lt;/a&gt;&lt;div class="postTitle"&gt; &lt;a name="feedback"&gt;						&lt;/a&gt;&lt;a title="permalink: re: QuickStart: Tomcat 集群配置" href="http://blog.joycode.com/moslem/articles/69167.aspx#71844"&gt;#&lt;/a&gt; &lt;a name="71844"&gt;&lt;/a&gt;re: QuickStart: Tomcat 集群配置 						 							2006-2-22 9:58 						 						&lt;a id="Comments_ascx_CommentList_ctl00_NameLink" href="http://wangjiajie917@sohu.com/" target="_blank"&gt;嘉杰&lt;/a&gt; 					&lt;/div&gt; 					&lt;div class="postText"&gt; 						写的很好，很棒！！！ 						&lt;br&gt; 						 					&lt;/div&gt; 				&lt;/div&gt; 				&lt;br&gt; 			 				&lt;div class="post"&gt; 					&lt;div class="postTitle"&gt; 						&lt;a title="permalink: re: QuickStart: Tomcat 集群配置" href="http://blog.joycode.com/moslem/articles/69167.aspx#71845"&gt;#&lt;/a&gt; &lt;a name="71845"&gt;&lt;/a&gt;re: QuickStart: Tomcat 集群配置 						 							2006-2-22 9:59 						 						&lt;a id="Comments_ascx_CommentList_ctl01_NameLink" href="http://wangjiajie917@sohu.com/" target="_blank"&gt;嘉杰&lt;/a&gt; 					&lt;/div&gt; 					&lt;div class="postText"&gt; 						我顶！！！！！ 						&lt;br&gt; 						 					&lt;/div&gt; 				&lt;/div&gt; 				&lt;br&gt; 			 				&lt;div class="post"&gt; 					&lt;div class="postTitle"&gt; 						&lt;a title="permalink: re: QuickStart: Tomcat 集群配置" href="http://blog.joycode.com/moslem/articles/69167.aspx#73435"&gt;#&lt;/a&gt; &lt;a name="73435"&gt;&lt;/a&gt;re: QuickStart: Tomcat 集群配置 						 							2006-3-24 14:06 						 						&lt;a id="Comments_ascx_CommentList_ctl02_NameLink" target="_blank"&gt;java fans&lt;/a&gt; 					&lt;/div&gt; 					&lt;div class="postText"&gt; 						通常cluster都有一个管理节点，tomcat cluster有没有管理与被管理的概念？ 						&lt;br&gt; 						 					&lt;/div&gt; 				&lt;/div&gt; 				&lt;br&gt; 			 				&lt;div class="post"&gt; 					&lt;div class="postTitle"&gt; 						&lt;a title="permalink:  正要使用之，3Q!" href="http://blog.joycode.com/moslem/articles/69167.aspx#74380"&gt;#&lt;/a&gt; &lt;a name="74380"&gt;&lt;/a&gt; 正要使用之，3Q! 						 							2006-4-12 14:43 						 						&lt;a id="Comments_ascx_CommentList_ctl03_NameLink" target="_blank"&gt;Allen&lt;/a&gt; 					&lt;/div&gt; 					&lt;div class="postText"&gt; 						very good! 						&lt;br&gt; 						 					&lt;/div&gt; 				&lt;/div&gt; 				&lt;br&gt; 			 				&lt;div class="post"&gt; 					&lt;div class="postTitle"&gt; 						&lt;a title="permalink: re: QuickStart: Tomcat 集群配置" href="http://blog.joycode.com/moslem/articles/69167.aspx#75356"&gt;#&lt;/a&gt; &lt;a name="75356"&gt;&lt;/a&gt;re: QuickStart: Tomcat 集群配置 						 							2006-4-30 10:24 						 						&lt;a id="Comments_ascx_CommentList_ctl04_NameLink" target="_blank"&gt;lionlhb&lt;/a&gt; 					&lt;/div&gt; 					&lt;div class="postText"&gt; 						写的不错，鼓励一下 						&lt;br&gt; 						 					&lt;/div&gt; 				&lt;/div&gt; 				&lt;br&gt; 			 				&lt;div class="post"&gt; 					&lt;div class="postTitle"&gt; 						&lt;a title="permalink: re: QuickStart: Tomcat 集群配置" href="http://blog.joycode.com/moslem/articles/69167.aspx#78510"&gt;#&lt;/a&gt; &lt;a name="78510"&gt;&lt;/a&gt;re: QuickStart: Tomcat 集群配置 						 							2006-7-10 14:38 						 						&lt;a id="Comments_ascx_CommentList_ctl05_NameLink" target="_blank"&gt;zhj&lt;/a&gt; 					&lt;/div&gt; 					&lt;div class="postText"&gt; 						你这个最终还是需要通过2个入口进入集群有何意义？ &lt;br&gt;难道集群没法配置统一的IP和端口么 						&lt;br&gt; 						 					&lt;/div&gt; 				&lt;/div&gt; 				&lt;br&gt; 			 				&lt;div class="post"&gt; 					&lt;div class="postTitle"&gt; 						&lt;a title="permalink: re: QuickStart: Tomcat 集群配置" href="http://blog.joycode.com/moslem/articles/69167.aspx#88001"&gt;#&lt;/a&gt; &lt;a name="88001"&gt;&lt;/a&gt;re: QuickStart: Tomcat 集群配置 						 							2006-11-25 17:27 						 						&lt;a id="Comments_ascx_CommentList_ctl06_NameLink" href="http://unmi.blogcn.com/" target="_blank"&gt;Unmi&lt;/a&gt; 					&lt;/div&gt; 					&lt;div class="postText"&gt; 						很好，我参考了你的这篇文章，用VMWare安装两个操作系统来试验集群功能 &lt;br&gt; &lt;br&gt;to zhj &lt;br&gt;版主在这篇文章的目的就只是让你体验集群，至于还是需要通过2个入口进入集群，作者已有提到，就是最后的，需要用apache来做负载均衡 						&lt;br&gt; 						 					&lt;/div&gt; 				&lt;/div&gt; 				&lt;br&gt; 			 				&lt;div class="post"&gt; 					&lt;div class="postTitle"&gt; 						&lt;a title="permalink: re: QuickStart: Tomcat 集群配置" href="http://blog.joycode.com/moslem/articles/69167.aspx#88005"&gt;#&lt;/a&gt; &lt;a name="88005"&gt;&lt;/a&gt;re: QuickStart: Tomcat 集群配置 						 							2006-11-25 18:15 						 						&lt;a id="Comments_ascx_CommentList_ctl07_NameLink" href="http://unmi.blogcn.com/" target="_blank"&gt;Unmi&lt;/a&gt; 					&lt;/div&gt; 					&lt;div class="postText"&gt; 						我试了，好像不行哦，看来还是需要通过一致的访问入口才能进行Session的复制 						&lt;br&gt; 						 					&lt;/div&gt; 				&lt;/div&gt; 				&lt;br&gt; 			 				&lt;div class="post"&gt; 					&lt;div class="postTitle"&gt; 						&lt;a title="permalink: 回复: QuickStart: Tomcat 集群配置" href="http://blog.joycode.com/moslem/articles/69167.aspx#103865"&gt;#&lt;/a&gt; &lt;a name="103865"&gt;&lt;/a&gt;回复: QuickStart: Tomcat 集群配置 						 							2007-6-6 10:27 						 						&lt;a id="Comments_ascx_CommentList_ctl08_NameLink" target="_blank"&gt;zhangv&lt;/a&gt; 					&lt;/div&gt; 					&lt;div class="postText"&gt; 						我也试了一下, 不行的, session id改变了 						&lt;br&gt; 						 					&lt;/div&gt; 				&lt;/div&gt; 				&lt;br&gt; 			 				&lt;div class="post"&gt; 					&lt;div class="postTitle"&gt; 						&lt;a title="permalink: 回复: QuickStart: Tomcat 集群配置" href="http://blog.joycode.com/moslem/articles/69167.aspx#104374"&gt;#&lt;/a&gt; &lt;a name="104374"&gt;&lt;/a&gt;回复: QuickStart: Tomcat 集群配置 						 							2007-6-19 14:17 						 						&lt;a id="Comments_ascx_CommentList_ctl09_NameLink" target="_blank"&gt;sessionid变了&lt;/a&gt; 					&lt;/div&gt; 					&lt;div class="postText"&gt; 						你是否打开了两个IE，那么SessionID肯定就变了 						&lt;br&gt; 						 					&lt;/div&gt; 				&lt;/div&gt; 				&lt;br&gt; 			 				&lt;div class="post"&gt; 					&lt;div class="postTitle"&gt; 						&lt;a title="permalink: 回复: QuickStart: Tomcat 集群配置" href="http://blog.joycode.com/moslem/articles/69167.aspx#106810"&gt;#&lt;/a&gt; &lt;a name="106810"&gt;&lt;/a&gt;回复: QuickStart: Tomcat 集群配置 						 							2007-7-30 17:27 						 						&lt;a id="Comments_ascx_CommentList_ctl10_NameLink" target="_blank"&gt;开心&lt;/a&gt; 					&lt;/div&gt; 					&lt;div class="postText"&gt; 						非常感谢，我试了 可以成功，今天很开心！ 						&lt;br&gt; 						 					&lt;/div&gt; 				&lt;/div&gt; 				&lt;br&gt; 			 				&lt;div class="post"&gt; 					&lt;div class="postTitle"&gt; 						&lt;a title="permalink: 回复: QuickStart: Tomcat 集群配置" href="http://blog.joycode.com/moslem/articles/69167.aspx#107131"&gt;#&lt;/a&gt; &lt;a name="107131"&gt;&lt;/a&gt;回复: QuickStart: Tomcat 集群配置 						 							2007-8-10 21:32 						 						&lt;a id="Comments_ascx_CommentList_ctl11_NameLink" target="_blank"&gt;Dutchman&lt;/a&gt; 					&lt;/div&gt; 					&lt;div class="postText"&gt; 						谢谢，正要用到！ 						&lt;br&gt; 						 					&lt;/div&gt; 				&lt;/div&gt; 				&lt;br&gt; 			 				&lt;div class="post"&gt; 					&lt;div class="postTitle"&gt; 						&lt;a title="permalink: 回复: QuickStart: Tomcat 集群配置" href="http://blog.joycode.com/moslem/articles/69167.aspx#111958"&gt;#&lt;/a&gt; &lt;a name="111958"&gt;&lt;/a&gt;回复: QuickStart: Tomcat 集群配置 						 							2007-11-26 11:58 						 						&lt;a id="Comments_ascx_CommentList_ctl12_NameLink" target="_blank"&gt;free1996&lt;/a&gt; 					&lt;/div&gt; 					&lt;div class="postText"&gt; 						写的好,向你学习 						&lt;br&gt; 						 					&lt;/div&gt; 				&lt;/div&gt; 				&lt;br&gt; 			 				 					&lt;div class="postTitle"&gt; 						&lt;a title="permalink: 回复: QuickStart: Tomcat 集群配置" href="http://blog.joycode.com/moslem/articles/69167.aspx#111959"&gt;#&lt;/a&gt; &lt;a name="111959"&gt;&lt;/a&gt;回复: QuickStart: Tomcat 集群配置 						 							2007-11-26 11:59 						 						&lt;a id="Comments_ascx_CommentList_ctl13_NameLink" target="_blank"&gt;free1996&lt;/a&gt; 					&lt;/div&gt; 					 						写的好,向你学习,我正在学习中&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;p&gt;实践中整理出tomcat集群和负载均衡&lt;br&gt;(一)环境说明&lt;br&gt;(1)服务器有4台，一台安装apache,三台安装tomcat&lt;br&gt;(2)apache2.0.55、tomcat5.5.15、jk2.0.4、jdk1.5.6或jdk1.4.2&lt;br&gt;(3)ip配置,一台安装apache的ip为192.168.0.88,三台安装tomcat的服务器ip分别为192.168.0.1/2/4&lt;br&gt;(二)安装过程&lt;br&gt;(1)在三台要安装tomcat的服务器上先安装jdk&lt;br&gt;(2)配置jdk的安装路径,在环境变量path中加入jdk的bin路径,新建环境变量JAVA_HOME指向jdk的安装路径&lt;br&gt;(3)在三台要安装tomcat的服务器上分别安装tomcat,调试三个tomcat到能够正常启动&lt;br&gt;(4)tomcat的默认WEB服务端口是8080,默认的模式是单独服务,我的三个tomcat的WEB服务端口修改为7080/8888/9999&lt;br&gt;修改位置为tomcat的安装目录下的conf/server.xml&lt;br&gt;修改前的配置为&lt;br&gt;    &amp;lt;Connector port="8080" maxHttpHeaderSize="8192"&lt;br&gt;               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"&lt;br&gt;               enableLookups="false" redirectPort="8443" acceptCount="100"&lt;br&gt;               connectionTimeout="20000" disableUploadTimeout="true" /&amp;gt;&lt;br&gt;修改后的配置为&lt;br&gt;    &amp;lt;Connector port="7080" maxHttpHeaderSize="8192"&lt;br&gt;               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"&lt;br&gt;               enableLookups="false" redirectPort="8443" acceptCount="100"&lt;br&gt;               connectionTimeout="20000" disableUploadTimeout="true" /&amp;gt;&lt;br&gt;依次修改每个tomcat的监听端口(7080/8888/9999)&lt;br&gt;&lt;br&gt;(5)分别测试每个tomcat的启动是否正常&lt;br&gt;http://192.168.0.1:7080&lt;br&gt;http://192.168.0.2:8888&lt;br&gt;http://192.168.0.4:9999&lt;br&gt;(三)负载均衡配置过程&lt;br&gt;(1)在那台要安装apache的服务器上安装apache2.0.55,我的安装路径为默认C:Program FilesApache GroupApache2&lt;br&gt;(2)安装后测试apache能否正常启动，调试到能够正常启动http://192.168.0.88&lt;br&gt;(3)下载jk2.0.4后解压缩文件&lt;br&gt;(4)将解压缩后的目录中的modules目录中的mod_jk2.so文件复制到apache的安装目录下的modules目录中,我的为C:Program FilesApache GroupApache2modules&lt;br&gt;(5)修改apache的安装目录中的conf目录的配置文件httpd.conf，在文件中加LoadModule模块配置信息的最后加上一句LoadModule jk2_module modules/mod_jk2.so&lt;br&gt;(6)分别修改三个tomcat的配置文件conf/server.xml，修改内容如下&lt;br&gt;修改前&lt;br&gt;    &amp;lt;!-- An Engine represents the entry point (within Catalina) that processes&lt;br&gt;         every request.  The Engine implementation for Tomcat stand alone&lt;br&gt;         analyzes the HTTP headers included with the request, and passes them&lt;br&gt;         on to the appropriate Host (virtual host). --&amp;gt;&lt;br&gt;&lt;br&gt;    &amp;lt;!-- You should set jvmRoute to support load-balancing via AJP ie :&lt;br&gt;    &amp;lt;Engine name="Standalone" defaultHost="localhost" jvmRoute="jvm1"&amp;gt;         &lt;br&gt;    --&amp;gt; &lt;br&gt;         &lt;br&gt;    &amp;lt;!-- Define the top level container in our container hierarchy --&amp;gt;&lt;br&gt;    &amp;lt;Engine name="Catalina" defaultHost="localhost"&amp;gt;&lt;br&gt;修改后&lt;br&gt;    &amp;lt;!-- An Engine represents the entry point (within Catalina) that processes&lt;br&gt;         every request.  The Engine implementation for Tomcat stand alone&lt;br&gt;         analyzes the HTTP headers included with the request, and passes them&lt;br&gt;         on to the appropriate Host (virtual host). --&amp;gt;&lt;br&gt;&lt;br&gt;    &amp;lt;!-- You should set jvmRoute to support load-balancing via AJP ie :--&amp;gt;&lt;br&gt;    &amp;lt;Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1"&amp;gt;         &lt;br&gt;     &lt;br&gt;         &lt;br&gt;    &amp;lt;!-- Define the top level container in our container hierarchy &lt;br&gt;    &amp;lt;Engine name="Catalina" defaultHost="localhost"&amp;gt;&lt;br&gt;    --&amp;gt;&lt;br&gt;将其中的jvmRoute="jvm1"分别修改为jvmRoute="tomcat1"和jvmRoute="tomcat2"和jvmRoute="tomcat3"&lt;br&gt;&lt;br&gt;(7)然后重启三个tomcat，调试能够正常启动。&lt;br&gt;(8)在apache的安装目录中的conf目录下创建文件workers2.propertie，写入文件内容如下&lt;br&gt;&lt;br&gt;# fine the communication channel &lt;br&gt;[channel.socket:192.168.0.1:8009] &lt;br&gt;info=Ajp13 forwarding over socket&lt;br&gt;#配置第一个服务器 &lt;br&gt;tomcatId=tomcat1 #要和tomcat的配置文件server.xml中的jvmRoute="tomcat1"名称一致&lt;br&gt;debug=0 &lt;br&gt;lb_factor=1 #负载平衡因子，数字越大请求被分配的几率越高&lt;br&gt;&lt;br&gt;# Define the communication channel &lt;br&gt;[channel.socket:192.168.0.2:8009] &lt;br&gt;info=Ajp13 forwarding over socket&lt;br&gt;tomcatId=tomcat2 &lt;br&gt;debug=0 &lt;br&gt;lb_factor=1 &lt;br&gt;&lt;br&gt;# Define the communication channel &lt;br&gt;[channel.socket:192.168.0.4:8009] &lt;br&gt;info=Ajp13 forwarding over socket&lt;br&gt;tomcatId=tomcat3 &lt;br&gt;debug=0 &lt;br&gt;lb_factor=1 &lt;br&gt;&lt;br&gt;[status:] &lt;br&gt;info=Status worker, displays runtime information.  &lt;br&gt;&lt;br&gt;[uri:/jkstatus.jsp] &lt;br&gt;info=Display status information and checks the config file for changes. &lt;br&gt;group=status: &lt;br&gt;&lt;br&gt;[uri:/*] &lt;br&gt;info=Map the whole webapp &lt;br&gt;debug=0&lt;br&gt;(9)在三个tomcat的安装目录中的webapps建立相同的应用,我和应用目录名为TomcatDemo,在三个应用目录中建立相同 WEB-INF目录和页面index.jsp,index.jsp的页面内容如下&lt;br&gt;&amp;lt;%@ page contentType="text/html; charset=GBK" %&amp;gt;&lt;br&gt;&amp;lt;%@ page import="java.util.*" %&amp;gt;&lt;br&gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Cluster App Test&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;Server Info:&lt;br&gt;&amp;lt;%&lt;br&gt;out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"&amp;lt;br&amp;gt;");%&amp;gt;&lt;br&gt;&amp;lt;%&lt;br&gt;  out.println("&amp;lt;br&amp;gt; ID " + session.getId()+"&amp;lt;br&amp;gt;");&lt;br&gt;&lt;br&gt;  // 如果有新的 Session 属性设置&lt;br&gt;  String dataName = request.getParameter("dataName");&lt;br&gt;  if (dataName != null &amp;amp;&amp;amp; dataName.length() &amp;gt; 0) {&lt;br&gt;     String dataValue = request.getParameter("dataValue");&lt;br&gt;     session.setAttribute(dataName, dataValue);&lt;br&gt;  }&lt;br&gt;&lt;br&gt;  out.print("&amp;lt;b&amp;gt;Session 列表&amp;lt;/b&amp;gt;");&lt;br&gt;&lt;br&gt;  Enumeration e = session.getAttributeNames();&lt;br&gt;  while (e.hasMoreElements()) {&lt;br&gt;     String name = (String)e.nextElement();&lt;br&gt;     String value = session.getAttribute(name).toString();&lt;br&gt;     out.println( name + " = " + value+"&amp;lt;br&amp;gt;");&lt;br&gt;         System.out.println( name + " = " + value);&lt;br&gt;   }&lt;br&gt;%&amp;gt;&lt;br&gt;  &amp;lt;form action="index.jsp" method="POST"&amp;gt;&lt;br&gt;    名称:&amp;lt;input type=text size=20 name="dataName"&amp;gt;&lt;br&gt;     &amp;lt;br&amp;gt;&lt;br&gt;    值:&amp;lt;input type=text size=20 name="dataValue"&amp;gt;&lt;br&gt;     &amp;lt;br&amp;gt;&lt;br&gt;    &amp;lt;input type=submit&amp;gt;&lt;br&gt;   &amp;lt;/form&amp;gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;br&gt;(10)重启apache服务器和三个tomcat服务器,到此负载 均衡已配置完成。测试负载均衡先测试apache,访问http://192.168.0.88/jkstatus.jsp&lt;br&gt;能否正常访问，并查询其中的内容，有三个tomcat的相关配置信息和负载说明,访问http://192.168.0.88/TomcatDemo/index.jsp看能够运行,&lt;br&gt;能运行，则已建立负载均衡。&lt;br&gt;(四)tomcat集群配置&lt;br&gt;(1)负载均衡配置的条件下配置tomcat集群&lt;br&gt;(2)分别修改三个tomcat的配置文件conf/server.xml,修改内容如下&lt;br&gt;修改前&lt;br&gt;        &amp;lt;!-- &lt;br&gt;        &amp;lt;Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"&lt;br&gt;                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"&lt;br&gt;                 expireSessionsOnShutdown="false"&lt;br&gt;                 useDirtyFlag="true"&lt;br&gt;                 notifyListenersOnReplication="true"&amp;gt;&lt;br&gt;&lt;br&gt;            &amp;lt;Membership &lt;br&gt;                className="org.apache.catalina.cluster.mcast.McastService"&lt;br&gt;                mcastAddr="228.0.0.4"&lt;br&gt;                mcastPort="45564"&lt;br&gt;                mcastFrequency="500"&lt;br&gt;                mcastDropTime="3000"/&amp;gt;&lt;br&gt;&lt;br&gt;            &amp;lt;Receiver &lt;br&gt;                className="org.apache.catalina.cluster.tcp.ReplicationListener"&lt;br&gt;                tcpListenAddress="auto"&lt;br&gt;                tcpListenPort="4001"&lt;br&gt;                tcpSelectorTimeout="100"&lt;br&gt;                tcpThreadCount="6"/&amp;gt;&lt;br&gt;&lt;br&gt;            &amp;lt;Sender&lt;br&gt;                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"&lt;br&gt;                replicationMode="pooled"&lt;br&gt;                ackTimeout="5000"/&amp;gt;&lt;br&gt;&lt;br&gt;            &amp;lt;Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"&lt;br&gt;                   filter=".*.gif;.*.js;.*.jpg;.*.png;.*.htm;.*.html;.*.css;.*.txt;"/&amp;gt;&lt;br&gt;                   &lt;br&gt;            &amp;lt;Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"&lt;br&gt;                      tempDir="/tmp/war-temp/"&lt;br&gt;                      deployDir="/tmp/war-deploy/"&lt;br&gt;                      watchDir="/tmp/war-listen/"&lt;br&gt;                      watchEnabled="false"/&amp;gt;&lt;br&gt;                      &lt;br&gt;            &amp;lt;ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/&amp;gt;&lt;br&gt;        &amp;lt;/Cluster&amp;gt;&lt;br&gt;        --&amp;gt;   &lt;br&gt;修改后&lt;br&gt;        &amp;lt;!-- modify by whh --&amp;gt;&lt;br&gt;        &amp;lt;Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"&lt;br&gt;                 managerClassName="org.apache.catalina.cluster.session.DeltaManager"&lt;br&gt;                 expireSessionsOnShutdown="false"&lt;br&gt;                 useDirtyFlag="true"&lt;br&gt;                 notifyListenersOnReplication="true"&amp;gt;&lt;br&gt;&lt;br&gt;            &amp;lt;Membership &lt;br&gt;                className="org.apache.catalina.cluster.mcast.McastService"&lt;br&gt;                mcastAddr="228.0.0.4"&lt;br&gt;                mcastPort="45564"&lt;br&gt;                mcastFrequency="500"&lt;br&gt;                mcastDropTime="3000"/&amp;gt;&lt;br&gt;&lt;br&gt;            &amp;lt;Receiver &lt;br&gt;                className="org.apache.catalina.cluster.tcp.ReplicationListener"&lt;br&gt;                tcpListenAddress="auto"&lt;br&gt;                tcpListenPort="4001"&lt;br&gt;                tcpSelectorTimeout="100"&lt;br&gt;                tcpThreadCount="6"/&amp;gt;&lt;br&gt;&lt;br&gt;            &amp;lt;Sender&lt;br&gt;                className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"&lt;br&gt;                replicationMode="pooled"&lt;br&gt;                ackTimeout="5000"/&amp;gt;&lt;br&gt;&lt;br&gt;            &amp;lt;Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"&lt;br&gt;                   filter=".*.gif;.*.js;.*.jpg;.*.png;.*.htm;.*.html;.*.css;.*.txt;"/&amp;gt;&lt;br&gt;                   &lt;br&gt;            &amp;lt;Deployer className="org.apache.catalina.cluster.deploy.FarmWarDeployer"&lt;br&gt;                      tempDir="/tmp/war-temp/"&lt;br&gt;                      deployDir="/tmp/war-deploy/"&lt;br&gt;                      watchDir="/tmp/war-listen/"&lt;br&gt;                      watchEnabled="false"/&amp;gt;&lt;br&gt;                      &lt;br&gt;            &amp;lt;ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/&amp;gt;&lt;br&gt;        &amp;lt;/Cluster&amp;gt;&lt;br&gt;       &amp;lt;!-- modify by whh --&amp;gt;       &lt;br&gt;将集群配置选项的注释放开即可，如上。&lt;br&gt;(3)重启三个tomcat。到此tomcat的集群已配置完成。&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;(五)应用配置&lt;br&gt;对于要进行负载和集群的的tomcat目录下的webapps中的应用中的WEB-INF中的web.xml文件要添加如下一句配置&lt;br&gt;&amp;lt;distributable/&amp;gt;&lt;br&gt;配置前&lt;br&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br&gt;&amp;lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"&amp;gt;&lt;br&gt;  &amp;lt;display-name&amp;gt;TomcatDemo&amp;lt;/display-name&amp;gt;&lt;br&gt;&amp;lt;/web-app&amp;gt;&lt;br&gt;配置后&lt;br&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br&gt;&amp;lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"&amp;gt;&lt;br&gt;  &amp;lt;display-name&amp;gt;TomcatDemo&amp;lt;/display-name&amp;gt;&lt;br&gt;   &amp;lt;distributable/&amp;gt;&lt;br&gt;&amp;lt;/web-app&amp;gt;&lt;br&gt;&lt;/p&gt; &lt;p&gt;问:tomcat集群是怎么处理session的阿&lt;/p&gt; &lt;p&gt;答:在tomcat做集群之后，每个tomcat之间自动根据tomcat的配置文件中的参数进行session复制,&lt;br&gt;对于一个客户端对说，只要是同一个IP，那它每次上传的sessionID就是一样的,&lt;/p&gt;&lt;br&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;1.使用DNS轮询.2.使用Apache R-proxy方式。3.使用Apache mod_jk方式. DNS轮询的缺点是，当集群中某台服务器停止之后，用户由于dns缓存的缘故，便无法访问服务，必须等到dns解析更新，或者这台服 务器重新启动。还有就是必须把集群中的所有服务端口暴露给外界，没有用apache做前置代理的方式安全，并且占用大量公网IP地址，而且tomcat还 要负责处理静态网页资源，影响效率。优点是集群配置最简单，dns设置也非常简单。 R-proxy的缺点是，当其中一台tomcat停止运行的时候， apache仍然会转发请求过去，导致502网关错误。但是只要服务器再启动就不存在这个问题。 mod_jk方式的优点是，Apache 会自动检测到停止掉的tomcat，然后不再发请求过去。缺点就是，当停止掉的tomcat服务器再次启动的时候，Apache检测不到，仍然不会转发请 求过去。 R-proxy和mod_jk的共同优点是.可以只将Apache置于公网，节省公网IP地址资源。可以通过设置来实现Apache专门负责处 理静态网页，让Tomcat专门负责处理jsp和servlet等动态请求。共同缺点是：如果前置Apache代理服务器停止运行，所有集群服务将无法对 外提供。R-proxy和mod_jk对静态页面请求的处理，都可以通设置来选取一个尽可能优化的效果。这三种方式对实现最佳负载均衡都有一定不足， mod_jk相对好些，可以通过设置lbfactor参数来分配请求任务。 所有这些在实际使用中都应该根据具体情况来选择。简略配置如下:前期准备： 1。下载Apache和Tomcat:Apache2.0.53:http: //www.eu.apache.org/dist/httpd/binaries/win32/apache_2.0.53-win32-x86-no_ssl.msi Tomcat5.5.9: http://www.eu.apache.org/dist/jakarta/tomcat-5/v5.5.9/bin/jakarta-tomcat- 5.5.9.ziphttp://www.eu.apache.org/dist/jakarta/tomcat-5/v5.5.9/bin/jakarta -tomcat-5.5.9-fulldocs.tar.gzhttp://www.eu.apache.org/dist/jakarta/tomcat -5/v5.5.9/bin/jakarta-tomcat-5.5.9-compat.ziphttp://www.eu.apache.org/dist/jakarta/tomcat -5/v5.5.9/bin/jakarta-tomcat-5.5.9-admin.zip mod_jk.sohttp://www.eu.apache.org/dist/jakarta/tomcat -connectors/jk/binaries/win32/jk-1.2.8/mod_jk-1.2.8-apache-2.0.52.so(可选， 因为Apache2.0.53已经自带).  2.配置Tomcat集群。同时发布有clusterapp这个web应用，，修改test.jsp，使得 打开：http://192.168.9.235:12080/clusterapp/test.jsp和http://192.168.9.226: 12080/clusterapp/test.jsp看到的是不同的页面效果。 3.安装Apache2.0.53。 此时Tomcat集群的服务器为： 192.168.9.226:12080和192.168.9.235:12080 编辑c: /windows/system32/drivers/etc/host文件，最后一行加上127.0.0.1   lizongbo.com先来R-proxy方式。接下来是mod_jk方式。重新启动apache，同样打开http: //lizongbo.com/clusterapp/test.jsp不停的刷新这个页面，也将会看到页面显示出不同的内容。参考资料：Tomcat cluster:http://www.onjava.com/onjava/2004/04/14/examples/tomcatclustering.ziphttp: //www.onjava.com/pub/a/onjava/2004/11/24/replication1.htmlhttp://www.onjava.com/pub/a/onjava/2004/11/24/replication1.html? page=2http://www.onjava.com/pub/a/onjava/2004/04/14/clustering.htmlhttp://www.onjava.com/pub/a/onjava/2004/04/14/clustering.html? page=2R-proxy:http://www.douzhe.com/docs/ApacheManual/mod/mod_proxy.html#proxypassreversehttp: //www.douzhe.com/docs/ApacheManual/mod/mod_rewrite.html#rewritemaphttp://www.douzhe.com/docs/ApacheManual/mod/mod_rewrite.html#rewriterule mod_jk:  http://jakarta.apache.org/tomcat/connectors-doc/config/apache.htmlhttp://jakarta.apache.org/tomcat/connectors -doc/config/workers.htmlhttp://jakarta.apache.org/tomcat/connectors-doc/common/ajpv13a.htmlhttp: //www.mail-archive.com/tomcat-user@jakarta.apache.org/msg146787.html  相对 已经过时的资料（因为mod_jk2方式已经不被推荐，mod_jk2已经不再被更新了）：http: //www.sentom.net/list.asp?id=14http://www.linuxforum.net/docnew/showthreaded.php? Cat=&amp;amp;Board=server&amp;amp;Number=507&amp;amp;page=1&amp;amp;view=collapsed&amp;amp;sb =5&amp;amp;o=all&amp;amp;fpart=http://www.ecoo.net/list.asp?articleid=2311http://www.linuxaid.com.cn/forum/showdoc.jsp? l=1&amp;amp;i=81013&amp;amp;m=0http://search.csdn.net/expert/topicview1.asp?id=1706745http: //www.chinaitlab.com/www/news/article_show.asp?id=11921  可能有用的资料：（因为我还没有 仔细看过） http://www.phpv.net/article.php/92 http: //raibledesigns.com/tomcat/ http://www.crazysquirrel.com/debian/tomcat55.php&lt;/p&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-7507729076645529230?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/7507729076645529230/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=7507729076645529230' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/7507729076645529230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/7507729076645529230'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2007/12/tomcat-windows2003-server-sp4-j2sdk1.html' title=''/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-9052640132058425979</id><published>2007-08-21T01:35:00.000-07:00</published><updated>2008-10-29T22:06:08.330-07:00</updated><title type='text'></title><content type='html'>&lt;BR&gt; &lt;DIV CLASS=postTitle&gt;   &lt;A HREF=http://blog.csdn.net/cnhappier/archive/2007/04/10/1559803.aspx&gt;&lt;IMG BORDER=0 HEIGHT=13 SRC=http://blog.csdn.net/images/authorship.gif WIDTH=15&gt; Struts+Spring+JDBC　简单配置&lt;/A&gt; &lt;/DIV&gt;      项目需要，在原来Struts的基础上，配了Spring，数据库访问也用JDBC代替，由于Spring出色的控制反转，JDBC连接的工作基本上不需要考虑，只要专注于数据抽取就可以了，下边把代码贴一下，顺便说说一些小细节。&lt;BR&gt; &lt;BR&gt; Spirng和Struts结合，主要有三种方式：&lt;BR&gt; 1，使用ActionSupport类&lt;BR&gt; 2，覆盖RequestProcessor&lt;BR&gt; 3，将Action委托给Spring&lt;BR&gt; 文章&lt;A HREF=http://www.ibm.com/developerworks/cn/java/j-sr2.html&gt;&amp;lt;使用 Spring更好地处理Struts动作&amp;gt;&lt;/A&gt;中,对这三种方法都分析得比较详细,我在这里归纳一下.&lt;BR&gt; 使 用第一种方法,是最简单的,不需要其他任何配置,只需要在把继承Action,改成继承ActionSupport,带来的问题就是Struts与 Spring,紧耦合,以后不使用Spring配置时,需要修改代码.但其实,我目前觉得使用此方法,有一个好处是可以方便的得到 WebApplicationContext对象,不然,就需要使用ClassPathXmlApplicaiton("...")来取得Context 对象,不是很方便.其实,看DelegationActionUtils的源码,applicationContext对象也只是,这样子通过 sturts的plugin取得的.&lt;BR&gt; actionServlet.getServletContext().getAttribute(&lt;BR&gt;                     ContextLoaderPlugIn.SERVLET_CONTEXT_PREFIX + modulePrefix)&lt;BR&gt; &lt;BR&gt; 第二种方法,所有Action的分发都是通过ActionServlet的，而实际上的操作是由RequestProcessor 完成的，因此，可以把它覆盖，引入Spring&lt;BR&gt; The RequestProcessor is where the majority of the core processing occurs for each request. Since version 1.3, the default Request Processor &lt;CODE&gt;(ComposableRequestProcessor)&lt;/CODE&gt; is composed using &lt;A HREF=http://jakarta.apache.org/commons/chain/&gt;Jakarta Commons Chain,&lt;/A&gt; which is an implementation of the &lt;EM&gt;Chain of Responsibility&lt;/EM&gt; pattern (CoR).&lt;BR&gt; &lt;BR&gt; The &lt;CODE&gt;&amp;lt;controller&amp;gt;&lt;/CODE&gt; element allows you to configure the ActionServlet. Many of the controller parameters were previously defined by servlet initialization parameters in your &lt;CODE&gt;web.xml&lt;/CODE&gt; file but have been moved to this section of &lt;CODE&gt;struts-config.xml&lt;/CODE&gt; in order to allow different modules in the same web application to be configured differently.&lt;BR&gt; &lt;BR&gt; 第三种是最推荐的方法&lt;BR&gt; 顺便说一下,plugin在struts的概念，来自UserGuide：&lt;BR&gt; The &lt;EM&gt;PlugIn&lt;/EM&gt; interface extends Action and so that applications can easily hook into the ActionServlet lifecycle. This interface defines two methods, init() and destroy(), which are called at application startup and shutdown, respectively. A common use of a Plugin Action is to configure or load application-specific data as the web application is starting up.&lt;BR&gt; 其中Spring中的ContextLoaderPlugIn就是继承此&lt;EM&gt;PlugIn&lt;/EM&gt; ,从而引入了Spring&lt;BR&gt; &lt;BR&gt; &lt;BR&gt; 基本上这样子就可以把Spring+Struts配置好，然后Spring+JDBC,关键就是配置好DataSource，然后通过JdbcTemplate类，就可以很方便的进行配置．以下部分为代码：&lt;BR&gt; &lt;BR&gt; web.xml&lt;BR&gt; &lt;DIV STYLE="BORDER:0.5pt solid windowtext;PADDING:4px 5.4pt;BACKGROUND:#e6e6e6 none repeat scroll 0% 50%;WIDTH:95%"&gt;   &lt;DIV&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;web-app&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;  &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;param-name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;contextConfigLocation&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;param-name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;param-value&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;/WEB-INF/applicationContext.xml,/WEB-INF/applicationContext-*.xml&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;param-value&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;  &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;context-param&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;  &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;listener&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;listener-class&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;org.springframework.web.context.ContextLoaderListener&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;listener-class&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;  &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;listener&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;  &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;servlet&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;servlet-name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;action&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;servlet-name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;servlet-class&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;org.apache.struts.action.ActionServlet&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;servlet-class&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;init-param&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;      &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;param-name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;config&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;param-name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;      &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;param-value&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;/WEB-INF/struts-config.xml&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;param-value&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;init-param&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;init-param&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;      &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;param-name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;debug&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;param-name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;      &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;param-value&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;3&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;param-value&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;init-param&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;init-param&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;      &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;param-name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;detail&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;param-name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;      &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;param-value&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;3&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;param-value&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;init-param&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;load-on-startup&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;0&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;load-on-startup&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;  &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;servlet&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;  &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;servlet-mapping&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;servlet-name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;action&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;servlet-name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;url-pattern&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;*.do&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;url-pattern&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;  &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;servlet-mapping&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;web-app&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;/SPAN&gt;   &lt;/DIV&gt; &lt;/DIV&gt; &lt;BR&gt; &lt;SPAN STYLE=FONT-STYLE:italic&gt;&lt;/SPAN&gt;struts-config.xml&lt;BR&gt; &lt;DIV STYLE="BORDER:0.5pt solid windowtext;PADDING:4px 5.4pt;BACKGROUND:#e6e6e6 none repeat scroll 0% 50%;WIDTH:95%"&gt;   &lt;DIV&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;?&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff00ff&gt;xml version="1.0" encoding="UTF-8"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;?&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;!&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff00ff&gt;DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;struts-config&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;data-sources &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;/&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;form-beans&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;form-bean &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="reportBaseForm"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;            type&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="com.sjtu.wgq.framework.controller.ReportBaseActionForm"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;form-bean&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;form-beans&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;global-exceptions &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;/&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;global-forwards &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;/&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;action-mappings&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;action &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="reportBaseForm"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt; path&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="/reportBaseAction"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;            type&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="org.springframework.web.struts.DelegatingActionProxy"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;            &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;forward &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="success"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt; path&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="/success.jsp"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;forward&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;            &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;forward &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="fail"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt; path&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="/fail.jsp"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;forward&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;action&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;action-mappings&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;message-resources&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;parameter&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="com.sjtu.wgq.framework.ApplicationResources"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;/&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;plug-in&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;className&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="org.springframework.web.struts.ContextLoaderPlugIn"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;set-property &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;property&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="contextConfigLocation"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;            value&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="/WEB-INF/action-servlet.xml"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;/&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;plug-in&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;struts-config&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;   &lt;/DIV&gt; &lt;/DIV&gt; &lt;BR&gt; action-servlet.xml&lt;BR&gt; &lt;DIV STYLE="BORDER:0.5pt solid windowtext;PADDING:4px 5.4pt;BACKGROUND:#e6e6e6 none repeat scroll 0% 50%;WIDTH:95%"&gt;   &lt;DIV&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&amp;lt;?&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;xml version&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;=&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;1.0&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; encoding&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;=&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;UTF-8&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;?&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&amp;lt;!&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;DOCTYPE beans PUBLIC &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;-//SPRING//DTD BEAN//EN&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;http://www.springframework.org/dtd/spring-beans.dtd&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;beans&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;bean name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;=&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;/reportBaseAction&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;class&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;=&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;com.sjtu.wgq.framework.controller.ReportBaseAction&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;bean&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;beans&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&amp;gt;&lt;/SPAN&gt;   &lt;/DIV&gt; &lt;/DIV&gt; &lt;BR&gt; &lt;BR&gt; applicationContext.xml&lt;BR&gt; &lt;DIV STYLE="BORDER:0.5pt solid windowtext;PADDING:4px 5.4pt;BACKGROUND:#e6e6e6 none repeat scroll 0% 50%;WIDTH:95%"&gt;   &lt;DIV&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;?&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff00ff&gt;xml version="1.0" encoding="UTF-8"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;?&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;!&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff00ff&gt;DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;beans&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;bean &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;id&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="dataSource"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;        class&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="org.springframework.jdbc.datasource.DriverManagerDataSource"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;property &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="driverClassName"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;            value&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="oracle.jdbc.driver.OracleDriver"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;property&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;property &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="url"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;            value&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="jdbc:oracle:thin:@IP:端口：SIN"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;property&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;property &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="username"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt; value&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;=""&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;property&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;property &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="password"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt; value&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;=""&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;property&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;bean&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;beans&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;   &lt;/DIV&gt; &lt;/DIV&gt; &lt;BR&gt; &lt;BR&gt; applicatoinContext-dao.xml&lt;BR&gt; &lt;DIV STYLE="BORDER:0.5pt solid windowtext;PADDING:4px 5.4pt;BACKGROUND:#e6e6e6 none repeat scroll 0% 50%;WIDTH:95%"&gt;   &lt;DIV&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;?&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff00ff&gt;xml version="1.0" encoding="UTF-8"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;?&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;!&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff00ff&gt;DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;beans&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;bean &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;id&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="userDAO"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt; class&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="com.sjtu.wgq.dao.jdbc.UserJdbcTemplateDAO"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;property &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;name&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="dataSource"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;            &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;ref &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt;bean&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;="dataSource"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#ff0000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;/&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;property&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;bean&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;beans&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;/SPAN&gt;   &lt;/DIV&gt; &lt;/DIV&gt; &lt;BR&gt; UserDAO.java&lt;BR&gt; &lt;DIV STYLE="BORDER:0.5pt solid windowtext;PADDING:4px 5.4pt;BACKGROUND:#e6e6e6 none repeat scroll 0% 50%;WIDTH:95%"&gt;   &lt;DIV&gt;     &lt;IMG ALIGN=top ALT="" ID=_25_61_Open_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif&gt;&lt;IMG ALIGN=top ALT="" ID=_25_61_Closed_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif STYLE=""&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;public&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;interface&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; UserDAO &lt;/SPAN&gt;&lt;SPAN ID=_25_61_Closed_Text STYLE="BORDER:1px solid #808080;BACKGROUND-COLOR:#ffffff"&gt;...&lt;/SPAN&gt;&lt;SPAN ID=_25_61_Open_Text&gt;&lt;SPAN STYLE=COLOR:#000000&gt;{&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;public&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; List getUser(String uid);&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;   &lt;/DIV&gt; &lt;/DIV&gt; &lt;BR&gt; User.java&lt;BR&gt; &lt;DIV STYLE="BORDER:0.5pt solid windowtext;PADDING:4px 5.4pt;BACKGROUND:#e6e6e6 none repeat scroll 0% 50%;WIDTH:95%"&gt;   &lt;DIV&gt;     &lt;IMG ALIGN=top ALT="" ID=_18_252_Open_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif&gt;&lt;IMG ALIGN=top ALT="" ID=_18_252_Closed_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif STYLE=""&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;public&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;class&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; User &lt;/SPAN&gt;&lt;SPAN ID=_18_252_Closed_Text STYLE="BORDER:1px solid #808080;BACKGROUND-COLOR:#ffffff"&gt;...&lt;/SPAN&gt;&lt;SPAN ID=_18_252_Open_Text&gt;&lt;SPAN STYLE=COLOR:#000000&gt;{&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;    String name;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;    String pwd;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;    &lt;BR&gt;     &lt;IMG ALIGN=top ALT="" ID=_75_93_Open_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&gt;&lt;IMG ALIGN=top ALT="" ID=_75_93_Closed_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif STYLE=""&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;public&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; String getName() &lt;/SPAN&gt;&lt;SPAN ID=_75_93_Closed_Text STYLE="BORDER:1px solid #808080;BACKGROUND-COLOR:#ffffff"&gt;...&lt;/SPAN&gt;&lt;SPAN ID=_75_93_Open_Text&gt;&lt;SPAN STYLE=COLOR:#000000&gt;{&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;return&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; name;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&gt;    }&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" ID=_129_152_Open_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&gt;&lt;IMG ALIGN=top ALT="" ID=_129_152_Closed_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif STYLE=""&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;public&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;void&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; setName(String name) &lt;/SPAN&gt;&lt;SPAN ID=_129_152_Closed_Text STYLE="BORDER:1px solid #808080;BACKGROUND-COLOR:#ffffff"&gt;...&lt;/SPAN&gt;&lt;SPAN ID=_129_152_Open_Text&gt;&lt;SPAN STYLE=COLOR:#000000&gt;{&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;this&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;.name &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;=&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; name;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&gt;    }&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" ID=_178_195_Open_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&gt;&lt;IMG ALIGN=top ALT="" ID=_178_195_Closed_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif STYLE=""&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;public&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; String getPwd() &lt;/SPAN&gt;&lt;SPAN ID=_178_195_Closed_Text STYLE="BORDER:1px solid #808080;BACKGROUND-COLOR:#ffffff"&gt;...&lt;/SPAN&gt;&lt;SPAN ID=_178_195_Open_Text&gt;&lt;SPAN STYLE=COLOR:#000000&gt;{&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;return&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; pwd;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&gt;    }&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" ID=_229_250_Open_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&gt;&lt;IMG ALIGN=top ALT="" ID=_229_250_Closed_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif STYLE=""&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;public&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;void&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; setPwd(String pwd) &lt;/SPAN&gt;&lt;SPAN ID=_229_250_Closed_Text STYLE="BORDER:1px solid #808080;BACKGROUND-COLOR:#ffffff"&gt;...&lt;/SPAN&gt;&lt;SPAN ID=_229_250_Open_Text&gt;&lt;SPAN STYLE=COLOR:#000000&gt;{&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;this&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;.pwd &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;=&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; pwd;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&gt;    }&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;   &lt;/DIV&gt; &lt;/DIV&gt; &lt;BR&gt; &lt;BR&gt; UserJdbcTemplateDAO.java&lt;BR&gt; &lt;DIV STYLE="BORDER:0.5pt solid windowtext;PADDING:4px 5.4pt;BACKGROUND:#e6e6e6 none repeat scroll 0% 50%;WIDTH:95%"&gt;   &lt;DIV&gt;     &lt;IMG ALIGN=top ALT="" ID=_74_619_Open_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif&gt;&lt;IMG ALIGN=top ALT="" ID=_74_619_Closed_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif STYLE=""&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;public&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;class&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; UserJdbcTemplateDAO &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;extends&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; JdbcDaoSupport &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;implements&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; UserDAO&lt;/SPAN&gt;&lt;SPAN ID=_74_619_Closed_Text STYLE="BORDER:1px solid #808080;BACKGROUND-COLOR:#ffffff"&gt;...&lt;/SPAN&gt;&lt;SPAN ID=_74_619_Open_Text&gt;&lt;SPAN STYLE=COLOR:#000000&gt;{&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" ID=_109_375_Open_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&gt;&lt;IMG ALIGN=top ALT="" ID=_109_375_Closed_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif STYLE=""&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;public&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; List getUser(String uid)&lt;/SPAN&gt;&lt;SPAN ID=_109_375_Closed_Text STYLE="BORDER:1px solid #808080;BACKGROUND-COLOR:#ffffff"&gt;...&lt;/SPAN&gt;&lt;SPAN ID=_109_375_Open_Text&gt;&lt;SPAN STYLE=COLOR:#000000&gt;{&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" ID=_144_357_Open_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&gt;&lt;IMG ALIGN=top ALT="" ID=_144_357_Closed_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif STYLE=""&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;if&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;(uid&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;!=&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;null&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&amp;amp;&amp;amp;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;!&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;uid.equals(&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;""&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;))&lt;/SPAN&gt;&lt;SPAN ID=_144_357_Closed_Text STYLE="BORDER:1px solid #808080;BACKGROUND-COLOR:#ffffff"&gt;...&lt;/SPAN&gt;&lt;SPAN ID=_144_357_Open_Text&gt;&lt;SPAN STYLE=COLOR:#000000&gt;{&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;            String sql &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;=&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;select ba.USER_ID id ,ba.PSWD_NO no from Ba.Ba9040 ba where ba.USER_ID= &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;+&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;uid;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;            &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#008000&gt;//&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#008000&gt;this.getJdbcTemplate().queryForList(sql);&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#008000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;            &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;return&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;this&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;.getJdbcTemplate().query(sql,&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;new&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; UserRowMapper());&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&gt;        }&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;return&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;null&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&gt;    }&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;    &lt;BR&gt;     &lt;IMG ALIGN=top ALT="" ID=_428_617_Open_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&gt;&lt;IMG ALIGN=top ALT="" ID=_428_617_Closed_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif STYLE=""&gt;    &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;private&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;class&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; UserRowMapper &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;implements&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; RowMapper&lt;/SPAN&gt;&lt;SPAN ID=_428_617_Closed_Text STYLE="BORDER:1px solid #808080;BACKGROUND-COLOR:#ffffff"&gt;...&lt;/SPAN&gt;&lt;SPAN ID=_428_617_Open_Text&gt;&lt;SPAN STYLE=COLOR:#000000&gt;{&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" ID=_495_614_Open_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif&gt;&lt;IMG ALIGN=top ALT="" ID=_495_614_Closed_Image SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif STYLE=""&gt;        &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;public&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; Object mapRow(ResultSet rs,&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;int&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; index)&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;throws&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; SQLException&lt;/SPAN&gt;&lt;SPAN ID=_495_614_Closed_Text STYLE="BORDER:1px solid #808080;BACKGROUND-COLOR:#ffffff"&gt;...&lt;/SPAN&gt;&lt;SPAN ID=_495_614_Open_Text&gt;&lt;SPAN STYLE=COLOR:#000000&gt;{&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;            User user &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;=&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;new&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; User();&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;            user.setName(rs.getString(&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;id&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;));&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;            user.setPwd(rs.getString(&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;no&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;));&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif&gt;            &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;return&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; user;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&gt;        }&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif&gt;    }&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;     &lt;IMG ALIGN=top ALT="" SRC=http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;   &lt;/DIV&gt; &lt;/DIV&gt; &lt;BR&gt; ReportBaseAction.java&lt;BR&gt; &lt;DIV STYLE="BORDER:0.5pt solid windowtext;PADDING:4px 5.4pt;BACKGROUND:#e6e6e6 none repeat scroll 0% 50%;WIDTH:95%"&gt;   &lt;DIV&gt;     &lt;SPAN STYLE=COLOR:#0000ff&gt;public&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;abstract&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;class&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; BaseAction &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;extends&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; ActionSupport {&lt;BR&gt;     &lt;BR&gt;         &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#008000&gt;/**&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#008000&gt; 继承与ActionSupport,&lt;BR&gt;          * &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#808080&gt;@see&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#008000&gt; org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)&lt;BR&gt;          &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#008000&gt;*/&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;&lt;BR&gt;         &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;public&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;final&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; ActionForward execute(ActionMapping mapping,ActionForm actionForm,&lt;BR&gt;                 HttpServletRequest request, HttpServletResponse response) {&lt;BR&gt;                      ApplicationContext ctx &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;=&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;this&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;.getWebApplicationContext();&lt;BR&gt;       &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#008000&gt;//&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#008000&gt;Spring完成注入和初始化．&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#008000&gt;&lt;BR&gt;     &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;                 UserDAO userDao &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;=&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt; (UserDAO)ctx.getBean(&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;UserDAO&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;"&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;);&lt;BR&gt;                      &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#008000&gt;//&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#008000&gt;调用UserDAO接口声明的方法．&lt;BR&gt;                      &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#008000&gt;//&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#008000&gt;userDAO.getUser("1");&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#008000&gt;&lt;BR&gt;     &lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#000000&gt;    }&lt;BR&gt;     }&lt;/SPAN&gt;   &lt;/DIV&gt; &lt;/DIV&gt; &lt;BR&gt; ActionForm的部分就省略了．&lt;BR&gt; 另外提一下就是，ActionSupport的getWebApplicatoinContext()方法载入的xml文件，是要在web.xml的&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#800000&gt;context-param&lt;/SPAN&gt;&lt;SPAN STYLE=COLOR:#0000ff&gt;&amp;gt;&lt;SPAN STYLE=COLOR:#000000&gt;声明的，否则如果只在struts-config.xml声明会找不到的．因为两个声明的不是一个概念，在&lt;/SPAN&gt;&lt;/SPAN&gt;getWebApplicatoinContext是通过servlet.getContext 的方法找到的，而在struts-config.xml配置的只是action-servlet.xml，即action的内容．具体原因，我还没有去查．&lt;BR&gt; &lt;BR&gt; 另外就是关于多个applicationContext的问题，可以参考web.xml的配置就可以了．&lt;BR&gt; 还有，applicationContext-dao.xml中的UserDao引用了dataSource,因为不在同一文件中，所以用&amp;lt;bean ref=""&amp;gt;的格式，如果在同一文件可以用&amp;lt;bean local=""&amp;gt;来引用．&lt;BR&gt; &lt;BR&gt; 通过Spring，使得Struts更加灵活，JDBC的配置很简单，但配置文件多，而且因为applicatonContext配置不正确的话，web工程是无法启动的，报linstener的错误，但不会具体指出是什么错．&lt;BR&gt; &lt;BR&gt; 还有以下问题要看看资料：&lt;BR&gt; 1,为什么在plugin里配置的xml，无法在getWebApplication中得到，按道理应该是一致的，因为都是通过actoinservlet去取得信息．&lt;BR&gt; 2,RequestProcessor具体是怎么工作的．&lt;BR&gt; &lt;BR&gt; 下次把＜程序员面试指南＞的体会说一下．&lt;BR&gt; &lt;BR&gt; &lt;P ID=TBPingURL&gt;   Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1559803 &lt;/P&gt; &lt;BR&gt; &lt;P CLASS=article&gt;   首先是一个基类BaseAction&lt;BR&gt;   =================================================================&lt;BR&gt;   public class BaseAction extends ActionSupport {&lt;BR&gt;   /** 简单的得到spring bean的方法*/&lt;BR&gt;   public Object getBean(String beanName) {&lt;BR&gt;   return this.getWebApplicationContext().getBean(beanName);&lt;BR&gt;   }&lt;BR&gt;   &lt;BR&gt;   /** 由子类Action对象调用, 可以在初始化时反射自身的结构, 形成一个映射, 用来日后dispatchSubaction.&lt;BR&gt;   *&lt;BR&gt;   * @return 存放了methods对象的Map&lt;BR&gt;   */&lt;BR&gt;   protected Map getMethodMap() {&lt;BR&gt;   ......&lt;BR&gt;   }&lt;BR&gt;   &lt;BR&gt;   /** 将Action转移给子动作.&lt;BR&gt;   * 在子类中调用时，只需要新建一个Object[] {参数1, 参数2, ...} 一般为 {form, request, dao}&lt;BR&gt;   * 然后调用dispatchSubAction(String, objects) 即可&lt;BR&gt;   *&lt;BR&gt;   * @param action 字符串，决定子动作的方法名&lt;BR&gt;   * @param objs 参数对象列表&lt;BR&gt;   * @param methods 由getMethodMap得到的Map&lt;BR&gt;   * @return 用来findForward的别名&lt;BR&gt;   */&lt;BR&gt;   protected String dispatchSubAction(String action, Object[] objs, Map methods) throws Exception {&lt;BR&gt;   ......&lt;BR&gt;   }&lt;BR&gt;   &lt;BR&gt;   之后是子类的写法：&lt;BR&gt;   ================================================================&lt;BR&gt;   public class SomeAction extends BaseAction {&lt;BR&gt;   protected Map methods = getMethodMap(); //各线程公用&lt;BR&gt;   //--------- 下面是此Action中公用的一些对象，线程安全？&lt;BR&gt;   XxxDAO xxxDao=(XxxDAO) getBean("xxxDao");&lt;BR&gt;   XxxService xxxService = (XxxService) getBean("xxxService");&lt;BR&gt;   &lt;BR&gt;   public ActionForward execute(......) throws Exception {&lt;BR&gt;   // ===================== 初始化环境 ===================== \&lt;BR&gt;   XxxForm form = (XxxForm) actionForm;&lt;BR&gt;   ActionErrors errors = new ActionErrors();&lt;BR&gt;   &lt;BR&gt;   // ==================== 获取用户参数 ==================== \&lt;BR&gt;   //主要是进行数据转换如：form.setXxx() = form.getXxx().split("..");&lt;BR&gt;   &lt;BR&gt;   // ==================== 调用业务逻辑 ==================== \&lt;BR&gt;   Object[] params = {form, request, errors};&lt;BR&gt;   //这里的params要和下面定义的所有子程序的参数对应起来&lt;BR&gt;   String forward = dispatchSubAction(form.getSubaction(), params, methods);&lt;BR&gt;   &lt;BR&gt;   // ==================== 设置回传参数 ==================== \&lt;BR&gt;   saveErrors(request,errors);&lt;BR&gt;   return mapping.findForward(forward);&lt;BR&gt;   }&lt;BR&gt;   &lt;BR&gt;   //所有的子程序的参数声明都应该相同, 但是每个Action可以根据自己的情况有所区别&lt;BR&gt;   public String show(MonthDayExecuteForm form, HttpServletRequest request, ActionErrors errors) {&lt;BR&gt;   ......&lt;BR&gt;   return "show";&lt;BR&gt;   }&lt;BR&gt;   &lt;BR&gt;   public String edit(MonthDayExecuteForm form, HttpServletRequest request, ActionErrors errors) {&lt;BR&gt;   ......&lt;BR&gt;   return "edit";&lt;BR&gt;   }&lt;BR&gt;   &lt;BR&gt;   public String save(MonthDayExecuteForm form, HttpServletRequest request, ActionErrors errors) {&lt;BR&gt;   ......&lt;BR&gt;   return "show";&lt;BR&gt;   }&lt;BR&gt;   }&lt;BR&gt;   ================================================================&lt;BR&gt;   归纳：我知道struts有lookupDispatchAction，1.2还有MappedAction，但是那些东西使用起来都不太方便。&lt;BR&gt;   1. 有的需要在MessageResources里面进行Submit按钮文字定义。&lt;BR&gt;   2. 有的需要在config中有特殊的配置&lt;BR&gt;   3. 必须使用和execute完全相同的冗长的函数声明&lt;BR&gt;   4. 各方法之间没有交集，难以实现统一的log处理，代码重复写的太多，例如一个简单的XxxForm form = (XxxForm) actionForm; 就必须写在所有的子方法中。&lt;BR&gt;   &lt;BR&gt;   不知道我这样做能不能较好的解决上面的问题？虽然会带来一些初始化的负担，但是实际运行时应该不会怎么影响效率。我主要关心的是，这个结构还可不可以优化？另外有没有什么安全/效率方面的硬伤？望高手们多多指点！ &lt;/P&gt; &lt;A NAME=11000305&gt;&lt;/A&gt; &lt;TABLE ALIGN=center BGCOLOR=#cccccc BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;   &lt;TBODY&gt;   &lt;TR&gt;     &lt;TD&gt;       &lt;TABLE BGCOLOR=#cccccc BORDER=0 CELLPADDING=4 CELLSPACING=1 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD&gt;             &lt;TABLE CELLPADDING=1 CELLSPACING=1 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD WIDTH=97%&gt;                   &lt;B&gt;Re: 一个关于Struts Action的小框架, 请高手指点一下&lt;/B&gt;                 &lt;/TD&gt;                 &lt;TD NOWRAP=nowrap WIDTH=1%&gt;                   发表: 2005年04月05日 23:50                 &lt;/TD&gt;                 &lt;TD ALIGN=center NOWRAP=nowrap WIDTH=1%&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/message/messageReplyAction.shtml?parentMessage.messageId=11000305&amp;amp;forum.forumId=16&gt;回复&lt;/A&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD&gt;             &lt;TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/profile.jsp?user=41611&gt;&lt;B&gt;SportsBaby1980&lt;/B&gt;&lt;/A&gt; &lt;A HREF=http://www.jdon.com/jivejdon/query/threadViewQuery.shtml?queryType=userMessageQueryAction&amp;amp;user=41611 TARGET=_blank&gt;发表文章: 244&lt;/A&gt;/ 注册时间: 2004年06月09日 16:52                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD COLSPAN=4 VALIGN=top WIDTH=99%&gt;             &lt;TABLE BORDER=0 CELLPADDING=2 CELLSPACING=2 STYLE=table-layout:fixed WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD STYLE=""&gt;                   &lt;SPAN CLASS=tpc_content&gt; 没看明白&lt;BR&gt;                   &lt;BR&gt;                   是自己写的mvc实现?&lt;BR&gt;                   &lt;BR&gt;                   还是在struts上作的一些方便开发的功能?&lt;BR&gt;                   &lt;/SPAN&gt;                   &lt;P&gt;                   &lt;/P&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;/TBODY&gt; &lt;/TABLE&gt; &lt;A NAME=11005587&gt;&lt;/A&gt; &lt;TABLE ALIGN=center BGCOLOR=#cccccc BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;   &lt;TBODY&gt;   &lt;TR&gt;     &lt;TD&gt;       &lt;TABLE BGCOLOR=#cccccc BORDER=0 CELLPADDING=4 CELLSPACING=1 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD&gt;             &lt;TABLE CELLPADDING=1 CELLSPACING=1 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD WIDTH=97%&gt;                   &lt;B&gt;Re: 一个关于Struts Action的小框架, 请高手指点一下&lt;/B&gt;                 &lt;/TD&gt;                 &lt;TD NOWRAP=nowrap WIDTH=1%&gt;                   发表: 2005年04月06日 11:39                 &lt;/TD&gt;                 &lt;TD ALIGN=center NOWRAP=nowrap WIDTH=1%&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/message/messageReplyAction.shtml?parentMessage.messageId=11005587&amp;amp;forum.forumId=16&gt;回复&lt;/A&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD&gt;             &lt;TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/profile.jsp?user=2&gt;&lt;B&gt;banq&lt;/B&gt;&lt;/A&gt; &lt;A HREF=http://www.jdon.com/jivejdon/query/threadViewQuery.shtml?queryType=userMessageQueryAction&amp;amp;user=2 TARGET=_blank&gt;发表文章: 8120&lt;/A&gt;/ 注册时间: 2002年08月03日 17:08                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD COLSPAN=4 VALIGN=top WIDTH=99%&gt;             &lt;TABLE BORDER=0 CELLPADDING=2 CELLSPACING=2 STYLE=table-layout:fixed WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD STYLE=""&gt;                   &lt;SPAN CLASS=tpc_content&gt; 一个建议：&lt;BR&gt;                   将 Object[] params = {form, request, errors};&lt;BR&gt;                   包装成对象，其实这是DTO对象，可参考Jdon框架中的EventModel。&lt;BR&gt;                   &lt;BR&gt;                   一个疑问：&lt;BR&gt;                   show、edit等重要方法是如何激活的? 这里是性能的关键点。&lt;BR&gt;                   &lt;BR&gt;                   如果使用struts的dispatchAction，它根据参数parameter的值来直接映射的，比较方便。&lt;BR&gt;                   &lt;BR&gt;                   在Jdon框架中，BaseAction(SomeAction ) 相当于ModelHandler，但是这部分代码在通常情况下可自动生成，通过配置完成。&lt;BR&gt;                   &lt;BR&gt;                   &lt;/SPAN&gt;                   &lt;P&gt;                   &lt;/P&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;/TBODY&gt; &lt;/TABLE&gt; &lt;A NAME=11039891&gt;&lt;/A&gt; &lt;TABLE ALIGN=center BGCOLOR=#cccccc BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;   &lt;TBODY&gt;   &lt;TR&gt;     &lt;TD&gt;       &lt;TABLE BGCOLOR=#cccccc BORDER=0 CELLPADDING=4 CELLSPACING=1 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD&gt;             &lt;TABLE CELLPADDING=1 CELLSPACING=1 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD WIDTH=97%&gt;                   &lt;B&gt;Re: 一个关于Struts Action的小框架, 请高手指点一下&lt;/B&gt;                 &lt;/TD&gt;                 &lt;TD NOWRAP=nowrap WIDTH=1%&gt;                   发表: 2005年04月09日 23:03                 &lt;/TD&gt;                 &lt;TD ALIGN=center NOWRAP=nowrap WIDTH=1%&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/message/messageReplyAction.shtml?parentMessage.messageId=11039891&amp;amp;forum.forumId=16&gt;回复&lt;/A&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD&gt;             &lt;TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/profile.jsp?user=12116&gt;&lt;B&gt;zyhalj&lt;/B&gt;&lt;/A&gt; &lt;A HREF=http://www.jdon.com/jivejdon/query/threadViewQuery.shtml?queryType=userMessageQueryAction&amp;amp;user=12116 TARGET=_blank&gt;发表文章: 10&lt;/A&gt;/ 注册时间: 2003年10月29日 16:22                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD COLSPAN=4 VALIGN=top WIDTH=99%&gt;             &lt;TABLE BORDER=0 CELLPADDING=2 CELLSPACING=2 STYLE=table-layout:fixed WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD STYLE=""&gt;                   &lt;SPAN CLASS=tpc_content&gt; 为了确保线程安全在一个应用的生命周期中，struts框架只会为每个action类创建一个action实例，所有的用户共请求共享同一个action 实例，并且所有的请求线程可以同时执行action实例的execute（）方法。所以你的小框架中的xxxDao 变量是实例变量，肯定是线程不安全的。采用同步方法也是不能解决线程安全的问题的。同样还是会出现“脏读”现象。&lt;BR&gt;                   &lt;BR&gt;                   banq说的对，你为什么不用dispatchAction呢，config配置并不复杂呀。这点灵活性 &lt;/SPAN&gt;                   &lt;P&gt;                   &lt;/P&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;/TBODY&gt; &lt;/TABLE&gt; &lt;A NAME=11049974&gt;&lt;/A&gt; &lt;TABLE ALIGN=center BGCOLOR=#cccccc BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;   &lt;TBODY&gt;   &lt;TR&gt;     &lt;TD&gt;       &lt;TABLE BGCOLOR=#cccccc BORDER=0 CELLPADDING=4 CELLSPACING=1 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD&gt;             &lt;TABLE CELLPADDING=1 CELLSPACING=1 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD WIDTH=97%&gt;                   &lt;B&gt;Re: 一个关于Struts Action的小框架, 请高手指点一下&lt;/B&gt;                 &lt;/TD&gt;                 &lt;TD NOWRAP=nowrap WIDTH=1%&gt;                   发表: 2005年04月11日 14:47                 &lt;/TD&gt;                 &lt;TD ALIGN=center NOWRAP=nowrap WIDTH=1%&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/message/messageReplyAction.shtml?parentMessage.messageId=11049974&amp;amp;forum.forumId=16&gt;回复&lt;/A&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD&gt;             &lt;TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/profile.jsp?user=12116&gt;&lt;B&gt;zyhalj&lt;/B&gt;&lt;/A&gt; &lt;A HREF=http://www.jdon.com/jivejdon/query/threadViewQuery.shtml?queryType=userMessageQueryAction&amp;amp;user=12116 TARGET=_blank&gt;发表文章: 10&lt;/A&gt;/ 注册时间: 2003年10月29日 16:22                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD COLSPAN=4 VALIGN=top WIDTH=99%&gt;             &lt;TABLE BORDER=0 CELLPADDING=2 CELLSPACING=2 STYLE=table-layout:fixed WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD STYLE=""&gt;                   &lt;SPAN CLASS=tpc_content&gt; ThreadLocal 是解决多线程内部数据的，你可以在网上看看相关例子 &lt;/SPAN&gt;                   &lt;P&gt;                   &lt;/P&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;/TBODY&gt; &lt;/TABLE&gt; &lt;A NAME=11052944&gt;&lt;/A&gt; &lt;TABLE ALIGN=center BGCOLOR=#cccccc BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;   &lt;TBODY&gt;   &lt;TR&gt;     &lt;TD&gt;       &lt;TABLE BGCOLOR=#cccccc BORDER=0 CELLPADDING=4 CELLSPACING=1 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD&gt;             &lt;TABLE CELLPADDING=1 CELLSPACING=1 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD WIDTH=97%&gt;                   &lt;B&gt;Re: 一个关于Struts Action的小框架, 请高手指点一下&lt;/B&gt;                 &lt;/TD&gt;                 &lt;TD NOWRAP=nowrap WIDTH=1%&gt;                   发表: 2005年04月11日 20:45                 &lt;/TD&gt;                 &lt;TD ALIGN=center NOWRAP=nowrap WIDTH=1%&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/message/messageReplyAction.shtml?parentMessage.messageId=11052944&amp;amp;forum.forumId=16&gt;回复&lt;/A&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD&gt;             &lt;TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/profile.jsp?user=12635&gt;&lt;B&gt;yuzs2000&lt;/B&gt;&lt;/A&gt; &lt;A HREF=http://www.jdon.com/jivejdon/query/threadViewQuery.shtml?queryType=userMessageQueryAction&amp;amp;user=12635 TARGET=_blank&gt;发表文章: 3&lt;/A&gt;/ 注册时间: 2003年11月14日 21:34                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD COLSPAN=4 VALIGN=top WIDTH=99%&gt;             &lt;TABLE BORDER=0 CELLPADDING=2 CELLSPACING=2 STYLE=table-layout:fixed WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD STYLE=""&gt;                   &lt;SPAN CLASS=tpc_content&gt; 楼主的想法有点从新制造轮子的嫌疑了.&lt;BR&gt;                   dispatchAction的确非常实用,MappingDispatchAction 解决了dispatchAction的不足之处,这两个类已经非常完善了,简单配置下文件就可以了,完全没有必要再去做重复的工作. &lt;/SPAN&gt;                   &lt;P&gt;                   &lt;/P&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;/TBODY&gt; &lt;/TABLE&gt; &lt;A NAME=11070225&gt;&lt;/A&gt; &lt;TABLE ALIGN=center BGCOLOR=#cccccc BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;   &lt;TBODY&gt;   &lt;TR&gt;     &lt;TD&gt;       &lt;TABLE BGCOLOR=#cccccc BORDER=0 CELLPADDING=4 CELLSPACING=1 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD&gt;             &lt;TABLE CELLPADDING=1 CELLSPACING=1 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD WIDTH=97%&gt;                   &lt;B&gt;Re: 一个关于Struts Action的小框架, 请高手指点一下&lt;/B&gt;                 &lt;/TD&gt;                 &lt;TD NOWRAP=nowrap WIDTH=1%&gt;                   发表: 2005年04月13日 22:49                 &lt;/TD&gt;                 &lt;TD ALIGN=center NOWRAP=nowrap WIDTH=1%&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/message/messageReplyAction.shtml?parentMessage.messageId=11070225&amp;amp;forum.forumId=16&gt;回复&lt;/A&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD&gt;             &lt;TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/profile.jsp?user=42711&gt;&lt;B&gt;markyang&lt;/B&gt;&lt;/A&gt; &lt;A HREF=http://www.jdon.com/jivejdon/query/threadViewQuery.shtml?queryType=userMessageQueryAction&amp;amp;user=42711 TARGET=_blank&gt;发表文章: 16&lt;/A&gt;/ 注册时间: 2004年07月19日 22:33                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD COLSPAN=4 VALIGN=top WIDTH=99%&gt;             &lt;TABLE BORDER=0 CELLPADDING=2 CELLSPACING=2 STYLE=table-layout:fixed WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD STYLE=""&gt;                   &lt;SPAN CLASS=tpc_content&gt; 问一个小问题&lt;BR&gt;                   楼主为什么用GETBEAN 而不用SETDAO方法? &lt;/SPAN&gt;                   &lt;P&gt;                   &lt;/P&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;/TBODY&gt; &lt;/TABLE&gt; &lt;A NAME=11070229&gt;&lt;/A&gt; &lt;TABLE ALIGN=center BGCOLOR=#cccccc BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;   &lt;TBODY&gt;   &lt;TR&gt;     &lt;TD&gt;       &lt;TABLE BGCOLOR=#cccccc BORDER=0 CELLPADDING=4 CELLSPACING=1 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD&gt;             &lt;TABLE CELLPADDING=1 CELLSPACING=1 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD WIDTH=97%&gt;                   &lt;B&gt;Re: 一个关于Struts Action的小框架, 请高手指点一下&lt;/B&gt;                 &lt;/TD&gt;                 &lt;TD NOWRAP=nowrap WIDTH=1%&gt;                   发表: 2005年04月13日 22:51                 &lt;/TD&gt;                 &lt;TD ALIGN=center NOWRAP=nowrap WIDTH=1%&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/message/messageReplyAction.shtml?parentMessage.messageId=11070229&amp;amp;forum.forumId=16&gt;回复&lt;/A&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD&gt;             &lt;TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/profile.jsp?user=42711&gt;&lt;B&gt;markyang&lt;/B&gt;&lt;/A&gt; &lt;A HREF=http://www.jdon.com/jivejdon/query/threadViewQuery.shtml?queryType=userMessageQueryAction&amp;amp;user=42711 TARGET=_blank&gt;发表文章: 16&lt;/A&gt;/ 注册时间: 2004年07月19日 22:33                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD COLSPAN=4 VALIGN=top WIDTH=99%&gt;             &lt;TABLE BORDER=0 CELLPADDING=2 CELLSPACING=2 STYLE=table-layout:fixed WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD STYLE=""&gt;                   &lt;SPAN CLASS=tpc_content&gt; 把SERVICE 与DAO放在同一层是不是有些混乱呢? &lt;/SPAN&gt;                   &lt;P&gt;                   &lt;/P&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;/TBODY&gt; &lt;/TABLE&gt; &lt;A NAME=11083280&gt;&lt;/A&gt; &lt;TABLE ALIGN=center BGCOLOR=#cccccc BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;   &lt;TBODY&gt;   &lt;TR&gt;     &lt;TD&gt;       &lt;TABLE BGCOLOR=#cccccc BORDER=0 CELLPADDING=4 CELLSPACING=1 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD&gt;             &lt;TABLE CELLPADDING=1 CELLSPACING=1 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD WIDTH=97%&gt;                   &lt;B&gt;Re: 一个关于Struts Action的小框架, 请高手指点一下&lt;/B&gt;                 &lt;/TD&gt;                 &lt;TD NOWRAP=nowrap WIDTH=1%&gt;                   发表: 2005年04月15日 10:33                 &lt;/TD&gt;                 &lt;TD ALIGN=center NOWRAP=nowrap WIDTH=1%&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/message/messageReplyAction.shtml?parentMessage.messageId=11083280&amp;amp;forum.forumId=16&gt;回复&lt;/A&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD&gt;             &lt;TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/profile.jsp?user=13639&gt;&lt;B&gt;vcshcn&lt;/B&gt;&lt;/A&gt; &lt;A HREF=http://www.jdon.com/jivejdon/query/threadViewQuery.shtml?queryType=userMessageQueryAction&amp;amp;user=13639 TARGET=_blank&gt;发表文章: 36&lt;/A&gt;/ 注册时间: 2003年12月28日 23:11                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD COLSPAN=4 VALIGN=top WIDTH=99%&gt;             &lt;TABLE BORDER=0 CELLPADDING=2 CELLSPACING=2 STYLE=table-layout:fixed WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD STYLE=""&gt;                   &lt;SPAN CLASS=tpc_content&gt; 没看懂&lt;BR&gt;                   建议下次能否先说明一下思路,然后在把代码贴出来 &lt;/SPAN&gt;                   &lt;P&gt;                   &lt;/P&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;/TBODY&gt; &lt;/TABLE&gt; &lt;A NAME=11083311&gt;&lt;/A&gt; &lt;TABLE ALIGN=center BGCOLOR=#cccccc BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;   &lt;TBODY&gt;   &lt;TR&gt;     &lt;TD&gt;       &lt;TABLE BGCOLOR=#cccccc BORDER=0 CELLPADDING=4 CELLSPACING=1 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD&gt;             &lt;TABLE CELLPADDING=1 CELLSPACING=1 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD WIDTH=97%&gt;                   &lt;B&gt;Re: 一个关于Struts Action的小框架, 请高手指点一下&lt;/B&gt;                 &lt;/TD&gt;                 &lt;TD NOWRAP=nowrap WIDTH=1%&gt;                   发表: 2005年04月15日 10:36                 &lt;/TD&gt;                 &lt;TD ALIGN=center NOWRAP=nowrap WIDTH=1%&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/message/messageReplyAction.shtml?parentMessage.messageId=11083311&amp;amp;forum.forumId=16&gt;回复&lt;/A&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD&gt;             &lt;TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/profile.jsp?user=13639&gt;&lt;B&gt;vcshcn&lt;/B&gt;&lt;/A&gt; &lt;A HREF=http://www.jdon.com/jivejdon/query/threadViewQuery.shtml?queryType=userMessageQueryAction&amp;amp;user=13639 TARGET=_blank&gt;发表文章: 36&lt;/A&gt;/ 注册时间: 2003年12月28日 23:11                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD COLSPAN=4 VALIGN=top WIDTH=99%&gt;             &lt;TABLE BORDER=0 CELLPADDING=2 CELLSPACING=2 STYLE=table-layout:fixed WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD STYLE=""&gt;                   &lt;SPAN CLASS=tpc_content&gt; 大概看了一下,不知道对不对&lt;BR&gt;                   这种结构我好象在sun的demo里,要不就是在ibatis的demo里见到过,没什么发明的,参考一下就可以了 &lt;/SPAN&gt;                   &lt;P&gt;                   &lt;/P&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;/TBODY&gt; &lt;/TABLE&gt; &lt;A NAME=11149872&gt;&lt;/A&gt; &lt;TABLE BGCOLOR=#cccccc BORDER=0 CELLPADDING=4 CELLSPACING=1 WIDTH=100%&gt;   &lt;TBODY&gt;   &lt;TR BGCOLOR=#eae9ea&gt;     &lt;TD&gt;       &lt;TABLE CELLPADDING=1 CELLSPACING=1 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR&gt;           &lt;TD WIDTH=97%&gt;             &lt;B&gt;Re: 一个关于Struts Action的小框架, 请高手指点一下&lt;/B&gt;           &lt;/TD&gt;           &lt;TD NOWRAP=nowrap WIDTH=1%&gt;             发表: 2005年04月20日 12:02           &lt;/TD&gt;           &lt;TD ALIGN=center NOWRAP=nowrap WIDTH=1%&gt;             &lt;A HREF=http://www.jdon.com/jivejdon/message/messageReplyAction.shtml?parentMessage.messageId=11149872&amp;amp;forum.forumId=16&gt;回复&lt;/A&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;TR BGCOLOR=#eae9ea&gt;     &lt;TD&gt;       &lt;TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR&gt;           &lt;TD&gt;             &lt;A HREF=http://www.jdon.com/jivejdon/profile.jsp?user=47829&gt;&lt;B&gt;warbaby&lt;/B&gt;&lt;/A&gt; &lt;A HREF=http://www.jdon.com/jivejdon/query/threadViewQuery.shtml?queryType=userMessageQueryAction&amp;amp;user=47829 TARGET=_blank&gt;发表文章: 11&lt;/A&gt;/ 注册时间: 2005年01月29日 18:24           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;TR BGCOLOR=#eae9ea&gt;     &lt;TD COLSPAN=4 VALIGN=top WIDTH=99%&gt;       &lt;TABLE BORDER=0 CELLPADDING=2 CELLSPACING=2 STYLE=table-layout:fixed WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR&gt;           &lt;TD STYLE=""&gt;             &lt;SPAN CLASS=tpc_content&gt; 不知道有没有人在实际中使用过struts的DispatchAction系列? 谁又能给我明白的讲讲DispatchAction, LookupDispatchAction, MappingDispatchAction各自的用法和区别呢？&lt;BR&gt;             &lt;BR&gt;             1) DispatchAction就是在struts-config中用parameter参数配置一个表单字段名,这个字段的值就是最终替代execute 被调用的方法. 例如parameter="method"而request.getParameter("method")="save"，其中"save"就是 MethodName。struts的请求将根据parameter被分发到"save"或者"edit"或者什么。但是有一点，save()或者 edit()等方法的声明和execute必须一模一样。&lt;BR&gt;             &lt;BR&gt;             2) LookupDispatchAction继承DispatchAction, 用于对同一个页面上的多个submit按钮进行不同的响应。其原理是，首先用MessageResource将按钮的文本和ResKey相关联，例如 button.save=保存；然后再复写getKeyMethodMap(), 将ResKey和MethodName对应起来, 例如map.put("button.save", "save"); 其配置方法和DispatchAction是一样的, 使用时要这么写:&lt;BR&gt;             &amp;lt;html:submit property="method"&amp;gt;&lt;BR&gt;             &amp;lt;bean:message key="button.save"/&amp;gt;&lt;BR&gt;             &amp;lt;/html:submit&amp;gt;&lt;BR&gt;             &lt;BR&gt;             3) MappingDispatchAction是1.2新加的, 也继承自DispatchAction. 它实现的功能和上面两个区别较大, 是通过struts-config.xml将多个action-mapping映射到同一个Action类的不同方法上, 典型的配置就是:&lt;BR&gt;             &amp;lt;action-mappings&amp;gt;&lt;BR&gt;             &amp;lt;action path="/saveUser" type="logic.UserAction" parameter="save"&amp;gt;&amp;lt;/action&amp;gt;&lt;BR&gt;             &amp;lt;action path="/editUser" type="logic.UserAction" parameter="edit"&amp;gt;&amp;lt;/action&amp;gt;&lt;BR&gt;             &amp;lt;/action-mappings&amp;gt;&lt;BR&gt;             然后UserAction继承MappingDispatchAction，其中有：&lt;BR&gt;             public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception&lt;BR&gt;             public ActionForward edit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception&lt;BR&gt;             等方法&lt;BR&gt;             &lt;BR&gt;             可以看到, 不管怎么变化, 其实这些类都是把execute给分解开, 不管是save, edit还是其他什么方法, 其实都是和原来的execute是等价的, save和edit之间没有任何直接的关系, 而事实呢，它们是同一个业务模型的两种不同操作。 我觉得这就是一个问题，对于save和edit这两种请求, 我后台逻辑有可能只是调用service的方法那一句不一样，其他代码是完全一致的(例如错误处理, 日志记录等)。因此我想出了这个小东西，在execute方法内部进行局部分解。&lt;BR&gt;             &lt;BR&gt;             上面有人说看iBATIS的代码看到过类似的。的确， iBATIS实现了一个BeanAction，将ActionForm和Acion写到了一个类里，然后通过一个ThreadLocal的局部变量在各个 方法之间传递actionMapping, request, response这些参数。其每个方法的声明变得非常简单，返回的也是字符串forward名。&lt;BR&gt;             &lt;BR&gt;             我在很大程度上是受了Clinton Begin的一些启发，但是BeanAction实现的框架稍微有些大，改写了struts的根本模式。而且作者也说，该框架没有经过实际应用的测试，所以我不想用。&lt;BR&gt;             &lt;BR&gt;             楼顶的帖子我是想说的尽量全面些，所以把service,dao什么的都写进去了。有人说为什么不用setDao, 我不太明白是什么意思。是不是用spring直接注入呢？那样的话，必须用spring的代理，感觉不是很稳定而且大大增加了配置工作。&lt;BR&gt;             有 人说xxxDao是局部变量，线性不安全。我也是想问问这个，象这种DAO和Service类，其本身一旦建立，是不会进行任何修改的（但是因为要从 spring取，所以不能声明为final）。是不是可以理解为提供一些静态方法(例如saveWorld)的工具类呢？这样的话，是不是就不存在线程不 安全的问题了？&lt;BR&gt;             究竟啥是线性不安全啊！！&lt;BR&gt;             &lt;BR&gt;             &lt;BR&gt;             下面是使用这个框架的例子。为了简便，去掉了接口层。BaseAction就不写了&lt;BR&gt;             &lt;BR&gt;             ===================== TestDAO，真正的业务逻辑实现 =============================&lt;BR&gt;             public class TestDAO {&lt;BR&gt;                 public void editWorld() {&lt;BR&gt;                     System.out.println("Editing the world");&lt;BR&gt;                 }&lt;BR&gt;             &lt;BR&gt;                 public void saveWorld() {&lt;BR&gt;                     System.out.println("Saving the world");&lt;BR&gt;                  }&lt;BR&gt;             }&lt;BR&gt;             &lt;BR&gt;             ===================== TestService 业务逻辑的facade, 通过spring将testDao注入 =============================&lt;BR&gt;             public class TestService {&lt;BR&gt;                 private TestDAO testDao;&lt;BR&gt;             &lt;BR&gt;                 public void setTestDao(TestDAO testDao) { this.testDao = testDao; }&lt;BR&gt;             &lt;BR&gt;                 public void editWorldTest() {&lt;BR&gt;                     testDao.editWorld();&lt;BR&gt;                 }&lt;BR&gt;             &lt;BR&gt;                 public void saveWorldTest() {&lt;BR&gt;                     testDao.saveWorld();&lt;BR&gt;                 }&lt;BR&gt;             }&lt;BR&gt;             &lt;BR&gt;             ===================== TestAction =============================&lt;BR&gt;             public class TestAction extends BaseAction {&lt;BR&gt;             &lt;BR&gt;                 private TestService getTestService() { return (TestService) getBean("testService"); };&lt;BR&gt;             &lt;BR&gt;                 public ActionForward execute(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception {&lt;BR&gt;                     TestActionForm form = (TestActionForm) actionForm;&lt;BR&gt;                     ActionErrors errors = new ActionErrors();&lt;BR&gt;             &lt;BR&gt;                     Object[] params={form, request, errors};&lt;BR&gt;             // 上面是关键！Object[]不能设置为对象，因为有可能Test2Action的这一行是{form,request,response,messages,context}。这是这个框架灵活性的体现&lt;BR&gt;                     String forward = dispatchSubAction(form.getMethod(), params, methods);&lt;BR&gt;             // 通过method进行分发, 可以采用其他任何变量&lt;BR&gt;             &lt;BR&gt;                     saveErrors(request, errors);&lt;BR&gt;                     return mapping.findForward(forward);&lt;BR&gt;                 }&lt;BR&gt;             &lt;BR&gt;                 //edit,save等方法的参数要和上面的Object[]相对照&lt;BR&gt;                 public String edit(TestActionForm form, HttpServletRequest request, ActionErrors errors) {&lt;BR&gt;                     log.info("现在是在edit子动作中");&lt;BR&gt;                     getTestService().editWorldTest();&lt;BR&gt;                     return "edit";&lt;BR&gt;                 }&lt;BR&gt;             &lt;BR&gt;                 public String save(TestActionForm form, HttpServletRequest request, ActionErrors errors) {&lt;BR&gt;                     log.info("现在是在save子动作中");&lt;BR&gt;                     getTestService().saveWorldTest();&lt;BR&gt;                     return "save";&lt;BR&gt;                 }&lt;BR&gt;             }&lt;/SPAN&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;/TBODY&gt; &lt;/TABLE&gt; &lt;P ID=TBPingURL&gt; &lt;/P&gt; &lt;P ID=TBPingURL&gt; &lt;/P&gt; &lt;TABLE BGCOLOR=#cccccc BORDER=0 CELLPADDING=4 CELLSPACING=1 WIDTH=100%&gt;   &lt;TBODY&gt;   &lt;TR BGCOLOR=#f7f7f7&gt;     &lt;TD&gt;       &lt;TABLE CELLPADDING=1 CELLSPACING=1 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR&gt;           &lt;TD WIDTH=97%&gt;             &lt;B&gt;Re: 一个关于Struts Action的小框架, 请高手指点一下&lt;/B&gt;           &lt;/TD&gt;           &lt;TD NOWRAP=nowrap WIDTH=1%&gt;             发表: 2005年04月20日 12:06           &lt;/TD&gt;           &lt;TD ALIGN=center NOWRAP=nowrap WIDTH=1%&gt;             &lt;A HREF=http://www.jdon.com/jivejdon/message/messageReplyAction.shtml?parentMessage.messageId=11150110&amp;amp;forum.forumId=16&gt;回复&lt;/A&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;TR BGCOLOR=#f7f7f7&gt;     &lt;TD&gt;       &lt;TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR&gt;           &lt;TD&gt;             &lt;A HREF=http://www.jdon.com/jivejdon/profile.jsp?user=47829&gt;&lt;B&gt;warbaby&lt;/B&gt;&lt;/A&gt; &lt;A HREF=http://www.jdon.com/jivejdon/query/threadViewQuery.shtml?queryType=userMessageQueryAction&amp;amp;user=47829 TARGET=_blank&gt;发表文章: 11&lt;/A&gt;/ 注册时间: 2005年01月29日 18:24           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;TR BGCOLOR=#f7f7f7&gt;     &lt;TD COLSPAN=4 VALIGN=top WIDTH=99%&gt;       &lt;TABLE BORDER=0 CELLPADDING=2 CELLSPACING=2 STYLE=table-layout:fixed WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR&gt;           &lt;TD STYLE=""&gt;             &lt;SPAN CLASS=tpc_content&gt; 中间格式有点问题：重发前边几段&lt;BR&gt;             &lt;BR&gt;             不知道有没有人在实际中使用过struts的DispatchAction系列? 谁又能给我明白的讲讲DispatchAction, LookupDispatchAction, MappingDispatchAction各自的用法和区别呢？&lt;BR&gt;             &lt;BR&gt;             1) DispatchAction就是在struts-config中用parameter参数配置一个表单字段名,这个字段的值就是最终替代execute 被调用的方法. 例如parameter="method"而request.getParameter("method")="save"，其中"save"就是 MethodName。struts的请求将根据parameter被分发到"save"或者"edit"或者什么。但是有一点，save()或者 edit()等方法的声明和execute必须一模一样。&lt;BR&gt;             &lt;BR&gt;             2) LookupDispatchAction继承DispatchAction, 用于对同一个页面上的多个submit按钮进行不同的响应。其原理是，首先用MessageResource将按钮的文本和ResKey相关联，例如 button.save=保存；然后再复写getKeyMethodMap(), 将ResKey和MethodName对应起来, 例如map.put("button.save", "save"); 其配置方法和DispatchAction是一样的, 使用时要这么写:&lt;BR&gt;             &amp;lt;html:submit property="method"&amp;gt;&lt;BR&gt;               &amp;lt;bean:message key="button.save"/&amp;gt;&lt;BR&gt;             &amp;lt;/html:submit&amp;gt;&lt;BR&gt;             &lt;BR&gt;             3) MappingDispatchAction是1.2新加的, 也继承自DispatchAction. 它实现的功能和上面两个区别较大, 是通过struts-config.xml将多个action-mapping映射到同一个Action类的不同方法上, 典型的配置就是:&lt;BR&gt;             &amp;lt;action-mappings&amp;gt;&lt;BR&gt;               &amp;lt;action path="/saveUser" type="logic.UserAction" parameter="save"&amp;gt;&amp;lt;/action&amp;gt;&lt;BR&gt;               &amp;lt;action path="/editUser" type="logic.UserAction" parameter="edit"&amp;gt;&amp;lt;/action&amp;gt;&lt;BR&gt;             &amp;lt;/action-mappings&amp;gt;&lt;BR&gt;             然后UserAction继承MappingDispatchAction，其中有：&lt;BR&gt;             public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception&lt;BR&gt;             public ActionForward edit(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception&lt;BR&gt;             等方法&lt;BR&gt;             &lt;BR&gt;             可以看到, 不管怎么变化, 其实这些类都是把execute给分解开, 不管是save, edit还是其他什么方法, 其实都是和原来的execute是等价的, save和edit之间没有任何直接的关系, 而事实呢，它们是同一个业务模型的两种不同操作。 我觉得这就是一个问题，对于save和edit这两种请求, 我后台逻辑有可能只是调用service的方法那一句不一样，其他代码是完全一致的(例如错误处理, 日志记录等)。因此我想出了这个小东西，在execute方法内部进行局部分解。 &lt;/SPAN&gt;             &lt;P&gt;             &lt;/P&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;/TBODY&gt; &lt;/TABLE&gt; &lt;A NAME=11150952&gt;&lt;/A&gt; &lt;TABLE ALIGN=center BGCOLOR=#cccccc BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;   &lt;TBODY&gt;   &lt;TR&gt;     &lt;TD&gt;       &lt;TABLE BGCOLOR=#cccccc BORDER=0 CELLPADDING=4 CELLSPACING=1 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD&gt;             &lt;TABLE CELLPADDING=1 CELLSPACING=1 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD WIDTH=97%&gt;                   &lt;B&gt;Re: 一个关于Struts Action的小框架, 请高手指点一下&lt;/B&gt;                 &lt;/TD&gt;                 &lt;TD NOWRAP=nowrap WIDTH=1%&gt;                   发表: 2005年04月20日 12:26                 &lt;/TD&gt;                 &lt;TD ALIGN=center NOWRAP=nowrap WIDTH=1%&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/message/messageReplyAction.shtml?parentMessage.messageId=11150952&amp;amp;forum.forumId=16&gt;回复&lt;/A&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD&gt;             &lt;TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/profile.jsp?user=47829&gt;&lt;B&gt;warbaby&lt;/B&gt;&lt;/A&gt; &lt;A HREF=http://www.jdon.com/jivejdon/query/threadViewQuery.shtml?queryType=userMessageQueryAction&amp;amp;user=47829 TARGET=_blank&gt;发表文章: 11&lt;/A&gt;/ 注册时间: 2005年01月29日 18:24                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD COLSPAN=4 VALIGN=top WIDTH=99%&gt;             &lt;TABLE BORDER=0 CELLPADDING=2 CELLSPACING=2 STYLE=table-layout:fixed WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD STYLE=""&gt;                   &lt;SPAN CLASS=tpc_content&gt; 可能还是有些地方没说明白。&lt;BR&gt;                   TestAction的配置和普通Action的配置完全一样。&lt;BR&gt;                   TestActionForm里面有一个method属性。&lt;BR&gt;                   运行结果:&lt;BR&gt;                   http://localhost/webapp/test.do?method=save&lt;BR&gt;                   在后台显示Saving the world.&lt;BR&gt;                   http://localhost/webapp/test.do?method=edit&lt;BR&gt;                   在后台显示Editing the world.&lt;BR&gt;                   &lt;BR&gt;                   banq说关键是edit,save等methods是如何激活的。就是这句：&lt;BR&gt;                   dispatchSubAction(form.getMethod(), params, methods);&lt;BR&gt;                   根据请求的method值，从methods中选择一个java.lang.Method类，以params为参数调用。&lt;BR&gt;                   &lt;BR&gt;                   这句是老版本，该贴发出后，经过优化，这里不需要使用methods来调用了。dispatchSubAction(form.getMethod(), params);就行了。在BaseAction里有一句&lt;BR&gt;                   protected Map methods = getMethodMap();&lt;BR&gt;                   在struts 初始化Action时，反射一次得到本Action的所有save,edit等等方法，Map里保存的是java.lang.Method，这样以后调用 应该能快些。子类中根本不需要看不到这一过程了，只要知道dispatchSubAction的第一个参数是方法名，第二个参数是调用方法的参数对象数组 即可。&lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;/SPAN&gt;                   &lt;P&gt;                   &lt;/P&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;/TBODY&gt; &lt;/TABLE&gt; &lt;A NAME=11652933&gt;&lt;/A&gt; &lt;TABLE ALIGN=center BGCOLOR=#cccccc BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;   &lt;TBODY&gt;   &lt;TR&gt;     &lt;TD&gt;       &lt;TABLE BGCOLOR=#cccccc BORDER=0 CELLPADDING=4 CELLSPACING=1 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD&gt;             &lt;TABLE CELLPADDING=1 CELLSPACING=1 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD WIDTH=97%&gt;                   &lt;B&gt;Re: 一个关于Struts Action的小框架, 请高手指点一下&lt;/B&gt;                 &lt;/TD&gt;                 &lt;TD NOWRAP=nowrap WIDTH=1%&gt;                   发表: 2005年05月14日 10:34                 &lt;/TD&gt;                 &lt;TD ALIGN=center NOWRAP=nowrap WIDTH=1%&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/message/messageReplyAction.shtml?parentMessage.messageId=11652933&amp;amp;forum.forumId=16&gt;回复&lt;/A&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD&gt;             &lt;TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/profile.jsp?user=2&gt;&lt;B&gt;banq&lt;/B&gt;&lt;/A&gt; &lt;A HREF=http://www.jdon.com/jivejdon/query/threadViewQuery.shtml?queryType=userMessageQueryAction&amp;amp;user=2 TARGET=_blank&gt;发表文章: 8120&lt;/A&gt;/ 注册时间: 2002年08月03日 17:08                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#f7f7f7&gt;           &lt;TD COLSPAN=4 VALIGN=top WIDTH=99%&gt;             &lt;TABLE BORDER=0 CELLPADDING=2 CELLSPACING=2 STYLE=table-layout:fixed WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD STYLE=""&gt;                   &lt;SPAN CLASS=tpc_content&gt; &amp;gt;反射一次得到本Action的所有save,edit等等方法，Map里保存的是java.lang.Method&lt;BR&gt;                   &lt;BR&gt;                   最好不用用反射，反射是耗费性能的，或者使用缓存优化一下。 &lt;/SPAN&gt;                   &lt;P&gt;                   &lt;/P&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;/TBODY&gt; &lt;/TABLE&gt; &lt;A NAME=13158302&gt;&lt;/A&gt; &lt;TABLE ALIGN=center BGCOLOR=#cccccc BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;   &lt;TBODY&gt;   &lt;TR&gt;     &lt;TD&gt;       &lt;TABLE BGCOLOR=#cccccc BORDER=0 CELLPADDING=4 CELLSPACING=1 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD&gt;             &lt;TABLE CELLPADDING=1 CELLSPACING=1 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD WIDTH=97%&gt;                   &lt;B&gt;Re: 一个关于Struts Action的小框架, 请高手指点一下&lt;/B&gt;                 &lt;/TD&gt;                 &lt;TD NOWRAP=nowrap WIDTH=1%&gt;                   发表: 2005年09月06日 10:04                 &lt;/TD&gt;                 &lt;TD ALIGN=center NOWRAP=nowrap WIDTH=1%&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/message/messageReplyAction.shtml?parentMessage.messageId=13158302&amp;amp;forum.forumId=16&gt;回复&lt;/A&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD&gt;             &lt;TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD&gt;                   &lt;A HREF=http://www.jdon.com/jivejdon/profile.jsp?user=12552&gt;&lt;B&gt;james_cn&lt;/B&gt;&lt;/A&gt; &lt;A HREF=http://www.jdon.com/jivejdon/query/threadViewQuery.shtml?queryType=userMessageQueryAction&amp;amp;user=12552 TARGET=_blank&gt;发表文章: 24&lt;/A&gt;/ 注册时间: 2003年11月11日 21:04                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;TR BGCOLOR=#eae9ea&gt;           &lt;TD COLSPAN=4 VALIGN=top WIDTH=99%&gt;             &lt;TABLE BORDER=0 CELLPADDING=2 CELLSPACING=2 STYLE=table-layout:fixed WIDTH=100%&gt;               &lt;TBODY&gt;               &lt;TR&gt;                 &lt;TD STYLE=""&gt;                   &lt;SPAN CLASS=tpc_content&gt; //dongqi_zhao@hotmail.com&lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   PublicForm继承自ActionForm，实现了当前登陆用户的统一获取（getUserId()），分页显示参数的统一传递(getStart(),getRange())，功能扩展参数（getDoType()）。&lt;BR&gt;                   &lt;BR&gt;                   PublicAction继承自Action，附加权限的判别，异常处理，日志纪录等功能&lt;BR&gt;                   e.g.&lt;BR&gt;                   &amp;lt;action name="stuentForm" type="com.virtual.test.action.StuentAddAction" scope="request" path="/test/stuentAddAction"&amp;gt;&lt;BR&gt;                   &amp;lt;forward name="list" path="/test/stuentListAction.do?doType=0" /&amp;gt;&lt;BR&gt;                   &amp;lt;forward name="add" path="/test/stuentAdd.jsp" /&amp;gt;&lt;BR&gt;                   &amp;lt;forward name="resource" path="2004105001002" /&amp;gt;&lt;BR&gt;                   &amp;lt;forward name="operator" path="201" /&amp;gt;&lt;BR&gt;                   &amp;lt;/action&amp;gt;&lt;BR&gt;                   通过resource，operator获取当前的资源，操作，进而进行权限鉴别&lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   package org.open.struts;&lt;BR&gt;                   &lt;BR&gt;                   import javax.servlet.http.*;&lt;BR&gt;                   &lt;BR&gt;                   import org.apache.struts.action.*;&lt;BR&gt;                   import org.open.util.*;&lt;BR&gt;                   &lt;BR&gt;                   /**&lt;BR&gt;                   * 所有actionForm的父类，提供登陆用户的统一获取，&lt;BR&gt;                   * 分页参数的统一传递 *&lt;BR&gt;                   *&lt;BR&gt;                   */&lt;BR&gt;                   public class PublicForm&lt;BR&gt;                   extends ActionForm {&lt;BR&gt;                   /**&lt;BR&gt;                   * 功能扩展用&lt;BR&gt;                   */&lt;BR&gt;                   private int doType;&lt;BR&gt;                   /**&lt;BR&gt;                   * 当前用户id&lt;BR&gt;                   */&lt;BR&gt;                   private String userId;&lt;BR&gt;                   /**&lt;BR&gt;                   * 开始记录数，分页用，从0开始&lt;BR&gt;                   */&lt;BR&gt;                   private int start = 0;&lt;BR&gt;                   /**&lt;BR&gt;                   * 每页的记录数，&lt;BR&gt;                   */&lt;BR&gt;                   private int range = 20;&lt;BR&gt;                   &lt;BR&gt;                   public int getDoType() {&lt;BR&gt;                   return doType;&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   public void setDoType(int doType) {&lt;BR&gt;                   this.doType = doType;&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   public ActionErrors validate(ActionMapping actionMapping,&lt;BR&gt;                   HttpServletRequest httpServletRequest) {&lt;BR&gt;                   &lt;BR&gt;                   return null;&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   public void reset(ActionMapping actionMapping,&lt;BR&gt;                   HttpServletRequest httpServletRequest) {&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   /**&lt;BR&gt;                   * 获取公共信息，userID.....&lt;BR&gt;                   */&lt;BR&gt;                   public void getCurrentDefine(ActionMapping actionMapping,&lt;BR&gt;                   HttpServletRequest httpServletRequest) {&lt;BR&gt;                   &lt;BR&gt;                   userId = PublicAction.LOGIN_NA;&lt;BR&gt;                   Cookie cookie = CookieMgr.getCookie(httpServletRequest,&lt;BR&gt;                   PublicAction.LOGIN_ACCOUNT_COOKIE);&lt;BR&gt;                   if (cookie != null) {&lt;BR&gt;                   userId = cookie.getValue();&lt;BR&gt;                   }&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   public String getUserId() {&lt;BR&gt;                   return userId;&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   public void setUserId(String userId) {&lt;BR&gt;                   this.userId = userId;&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   public int getStart() {&lt;BR&gt;                   return start;&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   public void setStart(int start) {&lt;BR&gt;                   this.start = start;&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   public int getRange() {&lt;BR&gt;                   return range;&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   public void setRange(int range) {&lt;BR&gt;                   this.range = range;&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   package org.open.struts;&lt;BR&gt;                   &lt;BR&gt;                   import java.util.logging.*;&lt;BR&gt;                   import javax.servlet.http.*;&lt;BR&gt;                   &lt;BR&gt;                   import org.apache.struts.action.*;&lt;BR&gt;                   import org.open.common.auth.logic.*;&lt;BR&gt;                   import org.open.common.log.logic.*;&lt;BR&gt;                   &lt;BR&gt;                   /**&lt;BR&gt;                   * 作为所有业务Action的父类，提供权限统一判别，异常集中处理&lt;BR&gt;                   *&lt;BR&gt;                   */&lt;BR&gt;                   public class PublicAction&lt;BR&gt;                   extends Action {&lt;BR&gt;                   &lt;BR&gt;                   /**&lt;BR&gt;                   * java logger interface&lt;BR&gt;                   */&lt;BR&gt;                   private Logger logger;&lt;BR&gt;                   /**&lt;BR&gt;                   * debug point&lt;BR&gt;                   */&lt;BR&gt;                   private String debugPoint;&lt;BR&gt;                   /**&lt;BR&gt;                   * 系统异常，置于request中的属性名&lt;BR&gt;                   */&lt;BR&gt;                   public static final String SYS_EXCEPTION = "sys.exception";&lt;BR&gt;                   &lt;BR&gt;                   /**&lt;BR&gt;                   * 系统信息提示，置于reqeust中的属性名&lt;BR&gt;                   */&lt;BR&gt;                   public static final String SYS_MESG = "sys.mesg";&lt;BR&gt;                   /**&lt;BR&gt;                   * 系统登陆页面的forward名称&lt;BR&gt;                   */&lt;BR&gt;                   public static final String F_LOGIN = "login";&lt;BR&gt;                   /**&lt;BR&gt;                   * 系统登陆错误的forward名称&lt;BR&gt;                   */&lt;BR&gt;                   public static final String F_LOGIN_NO = "login.no";&lt;BR&gt;                   &lt;BR&gt;                   /**&lt;BR&gt;                   * 系统登陆成功页面的forward名称&lt;BR&gt;                   */&lt;BR&gt;                   public static final String F_LOGIN_YES = "login.yes";&lt;BR&gt;                   &lt;BR&gt;                   /**&lt;BR&gt;                   * 系统登出成功页面的forward名称&lt;BR&gt;                   */&lt;BR&gt;                   public static final String F_LOGOUT = "logout";&lt;BR&gt;                   &lt;BR&gt;                   //系统异常的forward名称&lt;BR&gt;                   public static final String F_ERROR = "error";&lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   /**&lt;BR&gt;                   * 当前用户置于session中的属性名&lt;BR&gt;                   */&lt;BR&gt;                   public static final String LOGIN_ACCOUNT = "sys.account";&lt;BR&gt;                   /**&lt;BR&gt;                   * 当前用户置于COOKIE中的属性名&lt;BR&gt;                   */&lt;BR&gt;                   public static final String LOGIN_ACCOUNT_COOKIE = "sys.account";&lt;BR&gt;                   /**&lt;BR&gt;                   * 未登陆时得到用户id&lt;BR&gt;                   */&lt;BR&gt;                   public static final String LOGIN_NA = Auth.ACCOUNT_NA;&lt;BR&gt;                   &lt;BR&gt;                   /**&lt;BR&gt;                   * 执行成功&lt;BR&gt;                   */&lt;BR&gt;                   public static final String EXECUTE_OK = "1";&lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   &lt;BR&gt;                   /**&lt;BR&gt;                   * Action的入口方法&lt;BR&gt;                   */&lt;BR&gt;                   public ActionForward execute(ActionMapping actionMapping,&lt;BR&gt;                   ActionForm actionForm,&lt;BR&gt;                   HttpServletRequest httpServletRequest,&lt;BR&gt;                   HttpServletResponse httpServletResponse) {&lt;BR&gt;                   &lt;BR&gt;                   ActionForward af = null;&lt;BR&gt;                   PublicForm form = new PublicForm();&lt;BR&gt;                   try {&lt;BR&gt;                   //所有actionForm必须继承自 PublicForm&lt;BR&gt;                   &lt;BR&gt;                   form = (PublicForm) actionForm;&lt;BR&gt;                   &lt;BR&gt;                   //统一获取userId等公共信息&lt;BR&gt;                   form.getCurrentDefine(actionMapping, httpServletRequest);&lt;BR&gt;                   &lt;BR&gt;                   //获取当前资源代码&lt;BR&gt;                   String currentResource = "-1";&lt;BR&gt;                   try {&lt;BR&gt;                   currentResource = actionMapping.findForward("resource").getPath();&lt;BR&gt;                   }&lt;BR&gt;                   catch (Exception ex4) {&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   //获取当前操作代码&lt;BR&gt;                   String operator = "-1";&lt;BR&gt;                   try {&lt;BR&gt;                   operator = actionMapping.findForward("operator").getPath();&lt;BR&gt;                   }&lt;BR&gt;                   catch (Exception ex3) {&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   //获取当前是否进行权限判别的标志&lt;BR&gt;                   String identify = "false";&lt;BR&gt;                   try {&lt;BR&gt;                   identify = actionMapping.findForward("identify").getPath();&lt;BR&gt;                   }&lt;BR&gt;                   catch (Exception ex2) {&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   String userId = form.getUserId();&lt;BR&gt;                   &lt;BR&gt;                   //需要判别&lt;BR&gt;                   if (!identify.equalsIgnoreCase("false")) {&lt;BR&gt;                   &lt;BR&gt;                   // if (userId.equalsIgnoreCase(LOGIN_NA)) {&lt;BR&gt;                   // httpServletResponse.sendRedirect("/error/error.jsp?errCode=1");&lt;BR&gt;                   // }&lt;BR&gt;                   &lt;BR&gt;                   this.setDebugPoint("权限鉴别...");&lt;BR&gt;                   boolean flag = Auth.checkPrivilegeBySession(userId, currentResource,&lt;BR&gt;                   operator, httpServletRequest.getSession());&lt;BR&gt;                   &lt;BR&gt;                   if (!flag) {&lt;BR&gt;                   throw new Exception("当前用户(" + userId + ")没有相应的权限：" +&lt;BR&gt;                   currentResource + "@" + operator);&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   }&lt;BR&gt;                   this.setDebugPoint("逻辑执行...");&lt;BR&gt;                   af = performLogic(actionMapping, actionForm, httpServletRequest,&lt;BR&gt;                   httpServletResponse);&lt;BR&gt;                   this.setDebugPoint("逻辑执行结束.");&lt;BR&gt;                   }&lt;BR&gt;                   catch (Exception ex) {&lt;BR&gt;                   httpServletRequest.setAttribute(SYS_EXCEPTION, ex);&lt;BR&gt;                   httpServletRequest.setAttribute(SYS_MESG, ex);&lt;BR&gt;                   getLogger().log(Level.SEVERE, getDebugPoint(), ex);&lt;BR&gt;                   &lt;BR&gt;                   try {&lt;BR&gt;                   LogItemMaster.create(null, ex.getMessage(), ex + "n" + getDebugPoint(),&lt;BR&gt;                   LogItemMaster.LEVEL_WARNING,&lt;BR&gt;                   "SYSTEM", form.getUserId(), new java.util.Date());&lt;BR&gt;                   }&lt;BR&gt;                   catch (Exception ex1) {&lt;BR&gt;                   System.out.println(" LogItemMaster.create():" + ex1);&lt;BR&gt;                   }&lt;BR&gt;                   return actionMapping.findForward(F_ERROR);&lt;BR&gt;                   }&lt;BR&gt;                   return af;&lt;BR&gt;                   &lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   /**&lt;BR&gt;                   * 业务逻辑调用，所有子类必须实现此方法&lt;BR&gt;                   */&lt;BR&gt;                   public ActionForward performLogic(ActionMapping actionMapping,&lt;BR&gt;                   ActionForm actionForm,&lt;BR&gt;                   HttpServletRequest httpServletRequest,&lt;BR&gt;                   HttpServletResponse httpServletResponse) throws&lt;BR&gt;                   Exception&lt;BR&gt;                   &lt;BR&gt;                   {&lt;BR&gt;                   return null;&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   /**&lt;BR&gt;                   *&lt;BR&gt;                   */&lt;BR&gt;                   public java.util.logging.Logger getLogger() {&lt;BR&gt;                   if (logger == null) {&lt;BR&gt;                   logger = Logger.getLogger(this.getClass().getName());&lt;BR&gt;                   }&lt;BR&gt;                   return logger;&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   public String getDebugPoint() {&lt;BR&gt;                   return this.getClass().getName() + " -&amp;gt;_debug_Point: " +&lt;BR&gt;                   debugPoint;&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   public void setDebugPoint(String debugPoint) {&lt;BR&gt;                   this.debugPoint = debugPoint;&lt;BR&gt;                   }&lt;BR&gt;                   &lt;BR&gt;                   } &lt;/SPAN&gt;                   &lt;P&gt;                   &lt;/P&gt;                 &lt;/TD&gt;               &lt;/TR&gt;               &lt;/TBODY&gt;             &lt;/TABLE&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;/TBODY&gt; &lt;/TABLE&gt; &lt;TABLE ALIGN=center BGCOLOR=#cccccc BORDER=0 CELLPADDING=1 CELLSPACING=0 WIDTH=100%&gt;   &lt;TBODY&gt;   &lt;TR&gt;     &lt;TD&gt;       &lt;TABLE ALIGN=center BGCOLOR=#ffffff BORDER=0 CELLPADDING=3 CELLSPACING=0 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR&gt;           &lt;TD&gt;             这个主题有 &lt;B&gt;14&lt;/B&gt; 回复 ／ &lt;B&gt;1&lt;/B&gt; 页 [ ]           &lt;/TD&gt;           &lt;TD&gt;             &lt;BR&gt;           &lt;/TD&gt;           &lt;TD&gt;             &lt;BR&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;   &lt;/TR&gt;   &lt;/TBODY&gt; &lt;/TABLE&gt; &lt;TABLE ALIGN=center BORDER=0 CELLPADDING=0 CELLSPACING=2 WIDTH=100%&gt;   &lt;TBODY&gt;   &lt;TR&gt;     &lt;TD NOWRAP=nowrap VALIGN=top WIDTH=1%&gt;             &lt;/TD&gt;     &lt;TD ALIGN=center WIDTH=98%&gt;       &lt;TABLE BORDER=0 CELLPADDING=0 CELLSPACING=2 WIDTH=100%&gt;         &lt;TBODY&gt;         &lt;TR&gt;           &lt;TD&gt;             上一篇: &lt;A CLASS=forum HREF=http://www.jdon.com/jivejdon/thread/22402.html TITLE=jbuilder2005生成安装文件&gt; jbuilder2005生成安装文件 &lt;/A&gt;           &lt;/TD&gt;           &lt;TD ALIGN=right&gt;             下一篇: &lt;A CLASS=forum HREF=http://www.jdon.com/jivejdon/thread/22474.html TITLE=在hibernate中复杂的检索策略让我头痛，&gt; 在hibernate中复杂的检索策略让我.. &lt;/A&gt;           &lt;/TD&gt;         &lt;/TR&gt;         &lt;/TBODY&gt;       &lt;/TABLE&gt;     &lt;/TD&gt;     &lt;TD NOWRAP=nowrap VALIGN=top WIDTH=1%&gt;             &lt;/TD&gt;   &lt;/TR&gt;   &lt;/TBODY&gt; &lt;/TABLE&gt; &lt;CENTER&gt; &lt;/CENTER&gt; &lt;CENTER&gt; &lt;/CENTER&gt; &lt;P ID=TBPingURL&gt; &lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3979145966556781804-9052640132058425979?l=tomorrowwd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tomorrowwd.blogspot.com/feeds/9052640132058425979/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3979145966556781804&amp;postID=9052640132058425979' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/9052640132058425979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3979145966556781804/posts/default/9052640132058425979'/><link rel='alternate' type='text/html' href='http://tomorrowwd.blogspot.com/2007/08/strutsspringjdbc-strutsspringjdbcspring.html' title=''/><author><name>heimazhao</name><uri>http://www.blogger.com/profile/07472050640918708497</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3979145966556781804.post-6500738127897852916</id><published>2007-07-16T17:21:00.000-07:00</published><updated>2008-10-29T22:06:08.373-07:00</updated><title type='text'></title><content type='html'>  Java Collections&lt;br&gt; &lt;p&gt;   As Jason Bell pointed out in his editorial "A Modern Day Cinderella" (&lt;em&gt;JDJ&lt;/em&gt;, Vol. 8, issue 9), the spotlight is on J2EE and as a result many programmers are ignoring the foundation of the JDK. J2SE is the Java equivalent of C/C++ standard libraries. Here we deal with the lower-level entities, like the Number types, Integer, Long, Float, and Double. &lt;/p&gt; &lt;p&gt;   The Java Collections Framework (JCF) should be your first choice when faced with the task of managing any type of collection. The Collections API is one of the most useful parts of the JDK. Looking back at the projects I've worked on over the past 13 years, to some degree all of them involved managing collections of data structures. &lt;/p&gt; &lt;p&gt;   In this article I'll review the collections architecture. I'll also point out some of the useful features of the collections API (sorting and searching). To begin I'll go over the class categories, followed by a more detailed explanation of each. I encourage you to review Sun's documentation at &lt;a href="http://java.sun.com/products/jdk/1.2/docs/guide/collections/reference.html" target="new"&gt;http://java.sun.com/products/jdk/1.2/docs/guide/collections/reference.html&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;   There are explicit class categories in the Collections Framework. The J2SE Collections Framework consists of interfaces, abstract base classes, and concrete implementations that provide a rich set of functionality for us. The implementations are the classes your application should be utilizing behind the scenes. There are implementations based on maps and others that are backed by arrays. You can make your collection read-only or you can add support for multithreaded access. How is a programmer to decide which entity to use? There are two main criteria: thread safety and usage semantics. &lt;/p&gt; &lt;p&gt;   Usage semantics can be further broken down into collection- or map-based access. The library makes a distinction. The Map interface is not related to any of the Collection interfaces, because its main purpose in life is to map a key to an object, while the collection is just a loosely associated group of objects. &lt;/p&gt; &lt;p&gt;   &lt;strong&gt;Interfaces&lt;/strong&gt;&lt;br&gt;   Figure 1 provides a class diagram showing the interfaces that make up the Collections API. The interfaces represent the ideal types you should be passing around in your application. &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;    &lt;img alt="" src="http://photos.sys-con.com/story/res/43554/fig1.jpg" border="0" hspace="0"&gt; &lt;/div&gt; &lt;p&gt;   I strongly urge you to expose only the interfaces to clients of your classes. If you don't do this and instead pass around references to the concrete implementations, your code will become brittle due to the number of changes required to swap out one interface implementation for another. You should strive to expose the most general interface. For example, if a method is to return an ArrayList, first look and see if the methods exposed by the Collection interface will meet the needs of the intended usage (see Table 1). By doing this, you give yourself the opportunity to modify your method to return a LinkedList or any other type supporting the Collection interface. Who knows? You may even want to provide your own implementation of a Balanced Tree, and if you are instantiating and passing around references to a TreeMap, you'll have to alter the code at each reference. &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;    &lt;img alt="" src="http://photos.sys-con.com/story/res/43554/tab1.jpg" border="0" hspace="0"&gt; &lt;/div&gt; &lt;p&gt;   &lt;em&gt;Sets&lt;/em&gt;&lt;br&gt;   The semantics of Sets are close to those of Lists. However, Sets lack the notion of direct random access. A Set is just a collection of objects that you may iterate over. A useful feature of Sets is that they do not allow duplicates as long as you override hashCode() and equals() from Object. Listings 1-3 provide a short program that will illustrate this effect. There is the main HashSetExample and two Person classes: one that does not override Object.equals()/hashCode() and one that does. &lt;/p&gt; &lt;p&gt;   Running this program produces the follow output. &lt;/p&gt; &lt;p&gt;   &lt;font color="#800000"&gt;[000-11-1111, 222-23-1234, 000-11-1111]&lt;br&gt;   [000-11-1111, 222-23-1234] &lt;/font&gt; &lt;/p&gt; &lt;p&gt;   To remove duplicates your classes must override equals() from java.lang.Object. According to the Javadoc, overriding Object.hashCode() has more to do with performance. Interestingly, Sun's "Introduction to the Collections Framework Short Course" mentions overriding only the Object.hashCode(). Beware that if you follow the tutorial to the letter, you'll still have duplicate entries. You must override Object.equals(), as I've done in Listing 2, to prevent duplicates in your Sets. &lt;/p&gt; &lt;p&gt;   How about sorting this list? TreeSet can do that for us, but we still have a choice to make. Will we be sorting by the natural order or do we want an ad hoc sort? For this article we'll examine the ad hoc sort (to implement your own natural order, your class should implement the Comparable interface). We can achieve an arbitrary sort order by utilizing the Comparator interface. When we employ a comparator, it's passed to the sorting object. First, we need to create our sorting algorithm (see Listing 4). &lt;/p&gt; &lt;p&gt;   Now we can give this algorithm to the other implementation of Set; TreeSet. We add the following code to our main method at line 29 in Listing 4. &lt;/p&gt; &lt;p&gt;   &lt;font color="#800000"&gt;29&lt;br&gt;   30 Set sortedSet =&lt;br&gt;   31 new TreeSet&lt;br&gt;   32 (new PersonComparator());&lt;br&gt;   33&lt;br&gt;   34 sortedSet.addAll(set);&lt;br&gt;   35&lt;br&gt;   36 // sorted&lt;br&gt;   37 System.out.println(sortedSet); &lt;/font&gt; &lt;/p&gt; &lt;p&gt;   Now the output becomes: &lt;/p&gt; &lt;p&gt;   &lt;font color="#800000"&gt;[000-11-1111, 222-23-1234, 000-11-1111]&lt;br&gt;   [000-11-1111, 222-23-1234]&lt;br&gt;   [222-23-1234, 000-11-1111] &lt;/font&gt; &lt;/p&gt; &lt;p&gt;   Cool, eh? I won't go over this for each implementation. You should be able to apply this concept to any of the other sorting containers or utility methods (from Arrays or Collections). It's worth pointing out that even if you don't override either method, the TreeSet will use the Comparator and eliminate duplicates in the sorted set. Figure 2 provides a class diagram for the Set category. &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;    &lt;img alt="" src="http://photos.sys-con.com/story/res/43554/fig2.jpg" border="0" hspace="0"&gt; &lt;/div&gt; &lt;p&gt;   The LinkedHashSet is a special implementation of HashSet that supports list operations without directly implementing the List interface. LinkedHashSet will maintain the insertion order of the list elements, yet still allow you to access elements via a key, such as a traditional Map. And, as the name implies, it is a Set that supports all of Set's operations. &lt;/p&gt; &lt;p&gt;   &lt;em&gt;Lists&lt;/em&gt;&lt;br&gt;   Collection's other category is List; the implementations are ArrayList and LinkedList (see Figure 3). &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;    &lt;img alt="" src="http://photos.sys-con.com/story/res/43554/fig3.jpg" border="0" hspace="0"&gt; &lt;/div&gt; &lt;p&gt;   The List interface supports the notion of direct index-based access to the entries, allows duplicates, and defines an order. Direct index-based access is realized via the get(int) method, which accepts an index as the only argument. You may even acquire a subset of the List by specifying a "from index" and a "to index", the semantics of which closely follow that of String. The element at "from index" will be included in the sublist while the element at "to index" will not. &lt;/p&gt; &lt;p&gt;   ArrayList should be preferred if you don't require the ability to insert elements into the middle of the List (you're always adding to the end of the List) and you require random access to the elements. However, if you need to insert elements into the List and sequential access is your main concern, then LinkedList will be better. &lt;/p&gt; &lt;p&gt;   &lt;strong&gt;Maps&lt;/strong&gt;&lt;br&gt;   Finally, we get to the Map category (see Figure 4). As mentioned earlier, Map is not related to any of the Collection classes. This is because the JCF authors wanted to make a clear distinction between Collections and Maps. The most notable difference is that Maps do not support index-based access semantics. What is the nth element of a Map? &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;    &lt;img alt="" src="http://photos.sys-con.com/story/res/43554/fig4.jpg" border="0" hspace="0"&gt; &lt;/div&gt; &lt;p&gt;   If a Map is a Collection, what are the elements? The only reasonable answer is "Key-value pairs," but this provides a very limited (and not particularly useful) Map abstraction. You can't ask what value a given key maps to, nor can you delete the entry for a given key without knowing what value it maps to. &lt;/p&gt; &lt;p&gt;   The workhorse of this category is HashMap. For inserting, deleting, and accessing elements, HashMap offers the best implementation. TreeMap is the sorted version and offers the ability to traverse the contents of the Map in a determined order. &lt;/p&gt; &lt;p&gt;   As with the HashSet earlier, HashMap will require you to override Object.equals() and have a defined Object.hashCode() implementation on your own classes. And, of course, the objects you place in TreeMap should be comparable [or you must use the TreeMap(Comparator) constructor]. &lt;/p&gt; &lt;p&gt;   As with Sets, there's a special implementation of Map that supports a List-like view. LinkedHashMap provides for the same deterministic ordering as LinkedHashSet and supports all Map operations. &lt;/p&gt; &lt;p&gt;   There's a another specialized implementation of Map, WeakHashMap, that uses weak references. By employing WeakReference, the garbage collector is able to destroy objects despite the Map's reference. If no other thread holds a reference to a key in the WeakHashMap, the garbage collector is free to collect the key-value pair. &lt;/p&gt; &lt;p&gt;   &lt;strong&gt;Abstractions&lt;/strong&gt;&lt;br&gt;   The framework offers several opportunities for creating your own collection classes. The abstractions are for those instances where you want a more application-specific collection. There are several abstract classes implementing the interfaces with enough basic functionality to make your task less painful (see Figure 5). &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;    &lt;img alt="" src="http://photos.sys-con.com/story/res/43554/fig5.jpg" border="0" hspace="0"&gt; &lt;/div&gt; &lt;p&gt;   In general, you won't be extending these classes unless you want to try some new algorithm or storage technique. Most likely you should turn your attention to the wrapper classes as implemented by the Collections class. Using the Decorator pattern, as these classes do, you may create highly specialized versions of the containers. There's an excellent example in the group of classes created by Piet Jonas for detecting type errors. Using Piet's classes, it's possible to have an exception thrown if an incorrect type is inserted into a collection. These classes employ the exact same design as the specialized wrappers available in the synchronization and read-only methods that I'll discuss next. &lt;/p&gt; &lt;p&gt;   &lt;strong&gt;java.util.Collections API&lt;/strong&gt;&lt;br&gt;   Did you know that many of the Vector's methods are declared with the synchronized modifier? Are you aware of the cost of synchronization? While there have been advancements in many JVMs, there is still a slight overhead incurred with synchronization. &lt;/p&gt; &lt;p&gt;   Unless several different threads might access your collection, forget about any of the thread-safe implementations. Use one of the nonthread-safe implementations, like ArrayList or HashMap. If you need index-based access, use the ArrayList. If you are more concerned about key-based access, use the HashMap. &lt;/p&gt; &lt;p&gt;   While I may mention Vector and Hashtable from time to time, you should be aware that these two classes are now referred to as legacy code. The API has been reworked of late and all of the collection APIs are now unsynchronized. Special synchronized wrappers have been implemented (and hidden from us) for creating polymorphic, thread-safe implementations of the unsynchronized classes. You gain access to these thread-safe versions via static methods on the Collections class. &lt;/p&gt; &lt;p&gt;   &lt;font color="#800000"&gt;Collection Collections.synchronizedCollection(Collection);&lt;br&gt;   List Collections.synchronizedList(List);&lt;br&gt;   Map Collections.synchronizedMap(Map);&lt;br&gt;   Set Collections.synchronizedSet(Set);&lt;br&gt;   SortedMap Collections.synchronizedSortedMap(SortedMap);&lt;br&gt;   SortedSet Collections.synchronizedSortedSet(SortedSet); &lt;/font&gt; &lt;/p&gt; &lt;p&gt;   Notice that all of these methods accept the most general interface and return the same interface. If you make judicious use of these generalities, you'll be able to swap out implementations relatively painlessly. Now keep in mind that in theory, the implementation of collections shall be free to do whatever it wants. You don't want your code dependent upon J2SE source. If you insist on using the concrete classes, you'll have to downcast to use the results from the previous methods. Downcasting requires knowledge of implementation. Things will change over time. Try to insulate yourself from potential change points. The entire Collections Framework wreaks polymorphism, so take advantage of it, as polymorphism is a good thing. &lt;/p&gt; &lt;p&gt;   I performed a small test to compare ArrayList, SynchronizedList, and Vector, all three of which implement the List interface. The results show that for synchronized updates, Vector is the worst performer, while SynchronizedList is much faster. Both are compared to the unsynchronized ArrayList. The test involved completing a read (get) or write (add) operation in a tight loop, 100,000 times (see Table 2). &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;    &lt;img alt="" src="http://photos.sys-con.com/story/res/43554/tab2.jpg" border="0" hspace="0"&gt; &lt;/div&gt; &lt;p&gt;   Comparing Vector to SynchronizedList shows that Vector takes 138% and 40% more time than the same operations on SynchronizedList. Meanwhile, SynchronizedList takes a 12% hit over ArrayList for read operations, compared to the 167% increase for Vectors. Some people might be confused by the lack of symmetry in the numbers. If we want to compare A to B, the proper equation is (A - B)/B. Therefore if I want to compare 2 to 6, then (2 - 6)/6 gives -0.6667 or -66%. If I compare 6 to 2, then (6 - 2)/2 gives 2 or 200%. This may seem counterintuitive to saying 6 is three times as large as 2 (which is just a simple ratio, not a comparison). &lt;/p&gt; &lt;p&gt;   All of the collections support iterator semantics. Some will bark at you if the underlying collection is altered while you are accessing the iterator by throwing a ConcurrentModification exception. &lt;/p&gt; &lt;p&gt;   The static class Collections has many other useful methods for converting to and from certain types of collections. Of interest are those dealing with the creation of unmodifiable collections. First you create your collection and then pass it into the appropriate method and your collection is transformed into something that looks just like the original, but now it will throw an exception if anyone attempts to add or delete an object. Inner classes in Collections that simply extend the standard collection class and override the modifiers accomplish this. Now you can implement the Command pattern and employ the concept of read-only parameters and return structures. In a language that deals exclusively with object references, that's a nice-to-have feature. &lt;/p&gt; &lt;p&gt;   &lt;font color="#800000"&gt;List Collections.unmodifiableList(List);&lt;br&gt;   Map Collections.unmodifiableMap(Map);&lt;br&gt;   Set Collections.unmodifiableSet(Set);&lt;br&gt;   SortedMap Collections.unmodifiableSortedMap(SortedMap);&lt;br&gt;   SortedSet Collections.unmodifiableSortedSet(SortedSet); &lt;/font&gt; &lt;/p&gt; &lt;p&gt;   Sorting has been taken care of with a "tuned" implementation of Merge Sort. There are routines for sorting primitives and objects. You can implement classes that have a natural order by extending Comparable. If inheritance is at a premium, use the Comparator interface. C++ programmers will feel right at home with this idiom from the STL. There are even collections that are themselves sorted. SortedTree allows you to add objects that will be sorted on the fly. The API is so flexible that you can implement the natural order. &lt;/p&gt; &lt;p&gt;   Other utility methods in collections have to do with searching a List. The Collections class offers two binary searching methods. &lt;/p&gt; &lt;p&gt;   &lt;font color="#800000"&gt;Object Collections.binarySearch(List list, Object key);&lt;br&gt;   Object Collections.binarySearch(List list, Object key, Comparator comparator); &lt;/font&gt; &lt;/p&gt; &lt;p&gt;   These two methods, one of which employs the natural sort order of the list and the other the ad hoc, run in log(n) time where n is the number of elements in the list. However, this is true only if the list passed in implements the RandomAccess interface. Otherwise, if the list does not implement RandomAccess and is large, the search will execute an iterator-based binary search, which according to the Javadoc will "perform O(n) link traversals and O(log n) element comparisons." &lt;/p&gt; &lt;p&gt;   Figure 6 shows the big picture with the preferred extension points highlighted. We've discussed the general categories: Collection (Set, List) and Map. We've played around a little and have seen that to take full advantage of some collections, we have to override Object.equals and Object.hashCode. Also, we went over some of the performance tradeoffs of a couple of implementations. I should mention that there are other Collection APIs available to Java programmers. There's the popular JGL and the JDSL. I haven't looked at the JGL but I have played around with the academic version of the JDSL. The JDSL gives you all those nifty data structures you talked about in your junior year algorithms class. &lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;div align="center"&gt;    &lt;img alt="" src="http://photos.sys-con.com/story/res/43554/fig6.jpg" border="0" hspace="0"&gt; &lt;/div&gt; &lt;p&gt;   There are some new collections available in the latest JCF: LinkedHashSet, LinkedHashMap, and IdentityHashMap. In general they are highly specialized versions of the core JCF classes. &lt;/p&gt; &lt;p&gt;   &lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;   This article should prompt you to take another look at the Collections Framework and, if you are lucky, you'll see something that fits with your current development task. If you are really lucky, perhaps you'll see something else in the J2SE libraries that you never knew existed, collection related or not. Unfortunately, there doesn't seem to be any J2SE champion at Sun, so you'll have to make an effort to scan through the API's Javadoc every so often and perhaps even the source code as well (there are some novel snippets in there). &lt;/p&gt; &lt;div class="storyfooter"&gt;   Published Feb. 5, 2004 — Reads 19,152&lt;br&gt;   Copyright © 2007 SYS-CON Media. All Rights Reserved. &lt;/div&gt; &lt;div class="toolbar"&gt;   &lt;table width="100%"&gt;     &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;a href="http://java.sys-con.com/read/43554.htm"&gt;&lt;img src="http://res.sys-con.com/section/1/read.gif" border="0"&gt;&lt;/a&gt;       &lt;/td&gt;       &lt;td&gt;         &lt;a href="http://java.sys-con.com/read/43554.htm#" title="print this story"&gt;&lt;img src="http://res.sys-con.com/section/1/print.gif" border="0"&gt;&lt;/a&gt;       &lt;/td&gt;       &lt;td&gt;         &lt;a href="http://java.sys-con.com/read/43554_f.htm" title="comment on this story"&gt;&lt;img src="http://res.sys-con.com/section/1/feedback.gif" border="0"&gt;&lt;/a&gt;       &lt;/td&gt;       &lt;td&gt;         &lt;a href="http://java.sys-con.com/read/43554.htm#" title="alert someone to this story"&gt;&lt;img src="http://res.sys-con.com/section/1/email.gif" border="0"&gt;&lt;/a&gt;       &lt;/td&gt;       &lt;td&gt;         &lt;a href="http://java.sys-con.com/read/issue/345.htm" title="read other articles from this issue"&gt;&lt;img src="http://res.sys-con.com/section/1/issue.gif" border="0"&gt;&lt;/a&gt;       &lt;/td&gt;       &lt;td align="right"&gt;         &lt;a href="http://java.sys-con.com/read/43554.htm#" title="blog/write about this story"&gt;&lt;img src="http://res.sys-con.com/section/1/blog%281%29.gif" border="0"&gt;&lt;/a&gt;       &lt;/td&gt;     &lt;/tr&gt;     &lt;/tbody&gt;   &lt;/table&gt; &lt;/div&gt; &lt;div class="relatedstories"&gt;   &lt;strong&gt;Related Links&lt;/strong&gt;&lt;a href="http://developer.java.sun.com/developer/onlineTraining/collections/Collection.html"&gt;   &lt;div class="storytitle"&gt;     ▪ Introduction to the Collections Framework Short Course:   &lt;/div&gt;   &lt;/a&gt;&lt;a href="http://java.sun.com/docs/books/tutorial/collections/index.html"&gt;   &lt;div class="storytitle"&gt;     ▪ Collections Framework Tutorial:   &lt;/div&gt;   &lt;/a&gt;&lt;a href="http://java.sun.com/j2se/1.4.2/docs/guide/collections/designfaq.html"&gt;   &lt;div class="storytitle"&gt;     ▪ Java Collections API Design FAQ:   &lt;/div&gt;   &lt;/a&gt;&lt;a href="http://java.sun.com/j2se/1.4.2/docs/guide/collections/index.html"&gt;   &lt;div class="storytitle"&gt;     ▪ The Collections Framework:   &lt;/div&gt;   &lt;/a&gt;&lt;a href="http://java.sun.com/j2se/1.4.2/docs/guide/collections/reference.html"&gt;   &lt;div class="storytitle"&gt;     ▪ Annotated Outline of Collections Framework:   &lt;/div&gt;   &lt;/a&gt;&lt;a href="http://math.hws.edu/javanotes/c12/index.html"&gt;   &lt;div class="storytitle"&gt;     ▪ Eck, D.J. Programming with Collections, Introduction   &lt;/div&gt;   &lt;/a&gt;&lt;a href="http://photos.sys-con.com/story/res/43554/mcreynolds.txt"&gt;   &lt;div class="storytitle"&gt;     ▪ Source Code   &lt;/div&gt;   &lt;/a&gt;&lt;a href="http://www-106.ibm.com/developerworks/java/library/j-threads1.html"&gt;   &lt;div class="storytitle"&gt;     ▪ Goetz, B. "Threading lightly, Part 1: Synchronization is not the   &lt;/div&gt;   &lt;/a&gt;&lt;a href="http://www.cs.brown.edu/cgc/jdsl/"&gt;   &lt;div class="storytitle"&gt;     ▪ JDSL:   &lt;/div&gt;   &lt;/a&gt;&lt;a href="http://www.javaworld.com/javaworld/jw-04-2001/jw-0427-collections.html"&gt;   &lt;div class="storytitle"&gt;     ▪ Jonas, P. "Secure Type-safe Collections":   &lt;/div&gt;   &lt;/a&gt;&lt;a href="http://www.recursionsw.com/products/jgl/jgl.asp"&gt;   &lt;div class="storytitle"&gt;     ▪ JGL:   &lt;/div&gt;   &lt;/a&gt; &lt;/div&gt; &lt;div class="authorbio"&gt;   &lt;strong&gt;&lt;a href="http://java.sys-con.com/author/2774McReynolds.htm"&gt;About David McReynolds&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;   David McReynolds has been programming for over 12 years and is currently employed by Daugherty Business Solutions as a consultant. He has an MS in computer science from Southern Polytechnic State University.&lt;br&gt;   &lt;br&gt; &lt;/div&gt; &lt;div class=""&gt;   &lt;div class="portlettitlesmall"&gt;     SUBSCRIBE TO OUR RSS FEEDS &amp;amp; GET YOUR SYS-CON NEWS LIVE!   &lt;/div&gt;   &lt;table&gt;     &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;br&gt;       &lt;/td&gt;     &lt;/tr&gt;     &lt;/tbody&gt;   &lt;/table&gt;   &lt;table border="0" width="468"&gt;     &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;font face="verdana" size="-2"&gt; &lt;/font&gt;&lt;center&gt;&lt;font face="verdana" size="-2"&gt; &lt;font face="verdana" size="-2"&gt; &lt;a href="http://www.sys-con.com/general/aboutfeeds.htm"&gt;&lt;img src="http://res.sys-con.com/imgz/rss.gif" border="0"&gt;&lt;/a&gt; Click to Add our RSS Feeds to the Service of Your Choice:&lt;br&gt;         &lt;table&gt;           &lt;tbody&gt;           &lt;tr&gt;             &lt;td&gt;               &lt;br&gt;             &lt;/td&gt;           &lt;/tr&gt;           &lt;/tbody&gt;         &lt;/table&gt;         &lt;a href="http://java.sys-con.com/index.rss" title="Subscribe to my feed"&gt;&lt;img src="http://www2.sys-con.com/rssgraphics/xml.gif" style="border: 0pt none ;" border="2" hspace="0" vspace="0"&gt;&lt;/a&gt; &lt;a href="http://fusion.google.com/add?feedurl=http://java.sys-con.com/index.rss"&gt;&lt;img alt="Google Reader or Homepage" src="http://www2.sys-con.com/rssgraphics/google-all.gif" border="0" hspace="0" vspace="0"&gt;&lt;/a&gt; &lt;a href="http://add.my.yahoo.com/rss?url=http://java.sys-con.com/index.rss"&gt;&lt;img alt="Add to My Yahoo!" src="http://www2.sys-con.com/rssgraphics/yahoo.gif" border="0" hspace="0" vspace="0"&gt;&lt;/a&gt; &lt;a href="http://www.bloglines.com/sub/http://java.sys-con.com/index.rss"&gt;&lt;img alt="Subscribe with Bloglines" src="http://www2.sys-con.com/rssgraphics/bloglines.gif" border="0" hspace="0" vspace="0"&gt;&lt;/a&gt; &lt;a href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http://java.sys-con.com/index.rss"&gt;&lt;img alt="Subscribe in NewsGator Online" src="http://www2.sys-con.com/rssgraphics/newsgator.gif" border="0" hspace="0" vspace="0"&gt;&lt;/a&gt;&lt;br&gt;         &lt;a href="http://my.msn.com/addtomymsn.armx?id=rss&amp;amp;ut=http://java.sys-con.com/index.rss&amp;amp;ru=http://java.sys-con.com/index.rss"&gt;&lt;img src="http://www2.sys-con.com/rssgraphics/msn.gif" border="0" hspace="0" vspace="0"&gt;&lt;/a&gt; &lt;a href="http://www.feedster.com/myfeedster.php?action=addrss&amp;amp;rssurl=http://java.sys-con.com/index.rss&amp;amp;confirm=no"&gt;&lt;img alt="myFeedster" src="http://www2.sys-con.com/rssgraphics/addmyfeedster.gif" border="0" hspace="0" vspace="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.my.aol.com/add.jsp?url=http://java.sys-con.com/index.rss"&gt;&lt;img alt="Add to My AOL" src="http://www2.sys-con.com/rssgraphics/aol.gif" border="0" hspace="0" vspace="0"&gt;&lt;/a&gt; &lt;a href="http://www.rojo.com/add-subscription?resource=http://java.sys-con.com/index.rss"&gt;&lt;img alt="Subscribe in Rojo" src="http://www2.sys-con.com/rssgraphics/rojo.gif" style="border: 0pt none ;" border="2" hspace="0" vspace="0"&gt;&lt;/a&gt; &lt;a href="http://www.newsburst.com/Source/?add=http://java.sys-con.com/index.rss"&gt;&lt;img alt="Add 'Hugg' to Newsburst from CNET News.com" src="http://www2.sys-con.com/rssgraphics/newsburst.gif" style="border: 0pt none ;" border="2" hspace="0" vspace="0"&gt;&lt;/a&gt; &lt;a href="http://www.kinja.com/checksiteform.knj?pop=y&amp;amp;add=http://java.sys-con.com/index.rss"&gt;&lt;img alt="Kinja Digest" src="http://www2.sys-con.com/rssgraphics/addkinja.gif" border="0" hspace="0" vspace="0"&gt;&lt;/a&gt; &lt;a href="http://www.sys-con.com/general/aboutfeeds.htm"&gt;&lt;b&gt;View Additional SYS-CON Feeds&lt;/b&gt;&lt;/a&gt; &lt;/font&gt;&lt;/font&gt;&lt;/center&gt;       &lt;/td&gt;     &lt;/tr&gt;     &lt;/tbody&gt;   &lt;/table&gt;   &lt;table cellpadding="3" cellspacing="3"&gt;     &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;br&gt;       &lt;/td&gt;     &lt;/tr&gt;     &lt;/tbody&gt;   &lt;/table&gt;   &lt;center&gt;&lt;b&gt;In It? Reprint It!&lt;/b&gt; Contact advertising(at)sys-con.com! &lt;/center&gt;   &lt;table&gt;     &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;br&gt;       &lt;/td&gt;     &lt;/tr&gt;     &lt;/tbody&gt;   &lt;/table&gt; &lt;/div&gt; &lt;div class=""&gt;   &lt;a href="http://banners.sys-con.com/phpAdsNew-2.0/adclick.php?bannerid=3397&amp;amp;zoneid=197&amp;amp;source=&amp;amp;dest=http%3A%2F%2Fe.nvero.net%2Feas%3Fcamp%3D11662%3Bty%3Dct" target="NEW"&gt; &lt;/a&gt;   &lt;table bgcolor="#fdffca" border="1" bordercolor="#b9b9b9" cellpadding="4" cellspacing="0" width="468"&gt;     &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;center&gt;         &lt;div class="textlink"&gt;           &lt;a href="http://e.nvero.net/eas?camp=11662;ty=ct" target="_blank"&gt; &lt;span class="textlink"&gt; &lt;b&gt;Sun Studio :&lt;/b&gt; Compilers and Tools. Optimizing compilers and tools for C/C++/Fortran application development. &lt;img alt="BlackFoot Ad" src="http://e.nvero.net/eas?camp=11662;cre=img;ord=%5Btimestamp%5D" border="0" height="1" width="1"&gt;&lt;/span&gt;&lt;/a&gt;         &lt;/div&gt;         &lt;/center&gt;       &lt;/td&gt;     &lt;/tr&gt;     &lt;/tbody&gt;   &lt;/table&gt;   &lt;div style=""&gt;     &lt;img alt="" src="http://banners.sys-con.com/phpAdsNew-2.0/adlog.php?bannerid=3397&amp;amp;clientid=2208&amp;amp;zoneid=197&amp;amp;source=&amp;amp;block=0&amp;amp;capping=0&amp;amp;cb=8e0914c163cc7f20e3ed2038cd191b5d" style="width: 0px; height: 0px;" height="0" width="0"&gt;   &lt;/div&gt;   &lt;a href="http://banners.sys-con.com/phpAdsNew-2.0/adclick.php?n=ab9fa164" target="_blank"&gt;&lt;img alt="" src="http://banners.sys-con.com/phpAdsNew-2.0/adview.php?what=zone:197&amp;amp;n=ab9fa164" border="0"&gt;&lt;/a&gt;   &lt;table&gt;     &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;br&gt;       &lt;/td&gt;     &lt;/tr&gt;     &lt;/tbody&gt;   &lt;/table&gt; &lt;/div&gt; &lt;div class="portletsmallpadding"&gt;   &lt;div class="portlettitlesmall"&gt;     TODAY'S LATEST JAVA STORIES   &lt;/div&gt;   &lt;table border="0" cellpadding="2" cellspacing="0" width="99%"&gt;     &lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;div class="story"&gt;           &lt;a href="http://java.sys-con.com/read/filter/jdjlatest.htm"&gt;           &lt;div class="storytitle"&gt;             Real-World Java Seminar - Skilled Listening in Java           &lt;/div&gt;           &lt;/a&gt;           &lt;div class="storyauthor"&gt;             By Warren MacEvoy           &lt;/div&gt;           &lt;div class="storysummary"&gt;             &lt;img 
