﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-java node-文章分类-框架设计及应用</title><link>http://www.blogjava.net/luoqx/category/3049.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 07:03:46 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 07:03:46 GMT</pubDate><ttl>60</ttl><item><title>基于J2EE轻量级容器构件框架七、系统初始化服务和过滤器配置</title><link>http://www.blogjava.net/luoqx/articles/20406.html</link><dc:creator>publisher luo</dc:creator><author>publisher luo</author><pubDate>Fri, 18 Nov 2005 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/luoqx/articles/20406.html</guid><wfw:comment>http://www.blogjava.net/luoqx/comments/20406.html</wfw:comment><comments>http://www.blogjava.net/luoqx/articles/20406.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luoqx/comments/commentRss/20406.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luoqx/services/trackbacks/20406.html</trackback:ping><description><![CDATA[
<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><a name="_Toc119800807"><span style="font-size: 10.5pt; font-family: 宋体;"><span style="font-weight: bold;">服务初始化过程</span><br>
<img src="http://www.blogjava.net/images/blogjava_net/luoqx/%E6%A1%86%E6%9E%B6%E5%9B%BE%E7%89%87/%E6%9C%8D%E5%8A%A1%E8%BF%87%E6%BB%A4%E5%99%A8%E5%88%9D%E5%A7%8B%E5%8C%96%E8%BF%87%E7%A8%8B.bmp" alt="服务过滤器初始化过程.bmp" border="0" height="348" width="555"><br>
</span></a><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp; 系统启动时初始化两部分，一是系统服务，二是系统过滤器，框架定义了系统服务和过滤器的接口允许后期根据实际业务实现新的服务和过滤器并配置部署到系统中。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="4TimesNewRoman"><a name="_Toc119800808"><!--[if !supportLists]--><span style="line-height: 156%;" lang="EN-US"><span style=""><span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</span></span></span><!--[endif]--><span style="font-family: 黑体;">初始化服务的配置</span></a></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">配置信息如下：</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<table class="MsoTableGrid" style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">

 <tbody><tr style="height: 83.8pt;">
  <td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 419.4pt; height: 83.8pt;" valign="top" width="559">
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">&lt;system-config
  name="services"&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;item
  name="condition"<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>value="com.daosheng.service.impl.ConditionManagerImpl"
  /&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">&lt;/system-config&gt;<o:p></o:p></span></p>
  </td>
 </tr>
</tbody>
</table>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">只配置了一个服务：决策树服务。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="4TimesNewRoman"><a name="_Toc119800809"><!--[if !supportLists]--><span style="line-height: 156%;" lang="EN-US"><span style=""><span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</span></span></span><!--[endif]--><span style="font-family: 黑体;">初始化过滤器的配置</span></a></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">配置信息如下：</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<table class="MsoTableGrid" style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">

 <tbody><tr style="height: 125.95pt;">
  <td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 419.4pt; height: 125.95pt;" valign="top" width="559">
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">&lt;system-config
  name="filters"&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;item
  name="codefilter"<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>value="com.daosheng.blackfin.controller.filter.CodeFilter"
  /&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;item
  name="loginfilter" value="com.cqc.filter.LoginFilter"
  /&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;item
  name="logfilter" value="com.cqc.filter.LogFilter" /&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">&lt;/system-config&gt;<o:p></o:p></span></p>
  </td>
 </tr>
</tbody>
</table>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">配置</span><span style="font-size: 12pt;" lang="EN-US">xml</span><span style="font-size: 12pt; font-family: 宋体;">里面描述了三个过滤器分别是请求代码过滤器、登入过滤器、日志过滤器，在系统初始化这些</span><span style="font-size: 12pt;" lang="EN-US">Filter</span><span style="font-size: 12pt; font-family: 宋体;">，每次执行请求时都经过这些过滤器的过滤。</span><span style="font-size: 12pt;" lang="EN-US"><br style="page-break-before: always;" clear="all">
</span></p>

<img src ="http://www.blogjava.net/luoqx/aggbug/20406.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luoqx/" target="_blank">publisher luo</a> 2005-11-18 11:49 <a href="http://www.blogjava.net/luoqx/articles/20406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于J2EE轻量级容器构件框架六、数据bean（DataBean）</title><link>http://www.blogjava.net/luoqx/articles/20390.html</link><dc:creator>publisher luo</dc:creator><author>publisher luo</author><pubDate>Fri, 18 Nov 2005 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/luoqx/articles/20390.html</guid><wfw:comment>http://www.blogjava.net/luoqx/comments/20390.html</wfw:comment><comments>http://www.blogjava.net/luoqx/articles/20390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luoqx/comments/commentRss/20390.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luoqx/services/trackbacks/20390.html</trackback:ping><description><![CDATA[<p class="4TimesNewRoman"><a name="_Toc119800801"></a><a name="_Toc119769801"></a><a name="_Toc119769754"><span style=""><span style=""><!--[if !supportLists]--><span style="line-height: 156%;" lang="EN-US"><span style=""></span></span></span></span></a><span style=""><span style=""><span style=""><span style="font-family: 黑体;"></span></span></span></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">Data Bean </span><span style="font-size: 12pt; font-family: 宋体;">在本框架中有</span><span style="font-size: 12pt;" lang="EN-US">Value
Object</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;" lang="EN-US">View Object</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;" lang="EN-US">BO</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;" lang="EN-US">Java Bean</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;" lang="EN-US">POJO</span><span style="font-size: 12pt; font-family: 宋体;">等多种身份和用途。</span><span style="font-size: 12pt;" lang="EN-US">DataBean</span><span style="font-size: 12pt; font-family: 宋体;">是个普通的</span><span style="font-size: 12pt;" lang="EN-US">JavaBean</span><span style="font-size: 12pt; font-family: 宋体;">，作为</span><span style="font-size: 12pt;" lang="EN-US">POJO</span><span style="font-size: 12pt; font-family: 宋体;">通过</span><span style="font-size: 12pt;" lang="EN-US">O/R Mapping</span><span style="font-size: 12pt; font-family: 宋体;">来将数据固化到关系数据库或其它存储介质中；作为</span><span style="font-size: 12pt;" lang="EN-US">Value Bean</span><span style="font-size: 12pt; font-family: 宋体;">可以将数据在各层之间互相传输；作为</span><span style="font-size: 12pt;" lang="EN-US">View Object</span><span style="font-size: 12pt; font-family: 宋体;">帮助</span><span style="font-size: 12pt;" lang="EN-US">JSP</span><span style="font-size: 12pt; font-family: 宋体;">页面将数据传输并显示出来；作为</span><span style="font-size: 12pt;" lang="EN-US">BO</span><span style="font-size: 12pt; font-family: 宋体;">与</span><span style="font-size: 12pt;" lang="EN-US">service</span><span style="font-size: 12pt; font-family: 宋体;">层的</span><span style="font-size: 12pt;" lang="EN-US">Manager</span><span style="font-size: 12pt; font-family: 宋体;">们分别具有客观实物类的属性部分和行为部分，这样分离可以使服务层更好的分离出来并提供基于接口定义的服务，并更好的使</span><span style="font-size: 12pt;" lang="EN-US">Manager</span><span style="font-size: 12pt; font-family: 宋体;">及相关类形成独立的组件（类似</span><span style="font-size: 12pt;" lang="EN-US">Session
Bean,</span><span style="font-size: 12pt; font-family: 宋体;">符合</span><span style="font-size: 12pt;" lang="EN-US">façade</span><span style="font-size: 12pt; font-family: 宋体;">模式）。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">DataBean</span><span style="font-size: 12pt; font-family: 宋体;">贯穿于各个层，所以当整个项目组分配任务是以层次来划分而不是以模块划分工作的时候，</span><span style="font-size: 12pt;" lang="EN-US">DataBean</span><span style="font-size: 12pt; font-family: 宋体;">就成了各开发人员定义任务，理解任务，相互沟通的关键部分，因此</span><span style="font-size: 12pt;" lang="EN-US">DataBean</span><span style="font-size: 12pt; font-family: 宋体;">必须能够快速完成并更新。因此本框架采用工具自动批量生成的办法生成</span><span style="font-size: 12pt;" lang="EN-US">DataBean,</span><span style="font-size: 12pt; font-family: 宋体;">为了保证其准确性，项目组内严令禁止手工写</span><span style="font-size: 12pt;" lang="EN-US">DataBean</span><span style="font-size: 12pt; font-family: 宋体;">。</span><span style="font-size: 12pt;" lang="EN-US">DataBean</span><span style="font-size: 12pt; font-family: 宋体;">来自于数据库模型直接生成的</span><span style="font-size: 12pt;" lang="EN-US">XML Schema</span><span style="font-size: 12pt; font-family: 宋体;">，并通过</span><span style="font-size: 12pt;" lang="EN-US">Castor</span><span style="font-size: 12pt; font-family: 宋体;">生成</span><span style="font-size: 12pt;" lang="EN-US">DataBean</span><span style="font-size: 12pt; font-family: 宋体;">。有专门维护数据库模型的人员统一生成，即便在整个项目过程中由于客户的原因需求不断变更导致数据库设计不断变更，</span><span style="font-size: 12pt;" lang="EN-US">DataBean</span><span style="font-size: 12pt; font-family: 宋体;">也能正确的快速的生成出来。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">DataBean</span><span style="font-size: 12pt; font-family: 宋体;">还有三个个关键的方法就是</span><span style="font-size: 12pt;" lang="EN-US">marshal()</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;" lang="EN-US">unmarshal()</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;" lang="EN-US">validate()</span><span style="font-size: 12pt; font-family: 宋体;">。</span><span style="font-size: 12pt;" lang="EN-US">Validate()</span><span style="font-size: 12pt; font-family: 宋体;">方法提供了对数据进行校验的功能，这样不仅提供了在客户端用</span><span style="font-size: 12pt;" lang="EN-US">javascript</span><span style="font-size: 12pt; font-family: 宋体;">进行校验的功能，还能在服务器进行数据的校验。</span><span style="font-size: 12pt;" lang="EN-US">Marshal</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;" lang="EN-US">unmarshal</span><span style="font-size: 12pt; font-family: 宋体;">两个方法分别可以把</span><span style="font-size: 12pt;" lang="EN-US">DataBean</span><span style="font-size: 12pt; font-family: 宋体;">序列化和反序列化为</span><span style="font-size: 12pt;" lang="EN-US">xml</span><span style="font-size: 12pt; font-family: 宋体;">文件，实现了和</span><span style="font-size: 12pt;" lang="EN-US">xml</span><span style="font-size: 12pt; font-family: 宋体;">文件的快速转换功能。生成的</span><span style="font-size: 12pt;" lang="EN-US">xml</span><span style="font-size: 12pt; font-family: 宋体;">可以单独存储（除了数据库存储的另一中固化方案），也可以作为客户端浏览器</span><span style="font-size: 12pt;" lang="EN-US">xmlhttp</span><span style="font-size: 12pt; font-family: 宋体;">传输的数据格式，还可以作为提供的</span><span style="font-size: 12pt;" lang="EN-US">web service</span><span style="font-size: 12pt; font-family: 宋体;">的传递参数（</span><span style="font-size: 12pt;" lang="EN-US">SOA</span><span style="font-size: 12pt; font-family: 宋体;">）。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<img src ="http://www.blogjava.net/luoqx/aggbug/20390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luoqx/" target="_blank">publisher luo</a> 2005-11-18 10:54 <a href="http://www.blogjava.net/luoqx/articles/20390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于J2EE轻量级容器构件框架五、事务的AOP处理</title><link>http://www.blogjava.net/luoqx/articles/20383.html</link><dc:creator>publisher luo</dc:creator><author>publisher luo</author><pubDate>Fri, 18 Nov 2005 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/luoqx/articles/20383.html</guid><wfw:comment>http://www.blogjava.net/luoqx/comments/20383.html</wfw:comment><comments>http://www.blogjava.net/luoqx/articles/20383.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luoqx/comments/commentRss/20383.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luoqx/services/trackbacks/20383.html</trackback:ping><description><![CDATA[
<div class="Section1">

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">权限、事务、日志处理如果混杂在业务代码之中会使整个代码变得非常复杂而且可读性很差，难以修改重构。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">面向对象的分析和设计引入了继承、抽象和多态等概念，由此为我们提供了降低软件复杂性的工具。但是，开发人员在软件设计过程中仍然经常会面对无法用面向对象软件开发技术轻易解决的问题。这些问题之一就是如何处理应用程序中的横切关注点（</span><span style="font-size: 12pt;" lang="EN-US">Cross-cutting concerns</span><span style="font-size: 12pt; font-family: 宋体;">）。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<p class="MsoNormal" style="line-height: 150%;"><span style="font-size: 12pt; line-height: 150%;" lang="EN-US">1</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">、横切关注点</span><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">关注点就是设计人员感兴趣的某一概念或区域。例如，在一个订货系统中，核心关注点可能是订单处理和生产，而系统关注点可能是事务处理和安全管理。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">横切关注点是影响多个类或模块的关注点，即未能很好地局部化和模块化的关注点。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">横切关注点的表现有：</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">·</span><span style="font-size: 12pt; font-family: 宋体;">代码纠结</span><span style="font-size: 12pt;" lang="EN-US">—</span><span style="font-size: 12pt; font-family: 宋体;">当一个模块或代码段同时管理多个关注点时发生这种情况。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">·</span><span style="font-size: 12pt; font-family: 宋体;">代码分散</span><span style="font-size: 12pt;" lang="EN-US">—</span><span style="font-size: 12pt; font-family: 宋体;">当一个关注点分布在许多模块中并且未能很好地局部化和模块化时发生这种情况。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">这些现象会从几个方面影响软件；例如，它们会导致软件难以维护和重用，并且难以编写和理解。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<p class="MsoNormal" style="line-height: 150%;"><span style="font-size: 12pt; line-height: 150%;" lang="EN-US">2</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">、关注点的隔离</span><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">面向方面编程试图通过引入</span><span style="font-size: 12pt;" lang="EN-US">“</span><span style="font-size: 12pt; font-family: 宋体;">关注点的隔离</span><span style="font-size: 12pt;" lang="EN-US">”</span><span style="font-size: 12pt; font-family: 宋体;">这一概念来解决这些问题。采用这一概念，可以以一种模块化而且适当局部化的方式实现关注点。</span><span style="font-size: 12pt;" lang="EN-US">AOP</span><span style="font-size: 12pt; font-family: 宋体;">解决这个问题的办法是在设计空间中增加额外一维，并且引入了一些构造，这些构造使我们能够定义横切关注点，将它们转移进新的维，并且以模块化方式将它们打</span><span style="font-size: 12pt;"> </span><span style="font-size: 12pt; font-family: 宋体;">包。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">声明式的</span><span style="font-size: 12pt;" lang="EN-US">AOP</span><span style="font-size: 12pt; font-family: 宋体;">事务配置如下：</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<table class="MsoTableGrid" style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
 <tbody><tr style="height: 589.5pt;">
  <td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 426.4pt; height: 589.5pt;" valign="top" width="569">
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">&lt;bean id="nodeTarget"<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.daosheng.service.impl.NodeManagerImpl"
  singleton="true"<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>lazy-init="default"
  autowire="default" dependency-check="default"&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;property
  name="dao"&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;ref
  local="nodeDAO" /&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/property&gt;<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/bean&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;bean
  id="nodeManager"<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>class="com.daosheng.cms.right.RightTransactionProxyFactoryBean"<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>singleton="true"
  lazy-init="default" autowire="default"<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>dependency-check="default"&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;property
  name="transactionManager"&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;ref
  local="transactionManager" /&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/property&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;property
  name="target"&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;ref
  local="nodeTarget" /&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/property&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;property
  name="transactionAttributes"&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;props&gt;<span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;prop
  key="insert*"&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>PROPAGATION_REQUIRED,-ApplicationException<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/prop&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;prop
  key="update*"&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>PROPAGATION_REQUIRED,-ApplicationException<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/prop&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/props&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/property&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/bean&gt;<o:p></o:p></span></p>
  </td>
 </tr>
</tbody></table>

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">其实在注册</span><span style="font-size: 12pt;" lang="EN-US">nodeManager</span><span style="font-size: 12pt; font-family: 宋体;">时注册的实际类不是自己开发的</span><span style="font-size: 12pt;" lang="EN-US">NodeManagerImpl</span><span style="font-size: 12pt; font-family: 宋体;">类而是注册的</span><span style="font-size: 12pt;" lang="EN-US">RightTransactionProxyFactoryBean</span><span style="font-size: 12pt; font-family: 宋体;">代理工厂类。在其它类里调用的</span><span style="font-size: 12pt;" lang="EN-US">nodeManager</span><span style="font-size: 12pt; font-family: 宋体;">方法实际上是先调用的此代理工厂类的加入横切点代码（事务处理代码）然后在调用的</span><span style="font-size: 12pt;" lang="EN-US">NodeManagerImpl</span><span style="font-size: 12pt; font-family: 宋体;">的相应方法，这样就实现了</span><span style="font-size: 12pt;" lang="EN-US">NodeManagerImpl</span><span style="font-size: 12pt; font-family: 宋体;">类里不用操心事务问题，而实际的事务由加入在切点的</span><a name="N100D2"><b><span style="font-size: 12pt;" lang="EN-US">Advice</span></b></a><span style=""></span><span style="font-size: 12pt; font-family: 宋体;">来完成。其在真正方法执行前启动事务，执行后提交事务（</span><span style="font-size: 12pt;" lang="EN-US">commit</span><span style="font-size: 12pt; font-family: 宋体;">），如果出现异常则回滚（</span><span style="font-size: 12pt;" lang="EN-US">rollback</span><span style="font-size: 12pt; font-family: 宋体;">）。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: 宋体;">代理工厂类是采用</span><span style="font-size: 12pt;" lang="EN-US">jdk4</span><span style="font-size: 12pt; font-family: 宋体;">以上自带的动态代理机制实现的。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">框架的</span><span style="font-size: 12pt;" lang="EN-US">AOP</span><span style="font-size: 12pt; font-family: 宋体;">中提供了</span><span style="font-size: 12pt;" lang="EN-US">4</span><span style="font-size: 12pt; font-family: 宋体;">种处理切入类型</span><span style="font-size: 12pt;" lang="EN-US">:around,before,after,introduction.</span><span style="font-size: 12pt; font-family: 宋体;">顾名思义</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">　　</span><span style="font-size: 12pt;" lang="EN-US"><br>
1) around</span><span style="font-size: 12pt; font-family: 宋体;">是针对具体的某个切入点的方法</span><span style="font-size: 12pt;" lang="EN-US">(</span><span style="font-size: 12pt; font-family: 宋体;">比如</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">现在有个</span><span style="font-size: 12pt;" lang="EN-US">OrderBook</span><span style="font-size: 12pt; font-family: 宋体;">方法</span><span style="font-size: 12pt;" lang="EN-US">,around</span><span style="font-size: 12pt; font-family: 宋体;">的切入类型是就这个方法的内部调用</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">是通过</span><span style="font-size: 12pt;" lang="EN-US">java</span><span style="font-size: 12pt; font-family: 宋体;">的元</span><span style="font-size: 12pt;">
</span><span style="font-size: 12pt; font-family: 宋体;">数据</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">在运行时通过</span><span style="font-size: 12pt;" lang="EN-US">Method.invoke</span><span style="font-size: 12pt; font-family: 宋体;">来调用</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">具有返回值</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">当发生意外的时候会终止</span><span style="font-size: 12pt;" lang="EN-US">.</span><span style="font-size: 12pt; font-family: 宋体;">记住的一点是</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">返回值</span><span style="font-size: 12pt;" lang="EN-US">.);</span><span style="font-size: 12pt; font-family: 宋体;">　　</span><span style="font-size: 12pt;" lang="EN-US"><br>
2)before</span><span style="font-size: 12pt; font-family: 宋体;">是在方法调用前调用</span><span style="font-size: 12pt;" lang="EN-US">(</span><span style="font-size: 12pt; font-family: 宋体;">在</span><span style="font-size: 12pt;" lang="EN-US">OrderBook</span><span style="font-size: 12pt; font-family: 宋体;">方法前调用</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">但是没有返回值</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">同时在通常意外情况下</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">会继续运行下一步方法</span><span style="font-size: 12pt;" lang="EN-US">.</span><span style="font-size: 12pt; font-family: 宋体;">记住的一点是没有返回值</span><span style="font-size: 12pt;" lang="EN-US">);</span><span style="font-size: 12pt; font-family: 宋体;">　　</span><span style="font-size: 12pt;" lang="EN-US"><br>
3)after</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;" lang="EN-US">before</span><span style="font-size: 12pt; font-family: 宋体;">刚好相反</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">没有什么特别的地方</span><span style="font-size: 12pt;" lang="EN-US">.</span><span style="font-size: 12pt; font-family: 宋体;">　　</span><span style="font-size: 12pt;" lang="EN-US"><br>
4)introduction</span><span style="font-size: 12pt; font-family: 宋体;">是一个更加特殊的</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">但功能更加强大的切入类型</span><span style="font-size: 12pt;" lang="EN-US">.</span><span style="font-size: 12pt; font-family: 宋体;">比如</span><span style="font-size: 12pt;" lang="EN-US">(</span><span style="font-size: 12pt; font-family: 宋体;">你现在有</span><span style="font-size: 12pt;" lang="EN-US">Book</span><span style="font-size: 12pt; font-family: 宋体;">对象</span><span style="font-size: 12pt;" lang="EN-US">,Computer</span><span style="font-size: 12pt; font-family: 宋体;">对象</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">还有几十个这种业务对象</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">现在你希望在每个这样的对象中都加入一个记录最后修改的时间</span><span style="font-size: 12pt;" lang="EN-US">.</span><span style="font-size: 12pt; font-family: 宋体;">但是你又不希望对每个类都进行修改</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">因为太麻烦了</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">同时更重要的一点</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">破坏了对象的完整性</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">说不定你以后又不需要这个时间数据了呢</span><span style="font-size: 12pt;" lang="EN-US">.</span><span style="font-size: 12pt; font-family: 宋体;">框架</span><span style="font-size: 12pt;" lang="EN-US">AOP</span><span style="font-size: 12pt; font-family: 宋体;">为了专门实现这种思想提供了一个切入处理</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">那就是</span><span style="font-size: 12pt;" lang="EN-US">introduction.introduction</span><span style="font-size: 12pt; font-family: 宋体;">可以为动态加入某些方法</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">这样可以在运行时</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">强制转换这些对象</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">进行插入时间数据的动作</span><span style="font-size: 12pt;" lang="EN-US">,</span><span style="font-size: 12pt; font-family: 宋体;">更深的内幕就是</span><span style="font-size: 12pt;" lang="EN-US">C++</span><span style="font-size: 12pt; font-family: 宋体;">虚函数中的</span><span style="font-size: 12pt;" lang="EN-US">vtable</span><span style="font-size: 12pt; font-family: 宋体;">思想</span><span style="font-size: 12pt;" lang="EN-US">).<o:p></o:p></span></p>

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">下面时序图为事务在整个各层代码协作过程中启动和提交的过程。每个</span><span style="font-size: 12pt;" lang="EN-US">Manager</span><span style="font-size: 12pt; font-family: 宋体;">或者</span><span style="font-size: 12pt;" lang="EN-US">DAO</span><span style="font-size: 12pt; font-family: 宋体;">实体可能是开发的实际类也可以是代理类。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

</div>


<span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US"><img src="http://www.blogjava.net/images/blogjava_net/luoqx/%E6%A1%86%E6%9E%B6%E5%9B%BE%E7%89%87/TransactionAOP.bmp" alt="TransactionAOP.bmp" border="0" height="498" width="795"><br style="page-break-before: always;" clear="all">
</span><img src ="http://www.blogjava.net/luoqx/aggbug/20383.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luoqx/" target="_blank">publisher luo</a> 2005-11-18 10:33 <a href="http://www.blogjava.net/luoqx/articles/20383.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于J2EE轻量级容器构件框架四、异常处理</title><link>http://www.blogjava.net/luoqx/articles/20381.html</link><dc:creator>publisher luo</dc:creator><author>publisher luo</author><pubDate>Fri, 18 Nov 2005 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/luoqx/articles/20381.html</guid><wfw:comment>http://www.blogjava.net/luoqx/comments/20381.html</wfw:comment><comments>http://www.blogjava.net/luoqx/articles/20381.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luoqx/comments/commentRss/20381.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luoqx/services/trackbacks/20381.html</trackback:ping><description><![CDATA[
<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">Java</span><span style="font-size: 12pt; font-family: 宋体;">提供了两类主要的异常</span><span style="font-size: 12pt;" lang="EN-US">:runtime
exception</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;" lang="EN-US">checked exception</span><span style="font-size: 12pt; font-family: 宋体;">。所有的</span><span style="font-size: 12pt;" lang="EN-US">checked exception</span><span style="font-size: 12pt; font-family: 宋体;">是从</span><span style="font-size: 12pt;" lang="EN-US">java.lang.Exception</span><span style="font-size: 12pt; font-family: 宋体;">类衍生出来的，而</span><span style="font-size: 12pt;" lang="EN-US">runtime exception</span><span style="font-size: 12pt; font-family: 宋体;">则是从</span><span style="font-size: 12pt;" lang="EN-US">Java.lang.RuntimeException</span><span style="font-size: 12pt; font-family: 宋体;">或</span><span style="font-size: 12pt;" lang="EN-US">java.lang.Error</span><span style="font-size: 12pt; font-family: 宋体;">类衍生出来的。</span><span style="font-size: 12pt;" lang="EN-US"> <o:p></o:p></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">从逻辑的角度来说，</span><span style="font-size: 12pt;" lang="EN-US">checked exceptions</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;" lang="EN-US">runtime
exception</span><span style="font-size: 12pt; font-family: 宋体;">是有不同的使用目的的。</span><span style="font-size: 12pt;" lang="EN-US">checked exception</span><span style="font-size: 12pt; font-family: 宋体;">用来指示一种调用方能够直接处理的异常情况。而</span><span style="font-size: 12pt;" lang="EN-US">runtime exception</span><span style="font-size: 12pt; font-family: 宋体;">则用来指示一种调用方本身无法处理或恢复的程序错误。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">框架定义了一个异常基类</span><span style="font-size: 12pt;" lang="EN-US">ApplicationException</span><span style="font-size: 12pt; font-family: 宋体;">是属于</span><span style="font-size: 12pt;" lang="EN-US">checked
exceptions</span><span style="font-size: 12pt; font-family: 宋体;">类型主要有以下几个功能：</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 27pt; text-indent: 0cm; line-height: 150%;"><!--[if !supportLists]--><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><span style="">1、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">异常自底向上抛出统一处理，减少处理代码：</span><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">传统（过程式）方式编程，采用返回参数告诉调用的函数被调用的函数出现错误，所以在调用函数里面要加入很多的</span><span style="font-size: 12pt;" lang="EN-US">if</span><span style="font-size: 12pt; font-family: 宋体;">从句来判断各个被调用函数是否正确返回值，代码充斥了大量的大括号。采用异常机制，发生异常的位置包装成自定义的应用异常然后向上抛出，上面的各层均不用处理直接抛出到统一异常处理的</span><span style="font-size: 12pt;" lang="EN-US">MainController</span><span style="font-size: 12pt; font-family: 宋体;">里面即可，由统一的类来处理</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 27pt; text-indent: 0cm; line-height: 150%;"><!--[if !supportLists]--><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><span style="">2、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">异常统一编号，用户看到统一的处理信息：</span><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">每个异常都可以确定编号，并将编号与提示信息维护在数据库中，页面只显示统一维护的错误信息，这样就不会让错误信息编程开发人员随手写的不规范而且难以理解的信息，造成用户感觉系统难以使用。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 27pt; text-indent: 0cm; line-height: 150%;"><!--[if !supportLists]--><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><span style="">3、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">异常信息记录到错误日志中方便追踪异常位置：</span><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">统一处理程序抓取异常，并将异常信息记录日志。调试阶段还可以在控制台信息中打出异常堆，方便开发人员快速定位异常发生位置。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 27pt; text-indent: 0cm; line-height: 150%;"><!--[if !supportLists]--><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><span style="">4、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">根据获取异常</span><span style="font-size: 12pt; line-height: 150%;" lang="EN-US">AOP</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">声明式事务控制进行回滚操作：</span><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">整个开发使用声明式的事务，何时回滚就取决与应用异常的抛出。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">配置如下：</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<table class="MsoTableGrid" style="border: medium none ; margin-left: 42pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">

 <tbody><tr style="height: 147pt;">
  <td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 384.4pt; height: 147pt;" valign="top" width="513">
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">&lt;property
  name="transactionAttributes"&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;props&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;prop
  key="insert*"&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>PROPAGATION_REQUIRED,-ApplicationException<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/prop&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/props&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">&lt;/property&gt;<o:p></o:p></span></p>
  </td>
 </tr>
</tbody>
</table>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">应用异常基类如下图：<br>
</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><img src="http://www.blogjava.net/images/blogjava_net/luoqx/%E6%A1%86%E6%9E%B6%E5%9B%BE%E7%89%87/%E5%BA%94%E7%94%A8%E5%BC%82%E5%B8%B8.bmp" alt="应用异常.bmp" border="0" height="341" width="554"><br>


</p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">其它异常都继承于基类</span><span style="font-size: 12pt;" lang="EN-US">ApplicationException</span><span style="font-size: 12pt; font-family: 宋体;">，主要包含错误编号属性（</span><span style="font-size: 12pt;" lang="EN-US">errorNumber</span><span style="font-size: 12pt; font-family: 宋体;">）、异常信息（</span><span style="font-size: 12pt;" lang="EN-US">errorMessage</span><span style="font-size: 12pt; font-family: 宋体;">）、异常跟踪</span><span style="font-size: 12pt;" lang="EN-US">(stackTrace)</span><span style="font-size: 12pt; font-family: 宋体;">。以便实现上述功能。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><br>
<span style="font-size: 12pt; font-family: 宋体;"></span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<img src ="http://www.blogjava.net/luoqx/aggbug/20381.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luoqx/" target="_blank">publisher luo</a> 2005-11-18 10:27 <a href="http://www.blogjava.net/luoqx/articles/20381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于J2EE轻量级容器构件框架三、控制器部分</title><link>http://www.blogjava.net/luoqx/articles/20377.html</link><dc:creator>publisher luo</dc:creator><author>publisher luo</author><pubDate>Fri, 18 Nov 2005 02:23:00 GMT</pubDate><guid>http://www.blogjava.net/luoqx/articles/20377.html</guid><wfw:comment>http://www.blogjava.net/luoqx/comments/20377.html</wfw:comment><comments>http://www.blogjava.net/luoqx/articles/20377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luoqx/comments/commentRss/20377.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luoqx/services/trackbacks/20377.html</trackback:ping><description><![CDATA[

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">controller</span><span style="font-size: 12pt; font-family: 宋体;">包提供了三个主要功能：</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">如下图：<br>
</span></p>
<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><img src="http://www.blogjava.net/images/blogjava_net/luoqx/%E6%A1%86%E6%9E%B6%E5%9B%BE%E7%89%87/controller.bmp" alt="controller.bmp" border="0" height="297" width="396"><br>


</p>
<p class="MsoNormal" style="margin-left: 39pt; text-indent: -18pt; line-height: 150%;"><!--[if !supportLists]--><b style=""><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><span style="">1、<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp; </span></span></span></b><!--[endif]--><span style="font-size: 12pt; line-height: 150%;" lang="EN-US">mvc</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">的主控制</span><span style="font-size: 12pt; line-height: 150%;" lang="EN-US">servlet<b style=""><o:p></o:p></b></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">Main Controller</span><span style="font-size: 12pt; font-family: 宋体;">类提供了总体控制作用，所有的请求都先映射到此类上，然后在统一分发到各个部分控制类。由于</span><span style="font-size: 12pt;" lang="EN-US">servlet</span><span style="font-size: 12pt; font-family: 宋体;">是支持多线程的，所以性能是可以保证的。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">MainController</span><span style="font-size: 12pt; font-family: 宋体;">类继承于</span><span style="font-size: 12pt;" lang="EN-US">HttpServlet</span><span style="font-size: 12pt; font-family: 宋体;">类，主要方法有：</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 42pt; text-indent: -21pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">1)<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US">init()</span><span style="font-size: 12pt; font-family: 宋体;">方法，初始化方法，在此方法里面主要初始化一些公共的资源、服务，过滤器和一些系统基础配置参数等。初始化服务过程委托</span><span style="font-size: 12pt;" lang="EN-US">services</span><span style="font-size: 12pt; font-family: 宋体;">包中的</span><span style="font-size: 12pt;" lang="EN-US">Service
Manager</span><span style="font-size: 12pt; font-family: 宋体;">类来完成，初始化各种</span><span style="font-size: 12pt;" lang="EN-US">filter</span><span style="font-size: 12pt; font-family: 宋体;">由</span><span style="font-size: 12pt;" lang="EN-US">filter</span><span style="font-size: 12pt; font-family: 宋体;">包下的</span><span style="font-size: 12pt;" lang="EN-US">Filter Manager</span><span style="font-size: 12pt; font-family: 宋体;">来完成。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 60.7pt; text-indent: -39.7pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">2)<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US">doPost()</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;" lang="EN-US">doGet()</span><span style="font-size: 12pt; font-family: 宋体;">方法，接收各种请求并交给</span><span style="font-size: 12pt;" lang="EN-US">processRequest()</span><span style="font-size: 12pt; font-family: 宋体;">方法统一处理，统一了</span><span style="font-size: 12pt;" lang="EN-US">post, get</span><span style="font-size: 12pt; font-family: 宋体;">两种请求方式。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">通过在</span><span style="font-size: 12pt;" lang="EN-US">web.xml</span><span style="font-size: 12pt; font-family: 宋体;">中注册和映射，使得各种符合要求的请求都直接转发到此控制类上，配置如下：</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<table class="MsoTableGrid" style="border: medium none ; margin-left: 21pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">

 <tbody><tr style="height: 484.15pt;">
  <td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 398.4pt; height: 484.15pt;" valign="top" width="531">
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-name&gt;mainCommand&lt;/servlet-name&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-class&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>com.daosheng.blackfin.controller.MainController<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/servlet-class&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;init-param&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;param-name&gt;sysconfig&lt;/param-name&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;param-value&gt;/WEB-INF/blackfin-config.xml&lt;/param-value&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/init-param&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/servlet&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">&lt;servlet-mapping&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-name&gt;mainCommand&lt;/servlet-name&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;url-pattern&gt;/command/*&lt;/url-pattern&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/servlet-mapping&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-mapping&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-name&gt;mainCommand&lt;/servlet-name&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;url-pattern&gt;/main/*&lt;/url-pattern&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/servlet-mapping&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-mapping&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;servlet-name&gt;mainCommand&lt;/servlet-name&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;url-pattern&gt;*.cmd&lt;/url-pattern&gt;<o:p></o:p></span></p>
  <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&lt;/servlet-mapping&gt;<o:p></o:p></span></p>
  </td>
 </tr>
</tbody>
</table>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">这样碰到请求</span><span style="font-size: 12pt;" lang="EN-US">url</span><span style="font-size: 12pt; font-family: 宋体;">以</span><span style="font-size: 12pt;" lang="EN-US">.cmd</span><span style="font-size: 12pt; font-family: 宋体;">结尾的或者以</span><span style="font-size: 12pt;" lang="EN-US">/command/</span><span style="font-size: 12pt; font-family: 宋体;">或</span><span style="font-size: 12pt;" lang="EN-US">/main/</span><span style="font-size: 12pt; font-family: 宋体;">开头的都映射到此类上来做统一处理。实现了统一控制功能。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 39pt; text-indent: -18pt; line-height: 150%;"><!--[if !supportLists]--><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><span style="">2、</span></span><!--[endif]--><span style="font-size: 12pt; line-height: 150%;" lang="EN-US">filter</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">的接口和管理类</span><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">filter</span><span style="font-size: 12pt; font-family: 宋体;">包主要包含</span><span style="font-size: 12pt;" lang="EN-US">filter</span><span style="font-size: 12pt; font-family: 宋体;">接口和</span><span style="font-size: 12pt;" lang="EN-US">filter</span><span style="font-size: 12pt; font-family: 宋体;">的管理类。</span><span style="font-size: 12pt;" lang="EN-US">FilterManager</span><span style="font-size: 12pt; font-family: 宋体;">类负责初始化各注册的</span><span style="font-size: 12pt;" lang="EN-US">filter(</span><span style="font-size: 12pt; font-family: 宋体;">开发人员可以自己开发并注册在注册文件中</span><span style="font-size: 12pt;" lang="EN-US">),</span><span style="font-size: 12pt; font-family: 宋体;">系统控制类接收到各种请求先按需要交给过滤类（</span><span style="font-size: 12pt;" lang="EN-US">filter</span><span style="font-size: 12pt; font-family: 宋体;">）来进行过滤，然后在由各自业务处理类完成业务处理。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">统一过滤类可以用来完成一些需要每次请求都需要判断的逻辑，比如说登入校验（判断用户是否登入过，如果没有直接跳转到登入页面）还有一个比较关键的过滤就是</span><span style="font-size: 12pt;" lang="EN-US">CodeFilter</span><span style="font-size: 12pt; font-family: 宋体;">类。一般的</span><span style="font-size: 12pt;" lang="EN-US">http</span><span style="font-size: 12pt; font-family: 宋体;">请求分为两种类型，一种是普通类型，一种是为</span><span style="font-size: 12pt;" lang="EN-US">multipart </span><span style="font-size: 12pt; font-family: 宋体;">类型（</span><span style="font-size: 12pt;" lang="EN-US">form</span><span style="font-size: 12pt; font-family: 宋体;">的</span><span style="font-size: 12pt;" lang="EN-US">enctype="multipart/form-data"</span><span style="font-size: 12pt; font-family: 宋体;">，可以上传文件）两种类型导致在后面服务器端接收</span><span style="font-size: 12pt;" lang="EN-US">form</span><span style="font-size: 12pt; font-family: 宋体;">中的参数使用的方法各不相同，</span><span style="font-size: 12pt;" lang="EN-US">multipart</span><span style="font-size: 12pt; font-family: 宋体;">类型的用</span><span style="font-size: 12pt;" lang="EN-US">getParameter()</span><span style="font-size: 12pt; font-family: 宋体;">方法是没法取出提交上来的参数的，而是要得到一个</span><span style="font-size: 12pt;" lang="EN-US">Binary</span><span style="font-size: 12pt; font-family: 宋体;">数组自己进行分拆才能得到。导致程序取参数的不一致性，可移植性减弱。所以使用</span><span style="font-size: 12pt;" lang="EN-US">CodeFilter</span><span style="font-size: 12pt; font-family: 宋体;">对每个</span><span style="font-size: 12pt;" lang="EN-US">request</span><span style="font-size: 12pt; font-family: 宋体;">进行过滤，将两种情况上传的各种参数都重新</span><span style="font-size: 12pt;" lang="EN-US">setAttribute</span><span style="font-size: 12pt; font-family: 宋体;">到</span><span style="font-size: 12pt;" lang="EN-US">request</span><span style="font-size: 12pt; font-family: 宋体;">中，这样就能够使后面的</span><span style="font-size: 12pt;" lang="EN-US">command</span><span style="font-size: 12pt; font-family: 宋体;">类只使用</span><span style="font-size: 12pt;" lang="EN-US">getAttribute()</span><span style="font-size: 12pt; font-family: 宋体;">方法就能取到实际的参数而不需要管是哪种方式提交的了，并且</span><span style="font-size: 12pt;" lang="EN-US">CodeFilter</span><span style="font-size: 12pt; font-family: 宋体;">中还可以把一些字符过滤掉，比如说单引号等。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="margin-left: 39pt; text-indent: -18pt; line-height: 150%;"><!--[if !supportLists]--><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><span style="">3、</span></span><!--[endif]--><span style="font-size: 12pt; line-height: 150%; font-family: 宋体;">请求辅助类</span><span style="font-size: 12pt; line-height: 150%;" lang="EN-US"><o:p></o:p></span></p>


<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">请求辅助类（</span><span style="font-size: 12pt;" lang="EN-US">RequestHelper</span><span style="font-size: 12pt; font-family: 宋体;">）主要有两个作用，一是将</span><span style="font-size: 12pt;" lang="EN-US">request</span><span style="font-size: 12pt; font-family: 宋体;">，</span><span style="font-size: 12pt;" lang="EN-US">response</span><span style="font-size: 12pt; font-family: 宋体;">和配置参数封装起来然后作为</span><span style="font-size: 12pt;" lang="EN-US">command</span><span style="font-size: 12pt; font-family: 宋体;">的参数，使每个</span><span style="font-size: 12pt;" lang="EN-US">command</span><span style="font-size: 12pt; font-family: 宋体;">都能够获取到前台请求的各种信息，第二个作用是查找</span><span style="font-size: 12pt;" lang="EN-US">command</span><span style="font-size: 12pt; font-family: 宋体;">的各种配置参数信息。</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><br>
<span style="font-size: 12pt; font-family: 宋体;"></span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<img src ="http://www.blogjava.net/luoqx/aggbug/20377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luoqx/" target="_blank">publisher luo</a> 2005-11-18 10:23 <a href="http://www.blogjava.net/luoqx/articles/20377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于J2EE轻量级容器构件框架二、总体介绍</title><link>http://www.blogjava.net/luoqx/articles/20372.html</link><dc:creator>publisher luo</dc:creator><author>publisher luo</author><pubDate>Fri, 18 Nov 2005 02:17:00 GMT</pubDate><guid>http://www.blogjava.net/luoqx/articles/20372.html</guid><wfw:comment>http://www.blogjava.net/luoqx/comments/20372.html</wfw:comment><comments>http://www.blogjava.net/luoqx/articles/20372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luoqx/comments/commentRss/20372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luoqx/services/trackbacks/20372.html</trackback:ping><description><![CDATA[

<p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">利用此框架开发主要将代码分为三层，即控制层（</span><span style="font-size: 12pt;" lang="EN-US">Command</span><span style="font-size: 12pt; font-family: 宋体;">），业务逻辑层（</span><span style="font-size: 12pt;" lang="EN-US">Service</span><span style="font-size: 12pt; font-family: 宋体;">）和数据访问层（</span><span style="font-size: 12pt;" lang="EN-US">DAO</span><span style="font-size: 12pt; font-family: 宋体;">），</span><span style="font-size: 12pt;" lang="EN-US">command</span><span style="font-size: 12pt; font-family: 宋体;">代码只关注于页面跳转逻辑关系，收集请求数据，转发请求及最后跳转到指定的显示页面（</span><span style="font-size: 12pt;" lang="EN-US">JSP</span><span style="font-size: 12pt; font-family: 宋体;">）；</span><span style="font-size: 12pt;" lang="EN-US">Service</span><span style="font-size: 12pt; font-family: 宋体;">主要关注于页面逻辑，客户的需求转化为实际的业务逻辑就由</span><span style="font-size: 12pt;" lang="EN-US">Service</span><span style="font-size: 12pt; font-family: 宋体;">层来实现，其中权限事务日志等不是纯业务的逻辑交由</span><span style="font-size: 12pt;" lang="EN-US">AOP</span><span style="font-size: 12pt; font-family: 宋体;">的专门程序处理，使开发人员关注点聚焦而不会被繁琐的其它事情所影响效率；</span><span style="font-size: 12pt;" lang="EN-US">DAO</span><span style="font-size: 12pt; font-family: 宋体;">层主要完成业务逻辑中需要与数据库间交互的部分代码，主要是跟</span><span style="font-size: 12pt;" lang="EN-US">sql</span><span style="font-size: 12pt; font-family: 宋体;">语句，存储过程等相应的数据库（存储）打交道的部分代码的封装，把这一层抽离出来可以实现更好的移植性（如果转换数据库，只要修改</span><span style="font-size: 12pt;" lang="EN-US">DAO</span><span style="font-size: 12pt; font-family: 宋体;">这一层就可以了）。调用关系图如下：</span><span style="font-size: 12pt;" lang="EN-US"><o:p></o:p></span></p>

<img src="http://www.blogjava.net/images/blogjava_net/luoqx/%E6%A1%86%E6%9E%B6%E5%9B%BE%E7%89%87/%E6%A1%86%E6%9E%B6%E8%B0%83%E7%94%A8%E5%85%B3%E7%B3%BB%E5%9B%BE.bmp" alt="框架调用关系图.bmp" border="0" height="312" width="554"><br>
<span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp; 执行过程如上图，首先请求发送给主控制器，主控制器委托辅助类（</span><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">Request Helper</span><span style="font-size: 12pt; font-family: 宋体;">）根据分析</span><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">url</span><span style="font-size: 12pt; font-family: 宋体;">然后在配置文件中找到实际的</span><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">command</span><span style="font-size: 12pt; font-family: 宋体;">并执行，</span><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">command</span><span style="font-size: 12pt; font-family: 宋体;">获取请求的参数并委托</span><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">Services</span><span style="font-size: 12pt; font-family: 宋体;">层的各相应</span><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">Manager</span><span style="font-size: 12pt; font-family: 宋体;">类来处理相应的业务逻辑，其中如果有数据库操作的话则委托</span><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">DAO</span><span style="font-size: 12pt; font-family: 宋体;">来完成，将结果返回到</span><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">command</span><span style="font-size: 12pt; font-family: 宋体;">，</span><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">command</span><span style="font-size: 12pt; font-family: 宋体;">将结果（</span><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">Data Bean</span><span style="font-size: 12pt; font-family: 宋体;">）重新放入请求中并根据配置信息转发到显示（</span><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">view</span><span style="font-size: 12pt; font-family: 宋体;">）部分即</span><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">JSP</span><span style="font-size: 12pt; font-family: 宋体;">页面，最终</span><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">JSP</span><span style="font-size: 12pt; font-family: 宋体;">页面负责将取来的数据结合页面信息生成</span><span style="font-size: 12pt; font-family: &quot;Times New Roman&quot;;" lang="EN-US">html</span><span style="font-size: 12pt; font-family: 宋体;">代码返回到客户端浏览器上，实现了一个完整的交易过程。</span><br>
<img src ="http://www.blogjava.net/luoqx/aggbug/20372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luoqx/" target="_blank">publisher luo</a> 2005-11-18 10:17 <a href="http://www.blogjava.net/luoqx/articles/20372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于J2EE轻量级容器构件框架一、总体结构图</title><link>http://www.blogjava.net/luoqx/articles/20366.html</link><dc:creator>publisher luo</dc:creator><author>publisher luo</author><pubDate>Fri, 18 Nov 2005 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/luoqx/articles/20366.html</guid><wfw:comment>http://www.blogjava.net/luoqx/comments/20366.html</wfw:comment><comments>http://www.blogjava.net/luoqx/articles/20366.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/luoqx/comments/commentRss/20366.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luoqx/services/trackbacks/20366.html</trackback:ping><description><![CDATA[<img style="width: 517px; height: 331px;" src="http://www.blogjava.net/images/blogjava_net/luoqx/%E6%A1%86%E6%9E%B6%E5%9B%BE%E7%89%87/%E6%9E%84%E4%BB%B6%E6%A1%86%E6%9E%B6%E7%BB%93%E6%9E%84%E5%9B%BE.bmp" alt="构件框架结构图.bmp" border="0"><br>
<img src ="http://www.blogjava.net/luoqx/aggbug/20366.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luoqx/" target="_blank">publisher luo</a> 2005-11-18 10:00 <a href="http://www.blogjava.net/luoqx/articles/20366.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个项目里简单实用的O/R mapping的功能代码</title><link>http://www.blogjava.net/luoqx/articles/12758.html</link><dc:creator>publisher luo</dc:creator><author>publisher luo</author><pubDate>Mon, 12 Sep 2005 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/luoqx/articles/12758.html</guid><wfw:comment>http://www.blogjava.net/luoqx/comments/12758.html</wfw:comment><comments>http://www.blogjava.net/luoqx/articles/12758.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/luoqx/comments/commentRss/12758.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luoqx/services/trackbacks/12758.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 项目里对框架的要求除了功能，扩展性，性能等方面的要求外还有对项目开发周期与新手学习周期和难易度的考虑。由于项目开发时间压力很大，而且项目组员对sql语句非常熟悉，而且处于简化普通开发人员开发量的考虑在此项目中没有使用hibernate和ibatis等已经成熟的持久层框架，而是采用自己开发的O/R mapping类来实现通用的插入删除修改以及查询（单表）功能。基本能够满足项目里的6，70%的...&nbsp;&nbsp;<a href='http://www.blogjava.net/luoqx/articles/12758.html'>阅读全文</a><img src ="http://www.blogjava.net/luoqx/aggbug/12758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luoqx/" target="_blank">publisher luo</a> 2005-09-12 15:58 <a href="http://www.blogjava.net/luoqx/articles/12758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>现有框架简单介绍</title><link>http://www.blogjava.net/luoqx/articles/11301.html</link><dc:creator>publisher luo</dc:creator><author>publisher luo</author><pubDate>Sat, 27 Aug 2005 05:43:00 GMT</pubDate><guid>http://www.blogjava.net/luoqx/articles/11301.html</guid><wfw:comment>http://www.blogjava.net/luoqx/comments/11301.html</wfw:comment><comments>http://www.blogjava.net/luoqx/articles/11301.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/luoqx/comments/commentRss/11301.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/luoqx/services/trackbacks/11301.html</trackback:ping><description><![CDATA[&nbsp;
此j2ee框架历经了几年几个项目的发展，大部分东西进行了升级换代，少部分被淘汰掉了。主要是在实际项目中应用积累和发展起来的，最新版结合了
spring,将service层和dao层的装配（IOC）和通一容器管理都交由spring来管理，并且借用AOP技术将日志、权限很好的抽离了出
来。由于时间、项目进度，项目延续性等一系列原因所以这次项目的最终框架定位为：前面还是延续原有的自己开发的MVC框架（类似于struts）,中间采
用spring来反向注入和管理业务逻辑和数据访问层，后面的o/r
mapping是自己开发的简单的处理程序（采用反射原理）。由于工程上的要求考虑的要求多一些，所以各种工具相对简单实用一些没有那些成名的开源工具那
么功能强大和结构优美，还有待完善和改进。<br>
附时序图：<br>
<img src="http://www.blogjava.net/images/blogjava_net/luoqx/%E6%A1%86%E6%9E%B6%E5%9B%BE%E7%89%87/architecture.jpg" alt="architecture.jpg" border="0" height="718" width="1069"><br>
<br>
Saturday, August 27, 2005<br>
<img src ="http://www.blogjava.net/luoqx/aggbug/11301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/luoqx/" target="_blank">publisher luo</a> 2005-08-27 13:43 <a href="http://www.blogjava.net/luoqx/articles/11301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>