﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-上善若水-文章分类-Architecture</title><link>http://www.blogjava.net/bourn/category/25513.html</link><description> 反者道之动，弱者道之用。
 天下万物生于有，有生于无。</description><language>zh-cn</language><lastBuildDate>Thu, 08 Nov 2007 04:51:55 GMT</lastBuildDate><pubDate>Thu, 08 Nov 2007 04:51:55 GMT</pubDate><ttl>60</ttl><item><title>在基于Spring及Hibernate应用程序中使用ETags降低带宽占用和服务器压力</title><link>http://www.blogjava.net/bourn/articles/153572.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Wed, 17 Oct 2007 06:46:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/153572.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/153572.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/153572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/153572.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/153572.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Gavin Terrill 发表于2007.7.11 上午 8:45讨论区：Java 主题：Web框架、集群及缓存导言REST方式的应用程序构架在近日所产生的巨大影响突出了Web应用程序的优雅设计的重要性。现在人们开始理解&#8220;WWW架构&#8221;内在的可测量性及弹性，并且已经开始探索使用其范例的更好的方式。在本文中，我们将讨论一个Web应用开发工具——&#8220...&nbsp;&nbsp;<a href='http://www.blogjava.net/bourn/articles/153572.html'>阅读全文</a><img src ="http://www.blogjava.net/bourn/aggbug/153572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-10-17 14:46 <a href="http://www.blogjava.net/bourn/articles/153572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类似Google构架的开源项目Hadoop</title><link>http://www.blogjava.net/bourn/articles/153544.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Wed, 17 Oct 2007 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/153544.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/153544.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/153544.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/153544.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/153544.html</trackback:ping><description><![CDATA[<p>
作者
<strong>Scott Delap</strong>译者
<strong>张海龙</strong>
发布于
2007年8月17日 上午5时55分
</p>
<dl><dt>社区</dt><dd><a href="http://www.infoq.com/cn/java" name="java" id="739" onclick="try {CategoryPopup.showPopup(this);} catch(e) {}; return false;">Java</a></dd><dt>主题</dt><dd><a href="http://www.infoq.com/cn/grid_computing" name="grid_computing" id="838" onclick="try {CategoryPopup.showPopup(this);} catch(e) {}; return false;">网格计算</a>,</dd><dd><a href="http://www.infoq.com/cn/clustering" name="clustering" id="815" onclick="try {CategoryPopup.showPopup(this);} catch(e) {}; return false;">集群与缓存</a></dd></dl>
<p>类似Google构架的开源项目<a id="lv:t" title="Hadoop" href="http://www.infoq.com/hadoop">Hadoop</a> 已经存在一年多了，现在正受到来自开发社区的广泛关注。下面是来自Hadoop<a id="cygf" title="官网" href="http://lucene.apache.org/hadoop/">官网</a> 的消息： </p>
<blockquote>Hadoop是一个软件平台，可以让你很容易地开发和运行处理海量数据的应用&#8230;&#8230;Hadoop是<a id="txjs" title="MapReduce" href="http://wiki.apache.org/lucene-hadoop/HadoopMapReduce">MapReduce</a> 的实现，它使用了Hadoop分布式文件系统（HDFS）。MapReduce将应用切分为许多小任务块去执行。出于保证可靠性的考虑，HDFS会为数据块创建多个副本，并放置在群的计算节点中，MapReduce就在数据副本存放的地方进行处理&#8230;&#8230;<br />
</blockquote>
<p>Hadoop是由Java编写的，该项目已到得Yahoo的全面支持，项目的领袖Doug Cutting从2006年一月开始已经被Yahoo全职雇用于此项目中。华盛顿大学也从那时开始了一个以Hadoop为基础的分布式计算的课程，课程相关的材料也<a id="ev3h" title="已发布" href="http://code.google.com/edu/content/parallel.html">已发布</a> 在Google Code了，以满足那些对这项技术感兴趣的开发者们。<br />
最近，Yahoo的Jeremy Zawodny<a id="jakw" title="提供了" href="http://developer.yahoo.net/blog/archives/2007/07/yahoo-hadoop.html">提供了</a> 一个Hadoop的状态更新：<br />
</p>
<blockquote>在过去的几年里，每家参与建立大规模Web系统的公司都面临着一些相同的基础性挑战&#8230;&#8230;底层架构从来都是一个挑战。你不得不去购
买、并大量安装和管理众多的服务器，即使你使用的是其他人提供的商业硬件平台，你也不得不开发软件对这些任务进行分治处理，并让其保持运行&#8230;&#8230;要建立一个
必要的软件基础结构，我们可以放弃开发自己的技术，这可以认为是一项竞争优势，先赚到钱再说。但我们已经选择了一条稍有不同的路，当认识到有越来越多的公
司和组织的需求都很相似的时候，我们发现了Doug
Cutting（开源项目Nutch和Lucene的开创者）的工作，于是我们邀请他加入Yahoo，在新的开源项目Hadoop上继续工作。<br />
</blockquote>
<p>Zawodny去年一直工作于提供数据排序的基准评测，在测试中，每一个节点都对相同总和的输入数量进行排序。
假如有20个节点，每个节点有100条记录，那么就有2000个记录需要排序；当有100个节点时，每个节点有100条记录，那就总共有10000条记
录。下面是最近的评测结果：</p>
<p>
<table style="height: 392px; width: 300px;" cellpadding="" cellspacing="" width="248">
    <tbody>
        <tr>
            <td align="center"><strong>日期</strong> </td>
            <td><br />
            </td>
            <td align="center"><strong>节点数</strong><br />
            </td>
            <td align="center"><strong>耗时（小时）</strong><br />
            </td>
        </tr>
        <tr>
            <td align="center">四月 </td>
            <td align="center">2006 </td>
            <td align="center">188 </td>
            <td align="center">47.9 </td>
        </tr>
        <tr>
            <td align="center">五月 </td>
            <td align="center">2006 </td>
            <td align="center">500 </td>
            <td align="center">42.0 </td>
        </tr>
        <tr>
            <td align="center">十一月 </td>
            <td align="center">2006 </td>
            <td align="center">20 </td>
            <td align="center">1.8 </td>
        </tr>
        <tr>
            <td align="center">十一月 </td>
            <td align="center">2006 </td>
            <td align="center">100 </td>
            <td align="center">3.3 </td>
        </tr>
        <tr>
            <td align="center">十一月 </td>
            <td align="center">2006 </td>
            <td align="center">500 </td>
            <td align="center">5.2 </td>
        </tr>
        <tr>
            <td align="center">十一月 </td>
            <td align="center">2006 </td>
            <td align="center">900 </td>
            <td align="center">7.8 </td>
        </tr>
        <tr>
            <td align="center">七月<br />
            </td>
            <td align="center">2007 </td>
            <td align="center">20 </td>
            <td align="center">1.2 </td>
        </tr>
        <tr>
            <td align="center">七月 </td>
            <td align="center">2007 </td>
            <td align="center">100 </td>
            <td align="center">1.3 </td>
        </tr>
        <tr>
            <td align="center">七月 </td>
            <td align="center">2007 </td>
            <td align="center">500 </td>
            <td align="center">2.0 </td>
        </tr>
        <tr>
            <td align="center">七月 </td>
            <td align="center">2007 </td>
            <td align="center">900 </td>
            <td align="center">2.5 </td>
        </tr>
    </tbody>
</table>
</p>
<p>Tim O'Reilly<a id="cs.t" title="找出了" href="http://radar.oreilly.com/archives/2007/08/yahoos_bet_on_h.html">找出了</a> Zawodny所发的帖子，并从中发现了来自于Yahoo的高层支持：<br />
</p>
<blockquote>&#8230;&#8230;Yahoo! 已经在一月聘用了Hadoop的创始人Doug Cutting，但<a id="v.n7" title="Doug在开源大会上的谈论" href="http://radar.oreilly.com/archives/2007/08/yahoos_bet_on_h.html">Doug在开源大会上的谈论</a> ，更像是Hadoop的发布会，Yahoo! 也想以此表明Hadoop项目对他们来讲有多么重要。实际上，我还接到David Filo打来的电话，他想确认我是否知道这种支持来自于高层&#8230;&#8230;<br />
&#8230;&#8230;
为什么Yahoo! 的参与这么重要？首先，这预示一个搜索界第二大的公司认识到开源是在Web
2.0上与一个占统治地位的对手进行竞争的强大武器&#8230;&#8230;支持Hadoop和其它Apache项目不仅仅只是让Yahoo深入到他们可以使用的开源软件项目
中，更会帮助他们恢复在极客（geek）心中的形象&#8230;&#8230;其次，或是同样重要的是，Yahoo! 给了Hadoop一个机会进行规模方面的测试&#8230;&#8230;<br />
</blockquote>
<p>John Munsh用一句话<a id="ugbo" title="总结了" href="http://www.johnmunsch.com/2007/08/hadoop_and_the_opposite_of_the.html">总结了</a>
Yahoo的参与：&#8220;Hadoop和&#8216;非我发明症（Not-Invented-Here Syndrome）&#8217;之反例&#8221;。（译者注：John
Munsh在这里用&#8220;非我发明症&#8221;来指Microsoft那种不愿意接受任何协议，标准，或是其他公司开发的软件的态度。它认为不是自己创造的东西就是不
值得信任的。而Yahoo! 却基于竞争对手Google的MapReduce来构造自己的应用，所以这里说是&#8220;非我发明症&#8221;之反例。）<br />
</p>
<p>微软的Sriram Krishnan则从<a id="ljsk" title="那些" href="http://www.sriramkrishnan.com/blog/2007/08/open-source-and-scratching-itches-in.html">那些</a> 转到类似<a href="http://www.infoq.com/news/2006/11/hadoop-ec2">Hadoop和Amazon EC2</a>这种针对大规模应用并在不断发展的解决方案的创业者和开发人员所面对的问题的角度，对Hadoop提出了反对意见： <br />
</p>
<blockquote>Web
2.0的主要价值来自于由众多用户生成的数据，如del.ico.us、Digg、Facebook&#8230;&#8230;它已经超越了任何个人运行大规模的服务器软件的商
业意义，如Gmail、Google Search、Live、Y!
Search&#8230;&#8230;放荡不羁的极客们根本就不会去碰那些大规模blob存储（S3，Google文件系统），大规模结构化存储(Google的
Bigtable），还有在这种微架构之上运行代码的工具（MapReduct，Dryad）等等&#8230;&#8230;我也不知道Doug
Cutting的这种类似的开源产物在这条路上已经走了多远——也许这就是答案吧&#8230;&#8230;<br />
</blockquote><span style="font-weight: bold;">查看英文原文</span>：<a title="Open Source Google-Like Infrastructure Project Hadoop Gains Momentum" href="http://www.infoq.com/news/2007/08/hadoop-momentum">Open Source Google-Like Infrastructure Project Hadoop Gains Momentum</a>
<img src ="http://www.blogjava.net/bourn/aggbug/153544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-10-17 13:22 <a href="http://www.blogjava.net/bourn/articles/153544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX应用的客户端负载均衡问题探究</title><link>http://www.blogjava.net/bourn/articles/153531.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Wed, 17 Oct 2007 04:49:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/153531.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/153531.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/153531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/153531.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/153531.html</trackback:ping><description><![CDATA[<p>
作者
<strong>Gavin Terrill</strong>译者
<strong>王翔(Vision Wang)</strong>
发布于
2007年10月10日 下午8时48分
</p>
<dl><dt>社区</dt><dd><a href="http://www.infoq.com/cn/architecture" name="architecture" id="1,390" onclick="try {CategoryPopup.showPopup(this);} catch(e) {}; return false;">Architecture</a></dd><dt>主题</dt><dd><a href="http://www.infoq.com/cn/ria" name="ria" id="777" onclick="try {CategoryPopup.showPopup(this);} catch(e) {}; return false;">RIA</a>,</dd><dd><a href="http://www.infoq.com/cn/performance-scalability" name="performance-scalability" id="754" onclick="try {CategoryPopup.showPopup(this);} catch(e) {}; return false;">性能和扩展性</a></dd></dl>
<p>今天，当我们选择负载均衡时，大部分Web应用集群选择基于软件或硬件的服务器端方案，而<a href="http://www.digital-web.com/">《Digital Web Magazine》</a>最近发表的<a href="http://www.digital-web.com/articles/client_side_load_balancing/">一篇文章</a>讨论了一家公司如何在<a href="http://www.amazon.com/gp/browse.html?node=201590011">EC2</a>支持的应用中实现客户端负载均衡。</p>
<p>文章从负载均衡方案的需求谈起：</p>
<blockquote>
<li>需要在应用服务器集群中分担负载；</li>
<li>温和地应对单个服务器的宕机；</li>
<li>确保在最终用户端可以把这组服务器视为一个单独的服务器。</li>
</blockquote>
<p>作者朱磊（音译 Lei Zhu）分析了我们常用的服务端负载均衡手段——循环DNS（<a href="http://en.wikipedia.org/wiki/Round_robin_DNS">Round Robin DNS</a>），文中提到：</p>
<blockquote>很不幸，循环DNS的主要弱点是不能满足上面提到的第二个需求，当两台服务器中的一台宕机时，DNS服务器仍然会继续把请求发给它，这导致一半用户无法获得响应。</blockquote>
<p>他还指出集群前端软、硬件专用方案的不足：负载均衡器（Load
Balancer）自己总有一个响应数量上限，尽管可以通过循环DNS配合专用负载均衡器解决这一问题，但维护一个专用负载均衡器需要额外投入数万美元，
而且通常后备负载均衡器只有在主设备出现故障后才会发挥作用。</p>
<p>在客户端负载均衡概念的介绍中，作者请读者考虑关于桌面应用如何负载均衡的问题：</p>
<blockquote>桌面程序随机选择一台服务器，然后尝试获取数据，如果服务器不可用或没有在预设的时间内响应，那么就选择另一台服务器，直到可以
提取数据。桌面应用与Web应用不同的是，前者是独立于服务器，可以在客户端通过对服务器访问的负载均衡实现应用的可扩展性，而后者把客户端代码
（JavaScript或Flash WSF）保存在提供数据和资源的服务器上。</blockquote>
<p>为了把概念延伸到Web应用，作者剖析了典型AJAX应用的关键组成：</p>
<blockquote>
<li>客户端代码：JavaScript/Flash客户端的SWF；</li>
<li>资源：图片、级联样式表、音频和视频文件、HTML文档；</li>
<li>服务端代码：用于反馈客户端所需数据的后台逻辑。</li>
</blockquote>
<p>其中1、2两类内容相对静止，一般不像第3类那样有负载均衡的需要。关注于第3类组成，作者建议采用可靠的服务器或者像亚马逊<a href="http://aws.amazon.com/s3">S3那样的服务</a>，它描绘的策略如下：</p>
<blockquote>就像桌面应用一样，我们可以把一个应用服务器列表嵌到客户端代码里，Web客户端包括一个称为Servers.XML的文件，它保存了可用服务器的列表。客户端通过AJAX或者Flash访问列表中的每一个服务器，直到找到一台可响应的。</blockquote>
<p>尽管浏览器可以禁止客户端代码向它所来源的那些服务器之外的服务器发起服务端调用，但作者还是建议采用Flash或JavaScript的方案解决这个问题。采用客户端负载均衡有两个好处：</p>
<blockquote>
<li><strong>不需要额外的服务器设备，&#8220;不需要专用负载均衡设备，无需配置负载均衡硬件或确认备份功能和主负载均衡器是否正常工作&#8221;；</strong></li>
<li><strong>服务器可以被物理隔离，&#8220;由于是客户端选择服务器而不是由一个固定的负载均衡器重定向调用，所以服务器的位置不受限制&#8221;。</strong></li>
</blockquote>
<p>文章结尾，作者介绍了上述技术如何在亚马逊的EC2和S3基础上构造一个叫<a href="http://www.voxlite.com/">VoxLite</a>的具有高可用性和可扩展性的视频资讯应用，不过作者并没有架构出一个没有单点故障的负载均衡方案。</p>
<blockquote>很多Web应用会面向特定区域，通过一个动态DNS支持的EC2实例实现调用的负载均衡。如果提供负载均衡的这个实例出现故障，在动态DNS映像到另一个EC2实例前，整个系统就不可用了。</blockquote>
<p>为了克服这个问题，VoxLite通过向S3发起HTTP GET调用获得可用的服务器列表，该列表由EC2实例的一系列任务维护：</p>
<ol>
    <li>加载并解析<a href="http://s3.amazonaws.com/voxlite/?prefix=servers">http://s3.amazonaws.com/voxlite/?prefix=servers</a>。</li>
    <li>如果当前运行实例没有被列出来，就向一批EC2实例的关键服务器各发送一个空文件；</li>
    <li>通过测试到亚马逊内部Web服务IP地址的连接情况，可以验证该批其他服务器的是否运行正常，如果无法建立连接就把该服务器从这批服务器的列表中删掉。</li>
</ol>
<p>根据你的需求，客户端负载均衡在统一负载均衡的架构下，提供了一个有趣且具创新性的选择。作者总结道：</p>
<blockquote>通过在客户端负载均衡中采用S3和EC2，可以简化搭建一个具有弹性、扩展性、健壮性Web应用的工作。</blockquote>
<p><strong>查看英文原文：</strong><a href="http://www.infoq.com/news/2007/10/clientsideloadbalancing">Client side load balancing of Ajax applications</a></p>
<img src ="http://www.blogjava.net/bourn/aggbug/153531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-10-17 12:49 <a href="http://www.blogjava.net/bourn/articles/153531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>你真的明白什么是可伸缩性吗？</title><link>http://www.blogjava.net/bourn/articles/153532.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Wed, 17 Oct 2007 04:49:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/153532.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/153532.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/153532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/153532.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/153532.html</trackback:ping><description><![CDATA[<p>
作者
<strong>Gavin Terrill</strong>译者
<strong>郭晓刚</strong>
发布于
2007年10月7日 下午4时2分
</p>
<dl><dt>社区</dt><dd><a href="http://www.infoq.com/cn/architecture" name="architecture" id="1,390" onclick="try {CategoryPopup.showPopup(this);} catch(e) {}; return false;">Architecture</a></dd><dt>主题</dt><dd><a href="http://www.infoq.com/cn/performance-scalability" name="performance-scalability" id="754" onclick="try {CategoryPopup.showPopup(this);} catch(e) {}; return false;">性能和扩展性</a></dd></dl>
<p>&#8220;可伸缩性（Scalability）&#8221;是软件厂商常常在新闻稿中用到的一个词（也是人们站在饮水机旁谈论的一个词），但这个词在很多情况下都被误解了。例如，很多人说起可伸缩性的时候其实指的是性能和高可用性。Royans K Tharakan试图回答&#8220;<a href="http://www.royans.net/arch/2007/09/22/what-is-scalability/">什么是可伸缩性</a>&#8221;这个问题，他说： </p>
<blockquote>可伸缩性，简单来说，是以更大的规模来做你现在所做的事。伸展一个Web应用的规模在于让更多的人使用你的程序。如果你没法找出
方法在伸展规模的同时提高性能，没关系。而且只要你可以伸展规模来处理更大数量的用户，那么有几个单点故障（single point of
failure）也没关系。<br />
</blockquote>
<p>Royans解释说如今我们在面对规模伸展的时候有两个选择： </p>
<blockquote>
<ul>
    <li><strong>纵向的可伸缩性</strong>——在同一个逻辑单元内增加资源来提高处理能力。这样的例子包括在现有服务器上增加CPU，或者在现有的RAID/SAN存储中增加硬盘来提高存储量。 </li>
    <li><strong>横向的可伸缩性</strong>——增加更多逻辑单元的资源，并令它们像是一个单元一样工作。大多数集群方案、分布式文件系统、负载平衡都是在帮助你提高横向的可伸缩性。 </li>
</ul>
</blockquote>
<p>架构师们都在为达到线性的可伸缩性而挣扎，目的是让系统产出的增长与系统中投入资源的增长保持稳定的比率。然而，增加资源会导致一般耗费
（overhead）的额外增长，因此难以达到线性的可伸缩性。Royans将之称为&#8220;伸缩性因子&#8221;，并用它来区分各种类型的伸缩能力： </p>
<blockquote>
<ul>
    <li>如果在你扩大规模的时候伸缩性因子保持为常数，这种叫做<strong>线性伸缩性</strong>。 </li>
    <li>但很可能有些组件并不像其他组件那么适应规模的增长。小于1.0的伸缩性因子叫做<strong>次线性伸缩性</strong>。 </li>
    <li>话说回来，也可能因为增加更多组件而获得更佳的性能（在RAID系统中跨多个磁盘的I/O，当磁盘越多，性能越好）。这种叫做<strong>超线性伸缩性</strong> 。 </li>
    <li>如果应用程序没有专门为可伸缩性而设计，有可能当规模扩大的时候情况会变糟。这种称为<strong>负伸缩性</strong>。 </li>
</ul>
</blockquote>
<p>跟软件开发中的许多事物一样，这里也没有<a href="http://en.wikipedia.org/wiki/Silver_bullet">适合一切情形的银弹</a>可以解决你的伸缩性问题。Royans建议说，&#8220;<strong>如果你急切需要可伸缩性，向纵向发展可能是最容易的</strong>&#8221;，但注意&#8220;<strong>不幸的是纵向伸展会随着你的规模增长而越来越昂贵</strong>&#8221;，而且&#8220;<strong>无穷的横向线性伸缩性只是难以达到，而无穷的纵向伸缩性绝不可能</strong>&#8221;。他继续说： </p>
<blockquote>从另一方面来说，横向可伸缩性并不要求你购买越来越昂贵的服务器。它的本意是用普通的存储和服务器方案来实现规模伸展。不过横向可伸缩性也不便宜。应用必须从建造的最底层就加以考虑才能在多台服务器上运行得像一台服务器一样。 </blockquote>
<p>Royans最后建议应该考虑所有的层次才能解决可伸缩性问题： </p>
<blockquote>对于一个成功的Web应用，所有的层次都要同样能够应付规模的增长。包括存储层（集群文件系统、S3等）、数据库层（分区、联
合）、应用层（memcached、scaleout、terracota、tomcat
clustering等等）、Web层、负载平衡、防火墙等等。比如，如果你没办法实现多个负载平衡控制器来处理未来的网络流量，不管你在Web层的横向
伸缩性上扔下多少钱，都不会有什么效果。你的流量始终被限制在一个负载平衡控制器能够承受的程度。 </blockquote>
<p><strong>查看英文原文：</strong><a href="http://www.infoq.com/news/2007/10/whatisscalability">Think you know what scalability is?</a> </p>
<img src ="http://www.blogjava.net/bourn/aggbug/153532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-10-17 12:49 <a href="http://www.blogjava.net/bourn/articles/153532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>交互设计精髓</title><link>http://www.blogjava.net/bourn/articles/146350.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Wed, 19 Sep 2007 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/146350.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/146350.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/146350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/146350.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/146350.html</trackback:ping><description><![CDATA[转自http://www.ui123.com/blog/?p=4<br />
<br />
<p>12月 22nd, 2006 by  奇遇 </p>
<div>
<p><span style="color: Maroon;">书名原文： About Face 2.0: The Essentials of Interaction Design<br />
作者：     [ 美 ]Alan Cooper ， Robert M. Reimann 译者：詹剑锋、张知非<br />
</span></p>
<p><strong>推荐语</strong><br />
本书是一本由一位在交互设计前沿有着10年设计咨询经验及25年计算机工业界经验的卓越权威撰写的设计数字化产品行为的启蒙书。它探索了一个独特的设计领
域，即复杂系统行为的设计——特别是软件激活技术。本书论述一种具有革命意义的设计观念——人类驱动设计过程。
本书是一本难得的大师经典之作，应该是一本产品规划师、界面设计师以及可用性工程职业人员或者程序员都想得到的书。</p>
<p><strong>封面</strong></p>
<p><a href="http://www.ui123.com/blog/uploads/200612/22_135419_aboutface2.jpg" target="_blank"><img src="http://www.ui123.com/blog/uploads/200612/22_135419_aboutface2.jpg" alt="uploads/200612/22_135419_aboutface2.jpg" onload="javascript:DrawImage(this,520);" class="img_normal" /></a><br />
<br />
序<br />
本书旨在为您提供一些有效而实用的工具来设计用户界面（ user interface ）。这些工具很明显分为截然不同的两类：战术性工具
(tactical) 和策略性 (strategic) 工具。战术性工具是使用和创建用户界面的习惯用法 (user interface
idioms) ——如对话框 (dialog box) 和下压按钮 (push button) ——的提示（ hint ）和技巧 (tip)
。而策略性工具是思考用户界面习惯用法的方式，换言之，即用户与用户界面习惯用法的交互方式。<br />
虽然已经有了一些介绍策略性或者战术性准则的书，我们的目标在于写一本能将两者融为一体的书。在帮助您设计更有吸引力、更有效的对话框的同时，本书还将帮助您理解用户如何了解您的软件，以及与之交互的方式。<br />
设计有效的用户交互和界面之关键在于将策略性和战术性的方法合二为一。例如，客观上不存在好的对话框——对话框的品质取决于具体的应用情形：用户是
谁，他们的背景和目标是什么。仅仅应用一系列的战术性说明（ tactical dictum
），会使创建用户界面变得更容易，但这并不能使最终结果更好。同样，对于用户应该如何与您的系统交互的深层次思考也不能改善软件本身。真正奏效的是：在策
略上对用户与特定软件的交互方式保持敏感的同时，拥有一个可以在任意情况下应用的在你掌握之中的战术工具盒 （ tactical toolbox ）
。本书既会加深您对用户的理解，又将教您如何把这些理解转变为设计理念。<br />
谁应该读这本书<br />
在 1995 年 8 月，软件观念革命（ About Face ）这本书第一次出版时， 界面设计 (interface design)
还是个未开垦的新领域。少数人在软件工程的影子下，勇敢地以用户界面设计师的头衔工作，正如机敏的小哺乳动物在粗暴的巨龙阴影下爬行。正如在软件观念革命
第一版中所指出的，软件设计被人们错误地理解和评价。过去是怎么做的，程序员就就是怎么做的。很多处境不佳的文档工程师 (documenters)
、培训者、技术支持人员，以及处于增长趋势的 可用性工程职业人员（ usability practitioners ）
都意识到：某些事情应该改变。<br />
Web 令人吃惊的、似乎是一夜之间的发展和流行，驱动了这种改变。突然间，易用性（ ease Of use) 成了挂在每个人嘴边的术语。在
20 世纪 90 年代初期，即多媒体短暂流行的期间，涉足数字产品设计的传统设计师纷纷转向 Web
。表面上，新的设计师头衔像杂草一样涌现：信息设计师 (information designer) 、信息架构师 (information
architect) 、用户体验策略师 (user experience strategist) ，以及交互设计师 (interaction
designer) 。 C 级公司的首席职务（首席用户体验官， user experience officer
）一开始就存在，他的工作核心是创建以用户为中心的产品。很多重点大学都争先恐后地开展这些理论的培训。与此同时，可用性工程和人性因素（ human
factor ）职业人员的地位也在提升，现在被承认是推动更好产品设计的领导者。<br />
虽然 Web 使得界面技术倒退了不止十年，但它无可争议地将用户需求永久地置于公司的雷达之上。作者坚信： .COM
的衰败只能使得用户及其需求的可见性，以及对它们的关注在将来变得更加明显。人们一般对新技术感到厌倦。消费者传达了明确的信息，他们所需要的好技术是容
易使用的，并且能满足他们需求的技术。<br />
因此，作者很高兴地说，新版本的读者群会大大地增大：任何对用户与数字产品的交互感兴趣的人都会在读这本书的过程中获得独特的能力洞察力。程序员、与
数字产品相关的设计者、可用性工程职业人员、项目经理都会从此书中受益匪浅。读过《软件观念革命》（ About Face ）
第一版或《软件创新之路》（ The Inmates are running the Asylum ）
第一版的读者会在此发现更新颖且更详细的有关设计方法和原理的详细信息。<br />
为什么要做交互设计<br />
《软件观念革命》的第一版描述了一门被称为软件设计的学科，同时也可称为用户界面设计。在这两个术语中，用户界面设计有更强的生命力。在本书里，我们仍会使用它，而且大多数是合适的。<br />
然而，笔者很清楚，本书所讨论的内容要远比用户界面设计的范围广。界面这个词意指表面，本书所阐述的大多数设计问题要远远比 CRT 屏幕的表面问题深奥，它直接触及了&#8220;数字产品是什么&#8221;，以及&#8220;数字产品要做什么&#8221;等核心问题。<br />
近些年来，对于这类设计，人们已经提出了许许多多的术语。在 2000 年左右，公司对 Web 的兴趣达到顶点时，被称为信息架构（
information architecture ， IA ）的学科似乎最终包含了此处这里讨论的这类设计。但是正如 Web
在经济方面的前景已经暗淡一样， IA 基本上也保留了它以 Web 为中心的狭隘视图：如何组织和浏览页面上的内容。随着新经济的明显下滑， IA
产业的好运也逐渐消失。<br />
另一个近年来流行的术语是 体验设计（ experience design ） 。美国图形艺术研究所 (American Institute
of Graphic Artists ， AIGA)
特别提倡使用这个术语来概括用于开发数字产品和系统的不同设计与可用性工程学科。这个想法很有吸引力，但它仍然回避了一个问题——什么样的设计才是交互式
系统设计的真正核心，交互式系统设计是一种明显不同于已有设计的崭新设计。<br />
体验设计这种想法也有一定的问题。在笔者看来，体验是人与人工制品（或者其他生物）交互的结果。体验出现在一定的上下文场景 (context) 中，进一步由内部、心理的个人环境所调节，这种个人环境由动机、过去经验、气质和多种认知因素形成。<br />
作为设计者，我们不能声称能够设计一种人工制品或者系统的用户体验，但我们能够设计与人工制品交互的机制，以改善用户体验。因为，我们相信体验发生在
人和人工制品交互的过程中，我们已经选择了&#8220;交互设计&#8221;这个术语来表示本书描述的这类设计，该术语由 Bill Moggridge 和 Bill
Verplank 在 20 世纪 80 年代首创。你不能设计体验本身，但你能设计调节和引导体验的交互行为。<br />
交互设计的定义<br />
简单地说，交互设计是 人工制品 (artifact) 、环境和系统的行为，以及传达这种行为的 外形元素 (formal element)
的设计与定义。不像传统的设计学科主要关注 形式 (form) ，最近则是关注 内容和内涵 (content and meaning)
，而交互设计首先旨在规划和描述事物的行为方式，然后描述传达这种行为的最有效形式（参见图 1 ）。<br />
交互设计借鉴了传统设计、可用性工程及工程学科的理论和技术，它是一个具有独特方法和实践的综合体，而不只是部分的叠加。它也是一门工程学科，具有不同于其他科学和工程学科的方法。<br />
交互设计是一门特别关注以下内容的学科：<br />
? 定义与产品的行为和使用密切相关的产品形式<br />
? 预测产品的使用如何影响产品与用户的关系，以及用户对产品的理解。<br />
? 探索产品、人和 上下文 (context) （物质、文化和历史）之间的对话 (Riemann 和 Forlizzi,2001)<br />
? 交互设计从目标导向 (goal-directed) 的角度解决产品设计：<br />
? 要形成对人们希望的产品使用方式，以及人们为什么想用这种产品等问题的见解。<br />
? 尊重用户及其期望目标。<br />
? 对于产品特征与使用属性，要有一个完全的形态，而不能太简单。<br />
? 要看到产品最终成品的样子，它们目前的样子并不重要。<br />
设计的三维<br />
交互设计着重于传统设计较少探索的领域：行为设计。<br />
所有的设计影响人类行为：结构关于人们使用空间的方式，与形式和光线有关。如果没人对张贴画所表达的信息有所反应，那张贴画又有什么意义呢？<br />
引入交互技术——计算机的礼节——来设计人工制品的行为，以及这种行为如何影响和支持人的目标和期望？已经成为一门值得关注的学科。<br />
理解交互设计和传统设计关注点的不同方法之一是借助历史透镜。在 20
世纪的上半叶，设计者主要关注形式。后来设计者逐渐关注内涵，例如，产品设计师和结构师在 20 世纪 70
年代引入了本土和怀旧形式。直到今天，这种趋势仍在继续，诸如 PT Cruiser
的怀旧风格的汽车。今天，信息设计师继续关注内涵，包括可用内容的设计。<br />
在最近 15 年以来，越来越多的设计师开始谈论行为：软件激活技术 (software-enabled) 的产品（或复杂的机械）直接与用户交互的动态方式。<br />
这些关注（形式、内涵及行为）并不是相互排斥的。交互产品必须多少包含各部分；软件应用关注更多的是行为和形式，而对内容的需求较少； Web 站点和公用信息亭关注更多的是内容和形式，而较少关注复杂的行为。<br />
因为，复杂系统的行为通常不是一个审美学 (aesthetics) 的问题，而是认知因素 (cognitive factor) 和逻辑过程 (logical processes) 的结合，交互设计应该采用系统化方法，且能从这种方法中受益匪浅。<br />
交互设计师应该，也是首先要做的，理解使用他们设计的人们的目标、动机和期望（心智模型 ， mental model ）。这些最好能被理解为&#8220;叙述&#8221; (narrative) ——时间轴上的逻辑（或者情感）进展。<br />
与这些&#8220;叙述&#8221;相适应，所设计的人工制品必须具有它们自己的行为叙述，且这些行为必须成功地与用户的期望吻合。不像大多数机械制品，只有简单的行为，
观察之下一切都一目了然，软件和其他数字产品因为其行为潜在的复杂性，所以它们需要交互设计。软件对于观察者是不透明的，然而它所表现出来的可能行为几乎
是无限的。<br />
一些设计者，以设计的传统形式，如视觉 (visual) 、声音（ audible ）、触觉 (tactile themes) ，模式
(patterns) 、风格 (style) ，以及习惯用法 (idioms) 为论据，认为交互元素应被视为随着时间变化的感觉数据（
sense data ）流，类似于动画 (motion picture)
，因此完全可以通过传统设计方法来描述。然而，这种论点有严重的缺陷：尽管交互设计面向形式的方面非常重要，但是，除非它们是通过有效和合适的行为组织
的，否则几乎没用。如果没有一个逻辑结构或流来帮助解决用户的实际问题，那么面向形式的交互设计（ form-oriented
interactive design ）本身只是隔靴搔痒，价值值得怀疑。<br />
换句话说，如果没有条理化的&#8220;叙述&#8221;，感觉数据本身毫无意义。电影不能光有特效，叙述也很必不可少。这一点，对与数字产品的交互而言，更有效，因为对
话不在第三方可观察到的虚幻境界中发生。相反，它是在人和设计的人工制品之间的交流， Bill Buxton （ 1990
）称之为&#8220;非文字的自然语言&#8221;。这种对话（也就是行为）的期望和设计是交互设计的实质。<br />
本书的内涵和外延<br />
本书是一本有关交互设计（交互系统复杂且以用户为中心的行为设计）的原理和方法的参考书。本书的第一篇强调 设计过程 (design process) ，以及对用户的系统理解；第 2 篇提供了策略原理和工具；第 3 篇更深地钻研战术性的问题。<br />
本书不打算以 指南 （ guide ）的姿态出现，或者提供一些界面标准。实际上，你会在第 19
章了解到为什么那些工具的使用是有限制的，而仅仅与特定环境相关。也就是说，在本书中描述的过程和原理是与你选择的风格指南相兼容的，它也是解决任意这类
问题的一本极好的配套书。 指南 擅长于回答做什么，但无法回答为什么这样做。本书打算解决交互系统设计中未解决的问题。<br />
设计交互系统有 4 个步骤：研究问题域（ researching the domain ），理解用户 (understanding
with user) 及其需求；定义解决问题的框架 (defining the framework of a solution)
；完善设计细节 (filling in the design details) 。<br />
很多业内人士会加上第 5 个步骤：确认（ validation ）——让用户测试方案的有效性。他们这么做，不会错。最后一步是众所周知称为可用性学科的一部分。<br />
可用性工程方面的重要文献在持续增长，但有关交互设计的资料却相对很少。本书专门关注交互设计的过程和原理，设计方案的测试方法则留给出版的相关学术著作。本书可以与可用性工程方法和实践的文献配套使用。通过和谐地结合这两个学科，你会获得最好的设计成果。<br />
译者注 作者定义的术语，见第 2 章。<br />
译者注 作者定义的术语，见第 6 章。</p>
<p>名家推荐<br />
ALAN COOPER 作者推荐<br />
当我们被联系为 该 写中文版的序言时，我们非常兴奋，因为我们有机会接触一批新的而为数众多的读者，包括学生，设计人员，开发人员，以及人性因素专家等。<br />
在最近几年，中国不仅成为基于软件的数字产品 —— 从计算机、蜂窝电话到家庭和个人娱乐系统 ——
的主要制造者，也成为这些产品的日益重要的消费者。这就意味着在中国数以百万的新用户正在使用软件和数字产品，其中不乏初学者。由此可见，对于用户界面口
和交互设计师来说，这是一个独一无二的机会，他们的工作可以极大地改进这些数字产品的质量和合意性，并最终影响数以百万计的人们的生活。<br />
和西方一样，中国的开发者和制造商经过了一段时间才理解，用户界面和用户交互对于使得数字产品更有用和更成方面所具有的极端重要性。除了改善用户的生
活质量以外，容易使用和理解，并且能够更好地满足用户需求的产品有额外的潜力，为生产商增加利润和市场份额。我们希望本书将会为市场引领一条通向更好的数
字产品的道路，也可以为本书的读者，不论学生，设计人员，开发人员还是制造商，带来更多的机遇。<br />
交互设计是设计中的一个新领域，在这里是行为，而非形式成为最为关键的因素。形式必须支持行为，但是当用户和一个复杂的数字产品交互时，用户所能感受
到的产品质量和从中获得的亲身体验均来自于产品的行为。不是基于软件的产品不会有复杂的行为：锤子只有单一而简单的行为，除了样式以外不需要别的设计。然
而，蜂窝电话、掌上电脑或者数码相机有很多复杂的行为，而这些行为需要仔细而专门的设计方法。
本书试图描述行为和交互式设计这一崭新而又令人兴奋的领域的基本原则，我们预测这一领域将会成为 21 世纪设计学中的一个主要领域。<br />
本书的大部分例子来源于桌面计算机应用和 WWW 。尽管如此，书中几乎所有的内容也适用于别的数字设备。<br />
本书并不致力于阐述所有可能的设计方法，它也不包括用户界面标准的风格指南。事实上，本书提供了一个独特的过程和框架，借助它可以设计产品和产品的行为，而这些行为真正地解决了用户最核心的需求和意愿。<br />
书的第一篇描述了这一系统的过程 —— 我们称之为目标导向设计 —— 这一部分有一个前提，就是：如果你对产品的用户有深入了解，也了解他们使用该产品的动机（他们的目的），那么你可以为最重要的用户需求开发界面。<br />
本书第二篇和第三篇提供了高层次和细节的设计原则，主要涉及如何选择产品行为，既可以满足用户需求，又可以为用户消障碍，这无疑会提高用户的满意度和
生产率。在过去的 13 年里，我们在全世界使用了上面所说的方法为小到刚起步，大到有上百亿美金的公司的数百种数字设备，软件产品以及基于 Web
的服务做了设计。<br />
自从该书 2003 年在美国出版以来， 在美国和欧洲本书已被许多大学的计算机科学和设计专业选为教材 。尤其是人物角色的使用（在第一篇所描述的刻画用户的一个强有力的工具），几乎已经成为普遍采纳的设计和人性因素的最优方法。<br />
无论在中国还是西方，交互式设计的未来都是光明的。我们希望本书能激发出中国新一代数字产品和服务中的杰出设计！</p>
<p>Robert Reimann<br />
Brookline , Massachusetts , USA<br />
Alan Cooper<br />
Menlo Park, California, USA<br />
2005 。 1</p>
<p>叶展 人机交互分析师</p>
<p>　　读经典著作如同饮醇酒，回味隽永。而给经典著作写序，则如推销醇酒与人，在别人的沉醉中分享快乐。<br />
摆在我面前的就是一本经典著作，一本计算机领域的经典著作。众所周知，计算机领域多的是应景之作，比如某某软件版本 X.0
的使用指南之类，而少能经得起时间考验的经典著作。其原因一方面是计算机领域发展迅猛，知识更新代谢极快；另一方面，则是计算机领域应用重于理论，所以有
思想深度的著作比较少。<br />
一本书要成为经典，起码要两个条件。其一是著者是拥有深邃的思想，且文笔流畅。大师级人物，往往单从文字上的修养就看得出。比如经济界的
George Stigler （诺贝尔奖获得者，被誉为经济学界一支笔）和软件工程方面的 Frederick Brooks
（《神秘的人月》著者），他们的著作拿起来阅读几段，你马上就可以在行文中感到那种大家的雍容风度。而更重要的是，大师们在书中所讲述的往往不是细枝末节
的技巧和技术，而是一种深邃的思想方法，可以给人以深层次的启发。那种风度和深度，是难于模仿的。<br />
要成为经典的第二个条件是作者的思想要经得起时间的考验。对计算机书籍来说，起码要能经过 10 年的考验。这个标准比之其他领域已经是很宽松的了，但在这个标准下大部分计算机书籍会落马。<br />
以笔者来看，本书基本上符合前面的两个条件，是一本计算机领域的经典之作。<br />
本书的作者 Alan Cooper ，是计算机业界一位成名高手。除了早期在 Visual Basic 方面的工作外（他被誉为 Visual
Basic 之父），更重要的是他曾站到了一个新领域的前沿，参与并影响了软件开发领域一次深刻的变革。而这个新领域，就是人机交互（
Human-Computer Interaction ）。这个变革，是软件开发领域的第三次革命。<br />
在软件开发领域出现过三次革命—— 50
年代高级语言的出现，使得软件开发从机器硬件（机器语言）的束缚中解脱出来，程序员能够从（抽象＋结构）层次来进行思考。此为第一次革命。 70
年代软件工程兴起，使得软件开发的注意力由语言和编译器技术拓展到软件开发的过程（ software process
）。人们意识到：要提高一个软件产品最终的静态质量，必须提高这个产品产生过程的动态质量。此为第二次革命。而 90
年代以来，随着计算机软件和商业行为的联系越来越紧密，特别是互联网的兴起，人们进一步认识到：软件不是孤立的，软件的质量并不是仅由其本身就能决定的，
而是由（软件＋用户）这个大系统来决定的。软件的成功，在于是否它能够成功嵌入到用户的商业活动中。对人的因素的重视，使得一门新的领域崛起。这就是人机
交互。经过十几年发展，人机交互理论已经全面改观了一般商用软件设计开发的流程和方式，成为业界的标准。是为第三次革命。<br />
每次革命或变革，都会有豪杰之士涌现，为改变旧的思想和宣传一种新的思想而摇旗呐喊，成为领导变革的预言家和代言人。在 90
年代，一批人物涌现，一批著作发表，为人机交互理论在业界的应用打开了局面。 Donald Norman 在 1990 年出版了《 The
Design of Everyday Things 》， Jakob Nielsen 在 1994 年出版了《 Usability
Engineering 》，本书作者在 1995 年出版了本书的第一版。这些人的著作，都是经受了 10
年考验的，现在都成了经典。他们当时的思想，现在已经成为业界的主流。他们也自然而然地成为了人机交互领域举足轻重的领导者。<br />
阅读本书，最重要的是了解作者所阐述的关于软件设计开发的高层次理念和指导思想。因为作者是最新一次软件开发思想变革的积极参与者，他亲自现身说法写
的书当是记录这个思想变革的宝贵的第一手资料。正因为如此，笔者窃以为本书的第一部分最是重要，乃为全书的灵魂。这部分从了解用户，了解用户需求讲起，到
构建用户模型，到设计 scenario
来描述软件系统现在和未来的行为模式，到如何把对用户的理解和行为模式转换为设计方案。作者不仅把软件设计的整个过程流畅清晰地描述出来，而且真知灼见不
断涌现于其中。下面随便列举一二：<br />
? 软件的设计和开发，不要囫囵吞在一块，最好要分成两个单独的过程——设计过程和开发过程：
传统的软件工程理论，是对整个软件设计开发的过程化研究，而更侧重编程测试和项目规划部分，并且把设计和开发混在一起。而现在人机交互理论，实际上是把软
件设计这部分提出来，是对软件设计的过程化分析，还借用了认知心理学和其他领域的成果。目前业界普遍认为：对商用软件来说，这两个阶段分开，有助于软件质
量的提高。<br />
? 应当以用户为中心去设计软件，而不是以某项新技术或者技术人员为中心去开发软件：
这一点是软件走出象牙塔，渗入人类生活和商业领域的必然后果。作者虽然是程序员出身，但对以程序员（技术的代表）为核心的软件开发的局限性有清醒的认识，
并指出这种方法再也不能适应开发软件产品的需要。基于用户的设计（ User-Centered Design ）是 90
年代以后被&#8220;炒&#8221;的最火的一个词。它实际上是说在软件设计过程中要围绕用户和商业活动来进行，是不是围绕技术和程序员来运行。<br />
? 决定软件成功与否的，不是一个软件有多少个功能，而是这些功能是否有用和好用。<br />
? 设计软件，重要的是设计用户行为： 作者所极力鼓吹的一个新的名词——交互设计（ Interaction Design ）的含义就是软件设计师设计的不是死的软件，不是静止的界面，而是活的行为，是用户和软件硬件环境之间的动态交互，并寻求动态的最优。<br />
需要指出的是：以上思想，在 1995
年本书初版时乃为革命，与今则为业界常识——起码是美国商用软件开发领域人所共奉的常识。现今但凡大一点的和软件开发有关的公司，其软件设计开发过程都按
作者所提出的思路改进过。从另一个角度讲，这更体现了 90 年代这场变革的影响之深远。<br />
在本书的第二部分， Alan Cooper 介绍了一大把新概念和新名词（众所周知， Alan Cooper
在业界有卖弄新名词的&#8220;不良&#8221;嗜好。业内人最爱开的玩笑之一就是传说在什么什么会议上 Alan Cooper
又发明了一个新的英文词。当然能够在计算机业内成为这种玩笑的对象本身就说明这个人很有影响力。）这些新名词，由于是独此一家，别无分号，读者读来需要一
定的辨别力。需要记住的是：虽然这些名词比较新奇，但其含义和基本思路应该是容易接受的。<br />
与前两部分比，本书的第三部分就完全是实用性的了，有诸多实际的设计案例和讨论，而且主要是基于现有图形用户界面的格局。<br />
由于本书的这种结构——由抽象理念入手，到具体的设计方法和案例，使得它适合各类读者阅读。软件公司的领导者可以通过前两部分了解软件行业的最新思
潮，并以此为指导思想来改进自己公司内部的软件开发流程。软件开发人员，可以学习书中介绍的具体的方法，更可以从更实际的案例讨论中获得启发。对学生来
说，除了学习编程等&#8220;硬&#8221;技术外，通过读书了解一下软件行业&#8220;软&#8221;的思想，拓展眼界，受益将会不浅。<br />
国内软件行业经过多年发展已经初具规模，当然在发展的过程中也遇到诸多问题。目前的一个共识是中国软件业和外国比，最大的劣势并不是在具体某项技术或
者编程方面。中国的勤奋而又有天分的程序员，可以获得美国业界的编程大奖。由此可见单打独斗中国人是可以的。但项目一大起来，中国软件业的固有劣势就显现
出来了。中国的传统弱项主要是在软件工程和软件过程等方面。而现在西方软件行业又进了一步，在软件工程的基础上搞出了人机交互理论，又引发了一次革命。我
们目前对这场革命的了解还是很肤浅，人机交互领域在国内的科研、教学和应用都还在起步阶段。这就很有些旧的差距没有弥补上，新的差距又产生了的危险。这本
书现在被介绍到国内来，将有助于我们填补这方面的差距。此其时也！</p>
<p>叶展<br />
人机交互分析师<br />
2005 年 7 月于美国芝加哥</p>
<p>　　叶展，清华大学自动化系本科毕业，后赴美留学，先后取得伊州理工学院（ Illinois Institute of
Technology）的计算机硕士学位和卡内基美隆大学（Carnegie Mellon
University）的人机交互（Human-Computer
Interaction）硕士学位，现在美国BCS管理和IT咨询顾问公司任职。叶展目前主要的研究和工作领域是人机交互理论在游戏设计中的应用、人机界
面设计与评测、以及软件开发流程设计和管理。是这些领域有一定影响的专家，并应邀在包括CHI等一系列重要国际会议上发表了论文和演讲。</p>
<p>译 者 序<br />
今天，人类不仅在认识世界，也在创造着新世界。软件作为人类所创造的最复杂的人工制品（ artifact ）之一 ，
已不仅仅是人类智慧和工具的延伸，而在某种程度上作为虚拟世界新法则的执行者和实施者统治着我们。诺贝尔物理学奖获得者费曼曾经以这种方式描述过人类创造
新事物的过程：我们创造新事物，而被创造的新事物按照某种规则又创造新的事物，突然某一瞬间，不同于人类灵魂的事物出现了：它与人类灵魂迥然不同，或许还
有着恶意，威胁着人类。一个智者以这种玄想的方式展现了对人类创造物的恐惧。<br />
今天的软件人工制品会以这种方式工作吗？是否会威胁到我们的人类？作为软件业的一名从业人员，译者深知以 0 或者 1
为工作基础的计算机所有智慧来自于设计师和程序员的智慧，本身不具有恶意。然而，现实的情况是 &#8220;
受不正确的设计观念影响开发的软件已经开始威胁到大众用户 &#8221; ，技术派论者甚至以 &#8220; 计算机盲 &#8221; 通常称这些和计算机工作者一样富有智慧的人们。<br />
请尊重你的用户！ Alan Cooper
，这位在图形用户界面领域驰骋数十年的大师给出了如此的忠告。大师的忠告是中肯而辛辣的，技术不能高高在上，而应该植根于土壤，软件工人们不能脱离为人民
服务的宗旨，否则就要被革命了。新技术经济的沉沦也许指示着新的机遇：为大众用户服务，采取全新的目标导向设计方法。<br />
这种方法关注用户的目标；认真地研究实际用户和潜在用户，定义具体的原型用户 ( 人物角色 ， persona) ；使用人物角色作为脚本提纲 (scenarios) 的主要人物；人物角色作为定义交互产品功能、行为和形式的主要工具；遵循行为设计的原理。<br />
在系统模型方面，作者精彩地辨析了程序员的实现模型和用户的心智模型之间的差异，指出程序员通常为了容易实现的私利牺牲用户利益，用实现模型取代用户
的心智模型，从而产生了认知方面的鸿沟，因此在交互设计领域有必要区分设计和编程的责任。在用户分析方面，将用户分为新手用户、中间用户和专家用户三类
， 提出了没有用户愿意永远做新手用户，只有少数用户才会成为专家用户，因此大多数用户都是永久的中间用户，设计应该为中间用户优化的精辟论解。<br />
在行为和形式设计方面，作者深刻地揭示了一些现象背后隐藏的本质。首先从行为立场出发，定义了软件姿态的概念，将软件分为独占、暂时、精灵和辅助四种
姿态。不同姿态的软件对应不同的用户类型，如独占式应用的用户是永久的中间用户，应该在使用整个屏幕的情况下优化独占姿态的应用；而暂时姿态应用应该简
单、清晰而切中要点，保持在一个窗口和视图内。在用户心理层次，作者深刻地揭示了流状态 ：&#8220; 深深的完全沉思状态 &#8221; ，经常产生 &#8220; 轻微的欢娱
&#8221;
，能够让你忘记时间的流逝。因此，软件交互应该促进和加强流状态，而不是打断或者干扰流状态。为了创建高效的软件，作者提出了附加工作的概念，分析了附加
工作产生的原因，指出只有消除附加工作，用户才会效率更高。在这种背景下，作者也详细地分析了图形用户界面的导航问题，以及如何消除导航中出现的附加工
作。另外，作者指出要想开发效能高和用户使用起来会愉悦的软件，软件必须能够体贴和足够聪明。也正是从这个角度出发，作者详细地讨论了如何改善数据检索和
数据输入，使其体贴和足够聪明。<br />
在讨论如何为不同用户设计时，作者指出有两个概念在根据不同的经验水平将用户的需求进行分类方面特别有用：命令向量和工作集。命令向量是允许用户向程
序发起指令的特殊技术：下拉菜单、弹出菜单和工具条控件都是命令向量的例子。好的用户界面提供多种命令向量，这种冗余性让不同技能水平的用户和不同偏好的
用户根据自己的意愿和能力向程序发起命令。因为每个用户都在无意识地记忆经常使用的命令，持久的中间用户记住了命令和功能的适度子集：工作集。虽然严格的
说没有一个标准的工作集可以覆盖所有用户的需求，但是用户和使用模式的研究和建模可以产生一个较小的功能子集。这个最小工作集可以通过目标导向的设计方法
确定：利用脚本提纲来发现你的人物角色所需求的功能。这些需求直接转化成最小工作集的内容。<br />
作者也详细地阐述了视觉界面设计的一些基本原理，并在具体的背景下讨论了这些视觉界面设计原理的应用。如视觉界面必须：<br />
? 避免视觉噪音 (visual noise) 和杂乱 (clutter) ；<br />
? 使用对比 (contrast) ，相似性（ similarity ）与分层 (layering) 来区分和组织元素；<br />
? 在每一个组织层次提供视觉结构和流；<br />
? 使用紧凑、一致而场景合适的图像；<br />
? 全面而有目的地结合风格和功能。<br />
在对主流的三类界面范例：实现为中心（ implementation-centric ）、隐喻 (metaphoric) 和习惯用法
(idiomatic) 分析的基础上，作者独特而精辟地指出隐喻的限制，强调了习惯用法的力量，深刻地指出 &#8220;
所有的习惯用法都需要学习，而好的习惯用法只需要学一次 &#8221; 。<br />
另外，作者凭借渊博的知识和丰富的产业界经验，深刻全面地揭示和阐述了各种交互细节的本质、演化和蕴含的发展机遇，如直接操作 (direct
manipulation) 、选择、拖放 (drag and drop)
。在图形用户界面发展的历史背景下，作者高屋建瓴地详细讨论了各种控件和它们的行为。<br />
在译者学习和翻译这本书的过程中，深深地感受和体会到作者的大师风范，以及卓尔不群的见解和深刻的思想，并且在具体的科研实践中受益。相信任何一个读者只要用心读这本书，都会有同样的感受，并有丰富的收获。<br />
译者要感谢参与本书出版过程中的朱沭红编辑、孙学瑛编辑、 蒋芳 女士，感谢她们的耐心、信任和协作。</p>
<p>詹剑锋 ( jfzhan@ncic.ac.cn ) 、张知非<br />
2005 年 3 月 1 日</p>
<p>第一篇 了解你的用户<br />
第一部分 弥合差距<br />
1 目标导向设计<br />
2 实现模型和心智模型<br />
3 新手、专家和中间用户<br />
4 理解用户：定性研究<br />
5 用户建模：人物角色和目标<br />
6 脚本提纲：将目标转换为设计<br />
7 综合好的设计：原理和模式<br />
第二篇 设计行为和形式<br />
第二部分<br />
8 软件姿态<br />
9 和谐与流<br />
10 消除附加工作<br />
11 导航和调整<br />
12 理解撤销<br />
13 重新思考&#8220; Files &#8221;和&#8220; Save &#8221;<br />
第三部分 提供高效能和愉悦<br />
14 设计体贴的软件<br />
15 设计智能的软件<br />
16 改进数据检索<br />
17 改进数据输入<br />
18 为不同的需要进行设计<br />
第四部分 应用视觉设计原理<br />
19 外观设计<br />
20 隐喻、习惯用法和启示<br />
第三篇 交互细节<br />
第五部分 鼠标和操作<br />
21 直接操作和定点设备<br />
22 选 择 327<br />
23 拖 放 336<br />
24 操作控件、对象和连接<br />
第六部分 控件及其行为<br />
25 窗口行为<br />
26 使用控件<br />
27 菜单：教学向量<br />
28 使用菜单<br />
29 使用工具条和工具提示<br />
30 使用对话框<br />
31 对话框礼节<br />
32 创建更好的控件<br />
第七部分 与用户的交流<br />
33 消除错误<br />
34 通知和确认<br />
35 与用户的其他交流方式<br />
36 安装过程<br />
第八部分 超越桌面的设计<br />
37 Web 设计<br />
38 嵌入式系统的设计</p>
</div>
<img src ="http://www.blogjava.net/bourn/aggbug/146350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-09-19 09:57 <a href="http://www.blogjava.net/bourn/articles/146350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Code Engine使用手册V1.3</title><link>http://www.blogjava.net/bourn/articles/143997.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Mon, 10 Sep 2007 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/143997.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/143997.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/143997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/143997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/143997.html</trackback:ping><description><![CDATA[<p style="text-align: center;" align="center"><strong><span style="font-size: 14pt;">Version 1.3</span></strong></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><strong><span><span>1.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span></strong><strong><span style="font-family: 宋体;">基本组成：</span></strong></p>
<p style="margin-left: 42pt; text-indent: -21pt;"><span><span>a)<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">运行入口</span>CodeEngineRunner<span style="font-family: 宋体;">的</span>main<span style="font-family: 宋体;">（）；里面注册所有的</span>Generator<span style="font-family: 宋体;">；主要有：</span>IbatisGenerator<span style="font-family: 宋体;">，</span>ControllerGenerator<span style="font-family: 宋体;">，</span>JSPGenerator<span style="font-family: 宋体;">三个；任意一个可以单独运行多次；</span></p>
<p style="margin-left: 42pt; text-indent: -21pt;"><span><span>b)<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">代码结构：</span>*Generator,<span style="font-family: 宋体;">用于生成</span>domain<span style="font-family: 宋体;">，</span>manager<span style="font-family: 宋体;">和</span>sqlmap<span style="font-family: 宋体;">，</span>controller<span style="font-family: 宋体;">等文件，在生成之后为了保持系统的完整性，通常会调用一些</span>Modifier<span style="font-family: 宋体;">去修改配置文件；由于每个</span>Generator<span style="font-family: 宋体;">会单独再次访问配置文件，所以可以单独和重复生成；</span></p>
<p style="margin-left: 42pt; text-align: left; text-indent: -21pt;" align="left"><span><span>c)<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">主要的配置文件有</span>2<span style="font-family: 宋体;">个，位于</span>code_engine<span style="font-family: 宋体;">目录下，分别为：</span>code-engine-config.xml<span style="font-family: 宋体;">，</span>code-engine-gears.xml<span style="font-family: 宋体;">，但在实际使用中，我们经常要配置的是</span>code-engine-gears.xml<span style="font-family: 宋体;">，前者一般在项目开始的时候设定，后者用来生成和修改</span>domain<span style="font-family: 宋体;">，</span>manager<span style="font-family: 宋体;">和</span>sqlmap, controller<span style="font-family: 宋体;">，</span>jsp<span style="font-family: 宋体;">和相关的一些配置文件；</span></p>
<p style="margin-left: 42pt; text-align: left; text-indent: -21pt;" align="left"><span><span>d)<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">模板文件位于</span>template<span style="font-family: 宋体;">文件夹下面；可以任意添加和调用；语法为</span>freemarker<span style="font-family: 宋体;">，但是，通常只需参照其他模板文件，一般都可以写出新模板；</span></p>
<p style="margin-left: 42pt; text-align: left; text-indent: -21pt;" align="left"><span><span>e)<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">每次运行</span>codeengine<span style="font-family: 宋体;">都会在</span>backup<span style="font-family: 宋体;">目录下面生成备份文件，以备再次生成和修改；</span></p>
<p style="margin-left: 42pt; text-align: left; text-indent: -21pt;" align="left"><span><span>f)<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">生成日志在</span>logs<span style="font-family: 宋体;">目录下；</span></p>
<p style="margin-left: 42pt; text-align: left; text-indent: -21pt;" align="left"><span><span>g)<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span>Framework<span style="font-family: 宋体;">目录是框架目录，可重用部分，在生成新项目时候拷贝用；</span></p>
<p style="margin-left: 42pt; text-align: left; text-indent: -21pt;" align="left"><span><span>h)<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span>Reference<span style="font-family: 宋体;">目录是一些开发组件，主要是写</span>js<span style="font-family: 宋体;">组件；</span></p>
<p><span>2.<strong> code-engine-config.xml
</strong></span><strong><span style="font-family: 宋体;">配置简介</span></strong><span style="font-family: 宋体;">：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;?xml
version="1.0" encoding="UTF-8"?&gt;</span></p>
<p>&lt;codeEngineConfiguration&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;context&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&nbsp;&nbsp;&lt;distDir
path="D:"wiczone"trunk"wiczone" java="src"
web="war"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;!--&lt;distDir path="D:"test"trunk"project"
java="src" web="war"/&gt;--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;!--&lt;distDir path="build" java="src"
web="war"/&gt;--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;templateDir path="template"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;i18nSupport&gt;true&lt;/i18nSupport&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;database
classPath="lib"mysql-connector-java-3.1.7-bin.jar"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;driverClass&gt;org.gjt.mm.mysql.Driver&lt;/driverClass&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;url&gt;jdbc:mysql://localhost:3306/wiczone&lt;/url&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;username&gt;root&lt;/username&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;password&gt;root&lt;/password&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/database&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;package base="biz.wic" app="application"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;!--&lt;package base="biz.web"
app="framework"&gt;--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;domain&gt;domain&lt;/domain&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;controller&gt;web&lt;/controller&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;manager&gt;manager&lt;/manager&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;service&gt;service&lt;/service&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/package&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;web layoutComponent="tiles"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;manager&gt;WEB-INF"applicationContext-manager.xml&lt;/manager&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;lucene&gt;WEB-INF"applicationContext-lucene.xml&lt;/lucene&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;servlet&gt;WEB-INF"action-servlet.xml&lt;/servlet&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;security&gt;WEB-INF"applicationContext-acegi.xml&lt;/security&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;sqlMapConfig&gt;WEB-INF"sql-map-config.xml&lt;/sqlMapConfig&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;messages&gt;WEB-INF"classes"messages.properties&lt;/messages&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;tiles&gt;WEB-INF"defs&lt;/tiles&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;jdbc&gt;WEB-INF"jdbc.properties&lt;/jdbc&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/web&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;/context&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;!--</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>IMPORTANT NOTES:</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>1.in most cases, we no necessary to modify the &lt;context/&gt; part,
since we have already set done;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>2.each of controller/jsp can be re-created alternatively.</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>3.please becareful that metadata's character case.</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>4.the basis rule is:</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>if not existed we will created;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>if already existed we may overwrited;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>--&gt;</span></p>
<p>&lt;/codeEngineConfiguration&gt;</p>
<p style="margin-left: 39pt; text-indent: -18pt;">1）&nbsp;<span style="font-family: 宋体;">如上所示，</span>&lt; database &gt; <span style="font-family: 宋体;">用于配置数据库的连接，注意要保证</span>driver<span style="font-family: 宋体;">能访问到；</span></p>
<p style="margin-left: 39pt; text-indent: -18pt;">2）&nbsp;&lt;Package&gt;<span style="font-family: 宋体;">负责生成各种代码使用，</span></p>
<p style="margin-left: 39pt; text-indent: -18pt;">3）&nbsp;&lt;web&gt;<span style="font-family: 宋体;">用于指定一些配置文件；</span></p>
<p style="margin-left: 39pt; text-indent: -18pt;">4）&nbsp;<span style="font-family: 宋体;">以上文件通常在项目开始的时候设定；</span></p>
<p>&lt;context&gt;<span style="font-family: 宋体;">详解</span></p>
<p style="margin-left: 21pt; text-indent: 21pt;">a<span style="font-family: 宋体;">）</span><span>&lt;distDir
path="build" java="src" web="war"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;!--&lt;distDir path="D:"dist_project" java="src"
web="war"/&gt;--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;templateDir path="template"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;i18nSupport&gt;true&lt;/i18nSupport&gt;</span></p>
<p>distDir@path<span style="font-family: 宋体;">指目标项目的路径，&#8216;</span>build<span style="font-family: 宋体;">&#8217;是相对路径；</span> @java<span style="font-family: 宋体;">指</span>java source code<span style="font-family: 宋体;">的根目录；</span></p>
<p>@web<span style="font-family: 宋体;">指</span>web application<span style="font-family: 宋体;">的根目录；</span></p>
<p>templateDir@path<span style="font-family: 宋体;">指</span>freemarker template<span style="font-family: 宋体;">所在的目录，这里设定的是</span>$Code_Engin$"template; <span style="font-family: 宋体;">此目录下放置用于生成</span>controller<span style="font-family: 宋体;">和</span>jsp<span style="font-family: 宋体;">的模板文件（以</span>ftl<span style="font-family: 宋体;">为文件后缀）；</span></p>
<p>template /lib/<span style="font-family: 宋体;">下面放置的一个</span>common.ftl<span style="font-family: 宋体;">为通用的</span>functions<span style="font-family: 宋体;">，已经用</span>auto imports<span style="font-family: 宋体;">引入，要调用</span>common.ftl<span style="font-family: 宋体;">的</span>function<span style="font-family: 宋体;">，通常类似：</span><span>&lt;@ce.dosth param=paramObj
/&gt;, ce</span><span style="font-family: 宋体;">是</span>namespace<span style="font-family: 宋体;">，用于限定引用；具体代码见（</span>BaseGenerator.java<span style="font-family: 宋体;">）</span></p>
<p style="margin-left: 39pt; text-indent: -18pt;">5）&nbsp;i18nSupport<span style="font-family: 宋体;">是指定</span>jsp<span style="font-family: 宋体;">是否支持多语言；一般设定为支持的；</span></p>
<p><span>&lt;package base="biz.wic"
app="application"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&nbsp;&lt;domain&gt;domain&lt;/domain&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;controller&gt;web&lt;/controller&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;manager&gt;manager&lt;/manager&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;service&gt;service&lt;/service&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/package&gt;</span></p>
<p><span style="font-family: 宋体;">用于设定</span>java code<span style="font-family: 宋体;">的</span>package<span style="font-family: 宋体;">；</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&nbsp;&lt;web
layoutComponent="tiles"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;manager&gt;WEB-INF"applicationContext-manager.xml&lt;/manager&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;servlet&gt;WEB-INF"jbcc-servlet.xml&lt;/servlet&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;security&gt;WEB-INF"applicationContext-acegi.xml&lt;/security&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;sqlMapConfig&gt;WEB-INF"sql-map-config.xml&lt;/sqlMapConfig&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;messages&gt;WEB-INF"classes"messages.properties&lt;/messages&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;tiles&gt;WEB-INF"defs&lt;/tiles&gt;</span></p>
<p style="margin-left: 39pt; text-indent: -18pt;">6）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/web&gt;</p>
<p>3.<strong>code-engine-gears.xml</strong><strong><span style="font-family: 宋体;">配置详解：</span></strong></p>
<p><span>&lt;?xml version="1.0"
encoding="UTF-8"?&gt;</span></p>
<p>&lt;gears&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;!--</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>Generate model, related sqlmap manager file via abator, in most case we
don't need modify the abator-config.xml;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>just add the following model node will work;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>and this model node can create more than one;&nbsp;model name should be unique;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>default extends is : biz.web.framework.domain.BaseEntity</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;model name="city_model" table="city"
domain="City" usingLucene="false"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>extends="biz.web.framework.domain.BaseEntity" keyProperty="id"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;!--</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>Create *Controller and *MgrController, modify layout component like
Tiles of Sitemesh;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>modify action-servlet.xml, applicationContext-*.xml</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>defaultMethods@keyProperty default to "id"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;controller name="City" springBeanDef="true"
template="controller.ftl"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;managers&gt;CityMgr&lt;/managers&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;!--&lt;services
support="MailService"&gt;&lt;/services&gt;--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;defaultMethods refModel="city_model"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;method name="index" style="form"
view="list_city"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;method name="listAll" style="ajax" /&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;method name="list" style="ajax" /&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;method name="get" style="ajax"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/defaultMethods&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;/controller&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;!--&nbsp;using the option
[extends] to generated Mgr controller,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>overwrite default to true;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>method view default to</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;controller name="CityMgr" springBeanDef="true"
template="controller_mgr.ftl"</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extends="City"
overwrite="true"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;!--&lt;services support="CompassService"&gt;&lt;/services&gt;--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;defaultMethods refModel="city_model"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;method name="manager" style="form"
view="list_mgr_city"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;method name="update" style="form"
view="edit_city"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;method name="create" style="form" view="edit_city"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;method name="save" style="form"
view="edit_city"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;method name="edit" style="form"
view="edit_city"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;method name="delete" style="ajax"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/defaultMethods&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;/controller&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;!-- overwrite default to true;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>jsp name attribute used for jsp file name, and also used for tiles
definition</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;jsp name="list_mgr_city" refController="CityMgr"
template="list_mgr_jsp.ftl" overwrite="false"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;tiles&gt;main_layout_4&lt;/tiles&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;/jsp&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;jsp name="edit_city" refController="CityMgr"
template="edit_jsp.ftl" overwrite="false"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;!--&lt;tinyMCE&gt;content&lt;/tinyMCE&gt;--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;!--&lt;tiles&gt;main_layout_4&lt;/tiles&gt;--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;/jsp&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;!--&lt;jsp name="detail_recommend"
refController="City" template="detail_jsp.ftl"
overwrite="false"&gt;--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;!--&lt;tinyMCE&gt;content&lt;/tinyMCE&gt;--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;!--&lt;tiles&gt;main_layout_1&lt;/tiles&gt;--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;!--&lt;/jsp&gt;--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;!--overwrite default to true;--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;!--&lt;jsp name="list_city" refController="City"
template="list_jsp.ftl" overwrite="false"&gt;--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;!--&lt;tiles&gt;main_layout_2&lt;/tiles&gt;--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;!--&lt;/jsp&gt;--&gt;</span></p>
<p>&lt;/gears&gt;</p>
<p>1<span style="font-family: 宋体;">）</span>&lt;model&gt; &lt;controller&gt;&lt;jsp&gt; <span style="font-family: 宋体;">等节点用于生成</span>domain<span style="font-family: 宋体;">，</span>manager<span style="font-family: 宋体;">，</span>controller<span style="font-family: 宋体;">和</span>jsp<span style="font-family: 宋体;">，可配置</span>0-n<span style="font-family: 宋体;">个；次序随意</span>; <span style="font-family: 宋体;">且每个节点都有可选属性</span> overwrite <span style="font-family: 宋体;">（</span>true<span style="font-family: 宋体;">、</span>false<span style="font-family: 宋体;">）；</span></p>
<p>overwrite<span style="font-family: 宋体;">指定当目标</span>controller<span style="font-family: 宋体;">文件存在时，是否要覆写该文件，否则就生成</span>.generated<span style="font-family: 宋体;">为后缀的文件；</span>overwrite<span style="font-family: 宋体;">属性是可选的，默认为</span>true<span style="font-family: 宋体;">；</span></p>
<p>2<span style="font-family: 宋体;">）</span><span>&lt;controller name="CityMgr"
springBeanDef="true" template="controller_mgr.ftl"</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extends="City"
overwrite="true"&gt;</span></p>
<p style="margin-left: 42pt;">&lt;managers&gt;CityMgr&lt;/managers&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;!--&lt;services
support="CompassService"&gt;&lt;/services&gt;--&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;defaultMethods refModel="city_model"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;method name="manager" style="form"
view="list_mgr_city"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;method name="update" style="form"
view="edit_city"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;method name="create" style="form"
view="edit_city"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;method name="save" style="form"
view="edit_city"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;method name="edit" style="form"
view="edit_city"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;method name="delete" style="ajax"/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/defaultMethods&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;/controller&gt;</span></p>
<p><span style="font-family: 宋体;">这个配置看上去有些复杂，是为了提供更好的灵活性；</span>name<span style="font-family: 宋体;">用于在</span>code engine<span style="font-family: 宋体;">中标识</span>controller<span style="font-family: 宋体;">，同时用于生成的</span>controller.java<span style="font-family: 宋体;">的命名；在配置文件中应该是唯一的；</span></p>
<p>springBeanDef<span style="font-family: 宋体;">用于指出是否在相关的配置文件中添加</span>spring bean<span style="font-family: 宋体;">的定义，比如</span>xxx-servlet.xml<span style="font-family: 宋体;">等；否则只是生成</span>controller<span style="font-family: 宋体;">的</span>java<span style="font-family: 宋体;">；</span></p>
<p>template<span style="font-family: 宋体;">指定</span>freemarker<span style="font-family: 宋体;">模板；</span></p>
<p>managers<span style="font-family: 宋体;">指定要注入</span>manager<span style="font-family: 宋体;">定义；如果有多个用逗号分割；可选；</span></p>
<p>services<span style="font-family: 宋体;">指定要注入</span>service<span style="font-family: 宋体;">定义；如果有多个用逗号分割；</span>@support<span style="font-family: 宋体;">用于指定</span>framework<span style="font-family: 宋体;">下的</span>common service<span style="font-family: 宋体;">，比如</span>mail<span style="font-family: 宋体;">，</span>compass<span style="font-family: 宋体;">等；可选；</span></p>
<p>defaultMethods<span style="font-family: 宋体;">里面用于指定生成的</span>controller<span style="font-family: 宋体;">里面的方法；</span>refModel <span style="font-family: 宋体;">指参照的</span>model<span style="font-family: 宋体;">定义，</span> method@name<span style="font-family: 宋体;">用于指定方法名，比如</span>list<span style="font-family: 宋体;">，而且</span>list<span style="font-family: 宋体;">方法是预定义写在模板里面的</span>; method@style<span style="font-family: 宋体;">指定代码风格，可选有</span>form<span style="font-family: 宋体;">，</span>ajax<span style="font-family: 宋体;">两种；这个风格会同时影响</span>cotroller<span style="font-family: 宋体;">部分和</span>jsp<span style="font-family: 宋体;">部分；</span></p>
<p>method@view<span style="font-family: 宋体;">指方法返回的</span>tiles<span style="font-family: 宋体;">定义视图，当然这个属性在</span>style<span style="font-family: 宋体;">是</span>form<span style="font-family: 宋体;">的时候有效；可选；</span></p>
<p>e<span style="font-family: 宋体;">）</span>
<span>&lt;jsp name="edit_user" refController="UserMgr"
template="edit_jsp.ftl" &gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;tinyMCE&gt;Description&lt;/tinyMCE&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;tiles&gt;main_layout_1&lt;/tiles&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;/jsp&gt;</span></p>
<p>Jsp<span style="font-family: 宋体;">的</span>name<span style="font-family: 宋体;">用于生成的</span>jsp<span style="font-family: 宋体;">页面的文件名，同时还是</span>tiles<span style="font-family: 宋体;">的定义，在生成</span>controller<span style="font-family: 宋体;">时候也是有用的；</span></p>
<p>refController<span style="font-family: 宋体;">就是指明</span>jsp<span style="font-family: 宋体;">所参照的</span>controller<span style="font-family: 宋体;">定义；通过这个</span>refController<span style="font-family: 宋体;">，</span>jsp<span style="font-family: 宋体;">可以找到</span>default_methods<span style="font-family: 宋体;">的</span>style<span style="font-family: 宋体;">，</span>refModel<span style="font-family: 宋体;">等信息；</span></p>
<p>Template<span style="font-family: 宋体;">指明所使用的</span>freemarker<span style="font-family: 宋体;">模板；</span></p>
<p><span style="font-family: 宋体;">这里省略了</span>overwrite<span style="font-family: 宋体;">属性，</span>overwrite<span style="font-family: 宋体;">属性是可选的，默认为</span>true<span style="font-family: 宋体;">；</span></p>
<p>tinyMCE<span style="font-family: 宋体;">指定要加入</span>tinyMCE<span style="font-family: 宋体;">支持，同时，所管理的属性为&#8216;</span>Description<span style="font-family: 宋体;">&#8217;；</span> <span style="font-family: 宋体;">可选属性；</span></p>
<p>tiles<span style="font-family: 宋体;">属性定义了，此</span>jsp<span style="font-family: 宋体;">所</span>extend<span style="font-family: 宋体;">的</span>layout<span style="font-family: 宋体;">，可选属性；</span></p>
<p>f) </p>
<p><span>&lt;model name="city_model"
table="city" domain="City" usingLucene="false"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>extends="biz.web.framework.domain.BaseEntity"
keyProperty="id"/&gt;</span></p>
<p><span style="font-family: 宋体;">用于生成</span>domain<span style="font-family: 宋体;">，</span>manager<span style="font-family: 宋体;">，和</span>sqlmap<span style="font-family: 宋体;">，可以配置多个；</span></p>
<p>luceneSupport<span style="font-family: 宋体;">可选，如为</span>true<span style="font-family: 宋体;">代表将在</span>domain<span style="font-family: 宋体;">和</span>manager<span style="font-family: 宋体;">以及配置文件中加入</span>lucene<span style="font-family: 宋体;">的支持；</span></p>
<p>4.<strong><span style="font-family: 宋体;">创建新项目</span></strong></p>
<p>A.<span style="font-family: 宋体;">从</span>codeEngineRunner<span style="font-family: 宋体;">开始执行</span>createNewProject<span style="font-family: 宋体;">（&#8220;</span>distProject<span style="font-family: 宋体;">&#8221;）；（将</span>copy<span style="font-family: 宋体;">必需的框架文件到目标目录，同时修改</span>jdbc.properties<span style="font-family: 宋体;">等文件，同时将初始化</span>abator-config.xml<span style="font-family: 宋体;">；）</span></p>
<p>B<span style="font-family: 宋体;">．分别用到了</span>JDBCPropertiesModifier<span style="font-family: 宋体;">和</span>CodeEngineInitModifier<span style="font-family: 宋体;">；</span></p>
<p>C<span style="font-family: 宋体;">．执行目标工程</span>project<span style="font-family: 宋体;">目录下的</span>initdb.bat;<span style="font-family: 宋体;">初始化数据库，加载初始系统表和数据；当然执行此步骤之前要先创建数据库；</span></p>
<p>D<span style="font-family: 宋体;">．利用</span>codeEngineRunner<span style="font-family: 宋体;">的从数据库表，生成相应的文件后，使用</span>project<span style="font-family: 宋体;">目录下</span>build.bat<span style="font-family: 宋体;">编译文件；</span></p>
<img src ="http://www.blogjava.net/bourn/aggbug/143997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-09-10 14:47 <a href="http://www.blogjava.net/bourn/articles/143997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开发出高性能的网站，第三部分：压缩和其他服务器端的技术  </title><link>http://www.blogjava.net/bourn/articles/142715.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Tue, 04 Sep 2007 10:09:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/142715.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/142715.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/142715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/142715.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/142715.html</trackback:ping><description><![CDATA[转自http://www.uigarden.net/chinese/gao-xing-neng-iii<br />
<h3><a nicetitle="这篇文章的永久链接" href="http://www.uigarden.net/chinese/gao-xing-neng-iii">开发出高性能的网站，第三部分：压缩和其他服务器端的技术</a> - 2005-05-01</h3>
<br />
作者 <a href="http://www.uigarden.net/chinese/%e4%bd%9c%e8%80%85/Thomas+A.+Powell+%E5%92%8C+Joe+Lima/">Thomas A. Powell 和 Joe Lima</a>
<blockquote>
<p><a href="http://www.uigarden.net/english/developing-your-site-for-performance-part-iii-compression-and-other-server-side-enhancements">阅读本文英文原文</a>（翻译：刘松涛）<br />
经<a href="http://www.port80software.com/">Port80软件</a>授权发表</p>
</blockquote>
<p>在<a href="http://www.uigarden.net/chinese/gao-xing-neng-1">第一部分</a> , 我们讲了代码优化的20个技巧，这些代码优化都是针对开发者源代码的；在<a href="http://www.uigarden.net/chinese/gao-xing-neng-ii">第二部分</a> , 我们谈了缓冲控制。我们在此第三部分中，将来和大家一起看看其他的服务器端的技术，来提升网站的速度，我们先来看看HTTP压缩。</p>
<p><strong>什么是HTTP压缩？</strong></p>
<p>HTTP
压缩（或叫HTTP内容编码）作为一种网站和网页相关的标准，存在已久了，只是最近几年才引起大家的注意。HTTP压缩的基本概念就是采用标准的gzip
压缩或者deflate编码方法，来处理HTTP响应，在网页内容发送到网络上之前对源数据进行压缩。有趣的是，在版本4的IE和NetScape中就早
已支持这个技术，但是很少有网站真正使用它。Port80软件公司做的一项调查显示，财富1000强中少于5%的企业网站在服务器端采用了HTTP压缩技
术。不过，在具有领导地位的网站，如Google、Amazon、和Yahoo!等，HTTP内容编码技术却是普遍被使用的。考虑到这种技术会给大型的网
站们带来带宽上的极大节省，用于突破传统的系统管理员都会积极探索并家以使用HTTP压缩技术。</p>
<p>我们可以在浏览器发出的<code>Accept</code>请求的头部看到HTTP内容编码的键值。我们来看看Mozilla Firefox浏览器的这个请求，如下，我们特别注意一下<code>Accept</code>，<code>Accept-Language</code>，<code>Accept-Encoding</code>，和 <code>Accept-Charset</code>的头（header）:</p>
<code>GET / HTTP/1.1<br />
Host: www.port80software.com<br />
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040206 Firefox/0.8<br />
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,
text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1<br />
Accept-Language: en-us,en;q=0.5<br />
Accept-Encoding: gzip,deflate<br />
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7<br />
Keep-Alive: 300<br />
Connection: keep-alive</code>
<p>这些个<code>"Accept"</code>值
会被服务器用到，进而决定将适当的内容通过内容协商（Content
Negotiation）发回来—这是非常有用的功能，它可以让网站服务器返回不同的语言、字符集、甚至还可以根据使用者的习惯返回不同的技术。关于内容
协商的讨论很多，我们这就不再多讲。我们主要来看看和服务器端压缩有关的一些东西。<code>Accept-Encoding</code>表明了浏览器可接受的除了纯文本之外的内容编码的类型，比如gzip压缩还是deflate压缩内容。</p>
<p>我们下面来看看IE发出的请求headers，我们可以看到类似的<code>Accept-Encoding</code>值：</p>
<code>GET / HTTP/1.1<br />
Host: www.google.com<br />
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)<br />
Accept: image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,
application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,
application/x-shockwave-flash,*/*<br />
Accept-Encoding: gzip,deflate<br />
Accept-Language: en-us<br />
Connection: keep-alive</code>
<p>假设当今主流的每种浏览器都支持gzip和deflate编码(那些不支持的也不会发出<code>Accept-Encoding</code>)，我们可以简单的修改一下网站服务器，从而返回压缩内容到这些浏览器上，并返回标准（也就是没有压缩的）内容到其他的浏览器上。在下例中，如果我们的浏览器告诉Google它不接受内容编码，我们会取回3,358字节的数据；如果我们发出<code>Accept-Encoding</code>，再加上应答header告诉我们<code>Content-Encoding: gzip</code>，我们则会取回仅仅1,213字节 。用浏览器的查看源代码功能来看源代码，我们看不出什么差异，但如果使用网络跟踪的话，我们就会发现其响应是不同的。</p>
<p style="text-align: center;"><img src="http://www.uigarden.net/upload/Articles/port80/200505_01.gif" title="图一: Google压缩 / 非压缩对比" alt="图一: Google压缩 / 非压缩对比" /></p>
<p style="text-align: center;"><strong>图一: Google压缩 / 非压缩对比</strong></p>
<p>上例中，虽然文件不大，但是效果依然很明显—压缩后比原来小了74%。再加上我们前面两部分谈到的HTML、CSS、和JavaScript代码优化，Google在提升网站性能上的成果非常惊人—它的一个网页居然可以放在一个TCP响应包里。</p>
<p>虽
然Google在带宽上的考虑也远远超出其他一般的网站，HTTP内容编码进一步让HTML、CSS、和JavaScript等瘦身50%甚至更多。不好
的地方是，HTTP内容编码（词语&#8216;压缩&#8217;和&#8216;内容编码&#8217;在本文中基本上是一个意思）
基本上针对文本内容很有效，对于图像和其他二进制文件的压缩效果就一般了，有时可能根本没有效果，但总的来说，即使有很多二进制文件的时候，整体上可以瘦
身15%到30%那么多。</p>
<p><strong>HTTP内容编码的服务器端支持</strong></p>
<p>如果你现在认同HTTP压缩的
价值，下一个大问题是：你如何来实施？在Apache网站服务器上，可以使用mod_deflate来进行HTTP内容的编码。在微软的IIS上，就有些
麻烦了。虽然IIS
5可以支持gzip的编码压缩，但实施起来还是超级麻烦，尤其考虑到因为各种浏览器中细微差异来进行各种细致参数调整的时候。所以在IIS
5上，还是要考虑第三方的采用ISAPI过滤器的压缩插件，比如<a href="http://www.httpzip.com/">httpZip</a> 就是最好的一种。IIS 6上集成了压缩功能，也更快更灵活，但是还是配置起来比较复杂。<a href="http://www.zipenable.com/">ZipEnable</a> 带给我们第一个专为IIS 6集成压缩细致管理的工具—并且还有浏览器兼容情况监测功能。</p>
<p><strong>服务器内容编码的实质</strong></p>
<p>当
实施HTTP压缩时，要平衡考虑一些因素；如果将服务器配置成&#8216;输出&#8217;的内容压缩方式，虽然可以降低带宽的使用，但同时却增加了CPU的开销。多数情况
下，这不是什么大问题，尤其当网站服务器所作工作很少的时候。不过，在网络浏览很繁重的网站服务器上，运行相当多的动态内容就可能会达到CPU工作的极
限，这时再进而进行压缩的话，CPU可能会超负荷运行了。通过添加而外的服务器硬件资源，当然可能会减轻这种问题，并让我们享受通过压缩而节省下来的带
宽， 但最后带宽和CPU的问题还是要看哪个成本更高。</p>
<p>说到底，系统管理员和网站开发者是否对HTTP的压缩有兴趣，还是要看最
后的效果如何。当我们明显的发现带宽的负载下来了，那么访问者也可能会明显感觉转载网页的速度慢了。因为，压缩产生和解压缩会带来的CPU负载，
TTFB (time to first
byte)也通常会增加，这样浏览器渲染网页的速度也会降下来，但这还算是很好的平衡，因为数据压缩后传输的包变小了、变少了，提交的速度会变快，这个快
速回补偿网页渲染的慢速。然而，对于宽带用户来说，这样的改善可能就不明显了。不过，这两种情况下，对于网站建设者来说，都可以节省一些网络上的投资。当
然，如果可感知的反应时间对某网站来说是主要目标，并且网站的访问者很多都还使用拨号上网，那么本文的第二部分钟所讲的缓冲控制就是比较好的性能提高策
略。</p>
<p>最后，HTTP内容编码的另一个潜在问题是和由脚本产生的网页带来的服务器负载有关的，比如PHP和ASP。在此种情况下，
主要的问题是，网页内容每次请求可能会被再压缩，这样就会给服务器增加更多的负载（相对压缩静态内容来说）。如果，网站中所有的网页都是在请求时生成的
话，那么使用HTTP内容编码就得格外小心了。还好，很多商业上使用的压缩插件，直到如何对内容进行缓冲，但业余（较便宜的）的压缩工具可能就没有这些特
性了。</p>
<p><strong>动态网页：立即生成，还是稍后生成？</strong></p>
<p>有趣的是，很多的开发者都是在网站被访问时开
始动态的生成很多甚至全部他们网站的网页。比如，http://www.domain.com/article.php?id=5就是一个通用的URL，
它暗示了某个网页是由数据库查询时或填充模版生成的。这种常用方法的问题是，在很多情况下，在请求时间生成一个网页是pointless的，因为很多时候
这个主要的静态的（所谓的静态的动态网页、或脚本网页），其内容很长时间也不变化，这显然对于提高网页装载速度没有什么帮助。实际上，在一个高负荷的网站
这种方式会严重的降低服务期的性能。</p>
<p>要避免不必要的动态网页的生成，有一个方法是，每次有变化时，则预先生成有内容的静态.
html网页。如果这些生成的.html网页，还是经过了代码优化（在本文第一部分中过这些描述方法），则更好。这不仅会让服务器交付这些网页更快变得更
容易，而且这些技术还会使搜索引擎更友好。</p>
<p>不幸的是，在很多情况下，简单的生成动态的HTML网页并不太容易，也为很多网页只有
在网页被访问时才能够正确的生成动态内容。在这种情况下，你最好是对网页进行&#8216;烘焙&#8217;生成快速执行的形式。在ASP
.NET的情况下，这种形式则是二进制代码，在服务器端执行的特别快。不好的地方是，在用户访问之前，服务器需要先执行这些网页强制执行这些字节代码。还
好，在ASP .NET 2.0中，这些问题将得到改善。在PHP中，一些诸如Zend等的优化软件是不错的投资。</p>
<p>对于提交静态
和动态网页、或者HTML和图像的不同需要来说，考虑一下针对物理服务器或其他的硬件上的加速可能，也是比较明智的选择。为了网页加速而加强硬件方面的投
入的另一个方法是专业化—不同的部件进行不同的工作，这样产生出最大的效率。虽然，本文是从代码和网站服务器校对来说明如何提高网站的性能的，我们也不妨
讨论讨论其他相关的元素。</p>
<p><strong>对网站服务器进行涡轮增压</strong></p>
<p>加速网站要考虑的一个重点是服务器软
件和服务器硬件。先谈软件，网站系统管理员不太可能来回因为易用性问题、性能问题、安全问题等在Apache和IIS之间切换来切换去。简言之，网站服务
器和其底层的操作系统之间的关系错综复杂、互相影响，再进行系统或服务迁移则更是繁重且有风险的工作。所以，你如果真的考虑放弃一种网站服务器而使用另一
种的话，你必须严肃认真的好好考虑这个问题；而如果速度是考虑的第一要素的话，建议你考虑一下Zeus。</p>
<p>再谈硬件，如果要考虑升
级硬件，则先仔细分析一下服务器上的主要任务。在静态网站上，主要的工作是调整网络连接和把文件从磁盘拷贝到网络上。要加速这样类型的网站，你得把注意力
放在高速硬盘子系统和高速网络子系统上，另外还得有足够多的内存来处理并发请求。实际上，你可能得给服务器添加大量的内存，从而为经常使用的对象尽可能的
增加内存缓冲来减轻磁盘的存取。有趣的是，CPU的速度在这里却不是十分关键。虽然不能否认CPU对网站的整体性能有影响，但瓶颈主要发生在磁盘上。但
是，当网站处理动态网页和静态网页差不多一样多的时候，处理器就显得很关键了，但即便如此高速磁盘或双网卡还是更有效一些。另一种情况下，除了要处理动态
网页，还要处理其他占用CPU的操作（比如SSL和HTTP压缩等）的时候，CPU就显得十分关键了。换句话说，要加速网站服务时，服务器具体所作的工作
决定着什么类型的硬件资源更需要增强。</p>
<p>当你没有那么多增加服务器硬件或软件的预算时，还有一些物美价廉的解决方法。比如，你可以
对服务器的TCP/IP设置进行优化，这样依赖TCP/IP网络的HTTP便可以最优运行。TCP/IP的设置优化里，有一项是TCP的接受窗口，可以把
它调整成最适合应用或者最适合网络连接的，或者是针对确保TCP连接的一些参数（如ACK或TCP_NODELAY等）进行调整，根据具体情况设置成使用
或不使用。还有一些参数，比如TIME_WAIT时间等，也是可以进行调整的。但要记住，不管怎么调整这些网站服务或操作系统的参数，都必须进行真实的加
载试验以验证你的调整会不会反而减慢用户访问的服务或带来新的问题。此外，一定要弄懂这些参数之后，再进行调整。</p>
<p><strong>通过分工进行加速</strong></p>
<p>网站加速还可以考虑的一个出发点是，不同的网站内容可能会拥有不同的提交特性。考虑到不同的内容，其特性也不同，我们可以用多个服务器，每个服务器来执行不同的内容处理，这样可能比用服务器池（server farm）中的每一个服务来处理同样的任务要好得多。</p>
<p>我
们来看一个分工进行加速的简单例子。当你的商务网站给购物车或外部网使用SSL加密的时候，你会发现当有多个用户同时访问的时候，SSL加密带来
HTTPS段的明显负载会使你的服务器的性能会急剧下降。这种情况下，把流量分配给另一台服务器，其意义就十分明显了。比如，把你的主站点放在
www.domain.com上，把结账的处理部分放在shop.domain.com上。这个shop.domain.com就是一个专门处理SSL流
量的服务器，可能会用到SSL加速卡。采取分工的方式，可以让你专心处理结账的用户的SSL流量，而不至于像以往SSL的处理会导致服务器整体性能的下
降。对于图像和其他重量级的二进制的比如PDF文档或.exe文档，服务器处理其下载可能要花些力气，这些连接通常持续的时间比一般的连接都长，会消耗大
量宝贵的TCP/IP资源。进而，对于这些媒体资源(PDF、.exe、图像等)的处理，我们也并不需要把它们和文本资源（HTML、CSS和
JavaScript等）等同对待处理。在这种情况下，让处理文本资源的服务器有高性能的CPU，让处理媒体资源的服务器有大带宽，是有的放矢的解决之
道。</p>
<p>分工还可以进一步应用到网页的生成上。我们可以考虑把生成网页的工作单独放在一个服务器上，把处理静态内容的工作放在另一个
服务器上。现在已然有很多网站是采取这样的模式了，这其中很多网站会使用一个叫做Squid的反向代理（reverse
proxy）。在设置过程中，代理服务器专门提供静态的内容，速度很快；而后台的服务器则可以专心处理在访问时才会产生的动态内容。缓冲控制策略和规则，
我们在第二部分中谈到过，在这时的设置过程中就显得十分重要了；我们得确保代理服务器的缓冲中储存的内容在共享缓冲中是安全的。</p>
<p><strong>为了争夺市场而提速</strong></p>
<p>我
们刚才谈的那些东西主要是一些低成本的加速技术，在我们本文即将结束的时候，我们来看看一些需要软硬件成本很高但收益可观的方法。目前市场上提供有一些需
要花些钱的独特加速设备，它们可以进行比如网络连接分流、压缩、缓冲、和其他等技术，从而达到加速的目的。
如果你不在乎投资高带宽的话，这些解决方案就十分有效，但是大多数的网站还是更喜欢我们先前介绍过的物美价廉的方法，比如代码优化、缓冲、和HTTP编码
等。</p>
<p>就算你有很多资金，可以投资一个服务器池（server
farm）、并添加最高档的加速设备，也使用压缩和缓冲技术等，但你还是会最后达到一个极限。要想进一步再提速，还有最后一招：把内容放在离访问者最近的
地方，有可能的话，在那个地方再实施上述各类技术（如压缩、缓冲等）。你肯定注意过，有些网站提供镜像服务器等，这样世界各地的访问者就可以就近访问所需
内容。不过，还有比这个更有地理分布意义的方法，并且可以透明的让访问者使用。内容分发网络（Content Distribution
Network &#8211;
CDN），比如Akamai，就可以让我们把重型内容（如图象和其他二进制内容等）搬移到离访问者更近的地方，这样通过内容分发网站在世界各地的边缘缓
冲，访问者访问起来就会更快。这种方式带来了性能上极大提高，目前世界级的一些大网站都在使用。虽然这算不上是经济实用的方法，但作为这些方法的最后补
充，放在这里以飨读者。</p>
<blockquote>Thomas A. Powell
是PINT公司的创始人，也是加州大学San Diego分校计算机科学系的讲师，以及一些网页开发书籍的作者，其所著书目包括《HTML &amp;
XHTML: The Complete Reference》和 《JavaScript: The Complete Reference》等。
<p>Joe Lima 是Port80软件公司的首席构架师(architect)，同时教授UCSD 扩展的服务器技术。</p>
<p><strong>Port80软件公司</strong><br />
Port80 Software, Inc. 是微软 Internet Information Services (IIS)
网络服务的领先的开发商. 公司同时提供w3compiler, 一套优化代码的桌面应用软件。Port80 Software
是微软认证合作商(MCP ISV)。它位于San Diego, CA. 更多信息请见公司网站 www.port80software.com.</p>
</blockquote><br />
<img src ="http://www.blogjava.net/bourn/aggbug/142715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-09-04 18:09 <a href="http://www.blogjava.net/bourn/articles/142715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用开源组件开发高性能(Scalability and High Performance)的网站_1</title><link>http://www.blogjava.net/bourn/articles/142712.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Tue, 04 Sep 2007 10:00:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/142712.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/142712.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/142712.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/142712.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/142712.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;">利用开源组件开发高性能</span>(Scalability and High Performance)<span style="font-family: 宋体;">的网站</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>1.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">方案：</span></p>
<p style="margin-left: 42pt; text-indent: -21pt;"><span><span>a)<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span>Load balancer +<span>reverse proxy server + server
cluster</span><span style="font-family: 宋体;">；</span></p>
<p style="margin-left: 21pt;"><span style="font-family: 宋体;">图一是整体的结构图；思路很清楚；这种的结构的网站系统可以提高系统的响应能力；</span></p>
<p><span><!--[if gte vml 1]>
<![endif]--></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.blogjava.net/images/blogjava_net/bourn/image002.jpg" height="438" width="553" />&nbsp; <span style="font-family: 宋体;">图一</span></p>
<p style="margin-left: 21pt;">b<span style="font-family: 宋体;">）细节问题：</span></p>
<p style="margin-left: 21pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i<span style="font-family: 宋体;">）</span>web server <span style="font-family: 宋体;">是否可以是非同质的</span>server<span style="font-family: 宋体;">，比如有的负责</span>mail<span style="font-family: 宋体;">，有的负责</span>web<span style="font-family: 宋体;">页面，</span></p>
<p style="margin-left: 42pt; text-indent: 10.5pt;"><span style="font-family: 宋体;">有的负责文件上传；</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ii)<span style="font-family: 宋体;">用户的</span>session<span style="font-family: 宋体;">信息如何在不同的</span>server<span style="font-family: 宋体;">之间同步；</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iii<span style="font-family: 宋体;">）如果使用数据库集群的话，则有的</span>dbserver<span style="font-family: 宋体;">只负责读数据，有的则读写都做；</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体;">如何实现；</span>Replaication <span style="font-family: 宋体;">在</span>mysql<span style="font-family: 宋体;">中的支持正在研究；</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c<span style="font-family: 宋体;">）加入</span>reverse proxy server; <span style="font-family: 宋体;">图二显示了如何在架构中加入</span>reverse proxy server<span style="font-family: 宋体;">；</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体;">这里选择的</span>proxy server<span style="font-family: 宋体;">是</span>squid <span style="font-family: 宋体;">（</span>http://<span style="font-size: 10pt;">www.squid-cache.org</span><span style="font-family: 宋体;">），（至于为什么选它，</span></p>
<p style="margin-left: 15pt; text-indent: 31.5pt;"><span style="font-family: 宋体;">因为很多人都用它；本人奉行拿来主义）；</span>squid<span style="font-family: 宋体;">用来</span>cache<span style="font-family: 宋体;">静态的文件，</span>js<span style="font-family: 宋体;">，</span>image<span style="font-family: 宋体;">，</span></p>
<p style="margin-left: 15pt; text-indent: 31.5pt;">css<span style="font-family: 宋体;">等；</span>squid<span style="font-family: 宋体;">可以和</span>tomcat<span style="font-family: 宋体;">，</span>apache<span style="font-family: 宋体;">等集成；</span></p>
<img alt="" src="http://www.blogjava.net/images/blogjava_net/bourn/image006.jpg" height="437" width="554" />
<p><span><!--[if gte vml 1]>
<![endif]--></span></p>
<p><span style="font-family: 宋体;">图二</span></p>
<p style="margin-left: 21pt;">d<span style="font-family: 宋体;">）谁来做</span>load balancer<span style="font-family: 宋体;">呢，如果你使用</span>linux<span style="font-family: 宋体;">操作系统的话，那么一定要试试</span><span style="font-size: 10pt;">Linux
Virtual Server</span><span style="font-size: 10pt; font-family: 宋体;">（</span><span style="font-size: 10pt;"><a href="http://www.linuxvirtualserver.org/">www.linuxvirtualserver.org/</a>&nbsp;http://zh.linuxvirtualserver.org/ </span><span style="font-size: 10pt; font-family: 宋体;">）</span><span style="font-size: 10pt;">, </span><span style="font-size: 10pt; font-family: 宋体;">我国的章文嵩博士主持的开源项目，</span>TelTel<span style="font-family: 宋体;">的首席科学家；</span></p>
<p style="margin-left: 21pt;">IBM <span style="font-family: 宋体;">的介绍资料：</span></p>
<p style="margin-left: 21pt;"><a href="http://www-128.ibm.com/developerworks/cn/linux/cluster/lvs/part1/index.html">http://www-128.ibm.com/developerworks/cn/linux/cluster/lvs/part1/index.html</a></p>
<p style="margin-left: 21pt;"><a href="http://www-128.ibm.com/developerworks/cn/linux/cluster/lvs/part2/index.html">http://www-128.ibm.com/developerworks/cn/linux/cluster/lvs/part2/index.html</a></p>
<p style="margin-left: 21pt;"><a href="http://www-128.ibm.com/developerworks/cn/linux/cluster/lvs/part3/index.html">http://www-128.ibm.com/developerworks/cn/linux/cluster/lvs/part3/index.html</a></p>
<p style="margin-left: 21pt;"><a href="http://www-128.ibm.com/developerworks/cn/linux/cluster/lvs/part4/index.html">http://www-128.ibm.com/developerworks/cn/linux/cluster/lvs/part4/index.html</a></p>
<img alt="" src="http://www.blogjava.net/images/blogjava_net/bourn/image008.jpg" height="493" width="554" />
<p><span><!--[if gte vml 1]>
<![endif]--></span></p>
<p><span style="font-family: 宋体;">图三</span></p>
<img src ="http://www.blogjava.net/bourn/aggbug/142712.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-09-04 18:00 <a href="http://www.blogjava.net/bourn/articles/142712.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Code Engine基本技术demo2</title><link>http://www.blogjava.net/bourn/articles/142384.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Mon, 03 Sep 2007 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/142384.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/142384.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/142384.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/142384.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/142384.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;">关于如何生成字段的编辑页面；</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>1.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">首先应该读取</span>domain<span style="font-family: 宋体;">对象，从而获取</span>field<span style="font-family: 宋体;">列表；</span></p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp; /**</p>
<p style="margin-left: 18pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp; * getDomainFields via jsp name, and should
remove the super fields, like lastUpdatedBy, lastUpdatedDate</span></p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp; * @param name of jsp</p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp; * @return list of field</p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p style="margin-left: 18pt;"><span>&nbsp;&nbsp;&nbsp; public static List&lt;Field&gt;
getDomainFields(String name) {</span></p>
<p style="margin-left: 18pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;Field&gt; ret = new
ArrayList&lt;Field&gt;();</span></p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</p>
<p style="margin-left: 18pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class clz =
Class.forName(CodeEngineConfig.getDomainPackage() + "." +</span></p>
<p style="margin-left: 18pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>CodeEngineConfig.getControllerDomain(CodeEngineConfig.getJspRef(name)));</span></p>
<p style="margin-left: 18pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Field field :
clz.getDeclaredFields()) {</span></p>
<p style="margin-left: 18pt;"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>if(!"lastUpdateDate".equalsIgnoreCase(field.getName())</span></p>
<p style="margin-left: 18pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;
!"lastUpdateBy".equalsIgnoreCase(field.getName())){</span></p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret.add(field);</p>
<p style="margin-left: 18pt;"><span>//<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>System.out.println("field.getName() + field.getType() = " +
(field.getName() + field.getType()));</span></p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {</p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ret;</p>
<p style="margin-left: 18pt;">&nbsp;&nbsp;&nbsp; }</p>
<p style="margin-left: 18pt; text-indent: -18pt;"><span><span>2.<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">将</span>Field List<span style="font-family: 宋体;">传递给</span>freemarker<span style="font-family: 宋体;">模板；之所以要传递</span>field<span style="font-family: 宋体;">而不仅仅是</span>name<span style="font-family: 宋体;">的原因是，因为希望在模板里根据</span>field<span style="font-family: 宋体;">的</span>type<span style="font-family: 宋体;">，从而生成不同的</span>html<span style="font-family: 宋体;">，比如</span>date<span style="font-family: 宋体;">可以生成使用</span>js calendar<span style="font-family: 宋体;">的，</span>boolean<span style="font-family: 宋体;">生成</span>radio<span style="font-family: 宋体;">，或</span>checkbox<span style="font-family: 宋体;">，其他的生成</span>text<span style="font-family: 宋体;">；</span></p>
<p style="margin-left: 42pt; text-indent: -21pt;"><span><span>a)<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">定义</span>macro<span style="font-family: 宋体;">；</span></p>
<p>&lt;#macro getHtml field&gt;</p>
<p>&nbsp;&lt;#if field.type?ends_with('Boolean')&gt;</p>
<p><span>&lt;input type="radio"
id="${field.name}" name="${field.name}"
class="inp_txt_30" size="80"
value="${'$'}{${domain?uncap_first + '.' + field.name}}"&gt;</span></p>
<p>&nbsp;&lt;#elseif field.type?ends_with('Date')&gt;</p>
<p><span>&lt;input type="text"
id="${field.name}" name="${field.name}"
readonly="readonly" class="inp_txt_30" size="17"
value="&lt;fmt:formatDate value="${'$'}{${domain?uncap_first + '.' +
field.name}}" pattern="yyyy-MM-dd hh:mm"/&gt;"&gt;</span></p>
<p><span>&lt;button id="${field.name}Btn"
class="button" &gt;...&lt;/button&gt;</span></p>
<p><span>&lt;script
type="text/javascript"&gt;</span></p>
<p>Calendar.setup(</p>
<p>{</p>
<p>inputField&nbsp;: "${field.name}",&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;// id of the input field</p>
<p><span>ifFormat<span>&nbsp;&nbsp;&nbsp;
</span>: "%Y-%m-%d %H:%M",<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>// the date format</span></p>
<p>showsTime: true,</p>
<p><span>button<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>: "${field.name}Btn"<span>&nbsp;&nbsp;&nbsp;
</span>// id of the button</span></p>
<p>}</p>
<p>);</p>
<p>&lt;/script&gt;</p>
<p>&nbsp;&lt;#elseif field.type?ends_with('Text')&gt;</p>
<p><span>&lt;textarea id="${field.name}"
name="${field.name}" rows="15" cols="80"
style="width: 100%"&gt;${'$'}{${domain?uncap_first + '.' +
field.name}}&lt;/textarea&gt;</span></p>
<p>&nbsp;&lt;#else&gt;</p>
<p><span>&lt;input type="text"
id="${field.name}" name="${field.name}"
class="inp_txt_30" size="80" value="${'$'}{${domain?uncap_first
+ '.' + field.name}}"&gt;</span></p>
<p>&nbsp;&lt;/#if&gt;</p>
<p>&lt;/#macro&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b<span style="font-family: 宋体;">）调用</span>macro<span style="font-family: 宋体;">生成</span>html<span style="font-family: 宋体;">；</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;#list fields! as field&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td
class="txt_tit_s" &gt;&lt;spring:message code="${lbl + '.' +
domain?uncap_first + '.' + field.name}"/&gt;&lt;/td&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;@getHtml
field=field/&gt;&lt;/td&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/#list&gt;</span></p>
<img src ="http://www.blogjava.net/bourn/aggbug/142384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-09-03 17:12 <a href="http://www.blogjava.net/bourn/articles/142384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源框架的选型</title><link>http://www.blogjava.net/bourn/articles/142111.html</link><dc:creator>段氏</dc:creator><author>段氏</author><pubDate>Sun, 02 Sep 2007 11:23:00 GMT</pubDate><guid>http://www.blogjava.net/bourn/articles/142111.html</guid><wfw:comment>http://www.blogjava.net/bourn/comments/142111.html</wfw:comment><comments>http://www.blogjava.net/bourn/articles/142111.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bourn/comments/commentRss/142111.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bourn/services/trackbacks/142111.html</trackback:ping><description><![CDATA[<span style="font-family: 宋体;">如果你想用开源框架来开发</span>web<span style="font-family: 宋体;">项目，选择一套适用的组件是很关键的；</span>
<p><span style="font-family: 宋体;">不光要考虑开发的简单，还要考虑日后的升级；</span></p>
<p><span style="font-family: 宋体;">甚至足够充分的文档资料支持；还有现有团队的技术能力；以及项目时间等；</span></p>
<p style="margin-left: 31.5pt; text-indent: -31.5pt;">MVC<span style="font-family: 宋体;">：第一要素我个人觉得是要简单，因为在这个部分的中的代码量，通常相对后端是很多的；一个容易上手，并且大家都熟悉并且不讨厌；</span></p>
<p style="margin-left: 31.5pt; text-indent: -31.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SpringMVC<span style="font-family: 宋体;">，我个人觉得是很完备的</span>mvc<span style="font-family: 宋体;">，有着很強的灵活性，但正是这种灵活性，让很多人无所适从；</span></p>
<p style="margin-left: 31.5pt; text-indent: -31.5pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Struts 1
</span><span style="font-family: 宋体;">标签很糟糕；</span>form<span style="font-family: 宋体;">对象很别扭，繁琐的配置；</span></p>
<p style="margin-left: 31.5pt; text-indent: -31.5pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Struts2 <span style="font-family: 宋体;">没有用过，如果他还有</span>form<span style="font-family: 宋体;">我就不打算用；</span></p>
<p style="margin-left: 31.5pt;"><span style="font-family: 宋体;">学习</span>springside<span style="font-family: 宋体;">（以前）使用</span>Spring <span style="font-family: 宋体;">的</span>MultiActionController<span style="font-family: 宋体;">，减少了很多没有必要的配置；在一个</span>controller<span style="font-family: 宋体;">里面可以写多个</span>Action<span style="font-family: 宋体;">；</span>MultiActionController<span style="font-family: 宋体;">还可以很灵活的从</span>request<span style="font-family: 宋体;">中绑定</span>Domain<span style="font-family: 宋体;">对象，非常的方便；</span></p>
<p style="margin-left: 31.5pt;"><span>MultiActionController
</span><span style="font-family: 宋体;">加</span> Controller<span style="font-family: 宋体;">可以满足全部的需要；</span></p>
<p style="margin-left: 31.5pt;">JSP<span style="font-family: 宋体;">部分使用</span>spring form tag<span style="font-family: 宋体;">；</span></p>
<p>Tiles <span style="font-family: 宋体;">和</span> sitemesh<span style="font-family: 宋体;">；</span> <span style="font-family: 宋体;">考虑到使用</span>Ajax<span style="font-family: 宋体;">，而</span>sitemesh<span style="font-family: 宋体;">是利用</span>filter<span style="font-family: 宋体;">来修饰；选择</span>Tiles<span style="font-family: 宋体;">；</span></p>
<p>ORM<span style="font-family: 宋体;">用</span>ibatis,<span style="font-family: 宋体;">当前最实用，简单的</span>ORM<span style="font-family: 宋体;">；而且可以自动生成，又容易理解；何乐而不为；</span></p>
<p>FullTextSearch<span style="font-family: 宋体;">：</span> compass + lucene<span style="font-family: 宋体;">；</span></p>
<p>Others<span style="font-family: 宋体;">：</span>ActiveMQ + ApacheCXF</p>
<p><span>Form/Ajax Request &gt; Controller &gt;
Manager/Service &gt; GenericDao</span></p>
<p><span style="font-family: 宋体;">其他辅助工具：</span></p>
<p>EMS for mysql<span style="font-family: 宋体;">；</span></p>
<p>SVN as version control<span style="font-family: 宋体;">；</span></p>
<p>DB/web server<span style="font-family: 宋体;">：</span>mysql/resin</p>
<img src ="http://www.blogjava.net/bourn/aggbug/142111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bourn/" target="_blank">段氏</a> 2007-09-02 19:23 <a href="http://www.blogjava.net/bourn/articles/142111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>