<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>软件开发思考</title>
    <description></description>
    <link>http://jfish.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>infoq中文站发布了！</title>
        <author>jfish</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jfish.javaeye.com">jfish</a>&nbsp;
          链接：<a href="http://jfish.javaeye.com/blog/66284" style="color:red;">http://jfish.javaeye.com/blog/66284</a>&nbsp;
          发表时间: 2007年03月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="Arial">http://www.infoq.com/cn/<br />
站内时刻关注企业软件开发领域的变化与创新<br />
</font>
          <br/>
          <span style="color:red;">
            <a href="http://jfish.javaeye.com/blog/66284#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 Mar 2007 09:10:31 +0800</pubDate>
        <link>http://jfish.javaeye.com/blog/66284</link>
        <guid>http://jfish.javaeye.com/blog/66284</guid>
      </item>
      <item>
        <title>工作流</title>
        <author>jfish</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jfish.javaeye.com">jfish</a>&nbsp;
          链接：<a href="http://jfish.javaeye.com/blog/63073" style="color:red;">http://jfish.javaeye.com/blog/63073</a>&nbsp;
          发表时间: 2007年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <center>
<h1>工作流</h1>
</center>
<div>
<p align="right"><font face="黑体"><font size="3"><font color="#ff0033"><font face="Verdana"><font color="#f70938"><font face="黑体"><a href="http://www.itisedu.com/phrase/200604112229525.html" target="_new">中科永联</a>高级技术培训中心（</font><font face="黑体">www.itisedu.com</font><font face="黑体">）</font></font></font></font></font><font color="#ff0033"><img src="mhtml:file://F:\工作流\工作流.mht!http://www.itisedu.com/manage/Upload/image/200631194416454.jpg" border="0" alt="" /></font></font></p>
<font face="Verdana">
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="mhtml:file://F:\工作流\工作流.mht!http://www.itisedu.com/phrase/200603110944215.html" target="_new">工作流</a>（<a href="http://www.itisedu.com/phrase/200604231404275.html" target="_new">Workflow</a>）就是&ldquo;业务过程的部分或整体在<a href="http://www.itisedu.com/phrase/200603021438435.html" target="_new">计算机</a>应用环境下的自动化&rdquo;，它主要解决的是&ldquo;使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行，从而实现某个预期的业务目标，或者促使此目标的实现&rdquo;。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简单地说，工作流就是一系列相互衔接、自动进行的业务活动或任务。一个工作流包括一组任务（或活动）及它们的相互顺序关系，还包括流程及任务（或活动）的启动和终止条件，以及对每个任务（或活动）的描述。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 工作流在大多数的实际应用中的情况可以这样来简单地描述：在网络、服务器和多台计算机<a href="http://www.itisedu.com/phrase/200603082208195.html" target="_new">客户端</a>的硬件平台上，业务过程按照预先设定的规则并借助应用<a href="http://www.itisedu.com/phrase/200604232224305.html" target="_new">程序</a>和人对相关数据的处理而完成。例如，在日常办公中，当撰写好某份报告之后，可能需要将其提交给领导进行审阅或批示；审批意见可能需要汇集并提交给另外一个人，以便对报告进行进一步的修改。这样，可能会形成同一篇文档在多个人之间的顺序或同时传递。对于这样的情况，我们可以使用工作流技术来控制和管理文档在各个计算机之间自动传递，而非手工传递。这就可以称之为工作流。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.itisedu.com/phrase/200603090857555.html" target="_new">类</a>似的关于文档的自动化处理只是工作流技术的一种简单应用。事实上，工作流技术在现实生活中能够完成更多更复杂的任务。如企业（或机构）内部的各种数据或信息的自动处理，多种业务流程的整合，企业（或机构）之间的数据交换，借助Internet技术实现跨地域的数据传输和处理等等。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 某产品销售的工作流示意图： </p>
<p><img src="mhtml:file://F:\工作流\工作流.mht!http://www.itisedu.com/manage/Upload/image/200631194212456.gif" border="0" alt="" /></p>
<p><strong>一、工作流发展</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 工作流技术起源于二十世纪七十年代中期办公自动化领域的研究，由于当时计算机尚未普及，网络技术水平还很低以及理论基础匮乏，这项新技术并未取得成功。1983年至1985年间，在图像处理领域和电子邮件领域出现了早期的含有工作流特征的商用系统。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 进入九十年代以后，随着个人计算机、网络技术的普及和推广，以及信息化建设的日益完善，使得工作流技术的研究与开发进入了一个新的热潮。1993年8月,第一个工作流技术标准化的工业组织&mdash;&mdash;工作流管理联盟（Workflow Management Coalition，简称<a href="http://www.itisedu.com/phrase/200604231403245.html" target="_new">WFMC</a>，下同）成立。1994年，工作流管理联盟发布了用于<a href="http://www.itisedu.com/phrase/200603111053225.html" target="_new">工作流管理系统</a>之间互操作的工作流参考模型，并相继制定了一系列工业标准。与此同时，关于工作流技术的学术研究也十分活跃，许多原型系统在实验室里开发出来。进入二十一世纪以来，工作流技术已被越来越多的人认可，与之相关的标准规范、工作流引擎及商业产品不胜枚举。人们在开发推广工作流产品的同时，更加注重工作流的理论研究，以推动该项技术走向成熟。</p>
<p><strong>二、工作流的特点</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1，图形化、可视化设计流程图 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2，支持各种复杂流程<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3，组织结构级处理者指定功能<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4，<a href="http://www.itisedu.com/phrase/200604291151335.html" target="_new">B/S结构</a>，纯浏览器应用<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5，强大的安全性特色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6，表单功能强大，扩展便捷<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7，灵活的外出、超时管理策略<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8，处理过程可跟踪、管理<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9，丰富的统计、查询、报表功能<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10，与MAIL系统集成 </p>
<p><strong>三、工作流的优点</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 企业实施工作流管理所带来的好处是非常明显的，这包括提高企业运营效率、改善企业资源利用、提高企业运作的灵活性和适应性、提高工作效率、集中精力处理核心业务、跟踪业务处理过程、量化考核业务处理的效率、减少浪费、增加利润、充分发挥现有计算机网络资源的作用。实施工作流将达到缩短企业运营周期、改善企业内（外）部流程、优化并合理利用资源、减少人为差错和延误，提高劳动生产率等目的。<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总结实施工作流带来的好处，可以归纳为以下几点：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1，要处理的事项已自动传递到个人<a href="http://www.itisedu.com/phrase/200604231234155.html" target="_new">电脑</a>上 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2，不再需要对员工进行流程的培训，平滑实现流程变更 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3，员工只需将精力集中在处理自己关心的数据上 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4，随时得到历史数据 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5，随时生成处理效率报表 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6，达到无纸化办公的目标 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7，完全支持移动办公，使作业同步化 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8，科学管理更进一层，办公效率明显提高 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9，企业的核心竞争力将有提升 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10，通过流程自动化与<a href="http://www.itisedu.com/phrase/200602271218062.html" target="_new">数据库</a>集成，以及各类表单统计查询功能，提高决策能力 </p>
<p><strong><font face="Verdana">四、工作流WorkFlow技术构架</font></strong></p>
<p><img src="mhtml:file://F:\工作流\工作流.mht!http://www.itisedu.com/manage/Upload/image/200631194152246.jpg" border="0" alt="" /></p>
<p><br />
<strong>五、</strong><font face="Verdana"><strong>工作流是如何实现的</strong></font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 工作流的实施需要三个基本步骤：映射、建模和管理。映射是第一个步骤，其首要任务是确定并且文档化组织内全部现有的手工和自动化的业务流程；建模则是开发一个有助于建成流线型业务过程的模型。第三阶段是<a href="http://www.itisedu.com/phrase/200604232134205.html" target="_new">软件</a>实施以及跨越全部工作部门、业务单元甚至是整个企业的无缝系统集成。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了确保工作流系统能够&ldquo;无缝地&rdquo;实施到组织机构中，项目组都必须遵从已经定义好的、经过实践确认的行之有效的工作方法，并且在每个工作阶段都必须有可以<a href="http://www.itisedu.com/phrase/200604231331545.html" target="_new">度量</a>的结果。一个深思熟虑的实施计划被有经验的<a href="http://www.itisedu.com/phrase/200603082251135.html" target="_new">团队</a>执行，是成功地采用和实施工作流的决定因素。下图描述了一个推荐的、可供典型组织机构采纳的高层工作流（实施流程）。下面按图中步骤具体阐述。 </font>
<p>&nbsp;</p>
<p><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 建立<a href="http://www.itisedu.com/phrase/200604240825565.html" target="_new">项目管理</a>办公室</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项目管理办公室的组成是第一步，也是最重要的一步。项目管理办公室的成员须经过严格谨慎挑选，他们必须在恰当的程度上广泛代表组织内的业务、运营、IT以及审计等部门。产品供应方的产品专家、技术支持人员和管理人员也必须参与其中，以与用户互补。通常在PMO中还包含变更管理顾问，有助于形成组织中人员思路的多样化。每个成员的角色和责任必须定义清楚。PMO从整体上确立项目的实施范围、目标、实施时间<a href="http://www.itisedu.com/phrase/200603061723295.html" target="_new">框架</a>以及优先级等等。PMO也负责管理和跟踪项目进度、设定检测项目是否成功的指标，以及定期向高层汇报项目状况等。 </font></p>
<p><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 业务分析</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项目组将分析用户现有的业务流程，找出哪些流程需要优化和改进以达到上佳效果，并分析每个流程的时间线和期望的结果。他们将与关键人员进行座谈，收集和鉴别正确的信息及数据，从而决定工作流系统如何满足<a href="http://www.itisedu.com/phrase/200603101518295.html" target="_new">需求</a>。接下来的业务分析将辨别出哪些流程可以被优化、自动化、流线型化，哪些流程甚至需要重新设计。 </font></p>
<p><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 确定目标</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 确定上佳目标是建立在业务流程详细分析的基础之上的。工作流项目的目标定义应该清晰并可以进行验证，好的目标意味着项目的成功。在实施过程的每一个阶段，项目组必须确认达到的结果是他们所期望的结果。例如，如果目标是缩短开发票周期两周，则必须分析现有的时间跟踪、记账和开发票等流程。</font></p>
<p><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 确定实施计划</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目标确立后，由用户和软件供应商组成的项目组展示工作流解决方案具备的各种模块，根据用户提出的特定需求定义他们的功能和特性，并基于业务的优先级，共同决定每个模块的上线时间。</font></p>
<p><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将业务流程在工作流系统中建立模型</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在实施过程中建立业务模型是一个极重要的步骤。用户应当紧密地同软件产品应用专家进行合作，以在易用性和功能需求之间达到平衡。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用户可以在部署阶段前对模型进行测试，以确保该模型符合实际要求且没有过多的开销。需要指出的是，如果这个建模步骤没有完全正确地完成，将导致错误的报表或者多余的管理工作。</font></p>
<p><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实现流程和软件集成</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在这个阶段，项目组将确定现有的需要与工作流系统交互的流程与系统。如果处理不当，新旧流程的集成将导致失败。流程集成的一个重要方面就是在多系统之间消除或者最小化冗余数据，并在多个系统间复制这些数据。流程必须紧密集成，数据必须能跨越不同的流程和应用，顺畅流动。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项目组也必须确保工作流系统符合用户组织机构的安全标准，这一点经常在部署阶段前被忽视。</font></p>
<p><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 部署工作流系统</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 部署工作流系统包括两部分内容。第一部分自然是技术部分，涵盖了硬件和软件的安装、备份、恢复以及网络安装等等，这与一般的IT应用实施相似。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二部分是指上线试运行。试运行小组应具有真正的代表性。项目组必须与试运行小组就项目的重要性进行沟通，并确保提供足够的培训，使得试运行小组能够对试运行工作得心应手。建议项目组建立清晰的沟通渠道，保证在试运行期间可以及时反馈用户的意见和建议。试运行将使项目组鉴别出原来设计和计划的弱点和缺点，并在大规模上线运行前加以解决。这也可以提高用户对于新流程的接受程度，因为用户感到他们也参与了项目的开发部分，解决方案不是强加给他们的。 </font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般认为，采用阶段性实施工作流系统可使用户更快地获得效益。因为用户可以更有效地渐进学习新系统，取得立竿见影的效益。阶段性实施还给予用户更多的时间了解、评估他们进一步的需求，使得项目实施期间的修改更加容易。另外，阶段性实施项目降低了风险。</font></p>
<p><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统评估</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特别注意，在每一个阶段完成后，项目组都应该基于项目开始时设定的目标，对已经完成的结果进行评估，同时分析所达到的结果，并与最初的设计目标相对照。为了确保工作流解决方案在现有的业务环境中优化出更理想的结果，项目组必须进行定期的监控、评估和沟通，以了解什么需要更改。</font></p>
<p><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统支持</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为确保实施成功，更佳地使用工作流软件，组织机构必须进行服务投资，组织机构应该委派专业人员提供第一线的服务，也应负责与供应商签订合同，以获得第二级支持。</font></p>
<p><strong>六、工作流适用行业</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 消费品行业,制造业,电信服务业,银证险等金融服务业,物流服务业,物业服务业,物业管理,大中型进出口贸易公司,政府事业机构,研究院所及教育服务业等,特别是大的跨国企业和集团公司。</p>
<p><strong>七、工作流具体应用</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关键业务流程： 订单、报价处理、采购处理、合同审核、客户电话处理、供应链管理等 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 行政管理类：出差申请、加班申请、请假申请、用车申请、各种办公用品申请、购买申请、日报周报等凡是原来手工流转处理的行政表单。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 人事管理类： 员工培训安排、绩效考评、职位变动处理、员工档案信息管理等。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 财务相关类： 付款请求、应收款处理、日常报销处理、出差报销、预算和计划申请等。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 客户服务类： 客户信息管理、客户投诉、请求处理、售后服务管理等管理等。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特殊服务类： ISO系列对应流程、质量管理对应流程、产品数据信息管理、贸易公司报关处理、物流公司货物跟踪处理等各种通过表单逐步手工流转完成的任务均可应用工作流软件自动规范地实施。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作为一个成熟稳定的工作流产品，不仅提供日常办公和关键业务流程智能化管理，而且能根据公司的特殊实际要求轻松方便地随时定制各种流程，并可实现不同角色不同的跟踪、查询、统计、打印等强大功能</p>
<p><font face="Verdana"><strong>结论</strong></font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 许多组织机构都有雄心勃勃的计划，为了能够夺回失去的时间和获得竞争优势，希望能够以大的步伐，更深（企业级或多级）、更广（多应用）和更快（短时间）地进入数字工作流时代。我经常发现他们因为许多原因而惨遭失败。根据我个人经验，明智的做法是从小的范围开始做起，并随着工作流的成长而逐步做大。阶段性实施提供了转换到新的流程的平稳方法。由于用户看到了效益，使得用户更易于接纳新的工作流程。阶段性实施的另一个原因，是用户不能够承受一下子丢弃原有的全部流程，从零开始。组织机构应该在当前业务过程中最没有效率的地方，集中寻找他们的&ldquo;痛处&rdquo;，然后利用&ldquo;案例驱动&rdquo;原则影响他们。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 组织机构也必须认识到，当计划实施一个新的工作流程时，行政力量和企业文化必须要考虑进去。</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 成功与否的最后一个关键要素就是&ldquo;人&rdquo;。当我们改变业务流程时，技术是一个方面，但更大的挑战来自员工。的确，数字工作流系统要分阶段进行，使人们&ldquo;渐进式&rdquo;地取得经验，而不是&ldquo;革命式&rdquo;地得到经验。</font></p>
</p>
</font></div>
          <br/>
          <span style="color:red;">
            <a href="http://jfish.javaeye.com/blog/63073#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 20 Mar 2007 22:12:00 +0800</pubDate>
        <link>http://jfish.javaeye.com/blog/63073</link>
        <guid>http://jfish.javaeye.com/blog/63073</guid>
      </item>
      <item>
        <title>持久层设计</title>
        <author>jfish</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jfish.javaeye.com">jfish</a>&nbsp;
          链接：<a href="http://jfish.javaeye.com/blog/60021" style="color:red;">http://jfish.javaeye.com/blog/60021</a>&nbsp;
          发表时间: 2007年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.持久层概念<br />专注于实现持久化的一个相对独立的领域。<br /> <br />2.ORM(对象-关系型数据映射组件)<br />优点：<br />	减少乏味的代码<br />	更加面向对象的设计<br />	更好的性能<br />	更好的移植性<br />缺点：<br />	粒度问题granularity<br />	子类型问题subtypes<br />	同一性问题identity<br />	关联问题associations<br />	对象导航问题navigation<br />3.设计模式<br />	工厂模式factory<br />	代理模式proxy<br />	decorator模式<br />	dynamic proxy模式<br /><br />4.资源管理模式<br />A.DAO(data access object)模式<br />I.DAO模式的实现层次： <br />.data accessor模式<br />实现数据访问与业务逻辑分离，将数据访问的实现机制加以封装，与数据的使用代码加以分离，从外部来看，data accessor提供了黑盒式的数据存取接口。<br /><br />.active domain object模式<br />实现业务数据的对象化封装<br /><br />II.优点<br />	数据存储逻辑分离<br />	数据访问底层分离<br />	资源管理和调度分离<br />	数据抽象<br /><br />B.数据库连接池connection pool<br />基本原理：在内部对象池中维护一定数量的数据库连接，对外暴露数据库连接获取和返回方法。<br />优点：<br />	资源重用<br />	更快的响应速度<br />	新的资源分配手段<br />	统一的连接管理，避免数据库连接泄漏<br />5.解藕合设计<br />	应用层：应用逻辑与数据逻辑分离<br />	资源层：逻辑结构与物理结构分离
          <br/>
          <span style="color:red;">
            <a href="http://jfish.javaeye.com/blog/60021#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 18 Mar 2007 12:36:00 +0800</pubDate>
        <link>http://jfish.javaeye.com/blog/60021</link>
        <guid>http://jfish.javaeye.com/blog/60021</guid>
      </item>
      <item>
        <title>spring简介</title>
        <author>jfish</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jfish.javaeye.com">jfish</a>&nbsp;
          链接：<a href="http://jfish.javaeye.com/blog/60024" style="color:red;">http://jfish.javaeye.com/blog/60024</a>&nbsp;
          发表时间: 2007年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Spring项目启动于2003年2月，其中基础代码来自《expert one-on-one j2ee design and development》。<br /><br />   Spring 是指一个用于构造Java 应用程序的轻量级框架,不限定于只编写web 应用，最少侵入。<br />   <br />   本质上讲，Spring是IOC(Inversion of Control)和面向切面编程(AOP)的组合体。它是一个非侵入式的框架，增强了POJO的功能。从服务上讲(With a service abstraction)，它将程序代码从J2EE环境解耦到普通的java对象（自然，这些代码可以脱离J2EE而在多种环境中运行）。它还在很多功能上提供了除EJB之外的选择――比如为所有的POJO提供声明式事务。Spring被广泛运用到很多项目中，从小的web程序到大的企业应用程序。<br /><br />   Spring 的核心是个轻量级（Lightweight）的容器（Container），它是实现IoC（Inversion of Control）容器、非侵入性（No intrusive）的框架，并提供AOP（Aspect-oriented programming）概念的实现方式，提供对持久层（Persistence）、事务（Transaction）的支持，提供MVC Web 框架的实现，并对一些常用的企业服务API（Application Interface）提供一致的模型封装，是一个全方位的应用程序框架（Application framework），除此之外，对于现存的各种框架（Struts、JSF、Hibernate 等），Spring 也提供了与它们相整合的方案。
          <br/>
          <span style="color:red;">
            <a href="http://jfish.javaeye.com/blog/60024#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 18 Mar 2007 12:36:00 +0800</pubDate>
        <link>http://jfish.javaeye.com/blog/60024</link>
        <guid>http://jfish.javaeye.com/blog/60024</guid>
      </item>
      <item>
        <title>spring入门编程问题集锦</title>
        <author>jfish</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jfish.javaeye.com">jfish</a>&nbsp;
          链接：<a href="http://jfish.javaeye.com/blog/60035" style="color:red;">http://jfish.javaeye.com/blog/60035</a>&nbsp;
          发表时间: 2007年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span class="content">1、如何学习Spring？ <br />
你可以通过下列途径学习spring： <br />
(1) spring下载包中doc目录下的MVC-step-by-step和sample目录下的例子都是比较好的spring开发的例子。 <br />
<br />
(2) AppFuse集成了目前最流行的几个开源轻量级框架或者工具Ant,XDoclet,Spring,Hibernate(iBATIS),JUnit,Cactus,StrutsTestCase,Canoo's WebTest,Struts Menu,Display Tag Library,OSCache,JSTL,Struts 。 <br />
你可以通过AppFuse源代码来学习spring。 <br />
AppFuse网站：<a href="http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse" target="_blank">http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse</a> <br />
<br />
(3)Spring 开发指南(夏昕)（<a href="http://www.xiaxin.net/Spring_Dev_Guide.rar" target="_blank">http://www.xiaxin.net/Spring_Dev_Guide.rar</a>） <br />
一本spring的入门书籍,里面介绍了反转控制和依赖注射的概念，以及spring的bean管理，spring的MVC，spring和hibernte，iBatis的结合。 <br />
<br />
(4) spring学习的中文论坛 <br />
SpringFramework中文论坛(<a href="http://spring.jactiongroup.net/" target="_blank">http://spring.jactiongroup.net</a>) <br />
Java视线论坛(<a href="http://forum.javaeye.com/" target="_blank">http://forum.javaeye.com</a>)的spring栏目 <br />
<br />
2、利用Spring框架编程，console打印出log4j:WARN Please initialize the log4j system properly？ <br />
说明你的log4j.properties没有配置。请把log4j.properties放到工程的classpath中，eclipse的classpath为bin目录，由于编译后src目录下的文件会拷贝到bin目录下，所以你可以把log4j.properties放到src目录下。 <br />
这里给出一个log4j.properties的例子： <br />
<br />
log4j.rootLogger=DEBUG,stdout <br />
log4j.appender.stdout=org.apache.log4j.ConsoleAppender <br />
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout <br />
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%F:%L) - %m%n <br />
<br />
<br />
3、出现 java.lang.NoClassDefFoundError? <br />
一般情况下是由于你没有把必要的jar包放到lib中。 <br />
<br />
比如你要采用spring和hibernate（带事务支持的话），你除了spring.jar外还需要hibernat.jar、aopalliance.jar、cglig.jar、jakarta-commons下的几个jar包。 <br />
<br />
<a href="http://www.springframework.org/download.html" target="_blank">http://www.springframework.org/download.html</a>下载spring开发包，提供两种zip包 <br />
建议你下载开发包。这个zip解压缩后比后者多一个lib目录，其中有hibernate、j2ee、dom4j、aopalliance、jakarta-commons等常用包。<br />
4、java.io.FileNotFoundException: Could not open class path resource [....hbm.xml],提示找不到xml文件？ <br />
原因一般有两个： <br />
(1)该xml文件没有在classpath中。 <br />
(2)applicationContext-hibernate.xml中的xml名字没有带包名。比如： <br />
<bean class="org.springframework.orm.hibernate.LocalSessionFactoryBean" id="sessionFactory"></bean><br />
<property name="dataSource"><ref bean="dataSource"></ref></property>
<br />
<property name="mappingResources"><br />
<list></list>
<br />
<value></value>User.hbm.xml 错，改为： <value></value>com/yz/spring/domain/User.hbm.xml <br />
<br />
</property>
<br />
<property name="hibernateProperties"><br />
<props></props>
<br />
<prop key="hibernate.dialect"></prop>
net.sf.hibernate.dialect.MySQLDialect <br />
<prop key="hibernate.show_sql"></prop>
true <br />
<br />
</property>
<br />
<br />
<br />
<br />
5、org.springframework.beans.NotWritablePropertyException: Invalid property 'postDao' of bean class？ <br />
出现异常的原因是在application-xxx.xml中property name的错误。 <br />
<property name="....">中name的名字是与bean的set方法相关的，而且要注意大小写。 <br />
比如 <br />
public class PostManageImpl extends BaseManage implements PostManage { <br />
private PostDAO dao = null; <br />
public void setPostDAO(PostDAO postDAO){ <br />
this.dao = postDAO; <br />
} <br />
} <br />
那么xml的定义应该是： <br />
<bean parent="txProxyTemplate" id="postManage"></bean><br />
<property name="target"><br />
<bean class="com.yz.spring.service.implement.PostManageImpl"></bean><br />
<property name="postDAO"><ref bean="postDAO"></ref></property>
对 <br />
<property name="dao"><ref bean="postDAO"></ref></property>
错 <br />
<br />
</property>
<br />
<br />
<br />
<br />
6、Spring中如何实现事务管理？ <br />
首先，如果使用mysql，确定mysql为InnoDB类型。 <br />
事务管理的控制应该放到商业逻辑层。你可以写个处理商业逻辑的JavaBean，在该JavaBean中调用DAO，然后把该Bean的方法纳入spring的事务管理。 <br />
<br />
比如：xml文件定义如下： <br />
<bean abstract="true" id="txProxyTemplate"></bean>class=&quot;org.springframework.transaction.interceptor.TransactionProxyFactoryBean&quot;&gt; <br />
<property name="transactionManager"><ref bean="transactionManager"></ref></property>
<br />
<property name="transactionAttributes"><br />
<props></props>
<br />
<prop key="save*"></prop>
PROPAGATION_REQUIRED <br />
<prop key="remove*"></prop>
PROPAGATION_REQUIRED <br />
<prop key="*"></prop>
PROPAGATION_REQUIRED <br />
<br />
</property>
<br />
<br />
<br />
<bean parent="txProxyTemplate" id="userManage"></bean><br />
<property name="target"><br />
<bean class="com.yz.spring.service.implement.UserManageImpl"></bean><br />
<property name="userDAO"><ref bean="userDAO"></ref></property>
<br />
<br />
</property>
<br />
<br />
<br />
com.yz.spring.service.implement.UserManageImpl就是我们的实现商业逻辑的JavaBean。我们通过parent元素声明其事务支持。 <br />
<br />
<br />
7、如何管理Spring框架下更多的JavaBean？ <br />
JavaBean越多，spring配置文件就越大，这样不易维护。为了使配置清晰，我们可以将JavaBean分类管理，放在不同的配置文件中。 应用启动时将所有的xml同时加载。 <br />
比如： <br />
DAO层的JavaBean放到applicationContext-hibernate.xml中，商业逻辑层的JavaBean放到applicationContext-service.xml中。然后启动类中调用以下代码载入所有的ApplicationContext。 <br />
<br />
String[] paths = {&quot;com/yz/spring/dao/hibernate/applicationContext-hibernate.xml&quot;, <br />
&quot;com/yz/spring/service/applicationContext-service.xml&quot;}; <br />
ctx = new ClassPathXmlApplicationContext(paths); <br />
<br />
<br />
8、web应用中如何加载ApplicationContext？ <br />
可以通过定义web.xml，由web容器自动加载。 <br />
<br />
<servlet></servlet><br />
<servlet-name></servlet-name>context <br />
<servlet-class></servlet-class>org.springframework.web.context.ContextLoaderServlet <br />
<load-on-startup></load-on-startup>1 <br />
<br />
<br />
<context-param></context-param><br />
<param-name></param-name>
contextConfigLocation <br />
<param-value></param-value>
/WEB-INF/applicationContext-hibernate.xml <br />
<param-value></param-value>
/WEB-INF/applicationContext-service.xml <br />
<br />
<br />
9、在spring中如何配置的log4j? <br />
在web.xml中加入以下代码即可。 <br />
<context-param></context-param><br />
<param-name></param-name>
log4jConfigLocation <br />
<param-value></param-value>
/WEB-INF/log4j.properties <br />
<br />
<br />
<br />
10、Spring框架入门的编程问题解决了，我该如何更深地领会Spring框架呢？ <br />
这两本书你该去看看。这两本书是由Spring的作者Rod Johnson编写的。 <br />
Expert One on one J2EE Design and Development <br />
Expert One on one J2EE Development Without EJB <br />
你也该看看martinfowler的Inversion of Control Containers and the Dependency Injection pattern。 <br />
<a href="http://www.martinfowler.com/articles/injection.html" target="_blank">http://www.martinfowler.com/articles/injection.html</a><br />
<br />
再好好研读一下spring的文档。 <br />
<a href="http://www.jactiongroup.net/reference/html/" target="_blank">http://www.jactiongroup.net/reference/html/</a></property>
</span>
          <br/>
          <span style="color:red;">
            <a href="http://jfish.javaeye.com/blog/60035#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 18 Mar 2007 12:36:00 +0800</pubDate>
        <link>http://jfish.javaeye.com/blog/60035</link>
        <guid>http://jfish.javaeye.com/blog/60035</guid>
      </item>
      <item>
        <title>工作流一些资料</title>
        <author>jfish</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jfish.javaeye.com">jfish</a>&nbsp;
          链接：<a href="http://jfish.javaeye.com/blog/60684" style="color:red;">http://jfish.javaeye.com/blog/60684</a>&nbsp;
          发表时间: 2007年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ol>
    <li><font face="Arial">工作流联盟：<a href="http://www.wfmc.org/">http://www.wfmc.org/</a></font> </li>
    <li><font face="Arial">eworkflow：<font face="Arial"><a href="http://www.e-workflow.org/">http://www.e-workflow.org/</a></font></font> </li>
    <li>jbpm：<font face="Arial"><a href="http://www.jboss.com/products/jbpm">http://www.jboss.com/products/jbpm</a></font> </li>
    <li>osworkflow<a href="http://www.opensymphony.com/osworkflow">：http://www.opensymphony.com/osworkflow</a> </li>
    <li><font face="Arial">银狐999 的个人空间<a href="http://javafox.vip.myrice.com/index.htm">：http://javafox.vip.myrice.com/index.htm</a></font> </li>
    <li><font face="Arial">银狐999的个人BLOG：<font face="Arial"><a href="http://blog.csdn.net/james999">http://blog.csdn.net/james999</a></font></font> </li>
    <li><font face="Arial">工作流管理技术基础：<font face="Arial"><a href="http://www.simflow.net/Technic/Workflow/wfreference.htm">http://www.simflow.net/Technic/Workflow/wfreference.htm</a></font></font> </li>
    <li>工作流之星光：<font face="Arial"><a href="http://javafox.vip.myrice.com/mywf/bright/fox999_workflow_bright_20050302.pdf">http://javafox.vip.myrice.com/mywf/bright/fox999_workflow_bright_20050302.pdf</a></font> </li>
    <li><font face="Arial">JBPM 开源工作流引擎专栏：<font face="Arial"><a href="http://www.javaeye.com/subject/JBPM">http://www.javaeye.com/subject/JBPM</a></font></font> </li>
</ol>
          <br/>
          <span style="color:red;">
            <a href="http://jfish.javaeye.com/blog/60684#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 18 Mar 2007 12:35:22 +0800</pubDate>
        <link>http://jfish.javaeye.com/blog/60684</link>
        <guid>http://jfish.javaeye.com/blog/60684</guid>
      </item>
      <item>
        <title>专访TIBCO胡长城:看中国企业工作流应用</title>
        <author>jfish</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jfish.javaeye.com">jfish</a>&nbsp;
          链接：<a href="http://jfish.javaeye.com/blog/60671" style="color:red;">http://jfish.javaeye.com/blog/60671</a>&nbsp;
          发表时间: 2007年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong><a href="http://blog.csdn.net/EricLee00/archive/2007/03/15/1530807.aspx">本文来自：Ericlee的blog</a></strong></p>
<p><strong>1，&nbsp;您好，请先向我们的网友简单做一下自我介绍自己好吗？</strong><br />
&nbsp;我的网名是&ldquo;银狐999&rdquo;，目前就职于TIBCO中国研发中心，负责tibco administrator server底层组件的维护。<br />
&nbsp;我的工作经历即简单又复杂。简单是因为近五年来，我几乎都在围绕着Workflow相关的技术在发展；而复杂则是更换了好几家公司，从事过电子政务领域，数据集成领域、业务基础软件平台、协同办公平台等多方面的工作。<br />
&nbsp;我是个很Open的人，这得益于早期javaunion论坛上那帮伙伴，他们的无私奉献让我明白了，开放的技术交流才能让我们学得更多，懂得更多。所以这几年来，我一直坚持写技术心得，写工作流研究心得，并将他们无私的公开在我的主页和Blog上。</p>
<p><strong>2，现在谈到企业流程管理，经常会出现EAI、WF、BPM这些关键词。您做为这方面的专家，请解释一下它们之间的关系以及不同好吗？</strong><br />
&nbsp;EAI我想是比较容易理解和区分的，全称是企业应用集成（Enterprise Application Integration）。目前EAI更多的是基于消息中间件服务（企业消息总线Information Bus），利用多种适配装置完成分散的、分布式的应用的整合。目前比较流行的ESB概念，和EAI是有一定融合的，但ESB更多的是站在业务流程服务的角度，而不单单是消息或应用。</p>
<p>&nbsp;Workflow和BPM之间的区别是比较含糊的。所以在国外，一般不用Workflow去表示工作流应用。Workflow只是用于表示&ldquo;工作流技术（Workflow Technology）&rdquo;及这个领域范畴，而用&ldquo;Process&rdquo;来表示流程。<br />
&nbsp;我们所熟知的工作流管理联盟组织（WfMC），目前几乎也只是提BPM，其流程描述语言XPDL也是一直采用Process这个元素的。</p>
<p>&nbsp;上面的说法似乎是过于专业化了一点。那让我们回顾到上个世纪九十年代，诞生了&ldquo;Process Reengineering&rdquo;这个概念，单那个时候只是一阵风，因为技术跟不上，所以大多都只停留在管理层概念。而在九十年代，workflow技术和应用却蓬勃发展，可谓是百家争鸣，蒸蒸日上。 <br />
&nbsp;2000左右，工作流技术应用已经非常成熟，数据集成，应用集成也发展迅速。随之也推动了业务过程管理、整合、统计、优化等方面的应用需求。在这样一种市场需求下，必然需要一个含义更广泛、更偏管理和应用性的概念来服务于客户，这就诞生了&ldquo;BPM&rdquo;这个概念。<br />
&nbsp;如果Workflow是早期人们为了解决&ldquo;办公自动化&rdquo;&ldquo;流程自动化&rdquo;而诞生的应用技术和解决方案的话；那么BPM则是为了&ldquo;对全局性的业务分析、整合&rdquo;，以及&ldquo;能够基于这些分析提供对上层管理决策的支持&rdquo;的一种应用技术和解决方案。</p>
<p>&nbsp;事实上，如何去描述业务过程&ldquo;Business Process&rdquo;，一直还是个争论不休的话题，也因此存在几种标准。主要是以WfMC为代表的XPDL，OASIS为代表的BPEL，OMG为代表的BPMN和BPDM。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 虽然描述过程&ldquo;Process&rdquo;的标准并不一样，但是围绕过程定义、过程仿真、过程执行、过程监控、过程分析、过程优化这几个方面为核心的BPM Solution，这一方面各家几乎都是相同的，只是实现技术不同。</p>
<p><strong>3，工作流管理主要可以帮助企业解决什么样的问题呢？</strong><br />
&nbsp;可以帮助企业更清晰、更灵活的管理业务流程。<br />
&nbsp;<br />
<strong>4，目前，国内企业工作流管理应用环境的特点是什么？</strong><br />
&nbsp;目前国内的工作流应用还依然围绕电子政务和协同办公的审批类流程应用为主。当然，也存在一定的商业化业务性流程，比如这两年比较火热的物流领域的仓储管理流程等。</p>
<p><strong>5，从个人角度讲，国内的工作流管理的产品他们各自的特点是什么？</strong><br />
&nbsp;在国内，工作流应用与组织管理是密切不可分，甚至在很多时候，我们可以说，是为组织管理服务的。受到国内的管理更多的偏向于以&ldquo;人&rdquo;为本的思想，所以国内的流程存在很严重的&ldquo;人为影响&rdquo;，比如&ldquo;回退&rdquo;&ldquo;会签&rdquo;&ldquo;回退&rdquo;&ldquo;取回&rdquo;&ldquo;自由流&rdquo;&ldquo;主办辅办&rdquo;等等特色。<br />
&nbsp;也正因为这样，国内客户应用需求的差别非常大，单纯和固定的一款工作流产品，很难满足不同领域，不同客户的需求，所以国内的工作流产品更多的不得不依托于项目来生存。也很难短时间发展起来一款或几款非常庞大的产品。</p>
<p>&nbsp;你让我谈谈我对起步软件的看法，是有些不太好绝对公平的评论的。因为我曾经在思维加速（起步软件的前身）待过。<br />
&nbsp;起步软件是典型的以技术和产品征服客户的一家软件产品和应用服务提供商。前两年，从早期的纯粹业务技术软件平台产品提供商，转变为多业务产品和服务提供商（当然，目前主要以协同领域为主），是非常成功的转型。而他们早在多年以前就定位于&ldquo;模型驱动&rdquo;的产品架构和思路更是具有超越性的，这首先要得益于他们总经理马科先生的超前眼光，也更得益于他们的总工程师宋兴烈的执著和坚韧。<br />
&nbsp;当然，目前国内偏于应用开发平台的产品已经很多了，处理起步的X3，还有浪潮的loushang，炎黄盈动的AWS，普元的EOS等等。</p>
<p><strong>6，许多国际软件巨头比如BEA，IBM，Tibco它们都有涉足这个领域，对于它们的产品，我们国内的产品有哪些优势与不足呢？<br />
</strong>&nbsp;对于这些洋巨头们，我想用一句成语来形容&mdash;&mdash;&ldquo;高山仰止&rdquo;。意思是，在BPM、EAI、ESB这几个领域内，我们国内厂商与他们的实力差距太大。当然国内还是有这样的产品，比如东方通的消息产品，西安协同的ESB产品等。<br />
&nbsp;因为我在TIBCO，所以我就拿TIBCO来说吧。TIBCO最初是以消息服务产品发展起来的，直到目前的以提供EAI、BPM及相关的Solution产品的服务提供商。纳斯达克证券交易所（Nasdaq）的底层信息交易系统就是TIBCO消息产品支撑的。仅在消息服务这一个领域，就是国内产品短时间无法逾越的。<br />
&nbsp;我们再看看BPM这个领域吧，TIBCO的bpm产品是收购自Staffware，而Staffware早在85年的时候就一直在工作流领域发展。<br />
&nbsp;<br />
&nbsp;我不是过于夸大国外厂商的在这个领域内的实力。我的一个PSG部门的同事，每次在客户现场POC之后，总是感慨：&ldquo;每次在我用TIBCO产品竞标成功之后，我不是喜悦，而是深深的感到国内产品的落后，以及这个领域的近乎空白&rdquo;。但我只能说，我们在基础技术和核心技术方面，落后的太多太多。<br />
&nbsp;<br />
&nbsp;相比较这些国际巨头们，国内厂商的劣质主要表现在：<br />
（1）&nbsp;研发资金不足。<br />
（2）&nbsp;理论积累、技术积累和沉淀不足。研发团队的稳定性也是一个问题之一<br />
（3）&nbsp;国内客户需求和工作流应用还属于基本应用层次，所以很难推动国内厂商投入人力物力来提供产品的定位和应用层次，比如流程监控、分析等等。 </p>
<p>&nbsp;国内厂商的优势在于&ldquo;业务&rdquo;和&ldquo;客户化项目实施&rdquo;。如果从单纯流程这个角度，我想国内产品的优势则主要在于两方面：<br />
&nbsp;第一：&ldquo;客户应用的本地化流程特色&rdquo;，比如上面提到的&ldquo;回退&rdquo;&ldquo;会签&rdquo;&ldquo;回退&rdquo;&ldquo;取回&rdquo;&ldquo;自由流&rdquo;&ldquo;主办辅办&rdquo;等等特色；<br />
&nbsp;第二：&ldquo;本地化组织模型和权限&rdquo;，国内的组织模型是国外产品很难理解和超越的，这也是为什么国内工作流应用市场，几乎都还是主要被国内自己的厂商占据的一个主要原因之一。<br />
&nbsp;<br />
<strong>7，企业的需要是个性化的，那么通常国内的工作流管理厂商如何满足企业的个性需求？</strong><br />
&nbsp;国内工作流产品则主要依赖于提供灵活的建模工具，表单工具，对外程序接口（API），可外挂的扩展应用和接口实现等等来满足企业的个性化需求。</p>
<p><strong>8，企业部署一套工作流管理系统遇到的最大的困难是来自技术方面吗？你认为最大的困难在哪里？如何克服？</strong><br />
&nbsp;我一直有个观点：技术不是最主要的问题。国内应用开发商都是很厉害的，基本上在项目实施过程中，只要客户能够提出基本的需求，技术开发人员总是可以找到解决办法的。</p>
<p>&nbsp;国内企业实施工作流最大的困难来自于两个方面：<br />
（1）&nbsp;需求。客户对流程应用的需求很难提的比较清晰和准确。一方面是客户对工作流技术基本理念不清，所以很难准确地阐述应用需求；另一方面，是应用开发商对流程应用的整体性认识不全，系统性不够，所以很难正确的引导客户来分析流程应用和需求。<br />
（2）&nbsp;合适的流程产品。国内的产品外部相似性很多，但内部细力度的区别却又很多。但是这种细力度的区别是很难通过简单的演示就能够让应用开发商明白的。</p>
          <br/>
          <span style="color:red;">
            <a href="http://jfish.javaeye.com/blog/60671#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 18 Mar 2007 10:06:13 +0800</pubDate>
        <link>http://jfish.javaeye.com/blog/60671</link>
        <guid>http://jfish.javaeye.com/blog/60671</guid>
      </item>
      <item>
        <title>轻量级容器</title>
        <author>jfish</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jfish.javaeye.com">jfish</a>&nbsp;
          链接：<a href="http://jfish.javaeye.com/blog/60027" style="color:red;">http://jfish.javaeye.com/blog/60027</a>&nbsp;
          发表时间: 2007年03月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ul>
    <li><font face="Arial">容器</font><font face="Arial">是指应用代码的运行框架。</font></li>
    <li><font face="Arial"></font><font face="Arial">理想容器特点：<br />
    可接插性<br />
    一致性<br />
    一站式购物<br />
    提供企业级服务</font><font face="Arial"></font>
    <li>提供服务：<br />
    生命周期管理<br />
    查找服务<br />
    配置服务<br />
    依赖决议&nbsp; </li>
    </li>
</ul>
          <br/>
          <span style="color:red;">
            <a href="http://jfish.javaeye.com/blog/60027#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 Mar 2007 17:03:00 +0800</pubDate>
        <link>http://jfish.javaeye.com/blog/60027</link>
        <guid>http://jfish.javaeye.com/blog/60027</guid>
      </item>
      <item>
        <title>jdk5.0新特性</title>
        <author>jfish</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jfish.javaeye.com">jfish</a>&nbsp;
          链接：<a href="http://jfish.javaeye.com/blog/60080" style="color:red;">http://jfish.javaeye.com/blog/60080</a>&nbsp;
          发表时间: 2007年03月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">1.自动装箱与拆箱(autoboxing and unboxing)<br />
实现了基本类型与外覆类之间的隐式转换。基本类型至外覆类的转换称为装箱，外覆类至基本类型的转换为解箱。</font></p>
<p><font face="Arial">2.泛型(Generic)<br />
增强了java的类型安全，可以在编译期间对容器内的对象进行类型检查，在运行期不必进行类型的转换。而在j2se5之前必须在运行期动态进行容器内对象的检查及转换，减少含糊的容器，可以定义什么类型的数据放入容器</font></p>
<p><font face="Arial">3.注解(Meta data)</font></p>
<p><font face="Arial">4.增强循环(Enhanced for Loop)</font></p>
<p><font face="Arial">5.可变参数(Variable Arguments)</font></p>
<p><font face="Arial">6.静态导入(Static Imports)</font></p>
<p>&nbsp;java 代码</p>
<font face="Arial">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;java.lang.Math.*; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>sqrt(pow(x,&nbsp;</span><span class="number">2</span><span>)&nbsp;+&nbsp;pow(y,&nbsp;</span><span class="number">2</span><span>));&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中import static java.lang.Math.*;就是静态导入的语法，它的意思是导入Math类中的所有static方法和属性。这样我们在使用这些方法和属性时就不必写类名。需要注意的是默认包无法用静态导入，另外如果导入的类中有重复的方法和属性则需要写出类名，否则编译时无法通过。</p>
<p>7.枚举类(Enumeration Classes)</p>
<p>用法：public enum Name {types, &hellip;.}</p>
<div class="code_title">java 代码</div>
<font face="Arial">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">enum</span><span>&nbsp;Colors&nbsp;{Red,&nbsp;Yellow,&nbsp;Blue,&nbsp;Orange,&nbsp;Green,&nbsp;Purple,&nbsp;Brown,&nbsp;Black} &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Colors&nbsp;myColor&nbsp;=&nbsp;Colors.Red; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(myColor); &nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>8.Building Strings(StringBuilder类)<br />
在JDK5.0中引入了StringBuilder类，该类的方法不是同步(synchronized)的，这使得它比StringBuffer更加轻量级和有效。</p>
<p><font face="Arial">9.控制台输入(Console Input)<br />
在JDK5.0之前我们只能通过JOptionPane.showInputDialog进行输入，但在5.0中我们可以通过类Scanner在控制台进行输入操作</font></p>
<div class="code_title">java 代码</div>
<font face="Arial">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>java.util.Scanner&nbsp;s&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Scanner(System.in); &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>System.out.println(</span><span class="string">&quot;s:&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>System.out.println(s.next()); &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>10.Covariant Return Types</p>
<p>JDK5之前我们覆盖一个方法时我们无法改变被方法的返回类型，但在JDK5中我们可以改变它</p>
<div class="code_title"></div>
<div class="code_title">java 代码</div>
<font face="Arial">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;Employee&nbsp;clone()&nbsp;{&nbsp;...&nbsp;} &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>... &nbsp;&nbsp;</span> </li>
    <li class=""><span>Employee&nbsp;cloned&nbsp;=&nbsp;e.clone();&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>11.格式化I/O(Formatted I/O)<br />
类似C的格式化输入输出</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;TestFormat{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;a&nbsp;=&nbsp;</span><span class="number">150000</span><span>,&nbsp;b&nbsp;=&nbsp;</span><span class="number">10</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">float</span><span>&nbsp;c&nbsp;=&nbsp;</span><span class="number">5</span><span>.0101f,&nbsp;d&nbsp;=&nbsp;</span><span class="number">3</span><span>.14f; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.printf(</span><span class="string">&quot;%4d&nbsp;%4d%n&quot;</span><span>,&nbsp;a,&nbsp;b); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.printf(</span><span class="string">&quot;%x&nbsp;%x%n&quot;</span><span>,&nbsp;a,&nbsp;b); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.printf(</span><span class="string">&quot;%3.2f&nbsp;%1.1f%n&quot;</span><span>,&nbsp;c,&nbsp;d); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.printf(</span><span class="string">&quot;%1.3e&nbsp;%1.3e%n&quot;</span><span>,&nbsp;c,&nbsp;d*</span><span class="number">100</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
</font></font></font></font>
          <br/>
          <span style="color:red;">
            <a href="http://jfish.javaeye.com/blog/60080#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 Mar 2007 17:02:00 +0800</pubDate>
        <link>http://jfish.javaeye.com/blog/60080</link>
        <guid>http://jfish.javaeye.com/blog/60080</guid>
      </item>
      <item>
        <title>怎样用最简单的方法测试出来谁会编程，谁不会编程</title>
        <author>jfish</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jfish.javaeye.com">jfish</a>&nbsp;
          链接：<a href="http://jfish.javaeye.com/blog/60030" style="color:red;">http://jfish.javaeye.com/blog/60030</a>&nbsp;
          发表时间: 2007年03月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>（摘自csdn）</p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reginald Braithwaite认为，很多人和他一样遇到了这样的问题：&ldquo;当一个人遇到200个申请编程工作的人中有199个完全不能写代码的时候，你就会和他一样感到困惑。 我重申一下：他们什么代码都写不出来。&rdquo;</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 刚才所提到的人就是Imran，他直接拒绝了很多不能写出简单程序的程序员：</font></p>
<p><font face="Arial">&nbsp;&nbsp; &ldquo;在一些公平的考验之后，我发现那些因为代码而抓狂的人不是为了庞大的项目，而是在细小的地方就缠不休。所以我开始研究这些问题，收集这些编程人员的特点和归结成一类问题，取名为&ldquo;FizzBuzz 问题&rdquo;。 FizzBuzz问题是一种英国学校学生经常玩的游戏。举个&ldquo;FizzBuzz 问题&rdquo;的例子：</font><font face="Arial">写一个程序打印1到100这些数字。但是遇到数字为3的倍数的时候，打印&ldquo;Fizz&rdquo;替代数字，5的倍数用&ldquo;Buzz&rdquo;代替，既是3的倍数又是5的倍数打印&ldquo;FizzBuzz&rdquo;。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大多数好的程序员应该可以在几分钟之内在纸上写出这个程序。令人惊讶的是，绝大多数计算机科学与技术的本科生不会。我看到有很多自学的高级程序员写出一个方案要花大于10-15分钟。&rdquo;</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 众所周知，会编程和不会编程的人的区别一眼就能看出来。FizzBuzz是一个非常简单而又有效的方式，去筛掉那些不会编程的人。在面试程序员的时候，我认为一定要先看他们的代码。在我们招聘的时候，我们需要看先面试者的代码，然后才进行电话面试。程序考试一般都是相当基础的考题，很多时候都是基础应用。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要想找到合适的程序员，我们有责任通过大量的面试来进行选拔。企业都希望能够做出好的软件，所以需要优秀的编程人员。只有那些基础扎实，技术过硬的人，才能收到企业的青睐。<br />
</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://jfish.javaeye.com/blog/60030#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 Mar 2007 15:00:00 +0800</pubDate>
        <link>http://jfish.javaeye.com/blog/60030</link>
        <guid>http://jfish.javaeye.com/blog/60030</guid>
      </item>
      <item>
        <title>使用open source产品组装你的web应用架构(转载)</title>
        <author>jfish</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jfish.javaeye.com">jfish</a>&nbsp;
          链接：<a href="http://jfish.javaeye.com/blog/60037" style="color:red;">http://jfish.javaeye.com/blog/60037</a>&nbsp;
          发表时间: 2007年03月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span class="content">原文出处：<br />
<a href="http://www.onjava.com/pub/a/onjava/2004/04/07/wiringwebapps.html?page=1" target="_blank">http://www.onjava.com/pub/a/onjava/2004/04/07/wiringwebapps.html?page=1</a><br />
<a href="http://www.onjava.com/pub/a/onjava/2004/04/07/wiringwebapps.html?page=2" target="_blank">http://www.onjava.com/pub/a/onjava/2004/04/07/wiringwebapps.html?page=2</a><br />
<a href="http://www.onjava.com/pub/a/onjava/2004/04/07/wiringwebapps.html?page=3" target="_blank">http://www.onjava.com/pub/a/onjava/2004/04/07/wiringwebapps.html?page=3</a><br />
<br />
<br />
其实，就算用Java建造一个不是很烦琐的web应用，也不是件轻松的事情。 在构架的一开始就有很多事情要考虑。 从高处看，摆在开发者面前有很多问题：要考虑是怎样建立用户接口？在哪里处理业务逻辑？ 怎样持久化的数据。 而这三层构架中，每一层都有他们要仔细考虑的。 各个层该使用什么技术？ 怎样的设计能松散耦合还能灵活改变？ 怎样替换某个层而不影响整体构架？应用程序如何做各种级别的业务处理（比如事务处理）？ <br />
<br />
构架一个Web应用需要弄明白好多问题。 幸运的是，已经有不少开发者已经遇到过这类问题，并且建立了处理这类问题的框架。 一个好框架具备以下几点： 减轻开发者处理复杂的问题的负担（&ldquo;不重复发明轮子&rdquo;）； 内部有良好的扩展； 并且有一个支持它的强大的用户团体。 好的构架一般有针对性的处理某一类问题，并且能将它做好（Do One Thing well）。 然而，你的程序中有几个层可能需要使用特定的框架，已经完成的UI(用户接口) 并不代表你也可以把你的业务逻辑和持久逻辑偶合到你的UI部分。 举个例子， 你不该在一个Controller(控制器)里面写JDBC代码作为你的业务逻辑， 这不是控制器应该提供的。 一个UI 控制器应该委派给其它给在UI范围之外的轻量级组件。 好的框架应该能指导代码如何分布。 更重要的是，框架能把开发者从编码中解放出来，使他们能专心于应用程序的逻辑（这对客户来说很重要）。<br />
<br />
这篇文章将讨论怎样结合几种著名的框架来使得你的应用程序做到松弛耦合。 <br />
<br />
如何建立你的架构，并且怎样让你的各个应用层保持一致。？如何整合框架以便让每个层在以一种松散偶合的方式彼此作用而不用管低层的技术细节？这对我们来说真是一种挑战。 这里讨论一个整合框架的策略( 使用3 种受欢迎的开源框架) ：表示层我们用Struts； 业务层我们用Spring；而持久层则用Hibernate。 你也可以用其他FrameWork替换只要能得到同样的效果。 见图1 （框架组合示意图）<br />
<br />
<img src="http://www.uml.org.cn/images/upfile/2004418241.gif" border="0" height="193" alt="" width="450" /><br />
应用程序的分层<br />
<br />
大部分的Web应用在职责上至少能被分成4层。 这四层是：presentation（描述），persistence（持久），business（业务）和domain model（域模块）。每个层在处理程序上都应该有一项明确的责任, 而不应该在功能上与其它层混合，并且每个层要与其它层分开的，但要给他们之间放一个通信接口。 &nbsp; 我们就从介绍各个层开始，讨论一下这些层应该提供什么，不应该提供什么。<br />
<br />
<br />
<br />
表示层(The Presentation Layer) <br />
<br />
一般来讲，一个典型的Web应用的的末端应该是表示层。 很多Java发者也理解Struts所提供的。 象业务逻辑之类的被打包到org.apache.struts.Action.， 因此，我们很赞成使用Struts这样的框架。<br />
<br />
<br />
<br />
下面是Struts所负责的：<br />
<br />
&nbsp; * 管理用户的请求,做出相应的响应。 <br />
<br />
&nbsp; * 提供一个Controller ,委派调用业务逻辑和其它上层处理。 <br />
<br />
&nbsp; * 处理异常，抛给Struts Action <br />
<br />
&nbsp; * 为显示提供一个模型 <br />
<br />
&nbsp; * UI验证。 <br />
<br />
<br />
<br />
以下条款，不该在Struts显示层的编码中经常出现。 它们与显示层无关的。 <br />
<br />
&nbsp; * 直接的与数据库通信，例如JDBC调用。 <br />
<br />
&nbsp; * 与你应用程序相关联的业务逻辑以及校验。 <br />
<br />
&nbsp; * 事物管理。 <br />
<br />
在表示层引入这些代码，则会带来高偶合和麻烦的维护。<br />
<br />
<br />
<br />
<br />
<br />
持久层(The Persistence Layer)<br />
<br />
典型的Web应用的另一个末端是持久层。这里通常是程序最容易失控的地方。开发者总是低估构建他们自己的持久框架的挑战性。系统内部的持续层不但需要大量调试时间，而且还经常缺少功能使之变得难以控制，这是持久层的通病。 还好有几个ORM开源框架很好的解决了这类问题。尤其是Hibernate。 Hibernate为java提供了OR持久化机制和查询服务, 它还给已经熟悉SQL和JDBC API 的Java开发者一个学习桥梁，他们学习起来很方便。 Hibernate的持久对象是基于POJO和Java collections。此外，使用Hibernate并不妨碍你正在使用的IDE。 <br />
<br />
<br />
<br />
请看下面的条目，你在持久层编码中需要了解的。<br />
<br />
* 查询对象的相关信息的语句。 Hibernate通过一个OO查询语言（HQL）或者正则表达的API来完成查询。 HQL非常类似于SQL-- 只是把SQL里的table和columns用Object和它的fields代替。 你需要学习一些新的HQL语言； 不管怎样，他们容易理解而文档也做的很好。 HQL是一种对象查询的自然语言，花很小的代价就能学习它。<br />
<br />
* 如何存储，更新，删除数据库记录。 <br />
<br />
* 象Hibernate这类的高级ORM框架支持大部分主流数据库，并且他们支持 Parent/child关系，事物处理，继承和多态。<br />
<br />
<br />
<br />
业务层（The Business Layer）<br />
<br />
&nbsp; 一个典型Web应用的中间部分是业务层或者服务层。 从编码的视角来看，这层是最容易被忽视的一层。 而我们却往往在UI层或持久层周围看到这些业务处理的代码，这其实是不正确的，因为它导致了程序代码的紧密偶合，这样一来，随着时间推移这些代码很难维护。幸好，针对这一问题有好几种Frameworks存在。 最受欢迎的两个框架是Spring和PicoContainer。 这些为也被称为microcontainers，他们能让你很好的把对象搭配起来。 这两个框架都着手于&lsquo;依赖注射&rsquo;(dependency injection)(还有我们知道的&lsquo;控制反转&rsquo;Inversion of Control=IoC)这样的简单概念。 这篇文章将关注于Spring的注射（译注：通过一个给定参数的Setter方法来构造Bean,有所不同于Factory）, Spring还提供了Setter Injection(type2)，Constructor Injection(type3)等方式供我们选择。 Spring把程序中所涉及到包含业务逻辑和Dao的Objects&mdash;&mdash;例如transaction management handler（事物管理控制）、Object Factoris(对象工厂)、service objects（服务组件）&mdash;&mdash;都通过XML来配置联系起来。 <br />
<br />
<br />
<br />
后面我们会举个例子来揭示一下Spring 是怎样运用这些概念。 <br />
<br />
业务层所负责的如下： <br />
<br />
* 处理应用程序的 业务逻辑和业务校验 <br />
<br />
* 管理事物 <br />
<br />
* 允许与其它层相互作用的接口 <br />
<br />
* 管理业务层级别的对象的依赖。<br />
<br />
* 在显示层和持久层之间增加了一个灵活的机制，使得他们不直接的联系在一起。<br />
<br />
* 通过揭示 从显示层到业务层之间的Context来得到business services。<br />
<br />
* 管理程序的执行（从业务层到持久层）。<br />
<br />
<br />
<br />
<br />
<br />
域模块层（The Domain Model Layer ）<br />
<br />
既然我们致力于的是一个不是很复杂的Web的应用， 我们需要一个对象集合，让它在不同层之间移动的。 域模块层由实际需求中的业务对象组成 比如, OrderLineItem , Product等等。 开发者在这层 不用管那些DTOs，仅关注domain object即可。 例如，Hibernate允许你将数据库中的信息存放入对象（domain objects），这样你可以在连接断开的情况下把这些数据显示到UI层。 而那些对象也可以返回给持续层，从而在数据库里更新。 而且，你不必把对象转化成DTOs（这可能似的它在不同层之间的在传输过程中丢失），这个模型使得Java开发者能很自然运用OO，而不需要附加的编码。<br />
<br />
<br />
一个简单例子<br />
<br />
<br />
<br />
既然我们已经从全局上理解这些组件。 现在就让我们开始实践吧。 我们还是用 Struts，Spring 和Hibernate。这三个框架已经被描述够多了，这里就不重复介绍了。 这篇文章举例指导你如何使用这三个框架整合开发, 并向你揭示 一个请求是如何贯穿于各个层的。（从用户的加入一个Order到数据库，显示；进而更新、删除）。<br />
<br />
<br />
从这里可以下载到程序程序原代码（download）<br />
<br />
既然每个层是互相作用的，我们就先来创建domain objects。首先，我们要在这些Object中要确定那些是需要持久化的，哪些是提供给business logic，那些是显示接口的设计。 下一步，我们将配置我们的持久层并且定义好Hibernate的OR mappings。然后定义好Business Objects。有了这些组成部分之后，我们将 使用Spring把这些连接起来。 最后，我们提供给Spring一个持久层，从这个持久层里我们可以知道它是如何与业务逻辑层（business service layer）通信的，以及它是怎样处理其他层抛出的异常的。。 <br />
<br />
<br />
<br />
域对象层（Domain Object Layer）<br />
<br />
<br />
<br />
这层是编码的着手点，我们的编码就从这层开始。 例子中Order 与OrderItem 是一个One&mdash;To&mdash;Many的关系。 下面就是Domain Object Layer的两个对象： <br />
<br />
<br />
<br />
&middot; &nbsp; com.meagle.bo.Order.java: 包含了一个Order的概要信息<br />
<br />
&middot; &nbsp; com.meagle.bo.OrderLineItem.java: 包含了Order的详细信息<br />
<br />
好好考虑怎你的package命名,这反应出了你是怎样分层的。 例如 domain objects在程序中可能打包在com.meagle.bo内。 更详细一点将打包在com. meagle.bo的子目录下面。business logic应该从com.meagle.serice开始打包，而DAO 对象应该位于com.meagle.service.dao.hibernate。反应Forms和Actions的 持久对象（presentation classes） 应该分别放在 com.meagle.action和com.meagle.forms包。 准确的给包命名使得你的classes很好分割并且易于维护，并且在你添加新的classes时，能使得程序结构上保持上下一致。<br />
<br />
持久层的配置（Persistence Layer Configuration）<br />
建立Hibernate的持久层 需要好几个步骤。 第一步让我们把BO持久化。 既然Hibernate是通过POJO工作的， 因此Order和 OrderLineItem对象需要给所有的fileds 加上getter,setter方法。 Hibernate通过XML文件来映射(OR)对象，以下两个xml文件分别映射了Order 和OrderItem对象。（这里有个叫XDoclet工具可以自动生成你的XML影射文件）<br />
<br />
Order.hbm.xml <br />
OrderLineItem.hbm.xml <br />
你可以在WebContent/WEB-INF/classes/com/meagle/bo目录下找到这些xml文件。Hibernate的 SessionFactory 是用来告诉程序 应该与哪个数据库通信，该使用哪个连接池或使用了DataSource， 应该加载哪些持久对象。而Session接口是用来完成Selecting，Saving，Delete和Updating这些操作。 后面的我们将讲述SessionFactory和Session是怎样设置的。<br />
<br />
<br />
<br />
业务层的配置（Business Layer Configuration）<br />
<br />
既然我们已经有了domain objects，接下来我们就要business service objects了，用他们来执行程序的logic,调用持久层，得到UI层的requests,处理transactions，并且控制exceptions。 为了将这些连接起来并且易于管理，我们将使用面向方面的 SpringFramework。 Spring 提供了 控制倒置（inversion of control 0==IoC)和注射依赖设置（setter dependency injection）这些方式（可供选择），用XML文件将对象连接起来。 IoC是一个简单概念（它允许一个对象在上层接受其他对象的创建），用IoC这种方式让你的对象从创建中释放了出来，降低了偶合度。<br />
<br />
<br />
<br />
<br />
这里是一个没有使用IoC的对象创建的例子，它有很高偶合度。<br />
<br />
<img src="http://www.uml.org.cn/images/upfile/2004418242.gif" border="0" height="212" alt="" width="250" /><br />
图 2.没有使用 IoC. &nbsp; A 创建了 B 和 C<br />
<br />
<br />
<br />
而这里是一个使用IoC的例子，这种方式允许对象在高层可以创建并进入另外一个对象，所以这样可以直接被执行。<br />
<br />
<img src="http://www.uml.org.cn/images/upfile/2004418243.gif" border="0" height="210" alt="" width="250" /><br />
图 3. 对象使用了 IoC。 A 包含了接受B,C的 setter方法 , 这同样达到了 由A创建B,C的目的。<br />
<br />
<br />
<br />
<br />
<br />
建立我们的业务服务对象（Building Our Business Service Objects）<br />
<br />
<br />
Business Object中的Setter方法接受的是接口，这样我们可以很松散的定义对象实现，然后注入。 在我们的案例中，我们将用一个business service object接收一个DAO,用它来控制domain objects的持久化。 由于在这个例子中使用了Hibernate，我们可以很方便的用其他持久框架实现 同时通知Spring 有新的DAO可以使用了。<br />
<br />
在面向接口的编程中，你会明白 &ldquo;注射依赖&rdquo;模式是怎样松散耦合你的业务逻辑和持久机制的：）。<br />
<br />
<br />
<br />
下面是一个接口business service object，DAO代码片段：<br />
<br />
<br />
<br />
public interface IOrderService {<br />
<br />
public abstract Order saveNewOrder(Order order)<br />
<br />
&nbsp; throws OrderException,<br />
<br />
&nbsp; &nbsp; &nbsp; OrderMinimumAmountException;<br />
<br />
<br />
<br />
public abstract List findOrderByUser(<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String user)<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throws OrderException;<br />
<br />
<br />
<br />
public abstract Order findOrderById(int id)<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throws OrderException;<br />
<br />
<br />
<br />
public abstract void setOrderDAO(<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IOrderDAO orderDAO);<br />
<br />
}<br />
<br />
<br />
<br />
注意到这段代码里有一个 setOrderDao（），它就是一个DAO Object设置方法（注射器）。 但这里并没有一个getOrderDao的方法，这不必要，因为你并不会在外部访问这个orderDao。这个DAO Objecte将被调用，和我们的persistence layer 通信。我们将用Spring把DAO Object 和 business service object搭配起来的。因为我们是面向接口编程的，所以并不需要将实现类紧密的耦合在一起。<br />
<br />
<br />
<br />
接下去我们开始我们的DAO的实现类进行编码。 既然Spring已经有对Hibernate的支持，那这个例子就直接继承HibernateDaoSupport类了，这个类很有用，我们可以参考HibernateTemplate（它主要是针对HibernateDaoSupport的一个用法，译注：具体可以查看Srping 的API）。 下面是这个DAO接口代码：<br />
<br />
<br />
<br />
<br />
<br />
public interface IOrderDAO {<br />
public abstract Order findOrderById(<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final int id);<br />
<br />
public abstract List findOrdersPlaceByUser(<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final String placedBy);<br />
public abstract Order saveOrder(<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final Order order);<br />
}<br />
我们仍然要给我们持久层组装很多关联的对象，这里包含了HibernateSessionFactory 和TransactionManager。 Spring 提供了一个 HibernateTransactionManager，他用线程捆绑了一个Hibernate Session，用它来支持transactions(请查看ThreadLocal) 。<br />
<br />
下面是HibernateSessionFactory 和 HibernateTransactionManager:的配置：<br />
<br />
&lt;bean id=&quot;mySessionFactory&quot;<br />
&nbsp; &nbsp; class=&quot;org.springframework.orm.hibernate.<br />
&nbsp; &nbsp; &nbsp; &nbsp; LocalSessionFactoryBean&quot;&gt;<br />
&lt;property name=&quot;mappingResources&quot;&gt;<br />
&nbsp; &lt;list&gt;<br />
&nbsp; &nbsp; &lt;value&gt;<br />
&nbsp; &nbsp; com/meagle/bo/Order.hbm.xml<br />
&nbsp; &nbsp; &lt;/value&gt;<br />
&nbsp; &nbsp; &lt;value&gt;<br />
&nbsp; &nbsp; com/meagle/bo/OrderLineItem.hbm.xml<br />
&nbsp; &nbsp; &lt;/value&gt;<br />
&nbsp; &lt;/list&gt;<br />
&lt;/property&gt;<br />
&lt;property name=&quot;hibernateProperties&quot;&gt;<br />
&nbsp; &lt;props&gt;<br />
&nbsp; &nbsp; &lt;prop key=&quot;hibernate.dialect&quot;&gt;<br />
&nbsp; &nbsp; net.sf.hibernate.dialect.MySQLDialect<br />
&nbsp; &nbsp; &lt;/prop&gt;<br />
&nbsp; &nbsp; &lt;prop key=&quot;hibernate.show_sql&quot;&gt;<br />
&nbsp; &nbsp; false<br />
&nbsp; &nbsp; &lt;/prop&gt;<br />
&nbsp; &nbsp; &lt;prop key=&quot;hibernate.proxool.xml&quot;&gt;<br />
&nbsp; &nbsp; C:/MyWebApps/.../WEB-INF/proxool.xml<br />
&nbsp; &nbsp; &lt;/prop&gt;<br />
&nbsp; &nbsp; &lt;prop key=&quot;hibernate.proxool.pool_alias&quot;&gt;<br />
&nbsp; &nbsp; &nbsp; spring<br />
&nbsp; &nbsp; &lt;/prop&gt;<br />
&nbsp; &lt;/props&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
<br />
&lt;!-- Transaction manager for a single Hibernate<br />
SessionFactory (alternative to JTA) --&gt;<br />
&lt;bean id=&quot;myTransactionManager&quot;<br />
&nbsp; &nbsp; &nbsp; class=&quot;org.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; springframework.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; orm.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hibernate.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HibernateTransactionManager&quot;&gt;<br />
&lt;property name=&quot;sessionFactory&quot;&gt;<br />
&nbsp; &lt;ref local=&quot;mySessionFactory&quot;/&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
<br />
可以看出：每个对象都可以在Spring 配置信息中用&lt;bean&gt;标签引用。在这里，mySessionFactory引用了HibernateSessionFactory，而myTransactionManager引用了HibernateTransactionManage。 注意代码中myTransactionManger Bean有个sessionFactory属性。 HibernateTransactionManager有个sessionFactory setter 和 getter方法，这是用来在Spring启动的时候实现&ldquo;依赖注入&rdquo; （dependency injection）的。 在sessionFactory 属性里 引用mySessionFactory。这两个对象在Spring容器初始化后就被组装了起来了。 这样的搭配让你从 单例（singleton objects）和工厂（factories）中解放了出来，降低了代码的维护代价。 mySessionFactory.的两个属性，分别是用来注入mappingResources 和 hibernatePropertes的。通常，如果你在Spring之外使用Hibernate,这样的设置应该放在hibernate.cfg.xml中的。 不管怎样,Spring提供了一个便捷的方式-----在Spring内部配置中并入了Hibernate的配置。 如果要得到更多的信息，可以查阅Spring API。<br />
<br />
<br />
<br />
<br />
<br />
既然我们已经组装配置好了Service Beans，就需要把Business Service Object和 DAO也组装起来，并把这些对象配到一个事务管理器（transaction manager）里。<br />
<br />
<br />
<br />
在Spring中的配置信息：<br />
<br />
&lt;!-- ORDER SERVICE --&gt;<br />
&lt;bean id=&quot;orderService&quot;<br />
class=&quot;org.<br />
&nbsp; &nbsp; &nbsp; springframework.<br />
&nbsp; &nbsp; &nbsp; transaction.<br />
&nbsp; &nbsp; &nbsp; interceptor.<br />
&nbsp; &nbsp; &nbsp; TransactionProxyFactoryBean&quot;&gt;<br />
&lt;property name=&quot;transactionManager&quot;&gt;<br />
&nbsp; &lt;ref local=&quot;myTransactionManager&quot;/&gt;<br />
&lt;/property&gt;<br />
&lt;property name=&quot;target&quot;&gt;<br />
&nbsp; &lt;ref local=&quot;orderTarget&quot;/&gt;<br />
&lt;/property&gt;<br />
&lt;property name=&quot;transactionAttributes&quot;&gt;<br />
&nbsp; &lt;props&gt;<br />
&nbsp; &nbsp; &lt;prop key=&quot;find*&quot;&gt;<br />
&nbsp; PROPAGATION_REQUIRED,readOnly,-OrderException<br />
&nbsp; &nbsp; &lt;/prop&gt;<br />
&nbsp; &nbsp; &lt;prop key=&quot;save*&quot;&gt;<br />
&nbsp; PROPAGATION_REQUIRED,-OrderException<br />
&nbsp; &nbsp; &lt;/prop&gt;<br />
&nbsp; &lt;/props&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
<br />
&lt;!-- ORDER TARGET PRIMARY BUSINESS OBJECT:<br />
Hibernate implementation --&gt;<br />
&lt;bean id=&quot;orderTarget&quot;<br />
&nbsp; &nbsp; &nbsp; class=&quot;com.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; meagle.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; service.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; spring.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OrderServiceSpringImpl&quot;&gt;<br />
&lt;property name=&quot;orderDAO&quot;&gt;<br />
&nbsp; &lt;ref local=&quot;orderDAO&quot;/&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
<br />
&lt;!-- ORDER DAO OBJECT --&gt;<br />
&lt;bean id=&quot;orderDAO&quot;<br />
&nbsp; &nbsp; &nbsp; class=&quot;com.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; meagle.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; service.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dao.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hibernate.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OrderHibernateDAO&quot;&gt;<br />
&lt;property name=&quot;sessionFactory&quot;&gt;<br />
&nbsp; &lt;ref local=&quot;mySessionFactory&quot;/&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
<br />
<br />
<br />
<br />
图4 是我们对象搭建的一个提纲。 从中可以看出，每个对象都联系着Spring，并且能通过Spring注入到其他对象。把它与Spring的配置文件比较，观察他们之间的关系<br />
<br />
<img src="http://www.uml.org.cn/images/upfile/2004418244.gif" border="0" height="352" alt="" width="436" /><br />
图 4. Spring就是这样基于配置文件，将各个Bean搭建在一起。<br />
<br />
<br />
<br />
这个例子使用一个TransactionProxyFactoryBean，它定义了一个setTransactionManager()。 这对象很有用，他能很方便的处理你申明的事物还有Service Object。 &nbsp; 你可以通过transactionAttributes属性来定义怎样处理。 想知道更多还是参考TransactionAttributeEditor吧。<br />
<br />
TransactionProxyFactoryBean 还有个setter. 这会被我们 Business service object（orderTarget）引用， orderTarget定义了 业务服务层，并且它还有个属性，由setOrderDAO()引用。这个属性<br />
<br />
<br />
<br />
Spring 和Bean 的还有一点要注意的： bean可以以用两种方式创造。 这些都在单例模式（Sington）和原型模式（propotype）中定义了。 默认的方式是singleton,这意味着共享的实例将被束缚。 而原形模式是在Spring用到bean的时候允许新建实例的。当每个用户需要得到他们自己Bean的Copy时，你应该仅使用prototype模式。（更多的请参考设计模式中的单例模式和原形模式）<br />
<br />
提供一个服务定位器（Providing a Service Locator）<br />
<br />
既然我们已经将我们的Serices和DAO搭配起来了。我们需要把我们的Service显示到其他层。 这个通常是在Struts或者Swing这层里编码。一个简单方法就是用 服务定位器返回给Spring context 。当然，可以通过直接调用Spring中的Bean来做。<br />
<br />
下面是一个Struts Actin 中的服务定位器的一个例子。<br />
<br />
public abstract class BaseAction extends Action {<br />
<br />
private IOrderService orderService;<br />
<br />
public void setServlet(ActionServlet<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; actionServlet) {<br />
&nbsp; super.setServlet(actionServlet);<br />
&nbsp; ServletContext servletContext =<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; actionServlet.getServletContext();<br />
<br />
&nbsp; WebApplicationContext wac =<br />
&nbsp; &nbsp; WebApplicationContextUtils.<br />
&nbsp; &nbsp; &nbsp; getRequiredWebApplicationContext(<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; servletContext);<br />
<br />
&nbsp; &nbsp; this.orderService = (IOrderService)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wac.getBean(&quot;orderService&quot;);<br />
}<br />
<br />
protected IOrderService getOrderService() {<br />
&nbsp; return orderService;<br />
}<br />
}<br />
<br />
<br />
UI 层配置 （UI Layer Configuration）<br />
这个例子里UI层 使用了Struts framework. 这里我们要讲述一下在给程序分层的时候， 哪些是和Struts部分的。我们就从一个Struts-config.xml文件中的Action的配置信息开始吧。<br />
<br />
struts-config.xml file.<br />
<br />
&lt;action path=&quot;/SaveNewOrder&quot;<br />
&nbsp; type=&quot;com.meagle.action.SaveOrderAction&quot;<br />
&nbsp; name=&quot;OrderForm&quot;<br />
&nbsp; scope=&quot;request&quot;<br />
&nbsp; validate=&quot;true&quot;<br />
&nbsp; input=&quot;/NewOrder.jsp&quot;&gt;<br />
&lt;display-name&gt;Save New Order&lt;/display-name&gt;<br />
&lt;exception key=&quot;error.order.save&quot;<br />
&nbsp; path=&quot;/NewOrder.jsp&quot;<br />
&nbsp; scope=&quot;request&quot;<br />
&nbsp; type=&quot;com.meagle.exception.OrderException&quot;/&gt;<br />
&lt;exception key=&quot;error.order.not.enough.money&quot;<br />
&nbsp; path=&quot;/NewOrder.jsp&quot;<br />
&nbsp; scope=&quot;request&quot;<br />
&nbsp; type=&quot;com.<br />
&nbsp; &nbsp; &nbsp; meagle.<br />
&nbsp; &nbsp; &nbsp; exception.<br />
&nbsp; &nbsp; &nbsp; OrderMinimumAmountException&quot;/&gt;<br />
&lt;forward name=&quot;success&quot; path=&quot;/ViewOrder.jsp&quot;/&gt;<br />
&lt;forward name=&quot;failure&quot; path=&quot;/NewOrder.jsp&quot;/&gt;<br />
&lt;/action&gt;<br />
<br />
SaveNewOrder 这个Action是用来持久化UI层里的表单提交过来Order的。这是Struts中一个很典型的Action; 注意观察这个Action中exception配置，这些Exceptions也在Spring 配置文件(applicationContext-hibernate.xml)中配置了（就在 business service object 的transactionAttributes属性里）。 当异常在业务层被被抛出时，我们可以控制他们，并适当的显示给UI层。 <br />
<br />
第一个异常，OrderException,在持久层保存order对象失败的时候被触发。这将导致事物回滚并且通过BO把异常回传到Struts这一层。<br />
<br />
第二个异常，OrderMinimumAmountException也同第一个一样。<br />
<br />
<br />
<br />
<br />
<br />
搭配整和的最后一步 通过是让你显示层和业务层相结合。这个已经被服务定位器（service locator）实现了（前面讨论过了）， 这里服务层作为一个接口提供给我们的业务逻辑和持久层。 <br />
<br />
<br />
<br />
SaveNewOrder Action 在Struts中用一个服务定位器（service locator）来调用执行业务方法的。 方法代码如下：<br />
<br />
<br />
<br />
public ActionForward execute(<br />
<br />
ActionMapping mapping,<br />
<br />
ActionForm form,<br />
<br />
javax.servlet.http.HttpServletRequest request,<br />
<br />
javax.servlet.http.HttpServletResponse response)<br />
<br />
throws java.lang.Exception {<br />
<br />
<br />
<br />
OrderForm oForm = (OrderForm) form;<br />
<br />
<br />
<br />
// Use the form to build an Order object that<br />
<br />
// can be saved in the persistence layer.<br />
<br />
// See the full source code in the sample app.<br />
<br />
<br />
<br />
// Obtain the wired business service object<br />
<br />
// from the service locator configuration<br />
<br />
// in BaseAction.<br />
<br />
// Delegate the save to the service layer and<br />
<br />
// further upstream to save the Order object.<br />
<br />
getOrderService().saveNewOrder(order);<br />
<br />
<br />
<br />
oForm.setOrder(order);<br />
<br />
<br />
<br />
ActionMessages messages = new ActionMessages();<br />
<br />
messages.add(<br />
<br />
&nbsp; &nbsp; ActionMessages.GLOBAL_MESSAGE,<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; new ActionMessage(<br />
<br />
&nbsp; &nbsp; &quot;message.order.saved.successfully&quot;));<br />
<br />
<br />
<br />
saveMessages(request, messages);<br />
<br />
<br />
<br />
return mapping.findForward(&quot;success&quot;);<br />
<br />
}<br />
<br />
<br />
<br />
总结<br />
<br />
&nbsp; &nbsp; 这篇文章在技术和构架方面掩盖了很多低层的基础信息， 文章的主要的意图在于让你意识到如何给你应用程序分层。 分层可以&ldquo;解耦&rdquo;你的代码&mdash;&mdash;允许新的组件被添加进来，而且让你的代码易于维护。 这里用到的技术只是专注于把&ldquo;解偶&rdquo;做好。 不管怎样，使用这样的构架可以让你用其他技术代替现在的层。 例如，你可能不使用Hibernate实现持久化。既然你在DAO中面向接口的编程的，所以你完全可以用iBATIS来代替。或者，你也可能想用Struts外的其他的技术或者框架替换现在的UI层（转换久层，实现层并不应该直接影响到你的业务逻辑和业务服务层）。 用适当的框架搭建你的Web应用，其实也不是一件烦琐的工作，更主要的是它&ldquo;解耦&rdquo;了你程序中的各个层。<br />
<br />
<br />
</span>
          <br/>
          <span style="color:red;">
            <a href="http://jfish.javaeye.com/blog/60037#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 Mar 2007 14:54:27 +0800</pubDate>
        <link>http://jfish.javaeye.com/blog/60037</link>
        <guid>http://jfish.javaeye.com/blog/60037</guid>
      </item>
      <item>
        <title>osworkflow2.8.0学习指南</title>
        <author>jfish</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jfish.javaeye.com">jfish</a>&nbsp;
          链接：<a href="http://jfish.javaeye.com/blog/60033" style="color:red;">http://jfish.javaeye.com/blog/60033</a>&nbsp;
          发表时间: 2007年03月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          OSWorkflow是一个灵活的工作流引擎，设计成可嵌入到企业应用程序中。它提供了许多的持久化API支持包括：EJB,Hibernate,JDBC和其它。OSWorkflow还可以与Spring集成。<br />
网址：<a href="http://www.opensymphony.com/osworkflow/" target="_blank">http://www.opensymphony.com/osworkflow/</a><br />
<br />
1.OSWorkflow基本概念(gigix)<br />
<a href="http://gigix.blogdriver.com/gigix/113138.html" target="_blank">http://gigix.blogdriver.com/gigix/113138.html</a><br />
2.osworkflow中文指南(Quake Wang)<br />
<a href="http://wiki.opensymphony.com/display/WF/Tutorial+-+Chinese" target="_blank">http://wiki.opensymphony.com/display/WF/Tutorial+-+Chinese</a><br />
3.OSWorkflow入门(史帝芬心得笔记)<br />
<a href="http://my.so-net.net.tw/idealist/OSWorkflow/" target="_blank">http://my.so-net.net.tw/idealist/OSWorkflow/</a><br />
4.英文文档<br />
<a href="http://wiki.opensymphony.com/display/WF/Manual" target="_blank">http://wiki.opensymphony.com/display/WF/Manual</a><br />
5.深入分析(银狐999)<br />
<a href="http://blog.csdn.net/james999/category/52990.aspx" target="_blank">http://blog.csdn.net/james999/category/52990.aspx</a>
          <br/>
          <span style="color:red;">
            <a href="http://jfish.javaeye.com/blog/60033#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 Mar 2007 14:50:24 +0800</pubDate>
        <link>http://jfish.javaeye.com/blog/60033</link>
        <guid>http://jfish.javaeye.com/blog/60033</guid>
      </item>
      <item>
        <title>SQL语法手册</title>
        <author>jfish</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jfish.javaeye.com">jfish</a>&nbsp;
          链接：<a href="http://jfish.javaeye.com/blog/60031" style="color:red;">http://jfish.javaeye.com/blog/60031</a>&nbsp;
          发表时间: 2007年03月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="Section1" style="LAYOUT-GRID:  15.6pt none">
<h1><span lang="EN-US">Select</span></h1>
<p class="MsoNormal"><strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用途：</span><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;</span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从指定表中取出指定的列的数据</span></p>
<p class="MsoNormal"><strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语法：</span><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;<o:p></o:p></span></p>
<table cellspacing="0" border="1" bgcolor="#eeeedd" width="100%" cellpadding="0" style="BACKGROUND: #eeeedd; WIDTH: 100%; mso-cellspacing: 0cm">
    <tbody>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <pre><span lang="EN-US" style="FONT-SIZE: 9.5pt; COLOR: black">SELECT column_name(s) FROM table_name<o:p></o:p></span></pre>
            </td>
        </tr>
    </tbody>
</table>
<p class="MsoNormal"><span lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal"><strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解释：</span><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从数据库中选取资料列，并允许从一或多个资料表中，选取一或多个资料列或资料行。</span><span lang="EN-US">SELECT </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">陈述式的完整语法相当复杂，但主要子句可摘要为：</span></p>
<p class="MsoNormal"><span lang="EN-US">SELECT select_list <br />
[ INTO new_table ] <br />
FROM table_source <br />
[ WHERE search_condition ] <br />
[ GROUP BY group_by_expression ] <br />
[ HAVING search_condition ] <br />
[ ORDER BY order_expression [ ASC | DESC ] ] </span></p>
<p style="MARGIN: 0cm 0cm 0pt"><strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">例：</span><span lang="EN-US"><o:p></o:p></span></strong></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black"><span style="mso-spacerun: yes">&nbsp;</span>&ldquo;Persons&rdquo; </span><span style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">表中的数据有</span><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black"><o:p></o:p></span></p>
<table cellspacing="0" border="1" bgcolor="#eeeedd" width="100%" cellpadding="0" style="BACKGROUND: #eeeedd; WIDTH: 100%; mso-cellspacing: 0cm">
    <tbody>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">LastName<o:p></o:p></span></strong></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">FirstName<o:p></o:p></span></strong></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Address<o:p></o:p></span></strong></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">City<o:p></o:p></span></strong></p>
            </td>
        </tr>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Hansen<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Ola<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Timoteivn 10<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Sandnes<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Svendson<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Tove<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Borgvn 23<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Sandnes<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Pettersen<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Kari<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Storgt 20<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Stavanger<o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">选出字段名</span><span lang="EN-US">&rdquo;</span><span lang="EN-US" style="FONT-SIZE: 9.5pt"> LastName</span><span lang="EN-US">&rdquo;</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang="EN-US">&rdquo;</span><span lang="EN-US" style="FONT-SIZE: 9.5pt"> FirstName</span><span lang="EN-US">&rdquo; </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的数据</span></p>
<table cellspacing="0" border="1" bgcolor="#eeeedd" width="100%" cellpadding="0" style="BACKGROUND: #eeeedd; WIDTH: 100%; mso-cellspacing: 0cm">
    <tbody>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <pre><span lang="EN-US" style="FONT-SIZE: 9.5pt; COLOR: black">SELECT LastName,FirstName FROM Persons<o:p></o:p></span></pre>
            </td>
        </tr>
    </tbody>
</table>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">返回结果</span><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black">:<o:p></o:p></span></p>
<table cellspacing="0" border="1" bgcolor="#eeeedd" width="50%" cellpadding="0" style="BACKGROUND: #eeeedd; WIDTH: 50%; mso-cellspacing: 0cm">
    <tbody>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">LastName<o:p></o:p></span></strong></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">FirstName<o:p></o:p></span></strong></p>
            </td>
        </tr>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Hansen<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Ola<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Svendson<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Tove<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Pettersen<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Kari<o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">选出所有字段的数据</span></p>
<table cellspacing="0" border="1" bgcolor="#eeeedd" width="100%" cellpadding="0" style="BACKGROUND: #eeeedd; WIDTH: 100%; mso-cellspacing: 0cm">
    <tbody>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <pre><span lang="EN-US" style="FONT-SIZE: 9.5pt; COLOR: black">SELECT * FROM Persons<o:p></o:p></span></pre>
            </td>
        </tr>
    </tbody>
</table>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">返回结果</span><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black">:<o:p></o:p></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black">&nbsp;<o:p></o:p></span></p>
<table cellspacing="0" border="1" bgcolor="#eeeedd" width="100%" cellpadding="0" style="BACKGROUND: #eeeedd; WIDTH: 100%; mso-cellspacing: 0cm">
    <tbody>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">LastName<o:p></o:p></span></strong></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">FirstName<o:p></o:p></span></strong></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Address<o:p></o:p></span></strong></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">City<o:p></o:p></span></strong></p>
            </td>
        </tr>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Hansen<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Ola<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Timoteivn 10<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Sandnes<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Svendson<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Tove<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Borgvn 23<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Sandnes<o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Pettersen<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Kari<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Storgt 20<o:p></o:p></span></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Stavanger<o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-font-family: PMingLiU; mso-fareast-language: ZH-TW">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-font-family: PMingLiU; mso-fareast-language: ZH-TW">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-font-family: PMingLiU; mso-fareast-language: ZH-TW">&nbsp;<o:p></o:p></span></p>
<h1><span lang="EN-US">Where</span><span lang="EN-US" style="mso-fareast-font-family: PMingLiU; mso-fareast-language: ZH-TW"><o:p></o:p></span></h1>
<p class="MsoNormal"><strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用途：</span><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="TEXT-INDENT: 10.5pt; mso-char-indent-count: 1.0; mso-char-indent-size: 10.5pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">被用来规定一种选择查询的标准</span><span lang="EN-US" style="mso-fareast-font-family: PMingLiU; mso-fareast-language: ZH-TW"><o:p></o:p></span></p>
<p class="MsoNormal"><strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语法：</span><span lang="EN-US"><o:p></o:p></span></strong></p>
<table cellspacing="0" border="1" bgcolor="#eeeedd" width="100%" cellpadding="0" style="BACKGROUND: #eeeedd; WIDTH: 100%; mso-cellspacing: 0cm">
    <tbody>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <pre><span lang="EN-US" style="FONT-SIZE: 9.5pt; COLOR: black">SELECT column FROM table WHERE column condition value<o:p></o:p></span></pre>
            </td>
        </tr>
    </tbody>
</table>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">下面的操作符能被使用在</span><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black">WHERE</span><span style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">中：</span><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; mso-fareast-font-family: PMingLiU; mso-fareast-language: ZH-TW"><o:p></o:p></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black">=,&lt;&gt;,&gt;,&lt;,&gt;=,&lt;=,BETWEEN,LIKE</span><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; mso-fareast-font-family: PMingLiU; mso-fareast-language: ZH-TW"><o:p></o:p></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">注意：</span><span style="FONT-SIZE: 8.5pt; COLOR: black"> </span><span style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">在某些</span><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black">SQL</span><span style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的版本中不等号</span><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black">&lt; &gt;</span><span style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">能被写作为</span><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black">!=</span><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; mso-fareast-language: ZH-TW"><o:p></o:p></span></p>
<p class="MsoNormal"><strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解释：</span></strong><strong><span lang="EN-US" style="mso-fareast-language: ZH-TW"><o:p></o:p></span></strong></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp; </span>SELECT</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句返回</span><span lang="EN-US">WHERE</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子句中条件为</span><span lang="EN-US">true</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的数据</span><span lang="EN-US" style="mso-fareast-font-family: PMingLiU; mso-fareast-language: ZH-TW"><o:p></o:p></span></p>
<p class="MsoNormal"><strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例：</span></strong><strong><span lang="EN-US" style="mso-fareast-language: ZH-TW"><o:p></o:p></span></strong></p>
<p><span style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">从</span><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black">&rdquo;<strong> </strong>Persons&rdquo;</span><span style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">表中选出生活在</span><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black">&rdquo; Sandnes&rdquo; </span><span style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的人</span><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black"><o:p></o:p></span></p>
<table cellspacing="0" border="1" bgcolor="#eeeedd" width="100%" cellpadding="0" style="BACKGROUND: #eeeedd; WIDTH: 100%; mso-cellspacing: 0cm">
    <tbody>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <pre><span lang="EN-US" style="FONT-SIZE: 9.5pt; COLOR: black">SELECT * FROM Persons WHERE City='Sandnes'<o:p></o:p></span></pre>
            </td>
        </tr>
    </tbody>
</table>
<p><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black"><span style="mso-spacerun: yes">&nbsp;</span>&quot;Persons&quot; </span><span style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">表中的数据有</span><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black">:</span></strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black"><o:p></o:p></span></p>
<table cellspacing="0" border="1" bgcolor="#eeeedd" width="100%" cellpadding="0" style="BACKGROUND: #eeeedd; WIDTH: 100%; mso-cellspacing: 0cm">
    <tbody>
        <tr>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">LastName</span></strong><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 'Arial Unicode MS'; mso-bidi-font-family: 'Arial Unicode MS'"><o:p></o:p></span></strong></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">FirstName</span></strong><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 'Arial Unicode MS'; mso-bidi-font-family: 'Arial Unicode MS'"><o:p></o:p></span></strong></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 0.75pt; PADDING-BOTTOM: 0.75pt; PADDING-TOP: 0.75pt">
            <p class="MsoNormal"><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">Address</span></strong><strong><span lang="EN-US" style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 'Arial Unicode MS'; mso-bidi-font-family: 'Arial Unicode MS'"><o:p></o:p></span></strong></p>
            </td>
            <td style="PADDING-RIGHT: 0.75pt; PADDING-LEFT: 