<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>charles</title>
    <description></description>
    <link>http://charles.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>The Winners of the 18th Jolt </title>
        <author>charles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://charles.javaeye.com">charles</a>&nbsp;
          链接：<a href="http://charles.javaeye.com/blog/173980" style="color:red;">http://charles.javaeye.com/blog/173980</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          JOLT HALL OF FAME WINNER:<br /><br />    * VMware Workstation <br /><br />General Books<br /><br />Jolt Winner:<br /><br />    * Beautiful Code Edited by Andy Oram and Greg Wilson (O'Reilly Media)<br /><br />Productivity Winners:<br /><br />    * Manage It! Your Guide to Modern Pragmatic Project Management by Johanna Rothman (Pragmatic Bookshelf)<br />    * The Myths of Innovation by Scott Berkun (O'Reilly Media)<br />    * Release It! Design and Deploy Production-Ready Software by Michael T. Nygard(Pragmatic Bookshelf)<br /><br />Technical Books<br /><br />Jolt Winner:<br /><br />    * Continuous Integration: Improving Software Quality and Reducing Risk by Paul Duvall, Steve Matyas, Andrew Glover (Addison-Wesley Professional)<br /><br />Productivity Winners:<br /><br />    * xUnit Test Patterns: Refactoring Test Code by Gerard Meszaros (Addison-Wesley Professional)<br />    * Head First SQL: Your Brain on SQL — A Learner's Guide by Lynn Beighley (O'Reilly Media)<br />    * The Rails Way by Obie Fernandez (Addison-Wesley Professional)<br /><br />Change and Configuration Management<br /><br />Jolt Winner:<br /><br />    * FishEye (Atlassian)<br /><br />Productivity Winners:<br /><br />    * IncrediBuild (Xoreax Software)<br />    * Surround SCM (Seapine Software)<br />    * DiffMerge (SourceGear)<br /><br />Collaboration Tools<br /><br />Jolt Winner:<br /><br />    * Code Collaborator (Smart Bear)<br /><br />Productivity Winners:<br /><br />    * codeBeamer 5.0 (Intland Software)<br />    * Confluence (Atlassian)<br />    * TeamCity (JetBrains)<br /><br />Database Engines and Data Tools<br /><br />Jolt Winner:<br /><br />    * AquaLogic Data Services Platform (BEA Systems)<br /><br />Productivity Winners:<br /><br />    * Aleri Streaming Platform (Aleri)<br />    * Crystal Reports (Business Objects)<br />    * EnterpriseDB Advanced Server (EnterpriseDB)<br /><br />Design and Modeling Tools<br /><br />Jolt Winner:<br /><br />    * Corticon Business Rules Modeling Studio (Corticon Technologies)<br /><br />Productivity Winners:<br /><br />    * BigLever Software Gears (BigLever Software)<br />    * Enterprise Architect (Sparx Systems)<br />    * Structure101 for Java (Headway Software)<br /><br />Development Environments<br /><br />Jolt Winner:<br /><br />    * NetBeans IDE 6 (Sun Microsystems)<br /><br />Productivity Winners:<br /><br />    * IntelliJ IDEA (JetBrains)<br />    * CodeRush with Refactor! Pro (Developer Express)<br />    * Komodo IDE 4 (ActiveState)<br /><br />Enterprise Tools<br /><br />Jolt Winner:<br /><br />    * Kapow Mashup Server, Web 2.0 Edition (Kapow Technologies)<br /><br />Productivity Winners:<br /><br />    * Adobe LiveCycle Enterprise Suite (Adobe Systems)<br />    * Foglight (Quest Software)<br />    * Rally Enterprise (Rally Software Development)<br /><br />Libraries, Frameworks and Components<br /><br />Jolt Winner:<br /><br />    * Guice (Google)<br /><br />Productivity Winners:<br /><br />    * Eclipse Modeling Project (Eclipse Foundation)<br />    * Zend Framework (Zend Technologies)<br />    * JasperReports (JasperSoft)<br /><br />Mobile Development Tools<br /><br />Jolt Winner:<br /><br />    * Mojax (mFoundry)<br /><br />Productivity Winners:<br /><br />    * Adobe Device Central CS3 (Adobe Systems)<br />    * Eclipse Embedded Rich Client Platform (Eclipse Foundation)<br />    * NetBeans IDE 6 with Sun Java Wireless Toolkit 2.5.2 (Sun Microsystems)<br /><br />Project Management Tools<br /><br />Jolt Winner:<br /><br />    * Rally Enterprise (Rally Software Development)<br /><br />Productivity Winners:<br /><br />    * vResultSpace (Sapient) TargetProcess On-Demand (TargetProcess)<br />    * TeamCity (JetBrains)<br /><br />Security Tools<br /><br />Jolt Winner:<br /><br />    * Fortify Defender: Real-Time Analyzer (Fortify Software)<br /><br />Productivity Winners:<br /><br />    * Crowd (Atlassian)<br />    * DEFENSICS (Codenomicon)<br />    * Ounce (Ounce Labs)<br /><br />Testing Tools<br /><br />Jolt Winner:<br /><br />    * Clover 2.0 (Atlassian)<br /><br />Productivity Winners:<br /><br />    * JUnit Factory (Agitar Software)<br />    * SOAPscope Tester (Mindreef)<br />    * TestComplete Enterprise (AutomatedQA)<br /><br />Utilities<br /><br />Jolt Winner:<br /><br />    * VMware Workstation (VMware)<br /><br />Productivity Winners:<br /><br />    * Adobe Captivate 3 (Adobe Systems)<br />    * DemoWorks 2007 (ComponentOne)<br />    * ANTS Profiler 3 (Red Gate Software)<br /><br />Web Development<br /><br />Jolt Winner:<br /><br />    * Adobe ColdFusion 8 (Adobe Systems)<br /><br />Productivity Winners:<br /><br />    * 3rdRail (CodeGear)<br />    * NetBeans IDE 6 (Sun Microsystems)<br />    * RSSBus (/n software)<br /><br />Websites and Developer Networks<br /><br />Jolt Winner:<br /><br />    * O'Reilly Radar (O'Reilly Media)<br /><br />Productivity Winners:<br /><br />    * CM Crossroads (CMC Media)<br />    * Safari Books Online<br />    * The Code Project
          <br/>
          <span style="color:red;">
            <a href="http://charles.javaeye.com/blog/173980#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 09:56:31 +0800</pubDate>
        <link>http://charles.javaeye.com/blog/173980</link>
        <guid>http://charles.javaeye.com/blog/173980</guid>
      </item>
      <item>
        <title>思想决定生活 -《卡耐基成功之道全书》读书笔记</title>
        <author>charles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://charles.javaeye.com">charles</a>&nbsp;
          链接：<a href="http://charles.javaeye.com/blog/114316" style="color:red;">http://charles.javaeye.com/blog/114316</a>&nbsp;
          发表时间: 2007年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          当你遇到烦恼或者不快乐时，建议阅读《卡耐基成功之道全书》第183页至191页的“改变你生活的九个字”—“生活是由思想造成的” 。<br />    一个人很重要的能力是控制自己思想的能力，外界的很多东西我们无法控制，但我们唯一可以完全控制的是自己的思想。<br />    当你不快乐时，是由于不快乐的思想，而不是其他原因。<br />    你的思想决定了你的生活，只要保持快乐的思想，你的生活会充满快乐。<br /><br />下面是书中的部分内容摘录：<br />    只要知道你在想些什么，就知道你是怎样的一个人，因为每个人的特性，都是由思想造成的。我们的命运，完全决定于我们的心理状态。<br />    爱默生说：“一个人就是他整天所想的那些……他怎可能是别种样子呢”。<br />    我现在很确切地知道，你我所必须面对的最大问题——事实上几乎可以算是我们需要应付的唯一问题——就是如何选择正确的思想。如果我们能做到这一点，就可以解决所有的问题。曾经统治罗马帝国的伟大哲学家马尔卡斯·阿理流士，把这些总结成一句话——决定你命运的一句话：“生活是由思想造成的”。<br />    如果我们想的都是快乐的念头，我们就能快乐……“你并不是”诺曼·文生·皮尔说，“你想像中的那样，而你却是你所想的”。<br />    我们必须关切我们的问题，但是不能忧虑。关切和忧虑之间的分别是什么呢？让我再说明白一点，每一次我要通过交通拥挤的纽约市街时，我就会很注意我正在做的这件事——可是并不会忧虑。关心的意思就是要了解问题在哪里，然后很镇定地采取各种步骤去加以解决，而忧虑却是发疯似地在打着小圈子。<br />    我深信我们内心的平静，和我们由生活所得到的快乐，并不在于我们在哪里，我们有什么，或者我们是什么人，而只是在于我们的心境如何，与外在的条件没有多少关系。<br />    我只是想再重复一次爱默生在他那篇中做《自信》的散文里所说的那句结束语：“一次政治上的胜利，收入的增加，病体的康复，或是久别好友的归来，或是什么其他纯粹外在的事物，能提高你的兴致，让你觉得你眼前有很多的好日子，不要去相信它，事情绝不会是这样的，除了你自己以外，没有别的能带给你平静。”<br />    蒙坦，这位伟大的法国哲学家，以下面的两句话来作为他生活的座右铭：“一个人因发生的事情所受到的伤害，比不上因他对发生事情所拥有的意见来得深。”<br /><br />    当你被各种烦恼困扰着，整个人精神紧张不堪的时候，我是否应该大胆地告诉你，你可以凭自己的意志力，改变你的意志力，改变你的心境?不错，我应该这么做。而且，我还要告诉你如何做到这一点。这可能要花一点力气。可是秘诀却非常的简单。<br />    威廉·詹姆斯是实用心理学的权威，他曾经发表这样的理论：“行动似乎是随着感觉而来，可是实际上，行动和感觉是同时发生的。如果我们使我们意志力控制下的行动规律化，也能够间接地使不在意志力控制下的感觉规律化。”<br />    换句话说，威廉·詹姆斯告诉我们，我们不可能只凭“下定决心”就改变我们的情感——可是我们可以变化我们的动作，而当我们变化动作的时候，就会自然而然地改变了我们的感觉。<br />    “于是，”他解释说，“如果你感到不快乐，那么唯一能找到快乐的方法，就是振奋精神，使行动和言词好像已经感觉快乐的样子。”<br />    这种简单的办法是不是有用呢？你不妨自己试一试。使你的脸上露出一个很开心的笑脸来，挺起胸膛，好好地深吸一大口气，然后唱一小段歌，如果你不能唱，就吹口哨，若是你不会吹口哨，就哼一段歌。你就会很快地发现威廉·詹姆斯所说的是什么意思了——也就是说，当你的行动能够显出你快乐的时候，根本不可能再忧虑下去了。<br /><br />    有人说，上帝让人统治整个世界。这实在是一份相当大的礼物，可是我对这种特权实在没有什么兴趣。我所希望得到的，是能控制我的内心和精神。我知道在这点上我的成绩相当惊人。不论在什么时候，我总是想：只需控制我自己的行为，就能控制我的反应。<br />    所以让我们记住威廉·詹姆斯的话：“……通常，只要把受苦者内心的感觉，由恐惧改成奋斗，就能把大部分我们所谓的邪恶，改变为对你有帮助的好处。”<br />    让我们为我们的快乐而奋斗吧!<br />    让我们用一个每天能产生快乐而富有建设性思想的计划，来为我们的快乐而奋斗吧。下面就是这个计划，名字叫做《只为今天》。我认为这种计划非常有效，所以复印了好几千份送给别人。这是三十六年前已故的西贝儿·派屈吉所写的。如果你们能够照着做，我们就能消除大部分的忧虑，而大量地增加“生活的快乐”。<br />    《只为今天》：<br /><br />1. 只为今天，我要很快乐。假如林肯所说的“大部分的人只要下定决心都能很快乐”这句话是对的，那么快乐是来自内心，而不是存在于外在。<br /><br />2. 只为今天，我要让自己适应一切，而不去适应一切，而不去试着高速一切来适应我的欲望。我要以这种态度接受我的家庭、我的事业和我的运气。<br /><br />3. 只为今天，我要爱护我的身体。我要多加运动，善自照顾，善自珍惜；不损伤它、不忽视它；使它能成为我争取成功的好基础。<br /><br />4. 只为今天，我要加强我的思想。我要学一些有用的东西，我决不做一个胡思乱想的人。我要看一些需要思考、更需要集中精神才能看的书。<br /><br />5. 只为今天，我要用三件事来锻炼我的灵魂：我要为别人做一件好事，但不要让人家知道；我还要做两件我并不想做的事，而这就像威廉·詹姆斯所建议的，是为了锻炼。<br /><br />6. 只为今天，我要做个讨人喜欢的人，外表要尽量修饰，衣着要尽量得体，说话低声，行动优雅，丝毫不在乎别的毁誉。对任何事都不挑出毛病，也不干涉或教训别人。<br /><br />7. 只为今天，我要试着只考虑怎么度过今天，而不把我一生的问题都在一次解决。因为，我虽能解连续十二分钟做一件事，但若要我一辈子都这样做下去的话，就会吓坏了我。<br /><br />8. 只为今天，我要订下一个计划。我要写下每个钟点该做些什么事；也许我不会完全照着做，但还要订下这个计划；这样至少可以免除两种缺点——过分仓卒和犹豫不决。<br /><br />9. 只为今天，我要为自己留下安静的半个钟头，轻松一番。在这半个钟头里，我要想到能使我的生命中更充满希望。<br /><br />10. 只为今天，我要心中毫无惧怕。尤其是，我不要怕快乐，我要去欣赏美的一切，去爱，去相信我爱的那些人会爱我的。
          <br/>
          <span style="color:red;">
            <a href="http://charles.javaeye.com/blog/114316#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 20 Aug 2007 11:54:13 +0800</pubDate>
        <link>http://charles.javaeye.com/blog/114316</link>
        <guid>http://charles.javaeye.com/blog/114316</guid>
      </item>
      <item>
        <title>感受黄山</title>
        <author>charles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://charles.javaeye.com">charles</a>&nbsp;
          链接：<a href="http://charles.javaeye.com/blog/87438" style="color:red;">http://charles.javaeye.com/blog/87438</a>&nbsp;
          发表时间: 2007年06月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          第一天，从北京做车到黄山市（屯溪），天在下雨，坐上去盘口的游车，大概40分钟，到了黄山驴友驿站,稍歇便刻，设计好登上的线路，从后山上山（索道），天气不好所以什么都看不见，不过感觉后山景色还是挺美的（云谷寺、黑虎松、始信峰、北海、西海、排云亭），一路上看到都是翠绿的松树，秀气，入住排云楼宾馆，晚上吃好晚饭后，半晚时分天气好转，明月当空，所幸在排云亭看到了黄山一景“云海”。<br />第二天，天刚亮，直奔光明顶看日出，途径飞来石，一个小时的路程，天公作美，看到了朝日，返回排云楼，背好行囊，去黄山最秀丽的地方“西海大峡谷”，从谷顶走到谷底又爬上谷顶，一路行来看到了黄山第二景“怪石”、第三景“奇松”、“云海”，同一个景点，不同角度看过去，都是一处秀丽的景观，雄伟壮丽，云层从半山腰滑过，云里有山，山里有云，若隐若现，走在谷中陡峭的小路上,茫然感觉“不知黄山真面目，只缘身在此山中”，<br />走出谷来到天海，开始观前山的景色，身体已经透支不少，但还是有一股无形的力量，哪怕有一点点力气，也要争取走下去，“一线天”、“百步云梯”、“莲花峰”、“天都峰”、“迎客松”、黄山天气真是怪，下前山时天气还是清空万里，走到了迎客松，转过到山后就雾气笼罩于山中了，可能是山太高了，天都峰海拔1810米，因为体力原因，只能俯视天都峰了，一条陡峭上山路，沿山开出，从山低就能看到山顶，道路狭窄，心里只好暗暗说了“下次吧、还有机会”。下山的路就没什么好说的了，到了“慈光阁”已经是下午五时。
          <br/>
          <span style="color:red;">
            <a href="http://charles.javaeye.com/blog/87438#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 06 Jun 2007 19:42:50 +0800</pubDate>
        <link>http://charles.javaeye.com/blog/87438</link>
        <guid>http://charles.javaeye.com/blog/87438</guid>
      </item>
      <item>
        <title>17th Annual Jolt Award Winners</title>
        <author>charles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://charles.javaeye.com">charles</a>&nbsp;
          链接：<a href="http://charles.javaeye.com/blog/64886" style="color:red;">http://charles.javaeye.com/blog/64886</a>&nbsp;
          发表时间: 2007年03月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1. Books General<br /><br />Jolt Winner:<br /><br />    * Agile Software Development by Alistair Cockburn (Addison-Wesley Professional)<br /><br />Productivity Winners:<br /><br />    * Catastrophe Disentanglement by E. M. Bennatan (Addison-Wesley Professional)<br />    * Practices of an Agile Developer by V. Subramaniam and A. Hunt (Pragmatic Bookshelf)<br />    * Software Estimation Demystifying the Black Art by Steve McConnell (Microsoft Press)<br /><br />2. Books Technical<br /><br />Jolt Winner:<br /><br />    * Head First Object-Oriented Analysis & Design by B. McLaughlin, G. Pollice, and D. West (O'Reilly Media)<br /><br />Productivity Winners:<br /><br />    * Code Quality by Diomidis Spinellis (Addison-Wesley Professional)<br />    * Refactoring Databases by Scott W. Ambler and P. J. Sadalage (Addison-Wesley Professional)<br />    * CSS: The Missing Manual by David Sawyer McFarland (O'Reilly Media)<br /><br />3. Change and Configuration Management<br /><br />Jolt Winner:<br /><br />    * AccuRev 4.5 with AccuWorkflow (AccuRev)<br /><br />Productivity Winners:<br /><br />    * AnthillPro3 (Urbancode)<br />    * Perforce SCM (Perforce)<br />    * Team Foundation Server (Microsoft)<br /><br />4. Collaboration Tools<br /><br />Jolt Winner:<br /><br />    *. Confluence (Atlassian Software Systems)<br /><br />Productivity Winners:<br /><br />    * Adobe Acrobat Connect Professional (Adobe Systems)<br />    * NetBeans IDE (Sun Microsystems)<br />    * TeamCity (JetBrains)<br /><br />5. Database Engines and Data Tools<br /><br />Jolt Winner:<br /><br />    * Visual Studio 2005 Team Edition for Database Professionals (Microsoft)<br /><br />Productivity Winners:<br /><br />    * Coral8 Engine (Coral8)<br />    * Dbdeploy (ThoughtWorks)<br />    * SQL Refactor (Red Gate Software)<br /><br />6. Design and Modeling Tools<br /><br />Jolt Winner:<br /><br />    * stpBA Storyboarding (stpsoft)<br /><br />Productivity Winners:<br /><br />    * Corticon Business Rules Modeling Studio (Corticon)<br />    * MagicDraw UML (No Magic)<br />    * Stylus Studio 2007 XML Enterprise Suite (DataDirect Technologies)<br /><br />7. Development Environments<br /><br />Jolt Winner:<br /><br />    * NetBeans IDE (Sun Microsystems)<br /><br /> Productivity Winners:<br />IntelliJ IDEA (JetBrains)<br />IronPython (Microsoft)<br />Wolfram Workbench (Wolfram Research)<br />8. Enterprise Tools<br /><br />Jolt Winner:<br /><br />    * Cape Clear ESB Platform (Cape Clear Software)<br /><br />Productivity Winners:<br /><br />    * Liferay Portal (Liferay<br />    * Appistry EAF (Appistry)<br />    * Pentaho Open BI Suite (Pentaho)<br /><br />9. Libraries, Frameworks and Components<br /><br />Jolt Winner:<br /><br />    * NetAdvantage for .NET (Infragistics)<br /><br />Productivity Winners:<br /><br />    * JViews (ILOG)<br />    * .NET Framework 3.0 (Microsoft)<br />    * Intel Threading Building Blocks (Intel)<br /><br />10. Mobile Development Tools<br /><br />Jolt Winner:<br /><br />    * Carbide .c++ Professional Edition (Nokia)<br /><br />Productivity Winners:<br /><br />    * Crossfire (AppForge)<br />    * NetBeans Mobility Pack and Sun Java Wireless Tookit (Sun Microsystems)<br />    * Qtopia (Trolltech)<br /><br />11. Project Management<br /><br />Jolt Winner:<br /><br />    * Rally Enterprise (Rally Software)<br /><br />Productivity Winners:<br /><br />    * 6th Sense Analytics (6th Sense Analytics)<br />    * Teamwork (Open Lab)<br />    * V1: Agile Enterprise (VersionOne) <br /><br />12. Security<br /><br />Jolt Winner:<br /><br />    * AppScan (Watchfire)<br /><br />Productivity Winners:<br /><br />    * DevInspect (SPI Dynamics)<br />    * Fortify Source Code Analysis (Fortify)<br />    * Metasploit Framework (Metasploit) <br /><br />13. Testing<br /><br />Jolt Winner:<br /><br />    * AgitarOne (Agitar Software)<br /><br />Productivity Winners:<br /><br />    * Mindreef SOAPscope (Mindreef)<br />    * Parasoft SOAtest (Parasoft)<br />    * TestComplete (AutomatedQA)<br /><br />14. Bug and Defect Tracking<br /><br />Jolt Winner:<br /><br />    * TestTrack Studio (Seapine Software)<br /><br />Productivity Winners:<br /><br />    * JIRA (Atlassian Software Systems)<br />    * OnTime 2007 (Axosoft)<br />    * Software Planner Professional (Pragmatic Software)<br /><br />15. Utilities<br /><br />Jolt Winner:<br /><br />    * VMware Lab Manager (VMware)<br /><br />Productivity Winners:<br /><br />    * Adobe Captivate 2 (Adobe)<br />    * ElectricCommander (Electric Cloud)<br />    * Textmate (MacroMates)<br /><br />16. Web Development<br /><br />Jolt Winner:<br /><br />    * Adobe Flex 2 (Adobe Systems)<br /><br />Productivity Winners:<br /><br />    * IntelliJ IDEA (JetBrains)<br />    * Mindreef SOAPscope Server (Mindreef)<br />    * NetBeans Visual Web Pack 5.5 (Sun Microsystems) <br /><br />17. Websites and Developer Networks<br /><br />Jolt Winner:<br /><br />    * Sun Developer Network (Sun Microsystems)<br /><br />Productivity Winners:<br /><br />    * CM Crossroads (CMC Media)<br />    * Koders.com (Koders)<br />    * Krugle (Krugle)<br /><br />HALL OF FAME<br /><br />          * IBM developerWorks (IBM)
          <br/>
          <span style="color:red;">
            <a href="http://charles.javaeye.com/blog/64886#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 23 Mar 2007 11:24:45 +0800</pubDate>
        <link>http://charles.javaeye.com/blog/64886</link>
        <guid>http://charles.javaeye.com/blog/64886</guid>
      </item>
      <item>
        <title>17th Annual Jolt Award Winners</title>
        <author>charles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://charles.javaeye.com">charles</a>&nbsp;
          链接：<a href="http://charles.javaeye.com/blog/64880" style="color:red;">http://charles.javaeye.com/blog/64880</a>&nbsp;
          发表时间: 2007年03月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1. Books General<br /><br />Jolt Winner:<br /><br />    * Agile Software Development by Alistair Cockburn (Addison-Wesley Professional)<br /><br />Productivity Winners:<br /><br />    * Catastrophe Disentanglement by E. M. Bennatan (Addison-Wesley Professional)<br />    * Practices of an Agile Developer by V. Subramaniam and A. Hunt (Pragmatic Bookshelf)<br />    * Software Estimation Demystifying the Black Art by Steve McConnell (Microsoft Press)<br /><br />2. Books Technical<br /><br />Jolt Winner:<br /><br />    * Head First Object-Oriented Analysis & Design by B. McLaughlin, G. Pollice, and D. West (O'Reilly Media)<br /><br />Productivity Winners:<br /><br />    * Code Quality by Diomidis Spinellis (Addison-Wesley Professional)<br />    * Refactoring Databases by Scott W. Ambler and P. J. Sadalage (Addison-Wesley Professional)<br />    * CSS: The Missing Manual by David Sawyer McFarland (O'Reilly Media)<br /><br />3. Change and Configuration Management<br /><br />Jolt Winner:<br /><br />    * AccuRev 4.5 with AccuWorkflow (AccuRev)<br /><br />Productivity Winners:<br /><br />    * AnthillPro3 (Urbancode)<br />    * Perforce SCM (Perforce)<br />    * Team Foundation Server (Microsoft)<br /><br />4. Collaboration Tools<br /><br />Jolt Winner:<br /><br />    *. Confluence (Atlassian Software Systems)<br /><br />Productivity Winners:<br /><br />    * Adobe Acrobat Connect Professional (Adobe Systems)<br />    * NetBeans IDE (Sun Microsystems)<br />    * TeamCity (JetBrains)<br /><br />5. Database Engines and Data Tools<br /><br />Jolt Winner:<br /><br />    * Visual Studio 2005 Team Edition for Database Professionals (Microsoft)<br /><br />Productivity Winners:<br /><br />    * Coral8 Engine (Coral8)<br />    * Dbdeploy (ThoughtWorks)<br />    * SQL Refactor (Red Gate Software)<br /><br />6. Design and Modeling Tools<br /><br />Jolt Winner:<br /><br />    * stpBA Storyboarding (stpsoft)<br /><br />Productivity Winners:<br /><br />    * Corticon Business Rules Modeling Studio (Corticon)<br />    * MagicDraw UML (No Magic)<br />    * Stylus Studio 2007 XML Enterprise Suite (DataDirect Technologies)<br /><br />7. Development Environments<br /><br />Jolt Winner:<br /><br />    * NetBeans IDE (Sun Microsystems)<br /><br /> Productivity Winners:<br />IntelliJ IDEA (JetBrains)<br />IronPython (Microsoft)<br />Wolfram Workbench (Wolfram Research)<br />8. Enterprise Tools<br /><br />Jolt Winner:<br /><br />    * Cape Clear ESB Platform (Cape Clear Software)<br /><br />Productivity Winners:<br /><br />    * Liferay Portal (Liferay<br />    * Appistry EAF (Appistry)<br />    * Pentaho Open BI Suite (Pentaho)<br /><br />9. Libraries, Frameworks and Components<br /><br />Jolt Winner:<br /><br />    * NetAdvantage for .NET (Infragistics)<br /><br />Productivity Winners:<br /><br />    * JViews (ILOG)<br />    * .NET Framework 3.0 (Microsoft)<br />    * Intel Threading Building Blocks (Intel)<br /><br />10. Mobile Development Tools<br /><br />Jolt Winner:<br /><br />    * Carbide .c++ Professional Edition (Nokia)<br /><br />Productivity Winners:<br /><br />    * Crossfire (AppForge)<br />    * NetBeans Mobility Pack and Sun Java Wireless Tookit (Sun Microsystems)<br />    * Qtopia (Trolltech)<br /><br />11. Project Management<br /><br />Jolt Winner:<br /><br />    * Rally Enterprise (Rally Software)<br /><br />Productivity Winners:<br /><br />    * 6th Sense Analytics (6th Sense Analytics)<br />    * Teamwork (Open Lab)<br />    * V1: Agile Enterprise (VersionOne) <br /><br />12. Security<br /><br />Jolt Winner:<br /><br />    * AppScan (Watchfire)<br /><br />Productivity Winners:<br /><br />    * DevInspect (SPI Dynamics)<br />    * Fortify Source Code Analysis (Fortify)<br />    * Metasploit Framework (Metasploit) <br /><br />13. Testing<br /><br />Jolt Winner:<br /><br />    * AgitarOne (Agitar Software)<br /><br />Productivity Winners:<br /><br />    * Mindreef SOAPscope (Mindreef)<br />    * Parasoft SOAtest (Parasoft)<br />    * TestComplete (AutomatedQA)<br /><br />14. Bug and Defect Tracking<br /><br />Jolt Winner:<br /><br />    * TestTrack Studio (Seapine Software)<br /><br />Productivity Winners:<br /><br />    * JIRA (Atlassian Software Systems)<br />    * OnTime 2007 (Axosoft)<br />    * Software Planner Professional (Pragmatic Software)<br /><br />15. Utilities<br /><br />Jolt Winner:<br /><br />    * VMware Lab Manager (VMware)<br /><br />Productivity Winners:<br /><br />    * Adobe Captivate 2 (Adobe)<br />    * ElectricCommander (Electric Cloud)<br />    * Textmate (MacroMates)<br /><br />16. Web Development<br /><br />Jolt Winner:<br /><br />    * Adobe Flex 2 (Adobe Systems)<br /><br />Productivity Winners:<br /><br />    * IntelliJ IDEA (JetBrains)<br />    * Mindreef SOAPscope Server (Mindreef)<br />    * NetBeans Visual Web Pack 5.5 (Sun Microsystems) <br /><br />17. Websites and Developer Networks<br /><br />Jolt Winner:<br /><br />    * Sun Developer Network (Sun Microsystems)<br /><br />Productivity Winners:<br /><br />    * CM Crossroads (CMC Media)<br />    * Koders.com (Koders)<br />    * Krugle (Krugle)<br /><br />HALL OF FAME<br /><br />          * IBM developerWorks (IBM)
          <br/>
          <span style="color:red;">
            <a href="http://charles.javaeye.com/blog/64880#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 23 Mar 2007 11:14:55 +0800</pubDate>
        <link>http://charles.javaeye.com/blog/64880</link>
        <guid>http://charles.javaeye.com/blog/64880</guid>
      </item>
      <item>
        <title>Today(Mar.2007) joined XRuby team </title>
        <author>charles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://charles.javaeye.com">charles</a>&nbsp;
          链接：<a href="http://charles.javaeye.com/blog/58186" style="color:red;">http://charles.javaeye.com/blog/58186</a>&nbsp;
          发表时间: 2007年03月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          good message，XRuby is a ruby compiler that compiles ruby scripts to java bytecode
          <br/>
          <span style="color:red;">
            <a href="http://charles.javaeye.com/blog/58186#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 Mar 2007 12:37:38 +0800</pubDate>
        <link>http://charles.javaeye.com/blog/58186</link>
        <guid>http://charles.javaeye.com/blog/58186</guid>
      </item>
      <item>
        <title>你的灯还亮着吗?</title>
        <author>charles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://charles.javaeye.com">charles</a>&nbsp;
          链接：<a href="http://charles.javaeye.com/blog/53607" style="color:red;">http://charles.javaeye.com/blog/53607</a>&nbsp;
          发表时间: 2007年02月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div align="left">1,搞清谁(问题的对象)有问题.<br />
<hr size="2" width="100%" />
2,问题的本质是什么<br />
&nbsp; - 大多数问题其实就是你期望的东西和你体验的东西之间的差别.<br />
&nbsp; - 解决办法是要么改变期望,要么改变体验.<br />
<hr size="2" width="100%" />
3,不要把他们解决问题的方法误认为是问题的定义&mdash;特别是在你使用自己的解决方法时(要搞清楚问题的定义)<br />
<hr size="2" width="100%" />
4,如果你太轻易的解决了他们的问题,他们永远不会相信你真的解决了问题<br />
<hr size="2" width="100%" />
5,你永远都不能肯定你已经有了一个正确的定义,即使在问题已经解决之后,但永远不要放弃寻求它的努力<br />
<hr size="2" width="100%" />
6,不要过早的下结论,但是也不要忽略你的第一印象<br />
<hr size="2" width="100%" />
7,每种解决方法都会带来新的问题(问题不可被消灭,只会转嫁-使其变小)<br />
<hr size="2" width="100%" />
8,问题最难处理的部分地区恰恰是去意识到它们的存在<br />
<hr size="2" width="100%" />
9,如果在对问题的理解中,你想不出至少三种可能出错的地方,那么你并没有真正理解这个问题.<hr size="2" width="100%" />
</div>
<div align="center"> </div>
10,考虑我们要怎样改变问题的表述方式才能获得不同的解决<br />
<hr size="2" width="100%" />
11,一旦你用文字表述问题,请仔细推敲这些文字,以使这种表述在每个人的头脑都是一个意思.<br />
<hr size="2" width="100%" />
12,如果某人能够解决这个问题,但是他本人却并不会遇到这一问题时,那么你首先要做的就是让他感受到这个问题<br />
<hr size="2" width="100%" />
13,试试换过来指责你自己---即使只有一秒钟(问题的根源常常在你自己身上)<br />
<hr size="2" width="100%" />
14,问题的最终根源也许根本就不存在.(在问题解决者的山谷里,制造问题的人是国王)<br />
<hr size="2" width="100%" />
15,世上有两种人,一种人做事,另一种人给别人找事做.<br />
<hr size="2" width="100%" />
16, 问题有无解决的必要性请先回答:谁出的题?他想对我做什么?<br />
<hr size="2" width="100%" />
17,不管看上去如何,人们很少知道他们想要什么,直到你给了他们想要的东西.<br />
<hr size="2" width="100%" />
18,我们永远没有足够的时间来考虑我们是否真需要它,但是我们总有足够的时间来为之后悔.<br />
<hr size="2" width="100%" />
19,鱼总是最后一个看到水的. <br />
<hr size="2" width="100%" />
          <br/>
          <span style="color:red;">
            <a href="http://charles.javaeye.com/blog/53607#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 Feb 2007 22:45:55 +0800</pubDate>
        <link>http://charles.javaeye.com/blog/53607</link>
        <guid>http://charles.javaeye.com/blog/53607</guid>
      </item>
      <item>
        <title>Designing Learning</title>
        <author>charles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://charles.javaeye.com">charles</a>&nbsp;
          链接：<a href="http://charles.javaeye.com/blog/53143" style="color:red;">http://charles.javaeye.com/blog/53143</a>&nbsp;
          发表时间: 2007年02月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h1 class="article">Designing Learning</h1>
<h3 class="article">by Andy Hunt and Dave Thomas</h3>
<hr class="article" />
<p class="article">  <em>In our last column on StickyMinds,, we boldly stated that the two most fundamental activities in developing software are communication and learning. In this week's column, we'll focus on learning. As software development professionals, we're always learning--not just new technology, but the problem domain, the quirks of the users/clients, even the characteristics of the evolving system itself. That's a lot of learning--from many sources. But for such an important aspect of our profession, we tend to ignore it completely. Even for the traditional things we need to learn, such as new technology, we tend to learn accidentally and at the last minute (sometimes even later). Exercise your brain; take learning into your own hands. Doing so will benefit your skills and your career.</em>    </p>
<p class="article">  In order to be successful, we need to improve and take a more active role in our own learning whether we are working as developers, testers, or managers.    </p>
<p class="article">  As we mentioned in the last column, people at different skill levels have different needs when it comes to learning. Beginners need unambiguous, context-free rules, with no confusing reference to the larger picture. More advanced practitioners cannot work to rule, and must see the larger context and a holistic view.    </p>
<p class="article">  In addition, people have different learning styles--some prefer to read, others to hear a lecture, others to just wade in and play (also known as &quot;experiential learning&quot;). Oh, and before we even start learning, there's the small matter of trying to determine what you need to learn in the first place.    </p>
<h3>Create a plan</h3>
<p class="article">  In order to focus deliberately on your own learning, start with these three innocuous questions:   </p>
<ul>
    <li>What do you need to learn?</li>
    <li>How are you going to learn it?</li>
    <li>How will you know you're done?</li>
</ul>
<p class="article">  Let's take a closer look at each of these.   </p>
<h3>What do you need to learn? </h3>
<p class="article">  This is a much harder question than it first appears. If you are on a project moving to a new language or environment, then the answer might be pretty simple. But many times, what you really need to learn isn't so obvious.    </p>
<p class="article">  What's broken? What's lame? What are you guessing at that you really ought to know? What's missing in your knowledge portfolio, either for your current project or for your career in general? Besides obvious things such as a technology or a technique, think about less obvious things like, &quot;What are the characteristics of the system when placed under load?&quot; Make a list. Go on, grab a piece of paper or a keyboard and make a list. We'll wait right here.    </p>
<h3>How are you going to learn it?</h3>
<p class="article">  Okay, now you've got a list. For each topic that you've identified as relevant, you need to figure out how you're going to learn it. Unless you've picked all new topics and you're a complete beginner, you will have some experience with each one. Depending on how much experience you have in each topic, you'll have to approach each one differently.   </p>
<p class="article">  One size does not fit all, even for you! For topics in which you are a novice, you need to find very basic, rule-based, &quot;cookbook&quot;-style instruction, possibly cutting across different technologies. For instance, Greg Wilson's new book  <a href="http://pragmaticprogrammer.com//titles/gwd"><em>Data Crunching</em></a> gives a beginner's overview--and concrete recipes--using XML, SQL, plain text, and binary file handling.    </p>
<p class="article">  If you have more experience, you need to find something with more of a big-picture overview. For instance, if you're fluent in several programming languages, a simple overview of a new language's syntax and key features is probably enough to get you going.    </p>
<p class="article">  How do you learn best? If it's by reading, then go buy some books. If you need to hear it or attend a class, then start scouting the web for an appropriate conference, workshop, or other learning opportunity.    </p>
<h3>How will you know you're done?</h3>
<p class="article">  Finally, how do you know when you're done? In all things pragmatic, we need feedback to know when we're done. In this case, just setting a goal of &quot;learning xyz&quot; isn't sufficient. For instance, instead of saying you want to learn Ruby, set a concrete goal like you want to &quot;be able to write a web-based application that manages your to-do list in Ruby.&quot; Give yourself a timeline. For instance, write &quot;hello world&quot; on the first day, a small program with unit tests during the first week, and the big web-application at the end of the month.     </p>
<p class="article">  After achieving this milestone, re-evaluate and reiterate what else you need to learn. Learning is an open-ended activity, of course, so you're never really &quot;done.&quot; But if you can set some concrete, achievable milestones and meet them, you'll be in a good position to create the next set, and so on.    </p>
<p class="article">  You'll be learning a lot--deliberately, not by accident--and your skills and your career will be in much better shape.     </p>
<h3>About the Authors</h3>
<hr class="article" />
<p class="article">  Andy Hunt and Dave Thomas are partners in The Pragmatic Programmers, LLC, specializing in helping people find better ways to develop software. They helped author the now-famous Agile Manifesto, and speak internationally on new ways of producing software. From their best-selling book, The Pragmatic Programmer, to the new titles from their <a href="http://pragmaticprogrammer.com/bookshelf/index.html">Pragmatic Bookshelf</a> publishing company, Dave and Andy are there to help programmers stay on top of their game. Contact them via <a href="http://pragmaticprogrammer.com/contact.html">www.pragmaticprogrammer.com.</a> </p>
<p class="article"><br />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://charles.javaeye.com/blog/53143#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 Feb 2007 12:12:36 +0800</pubDate>
        <link>http://charles.javaeye.com/blog/53143</link>
        <guid>http://charles.javaeye.com/blog/53143</guid>
      </item>
      <item>
        <title>Ruby install for linux </title>
        <author>charles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://charles.javaeye.com">charles</a>&nbsp;
          链接：<a href="http://charles.javaeye.com/blog/52096" style="color:red;">http://charles.javaeye.com/blog/52096</a>&nbsp;
          发表时间: 2007年02月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ruby官方网站：<a href="http://www.ruby-lang.org/en/">http://www.ruby-lang.org/en/</a><br />
你可以在上面得到源代码，进行编译，自本文截止的最新版本为1.8.5(stable)，下载地址为:<a href="ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.5.tar.gz">ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.5.tar.gz</a><br />
<br />
这里推荐大家使用源码安装，因为这样可以得到最新的版本。<br />
安装ruby：<br />
$ tar -xvf&nbsp; ruby-1.8.5.tar.gz<br />
$ cd ruby-1.8.5<br />
$ ./configure<br />
$ make<br />
$ make install (run as root)<br />
<br />
记得ruby就不应该忘记gem，下载地址：<a href="http://rubyforge.org/frs/download.php/11289/rubygems-0.9.0.tgz">http://rubyforge.org/frs/download.php/11289/rubygems-0.9.0.tgz</a>这个时候的最新版本是：0.9.0<br />
gem安装很方便，gem是基于ruby-zlib的，所以先安装ruby-zlib(<a href="http://raa.ruby-lang.org/project/ruby-zlib">http://raa.ruby-lang.org/project/ruby-zlib</a>)，这一步不一定是必须的，这和发行版本有一定的关系<br />
安装ruby-zlib(下载地址：<a href="http://www.blue.sky.or.jp/atelier/ruby/ruby-zlib-0.6.0.tar.gz">http://www.blue.sky.or.jp/atelier/ruby/ruby-zlib-0.6.0.tar.gz</a>)，解压<br />
$ ruby extconf.rb<br />
$ make<br />
$ make install (run as root)<br />
<br />
这样安装gem就没有问题了，安装如下，进入gem的目录：<br />
$sudo ruby setup.rb<br />
就可以进行安装，加入想要知道更多的信息，请参考：<a href="http://docs.rubygems.org/read/chapter/3">http://docs.rubygems.org/read/chapter/3</a><br />
<br />
这样我们就大致完成了ruby的安装，有了ruby，自然要用rails（也许是比较偏激的看法）：<br />
$gem install rails<br />
<br />
一直谈到的是web，其实出了web之外ruby也可以做desktop，并且以及有人这么做了，fxri就是最好的例子,还有一些项目，比如ruby- gnome2等，在windows我们可以感觉到fxri有多慢，linux情况会有所改变，然而，ruby毕竟是解释型，桌面领域还有待发展。<br />
<br />
个人认为ruby在桌面的开发模式可以是：开发前端。使用更高效的语言开发基于CLI的实用程序，由于基于CLI的实用程序抛开了GUI的困扰，使得质量和性能都会有一定的提高，然后用ruby写GUI界面作为此程序的前端。
          <br/>
          <span style="color:red;">
            <a href="http://charles.javaeye.com/blog/52096#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 04 Feb 2007 11:54:58 +0800</pubDate>
        <link>http://charles.javaeye.com/blog/52096</link>
        <guid>http://charles.javaeye.com/blog/52096</guid>
      </item>
      <item>
        <title>软件设计中的原则（GRASP）</title>
        <author>charles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://charles.javaeye.com">charles</a>&nbsp;
          链接：<a href="http://charles.javaeye.com/blog/51151" style="color:red;">http://charles.javaeye.com/blog/51151</a>&nbsp;
          发表时间: 2007年01月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span lang="EN-US"><span style=""> </span></span><span style="font-family: 宋体;">这里说的几个软件模式是属于原则层次一级的，比</span><span lang="EN-US">GoF</span><span style="font-family: 宋体;">等软件设计模式高一层。遵循这些原则可以使我们设计出来的软件有更好的可复用性和可维护性，同样</span><span lang="EN-US">GoF</span><span style="font-family: 宋体;">等软件设计模式也是遵循这一原则的。</span>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 5.15pt;"><span lang="EN-US"><span style="">     </span></span><span style="font-family: 宋体;">下边的条列只是简单的介绍，以便忘记了偶尔过来游览一下，详细的介绍请参阅：《</span><span lang="EN-US">Java</span><span style="font-family: 宋体;">模式》、《</span><span lang="EN-US">UML</span><span style="font-family: 宋体;">和模式应用</span><span lang="EN-US">-</span><span style="font-family: 宋体;">面向对象分析与设计导论》</span></p>
<span lang="EN-US" style=""><span style="">      </span></span>
<ul>
    <li><span lang="EN-US">GRASP</span><span style="font-family: 宋体;">模式</span></li>
</ul>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 9pt; text-indent: 12pt;"><span lang="EN-US">GRASP</span><span style="font-family: 宋体;">是</span><span lang="EN-US">General Responsibility Assignment Software Pattern(</span><span style="font-family: 宋体;">通用指责分配软件模式</span><span lang="EN-US">)</span><span style="font-family: 宋体;">的缩写。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -12pt;"><span lang="EN-US" style=""><span style="">   1)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span></span><span style="font-family: 宋体;">专家模式</span><span lang="EN-US">(Expert)</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-family: 宋体;">解决方案：将职责分配给具有履行职责所需要的信息的类</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-family: 宋体;">通俗点就是：该干嘛干嘛去，别管别人的闲事或者我的职责就是搞这个，别的事不管。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt;"><span style="font-family: 宋体;">举个简单的例子，如果有一个类是专门处理字符串相关的类，那么这个类只能有字符串处理相关的方法，而不要将日期处理的方法加进来。也就是提高软件高内聚一种原则。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -12pt;"><span lang="EN-US" style=""><span style="">  2)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span></span><span style="font-family: 宋体;">创建者</span><span lang="EN-US">(Creator)</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-family: 宋体;">解决方案：将创建一个类</span><span lang="EN-US">A</span><span style="font-family: 宋体;">的实例的职责指派给类</span><span lang="EN-US">B</span><span style="font-family: 宋体;">的实例，如果下列条件满足的话：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;"><span lang="EN-US" style=""><span style="">a)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span></span><span lang="EN-US">B</span><span style="font-family: 宋体;">聚合了</span><span lang="EN-US">A</span><span style="font-family: 宋体;">对象</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;"><span lang="EN-US" style=""><span style="">b)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">        </span></span></span><span lang="EN-US">B</span><span style="font-family: 宋体;">包含了</span><span lang="EN-US">A</span><span style="font-family: 宋体;">对象</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;"><span lang="EN-US" style=""><span style="">c)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">        </span></span></span><span lang="EN-US">B</span><span style="font-family: 宋体;">纪录了</span><span lang="EN-US">A</span><span style="font-family: 宋体;">对象的实例</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;"><span lang="EN-US" style=""><span style="">d)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">        </span></span></span><span lang="EN-US">B</span><span style="font-family: 宋体;">要经常使用</span><span lang="EN-US">A</span><span style="font-family: 宋体;">对象</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;"><span lang="EN-US" style=""><span style="">e)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span></span><span style="font-family: 宋体;">当</span><span lang="EN-US">A</span><span style="font-family: 宋体;">的实例被创建时，</span><span lang="EN-US">B</span><span style="font-family: 宋体;">具有要传递给</span><span lang="EN-US">A</span><span style="font-family: 宋体;">的初始化数据</span><span lang="EN-US">(</span><span style="font-family: 宋体;">也就是说</span><span lang="EN-US">B</span><span style="font-family: 宋体;">是创建</span><span lang="EN-US">A</span><span style="font-family: 宋体;">的实例这项任务的信息专家</span><span lang="EN-US">)</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;"><span lang="EN-US" style=""><span style="">f)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span></span><span lang="EN-US">B</span><span style="font-family: 宋体;">是</span><span lang="EN-US">A</span><span style="font-family: 宋体;">对象的创建者</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-family: 宋体;">如果以上条件中不止一条成立的话，那么最好让</span><span lang="EN-US">B</span><span style="font-family: 宋体;">聚集或包含</span><span lang="EN-US">A</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-family: 宋体;">通俗点就是：我要用你所以我来创建你，请不要让别人创建你</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt;"><span style="font-family: 宋体;">这个模式是支持低耦合度原则的一个体现</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -12pt;"><span lang="EN-US" style=""><span style="">  3)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span></span><span style="font-family: 宋体;">高聚合度或高内聚</span><span lang="EN-US">(High Cohesion)</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-family: 宋体;">解决方案：分配一个职责的时候要保持类的高聚合度</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt;"><span style="font-family: 宋体;">聚合度或内聚度</span><span lang="EN-US">(cohesion)</span><span style="font-family: 宋体;">是一个类中的各个职责之间相关程度和集中程度的度量。一个具有高度相关职责的类并且这个类所能完成的工作量不是特别巨大，那么他就是具有高聚合度。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -12pt;"><span lang="EN-US" style=""><span style="">  4)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span></span><span style="font-family: 宋体;">低耦合度或低耦合</span><span lang="EN-US">(Low Coupling)</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-family: 宋体;">解决方案：在分配一个职责时要使保持低耦合度。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-family: 宋体;">耦合度</span><span lang="EN-US">(coupling)</span><span style="font-family: 宋体;">是一个类与其它类关联、知道其他类的信息或者依赖其他类的强弱程度的度量。一个具有低</span><span lang="EN-US">(</span><span style="font-family: 宋体;">弱</span><span lang="EN-US">)</span><span style="font-family: 宋体;">耦合度的类不依赖于太多的其他类。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -12pt;"><span lang="EN-US" style=""><span style="">  5)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span></span><span style="font-family: 宋体;">控制者</span><span lang="EN-US">(Controller)</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-family: 宋体;">解决方案：将处理系统事件消息的职责分派给代表下列事物的类：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;"><span lang="EN-US" style=""><span style="">a)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span></span><span style="font-family: 宋体;">代表整个&ldquo;系统&rdquo;的类（虚包控制者）</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;"><span lang="EN-US" style=""><span style="">b)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">        </span></span></span><span style="font-family: 宋体;">代表整个企业或组织的类（虚包控制者）</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;"><span lang="EN-US" style=""><span style="">c)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">        </span></span></span><span style="font-family: 宋体;">代表真实世界中参与职责（角色控制者）的主动对象类（例，一个人的角色）</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt;"><span lang="EN-US" style=""><span style="">d)<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">        </span></span></span><span style="font-family: 宋体;">代表一个用况中所有事件的人工处理者类，通常用&ldquo;</span><span lang="EN-US">&lt;</span><span style="font-family: 宋体;">用例名</span><span lang="EN-US">&gt;</span><span style="font-family: 宋体;">处理者&rdquo;的方式命名（用例控制者）</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-family: 宋体;">这是一个控制者角色职责分配的原则，就是哪些控制应该分派给哪个角色。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -9pt;"><span lang="EN-US" style=""><span style="">  6)</span></span><span style="font-family: 宋体;">多态</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-family: 宋体;">当相关的可选择的方法或行为随着类型变化时，将行为的职责</span><span lang="EN-US">-</span><span style="font-family: 宋体;">使用多态的操作</span><span lang="EN-US">-</span><span style="font-family: 宋体;">分配给那些行为变化的类型</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt;"><span style="font-family: 宋体;">也就是说尽量对抽象层编程，用多态的方法来判断具体应该使用那个类，而不是用</span><span lang="EN-US">if instanceof </span><span style="font-family: 宋体;">来判断该类是什么接来执行什么。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -9pt;"><span lang="EN-US" style=""><span style="">  7)</span></span><span style="font-family: 宋体;">纯虚构</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><span style="font-family: 宋体;">一个纯虚构意味着虚构某些事物，而不是到了迫不得已我们才这样做。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><span style="font-family: 宋体;">例，我们的</span><span lang="EN-US">Sale</span><span style="font-family: 宋体;">类的数据要存入数据库，但是他必须和数据库接口相连接，如果将接口连接放入</span><span lang="EN-US">Sale</span><span style="font-family: 宋体;">类中势必增加该类的耦合度，所以我们可以虚构一个类来处理与数据库接口连接的问题。这个类就是我们虚构出来的一个事物。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -9pt;"><span lang="EN-US" style=""><span style="">  8)</span></span><span style="font-family: 宋体;">中介者</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;"><span style="font-family: 宋体;">将职责分配给一个中间对象以便在其他构件或服务之间仲裁，这样这些构件或服务没有被直接耦合。这个中间对象</span><span lang="EN-US">(intermediary)</span><span style="font-family: 宋体;">在其他构件或服务间创建一个中介者</span><span lang="EN-US">(Indirection)</span><span style="font-family: 宋体;">。这个中间对象也就事</span><span lang="EN-US">7)</span><span style="font-family: 宋体;">中的纯虚构。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -9pt;"><span lang="EN-US" style=""><span style="">  9)</span></span><span style="font-family: 宋体;">不要和陌生人讲话</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: 23.95pt;"><span style="font-family: 宋体;">分配职责给一个客户端的直接对象以使它与一个间接对象进行协作，这样客户端无需知道这个间接对象。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: 23.95pt;"><span style="font-family: 宋体;">这个模式</span><span lang="EN-US">-</span><span style="font-family: 宋体;">也被叫做</span><span lang="EN-US">(Demeter)</span><span style="font-family: 宋体;">准则。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="">       </span></span><span style="font-family: 宋体;">通俗点就是：只与你直接的朋友们通信</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="">                            </span></span><span style="font-family: 宋体;">不要跟&ldquo;陌生人&rdquo;说话</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 63pt; text-indent: 21pt;"><span style="font-family: 宋体;">每个软件单位对其他的单位都只有最少的知识，而且局限于那些与本单位密切相关的软件单位</span></p>
<ul>
    <li><span lang="EN-US" style=""><span style="">  2.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">   </span></span></span><span style="font-family: 宋体;">其他设计原则</span></li>
</ul>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -9pt;"><span lang="EN-US" style=""><span style="">  1)</span></span><span style="font-family: 宋体;">&ldquo;开</span><span lang="EN-US">-</span><span style="font-family: 宋体;">闭&rdquo;原则（</span><span lang="EN-US">Open-Closed Principle</span><span style="font-family: 宋体;">，或者</span><span lang="EN-US">OCP</span><span style="font-family: 宋体;">）</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-family: 宋体;">一个软件实体应当对扩展开放，对修改关闭。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt;"><span style="font-family: 宋体;">意思就是在设计一个模块的时候，应当使这个模块在不被修改的前提下被扩展。换言之，应当可以在不修改代码的情况下改变这个模块的行为。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -9pt;"><span lang="EN-US" style=""><span style="">  2)</span></span><span style="font-family: 宋体;">里氏代换原则（</span><span lang="EN-US">Liskov Substitution Principle, </span><span style="font-family: 宋体;">或者</span><span lang="EN-US">LSP</span><span style="font-family: 宋体;">）</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-family: 宋体;">这个就是尽量用多态的方法编程，也就是</span><span lang="EN-US">GRASP</span><span style="font-family: 宋体;">模式中的多态。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -9pt;"><span lang="EN-US" style=""><span style="">  3)</span></span><span style="font-family: 宋体;">依赖倒转原则（</span><span lang="EN-US">Dependency Inversion Principle, </span><span style="font-family: 宋体;">或者</span><span lang="EN-US">DIP</span><span style="font-family: 宋体;">）</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-family: 宋体;">依赖倒转原则讲的是：要依赖于抽象，不要依赖于具体</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-family: 宋体;">就是说我们尽量在抽象层进行控制编程，要针对接口编程，不要针对实现编程。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -9pt;"><span lang="EN-US" style=""><span style="">  4)</span></span><span style="font-family: 宋体;">接口隔离原则（</span><span lang="EN-US">Interface Segregation Principle, </span><span style="font-family: 宋体;">或者</span><span lang="EN-US">ISP</span><span style="font-family: 宋体;">）</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt;"><span style="font-family: 宋体;">使用多个专门的接口比使用单一的总接口要好。也就是，从一个客户类的角度来讲：一个类对另外一个类的依赖性应当是建立在最小的接口上的。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -9pt;"><span lang="EN-US" style=""><span style="">  5)</span></span><span style="font-family: 宋体;">组合</span><span lang="EN-US">/</span><span style="font-family: 宋体;">聚合复用原则（</span><span lang="EN-US">Composition/Aggregation Principle, </span><span style="font-family: 宋体;">或者</span><span lang="EN-US">CARP</span><span style="font-family: 宋体;">）</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt;"><span style="font-family: 宋体;">又叫合成复用原则。原则就是在一个新的对象里面使用一些已有的对象，使之成为新对象的一部分：新的对象通过向这些对象的委派达到复用已有功能的目的。也就是，要尽量使用类的合成复用，尽量不要使用继承</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -9pt;"><span lang="EN-US" style=""><span style="">  6)变与不变的分离<br />
更扩展一步,就是将不同变化的组件进行隔离.最简单的例子就是javabean中的存取器。它隔离了不变的接口和变化的内部属性。这方面体现最好的个人觉得就是eclipse，通过变化的插件，eclipse可以用来实现任何功能。</span></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://charles.javaeye.com/blog/51151#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 29 Jan 2007 22:32:05 +0800</pubDate>
        <link>http://charles.javaeye.com/blog/51151</link>
        <guid>http://charles.javaeye.com/blog/51151</guid>
      </item>
      <item>
        <title>语言的力量</title>
        <author>charles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://charles.javaeye.com">charles</a>&nbsp;
          链接：<a href="http://charles.javaeye.com/blog/50495" style="color:red;">http://charles.javaeye.com/blog/50495</a>&nbsp;
          发表时间: 2007年01月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          语言是交流基础，那么怎么让沟通更有谐和力，那就要加强语言的表达能力，一件事可以用语言来描述，怎么才能说到问题的本质，和不同人的交往怎么才能达到融洽的效果，都要靠语言的说服力，这是一种长期培养了锻炼出来的能力。
          <br/>
          <span style="color:red;">
            <a href="http://charles.javaeye.com/blog/50495#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 25 Jan 2007 23:24:25 +0800</pubDate>
        <link>http://charles.javaeye.com/blog/50495</link>
        <guid>http://charles.javaeye.com/blog/50495</guid>
      </item>
      <item>
        <title>SpringSide开发实战（四）：打通数据持久层的任督二脉</title>
        <author>charles</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://charles.javaeye.com">charles</a>&nbsp;
          链接：<a href="http://charles.javaeye.com/blog/48210" style="color:red;">http://charles.javaeye.com/blog/48210</a>&nbsp;
          发表时间: 2007年01月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="postbody">
<p>在这里，将创建一个简化的用户管理模块，演示怎样利用SpringSide提供的数据持久层的功能，包括怎样通过Hibernate的Annotation来配置多对一映射和多对多映射。</p>
<p>大 家都知道，现在最流行用户管理模型的是RBAC，也就是基于角色的访问控制模型，在这种模型中，可以划分多个层次，如用户-角色-资源、用户-角色-权限 -资源、用户-角色-角色组-权限-资源、用户-角色-角色组-权限-操作-资源等等，因此，想要创建一个完善而复杂的用户管理模块，是相当具有难度的。 在Web2.0时代，有一个很重要的开发思想，那就是先让程序跑起来，以后再逐步添加复杂的功能。因此，在这里只创建一个简化的用户管理模块。</p>
<p>所谓简化，它具有如下几个特点：</p>
<p>1.在认证方式中，选择基于用户名和密码的认证，用户需要提供用户名、密码和昵称，用户名和昵称都要求不能重复，用户名不能包含中文，且不能够被修改，昵称可以为中文，也可以被修改。密码使用MD5加密。</p>
<p>2.不包含用户的真实信息，如姓名、年龄、性别、职业、地址、邮编等等，因为如果包含这些字段，那么还需要包含更多的额外字段来让用户决定是否公开这些信息，因此，去掉这些东西，可以简化开发过程，让网站能够尽快的跑起来。</p>
<p>3.联系方式只需要用户提供它的电子邮箱和QQ号码。</p>
<p>4.如果用户密码丢失，可以通过密码提示问题找回，随机产生的新密码会发到用户的电子邮箱。</p>
<p>5.省略用户的个性化设置，如个性化签名、自定义头像等。</p>
<p>6.要能够记录用户的注册时间和最后登录时间。</p>
<p>7.要具有完善的积分和排名机制。</p>
<p>8.用户删除的时候不做物理删除，只标记为该用户不可用。</p>
<p>8. 具有简化的角色和权限管理机制，这里的简化主要有以下几点：每个用户只能属于一个角色，即多对一关系，而不是传统的多对多关系；角色不需要分组；没有专门 的资源抽象层；在角色表中只使用一个字段来表示该角色具有的权限，权限以数字表示，以逗号分开，如&ldquo;1,2&rdquo;，&ldquo;1,3,15&rdquo;等等。</p>
<p>9.用户可以创建群和加入群，为了简化，群的创始人即为管理员，并不可改变，用户加入群需要管理员批准，一个用户可以加如多个群，即多对多关系。</p>
<p>从 上面的描述可以看出，一个简化的用户管理系统最少需要三个表，即users，roles和groups表，其中users和roles之间为多对一映射， users和groups之间为多对多映射，为了实现多对多映射，并且用户加入群的时候需要管理员批准，需要一个中间表users_groups。下面是 在MySQL中创建数据表的语句。</p>
<p>创建用户表：</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"> 				<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /> 				<span style="color: rgb(0, 0, 255);">create</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">table</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;users(<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />id&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">int</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;auto_increment&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">primary</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">key</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />name&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">varchar</span> 				<span style="color: rgb(0, 0, 0);">(</span> 				<span style="font-weight: bold; color: rgb(128, 0, 0);">20</span> 				<span style="color: rgb(0, 0, 0);">)&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />password&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">char</span> 				<span style="color: rgb(0, 0, 0);">(</span> 				<span style="font-weight: bold; color: rgb(128, 0, 0);">32</span> 				<span style="color: rgb(0, 0, 0);">)&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />monicker&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">varchar</span> 				<span style="color: rgb(0, 0, 0);">(</span> 				<span style="font-weight: bold; color: rgb(128, 0, 0);">30</span> 				<span style="color: rgb(0, 0, 0);">)&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />question&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">varchar</span> 				<span style="color: rgb(0, 0, 0);">(</span> 				<span style="font-weight: bold; color: rgb(128, 0, 0);">30</span> 				<span style="color: rgb(0, 0, 0);">)&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />answer&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">varchar</span> 				<span style="color: rgb(0, 0, 0);">(</span> 				<span style="font-weight: bold; color: rgb(128, 0, 0);">30</span> 				<span style="color: rgb(0, 0, 0);">)&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />email&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">varchar</span> 				<span style="color: rgb(0, 0, 0);">(</span> 				<span style="font-weight: bold; color: rgb(128, 0, 0);">40</span> 				<span style="color: rgb(0, 0, 0);">)&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />qq&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">varchar</span> 				<span style="color: rgb(0, 0, 0);">(</span> 				<span style="font-weight: bold; color: rgb(128, 0, 0);">12</span> 				<span style="color: rgb(0, 0, 0);">)&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />roleid&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">int</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />score&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">int</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">default</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(255, 0, 0);">'</span> 				<span style="color: rgb(255, 0, 0);">0</span> 				<span style="color: rgb(255, 0, 0);">'</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />regtime&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">timestamp</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">default</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(255, 0, 255);">CURRENT_TIMESTAMP</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />logintime&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">timestamp</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">default</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(255, 0, 0);">'</span> 				<span style="color: rgb(255, 0, 0);">2007-01-01&nbsp;00:00:00</span> 				<span style="color: rgb(255, 0, 0);">'</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />isdeleted&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">varchar</span> 				<span style="color: rgb(0, 0, 0);">(</span> 				<span style="font-weight: bold; color: rgb(128, 0, 0);">2</span> 				<span style="color: rgb(0, 0, 0);">)&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">default</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(255, 0, 0);">'</span> 				<span style="color: rgb(255, 0, 0);">0</span> 				<span style="color: rgb(255, 0, 0);">'</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span> 				<span style="color: rgb(0, 0, 255);">index</span> 				<span style="color: rgb(0, 0, 0);">(username),<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span> 				<span style="color: rgb(0, 0, 255);">index</span> 				<span style="color: rgb(0, 0, 0);">(monicker));</span> 		</div>
<p> 				<br />
为了加快查找用户的速度，在用户名和昵称列上创建了索引。</p>
<p>创建角色表：</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"> 				<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /> 				<span style="color: rgb(0, 0, 255);">create</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">table</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;roles(<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />id&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">int</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;auto_increment&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">primary</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">key</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />name&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">varchar</span> 				<span style="color: rgb(0, 0, 0);">(</span> 				<span style="font-weight: bold; color: rgb(128, 0, 0);">20</span> 				<span style="color: rgb(0, 0, 0);">)&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />privilegesFlag&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">varchar</span> 				<span style="color: rgb(0, 0, 0);">(</span> 				<span style="font-weight: bold; color: rgb(128, 0, 0);">255</span> 				<span style="color: rgb(0, 0, 0);">),<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span> 				<span style="color: rgb(0, 0, 255);">index</span> 				<span style="color: rgb(0, 0, 0);">(rolename)<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span> 		</div>
<p> 				<br />
创建群组表：</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"> 				<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /> 				<span style="color: rgb(0, 0, 255);">create</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">table</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;groups(<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />id&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">int</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;auto_increment&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">primary</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">key</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />name&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">varchar</span> 				<span style="color: rgb(0, 0, 0);">(</span> 				<span style="font-weight: bold; color: rgb(128, 0, 0);">40</span> 				<span style="color: rgb(0, 0, 0);">)&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />creatorid&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">int</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />createtime&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">timestamp</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">default</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(255, 0, 255);">CURRENT_TIMESTAMP</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />isdeleted&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">varchar</span> 				<span style="color: rgb(0, 0, 0);">(</span> 				<span style="font-weight: bold; color: rgb(128, 0, 0);">2</span> 				<span style="color: rgb(0, 0, 0);">)&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">default</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(255, 0, 0);">'</span> 				<span style="color: rgb(255, 0, 0);">0</span> 				<span style="color: rgb(255, 0, 0);">'</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span> 				<span style="color: rgb(0, 0, 255);">index</span> 				<span style="color: rgb(0, 0, 0);">(groupname));<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span> 		</div>
<p> 				<br />
creatorid代表组的创始人，同时也是管理员，这里同样设置群组不做物理删除。</p>
<p>创建用户群组多对多映射辅助表：</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"> 				<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /> 				<span style="color: rgb(0, 0, 255);">create</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">table</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;users_groups(<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />id&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">int</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;auto_increment&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">primary</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">key</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />userid&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">int</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />groupid&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">int</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(128, 128, 128);">not</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">null</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />jointime&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">timestamp</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />status&nbsp;</span> 				<span style="font-weight: bold; color: rgb(0, 0, 0);">tinyint</span> 				<span style="color: rgb(0, 0, 0);">,<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span> 				<span style="color: rgb(0, 0, 255);">index</span> 				<span style="color: rgb(0, 0, 0);">(userid),<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span> 				<span style="color: rgb(0, 0, 255);">index</span> 				<span style="color: rgb(0, 0, 0);">(groupid)<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />);</span> 		</div>
<p> 				<br />
其中status列代表用户是否通过了管理员的批准，为了加快查找速度，在userid和groupid列上建立索引。</p>
<p>设计完数据库，就该设计领域对象了，领域对象的设计方法为先设计简单的POJO，然后再在POJO上添加Hibernate Annotation来配置映射关系。在进行Annotation配置的时候，可以从以下几个方面进行思考。</p>
<p>1、使用什么样的数据类型映射数据库中的列类型？<br />
2、对象之间是一对一、一对多还是多对多关系？<br />
3、关联的对象之间哪一个作为主控方？<br />
4、对象之间的关联是单向的还是双向的？</p>
<p>首 先来看看users和roles之间的关系，考虑到加载一个用户数据的时候，往往同时需要知道他属于哪个角色，而加载一个角色的时候，就没有必要知道它管 理哪些用户了，因此，它们是简单的单向关系，是多对一映射。当出现多对一映射的时候，永远都应该选择多的这一方作为主控方，道理很简单，打个比方，让一个 国家元首记住全国人民的名字基本是不可能的，而让全国人民记住国家元首的名字就很简单了。因此，这里User作为主控方，Role作为被控方。</p>
<p>再 来看看数据类型的映射，对于简单的int、varchar这样的就不用多说了。而日期时间类型的映射是一个重点，可以看到，前面的数据库创建语句中，所有 需要时间的地方都使用了timestamp列类型，使用timestamp列类型的唯一目的就是为了能够使用default CURRENT_TIMESTAMP语句，使用date和datetime类型就不行，在MySQL中，timestamp只能表示从'1970-01- 01 00:00:00'到2037年的范围。</p>
<p>MySQL中的timestamp和java.sql.Timestamp表现不一 致，在MySQL中，timestamp和datetime类型精度是一样的，都只能储存到整数秒，而timestamp比datetime能表示的时间 范围要小得多，在Java中，java.util.Date和MySQL的timestamp的精度是一致的，只能储存到整数秒，而 java.sql.Timestamp还保存毫微秒，因此建议使用java.util.Date来映射timestamp列，使用 java.sql.Timestamp只是浪费。</p>
<p>MySQL和Java在时间上面还有一个冲突，那就是MySQL支持全零的时间， 如'0000-00-00 00:00:00'，而Java不支持，因此如果在定义users表的logintime列时使用logintime timestamp not null default '0000-00-00 00:00:00'，那么在使用Hibernate来获取User对象的时候就会出错，所以在创建数据库的时候要选择一个合法的默认时间，如'2007- 01-01 00:00:00'。</p>
<p>下面请看User.java的代码：</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"> 				<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /> 				<span style="color: rgb(0, 0, 255);">package</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;com.xkland.domain;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span> 				<span style="color: rgb(0, 0, 255);">import</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;java.io.Serializable;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span> 				<span style="color: rgb(0, 0, 255);">import</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;java.util.Date;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span> 				<span style="color: rgb(0, 0, 255);">import</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;org.springside.core.dao.extend.Undeletable;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span> 				<span style="color: rgb(0, 0, 255);">import</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;org.hibernate.annotations.Cache;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span> 				<span style="color: rgb(0, 0, 255);">import</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;org.hibernate.annotations.CacheConcurrencyStrategy;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span> 				<span style="color: rgb(0, 0, 255);">import</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;javax.persistence.</span> 				<span style="color: rgb(0, 0, 0);">*</span> 				<span style="color: rgb(0, 0, 0);">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />@Entity<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />@Table(name</span> 				<span style="color: rgb(0, 0, 0);">=</span> 				<span style="color: rgb(0, 0, 0);">&quot;</span> 				<span style="color: rgb(0, 0, 0);">users</span> 				<span style="color: rgb(0, 0, 0);">&quot;</span> 				<span style="color: rgb(0, 0, 0);">)<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />@Undeletable(status</span> 				<span style="color: rgb(0, 0, 0);">=</span> 				<span style="color: rgb(0, 0, 0);">&quot;</span> 				<span style="color: rgb(0, 0, 0);">isDeleted</span> 				<span style="color: rgb(0, 0, 0);">&quot;</span> 				<span style="color: rgb(0, 0, 0);">)<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_363_2527_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_363_2527_Open_Text.style.display='none'; Codehighlighter1_363_2527_Closed_Image.style.display='inline'; Codehighlighter1_363_2527_Closed_Text.style.display='inline';" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_363_2527_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_363_2527_Closed_Text.style.display='none'; Codehighlighter1_363_2527_Open_Image.style.display='inline'; Codehighlighter1_363_2527_Open_Text.style.display='inline';" alt="" style="display: none;" /></span> 				<span style="color: rgb(0, 0, 255);">public</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">class</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;User&nbsp;</span> 				<span style="color: rgb(0, 0, 255);">implements</span> 				<span style="color: rgb(0, 0, 0);">&nbsp;Serializable&nbsp;</span> 				<span id="Codehighlighter1_363_2527_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"> 						<img src="http://www.blogjava.net/Images/dot.gif" alt="" /> 				</span> 				<span id="Codehighlighter1_363_2527_Open_Text"> 						<span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">private</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;Integer&nbsp;id;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">private</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;name;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">private</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;password;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">private</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;monicker;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">private</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;question;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">private</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;answer;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">private</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;email;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">private</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;qq;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">private</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;Role&nbsp;role;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">private</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;Integer&nbsp;score;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">private</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;Date&nbsp;regTime;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">private</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;Date&nbsp;loginTime;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">private</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;Byte&nbsp;isDeleted;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;@Id<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;@GeneratedValue(strategy&nbsp;</span> 						<span style="color: rgb(0, 0, 0);">=</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;GenerationType.AUTO)<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_750_766_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_750_766_Open_Text.style.display='none'; Codehighlighter1_750_766_Closed_Image.style.display='inline'; Codehighlighter1_750_766_Closed_Text.style.display='inline';" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_750_766_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_750_766_Closed_Text.style.display='none'; Codehighlighter1_750_766_Open_Image.style.display='inline'; Codehighlighter1_750_766_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">public</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;Integer&nbsp;getId()&nbsp;</span> 						<span id="Codehighlighter1_750_766_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"> 								<img src="http://www.blogjava.net/Images/dot.gif" alt="" /> 						</span> 						<span id="Codehighlighter1_750_766_Open_Text"> 								<span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span> 								<span style="color: rgb(0, 0, 255);">return</span> 								<span style="color: rgb(0, 0, 0);">&nbsp;id;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;}</span> 						</span> 						<span style="color: rgb(0, 0, 0);"> 								<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_799_818_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_799_818_Open_Text.style.display='none'; Codehighlighter1_799_818_Closed_Image.style.display='inline'; Codehighlighter1_799_818_Closed_Text.style.display='inline';" alt="" /> 								<img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_799_818_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_799_818_Closed_Text.style.display='none'; Codehighlighter1_799_818_Open_Image.style.display='inline'; Codehighlighter1_799_818_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">public</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">void</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;setId(Integer&nbsp;id)&nbsp;</span> 						<span id="Codehighlighter1_799_818_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"> 								<img src="http://www.blogjava.net/Images/dot.gif" alt="" /> 						</span> 						<span id="Codehighlighter1_799_818_Open_Text"> 								<span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span> 								<span style="color: rgb(0, 0, 255);">this</span> 								<span style="color: rgb(0, 0, 0);">.id&nbsp;</span> 								<span style="color: rgb(0, 0, 0);">=</span> 								<span style="color: rgb(0, 0, 0);">&nbsp;id;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;}</span> 						</span> 						<span style="color: rgb(0, 0, 0);"> 								<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_847_865_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_847_865_Open_Text.style.display='none'; Codehighlighter1_847_865_Closed_Image.style.display='inline'; Codehighlighter1_847_865_Closed_Text.style.display='inline';" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_847_865_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_847_865_Closed_Text.style.display='none'; Codehighlighter1_847_865_Open_Image.style.display='inline'; Codehighlighter1_847_865_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">public</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;getName()&nbsp;</span> 						<span id="Codehighlighter1_847_865_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"> 								<img src="http://www.blogjava.net/Images/dot.gif" alt="" /> 						</span> 						<span id="Codehighlighter1_847_865_Open_Text"> 								<span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span> 								<span style="color: rgb(0, 0, 255);">return</span> 								<span style="color: rgb(0, 0, 0);">&nbsp;name;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;}</span> 						</span> 						<span style="color: rgb(0, 0, 0);"> 								<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_901_924_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_901_924_Open_Text.style.display='none'; Codehighlighter1_901_924_Closed_Image.style.display='inline'; Codehighlighter1_901_924_Closed_Text.style.display='inline';" alt="" /> 								<img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_901_924_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_901_924_Closed_Text.style.display='none'; Codehighlighter1_901_924_Open_Image.style.display='inline'; Codehighlighter1_901_924_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">public</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">void</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;setName(String&nbsp;name)&nbsp;</span> 						<span id="Codehighlighter1_901_924_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"> 								<img src="http://www.blogjava.net/Images/dot.gif" alt="" /> 						</span> 						<span id="Codehighlighter1_901_924_Open_Text"> 								<span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span> 								<span style="color: rgb(0, 0, 255);">this</span> 								<span style="color: rgb(0, 0, 0);">.name&nbsp;</span> 								<span style="color: rgb(0, 0, 0);">=</span> 								<span style="color: rgb(0, 0, 0);">&nbsp;name;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;}</span> 						</span> 						<span style="color: rgb(0, 0, 0);"> 								<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_957_979_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_957_979_Open_Text.style.display='none'; Codehighlighter1_957_979_Closed_Image.style.display='inline'; Codehighlighter1_957_979_Closed_Text.style.display='inline';" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_957_979_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_957_979_Closed_Text.style.display='none'; Codehighlighter1_957_979_Open_Image.style.display='inline'; Codehighlighter1_957_979_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">public</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;getPassword()&nbsp;</span> 						<span id="Codehighlighter1_957_979_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"> 								<img src="http://www.blogjava.net/Images/dot.gif" alt="" /> 						</span> 						<span id="Codehighlighter1_957_979_Open_Text"> 								<span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span> 								<span style="color: rgb(0, 0, 255);">return</span> 								<span style="color: rgb(0, 0, 0);">&nbsp;password;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;}</span> 						</span> 						<span style="color: rgb(0, 0, 0);"> 								<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1023_1054_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1023_1054_Open_Text.style.display='none'; Codehighlighter1_1023_1054_Closed_Image.style.display='inline'; Codehighlighter1_1023_1054_Closed_Text.style.display='inline';" alt="" /> 								<img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1023_1054_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1023_1054_Closed_Text.style.display='none'; Codehighlighter1_1023_1054_Open_Image.style.display='inline'; Codehighlighter1_1023_1054_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">public</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">void</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;setPassword(String&nbsp;password)&nbsp;</span> 						<span id="Codehighlighter1_1023_1054_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"> 								<img src="http://www.blogjava.net/Images/dot.gif" alt="" /> 						</span> 						<span id="Codehighlighter1_1023_1054_Open_Text"> 								<span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span> 								<span style="color: rgb(0, 0, 255);">this</span> 								<span style="color: rgb(0, 0, 0);">.password&nbsp;</span> 								<span style="color: rgb(0, 0, 0);">=</span> 								<span style="color: rgb(0, 0, 0);">&nbsp;password;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;}</span> 						</span> 						<span style="color: rgb(0, 0, 0);"> 								<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1087_1109_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1087_1109_Open_Text.style.display='none'; Codehighlighter1_1087_1109_Closed_Image.style.display='inline'; Codehighlighter1_1087_1109_Closed_Text.style.display='inline';" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1087_1109_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1087_1109_Closed_Text.style.display='none'; Codehighlighter1_1087_1109_Open_Image.style.display='inline'; Codehighlighter1_1087_1109_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">public</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;getMonicker()&nbsp;</span> 						<span id="Codehighlighter1_1087_1109_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"> 								<img src="http://www.blogjava.net/Images/dot.gif" alt="" /> 						</span> 						<span id="Codehighlighter1_1087_1109_Open_Text"> 								<span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span> 								<span style="color: rgb(0, 0, 255);">return</span> 								<span style="color: rgb(0, 0, 0);">&nbsp;monicker;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;}</span> 						</span> 						<span style="color: rgb(0, 0, 0);"> 								<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1153_1184_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1153_1184_Open_Text.style.display='none'; Codehighlighter1_1153_1184_Closed_Image.style.display='inline'; Codehighlighter1_1153_1184_Closed_Text.style.display='inline';" alt="" /> 								<img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1153_1184_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1153_1184_Closed_Text.style.display='none'; Codehighlighter1_1153_1184_Open_Image.style.display='inline'; Codehighlighter1_1153_1184_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">public</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">void</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;setMonicker(String&nbsp;monicker)&nbsp;</span> 						<span id="Codehighlighter1_1153_1184_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"> 								<img src="http://www.blogjava.net/Images/dot.gif" alt="" /> 						</span> 						<span id="Codehighlighter1_1153_1184_Open_Text"> 								<span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span> 								<span style="color: rgb(0, 0, 255);">this</span> 								<span style="color: rgb(0, 0, 0);">.monicker&nbsp;</span> 								<span style="color: rgb(0, 0, 0);">=</span> 								<span style="color: rgb(0, 0, 0);">&nbsp;monicker;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;}</span> 						</span> 						<span style="color: rgb(0, 0, 0);"> 								<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1217_1239_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1217_1239_Open_Text.style.display='none'; Codehighlighter1_1217_1239_Closed_Image.style.display='inline'; Codehighlighter1_1217_1239_Closed_Text.style.display='inline';" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1217_1239_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1217_1239_Closed_Text.style.display='none'; Codehighlighter1_1217_1239_Open_Image.style.display='inline'; Codehighlighter1_1217_1239_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">public</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;getQuestion()&nbsp;</span> 						<span id="Codehighlighter1_1217_1239_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"> 								<img src="http://www.blogjava.net/Images/dot.gif" alt="" /> 						</span> 						<span id="Codehighlighter1_1217_1239_Open_Text"> 								<span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span> 								<span style="color: rgb(0, 0, 255);">return</span> 								<span style="color: rgb(0, 0, 0);">&nbsp;question;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;}</span> 						</span> 						<span style="color: rgb(0, 0, 0);"> 								<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1283_1314_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1283_1314_Open_Text.style.display='none'; Codehighlighter1_1283_1314_Closed_Image.style.display='inline'; Codehighlighter1_1283_1314_Closed_Text.style.display='inline';" alt="" /> 								<img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1283_1314_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1283_1314_Closed_Text.style.display='none'; Codehighlighter1_1283_1314_Open_Image.style.display='inline'; Codehighlighter1_1283_1314_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">public</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">void</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;setQuestion(String&nbsp;question)&nbsp;</span> 						<span id="Codehighlighter1_1283_1314_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"> 								<img src="http://www.blogjava.net/Images/dot.gif" alt="" /> 						</span> 						<span id="Codehighlighter1_1283_1314_Open_Text"> 								<span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span> 								<span style="color: rgb(0, 0, 255);">this</span> 								<span style="color: rgb(0, 0, 0);">.question&nbsp;</span> 								<span style="color: rgb(0, 0, 0);">=</span> 								<span style="color: rgb(0, 0, 0);">&nbsp;question;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;}</span> 						</span> 						<span style="color: rgb(0, 0, 0);"> 								<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1345_1365_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1345_1365_Open_Text.style.display='none'; Codehighlighter1_1345_1365_Closed_Image.style.display='inline'; Codehighlighter1_1345_1365_Closed_Text.style.display='inline';" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1345_1365_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1345_1365_Closed_Text.style.display='none'; Codehighlighter1_1345_1365_Open_Image.style.display='inline'; Codehighlighter1_1345_1365_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">public</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;String&nbsp;getAnswer()&nbsp;</span> 						<span id="Codehighlighter1_1345_1365_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"> 								<img src="http://www.blogjava.net/Images/dot.gif" alt="" /> 						</span> 						<span id="Codehighlighter1_1345_1365_Open_Text"> 								<span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span> 								<span style="color: rgb(0, 0, 255);">return</span> 								<span style="color: rgb(0, 0, 0);">&nbsp;answer;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;}</span> 						</span> 						<span style="color: rgb(0, 0, 0);"> 								<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1405_1432_Open_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1405_1432_Open_Text.style.display='none'; Codehighlighter1_1405_1432_Closed_Image.style.display='inline'; Codehighlighter1_1405_1432_Closed_Text.style.display='inline';" alt="" /> 								<img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1405_1432_Closed_Image" align="top" onclick="this.style.display='none'; Codehighlighter1_1405_1432_Closed_Text.style.display='none'; Codehighlighter1_1405_1432_Open_Image.style.display='inline'; Codehighlighter1_1405_1432_Open_Text.style.display='inline';" alt="" style="display: none;" />&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">public</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;</span> 						<span style="color: rgb(0, 0, 255);">void</span> 						<span style="color: rgb(0, 0, 0);">&nbsp;setAnswer(String&nbsp;answer)&nbsp;</span> 						<span id="Codehighlighter1_1405_1432_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"> 								<img src="http://www.blogjava.net/Images/dot.gif" alt="" /> 						</span> 						<span id="Codehighlighter1_1405_1432_Open_Text"> 								<span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;</span> 								<span style="color: rgb(0, 0, 255);">this</s