﻿<?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-思想比知识更重要 成长比成功更重要-随笔分类-Software Engineering</title><link>http://www.blogjava.net/renyangok/category/18991.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:42:12 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:42:12 GMT</pubDate><ttl>60</ttl><item><title>架构，框架，模式，构件，组件，中间件之间区别</title><link>http://www.blogjava.net/renyangok/archive/2007/02/13/99635.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Tue, 13 Feb 2007 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/02/13/99635.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/99635.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/02/13/99635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/99635.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/99635.html</trackback:ping><description><![CDATA[
		<div>
				<strong>1．<br />什么是架构？<br /></strong>架构、框架、模式是一种从大到小的关系，也是一种组合关系。<br /><br />架构一般针对一个行业或一类应用，是技术和应用完美的结合。<br /><br />框架因为比较小，很多表现为中间件，框架一般是从技术角度解决同类问题，例如J道数据增删改查框架就解决了所有<a href="http://www.myfaq.com.cn/Dev/DataBase/index.html" target="_blank">数据库</a><a href="http://www.myfaq.com.cn/System/index.html" target="_blank">系统</a>中大量数据增删改查的功能开发，框架是从技术的横切面去解决实际应用问题。<br /><br />模式则更小了，越小越灵活，可重用的范围更广。<br /><br />一个框架可能使用了多个模式，而一个架构有可能应用了多个框架，这样一个大型<a href="http://www.myfaq.com.cn/System/index.html" target="_blank">系统</a>的设计基本从主骨干到骨架基本能够被设计者考虑设计到，也可以想见，一个<a href="http://www.myfaq.com.cn/System/index.html" target="_blank">系统</a>被细化成了很多工作量，例如一个部分细化到工厂模式，那么就可以要求<a href="http://www.myfaq.com.cn/Dev/index.html" target="_blank">程序</a><font face="Arial" size="2"><font face="Times New Roman" size="3">员实现工厂模式的代码即可。<br /><br />由此，控制了大型软件质量，也提高开发效率，同时使得项目变得易于管理和协同，由此可见，一个大型项目的架构设计非常重要。</font><br /></font><br /><strong>什么是框架？<br /></strong>　　<br />　　框架，即framework。其实就是某种应用的半成品，就是一组组件，供你选用完成你自己的系统。简单说就是使用别人搭好的舞台，你来做表演。而且，框架一般是成熟的，不断升级的软件。<br /><br /><strong>什么是模式？</strong><br />　　<br />　　模式，即pattern。其实就是解决某一类问题的方法论。你把解决某类问题的方法总结归纳到理论高度，那就是模式。<br />　　<br />　　Alexander给出的经典定义是：每个模式都描述了一个在我们的环境中不断出现的问题，然后描述了该问题的解决方案的核心。通过这种方式，你可以无数次地使用那些已有的解决方案，无需在重复相同的工作。<br />　　<br />　　模式有不同的领域，建筑领域有建筑模式，软件设计领域也有设计模式。当一个领域逐渐成熟的时候，自然会出现很多模式。<br />　　<br /><br /><strong>什么是构件？</strong><br />构件（component）是可复用的软件组成成份，可被用来构造其他软件。它可以是被封装的对象类、类树、一些功能模块、软件框架（framwork）、软件构架（或体系结构Architectural）、文档、分析件、设计模式（Pattern）等。构件分为构件类和构件实例，通过给出构件类的参数，生成实例，通过实例的组装和控制来构造相应的应用软件，这不仅大大提高了软件开发者的开发效率，也大大提高了软件的质量。<br /><br /><strong>什么是组建？</strong><br /><br />一、组件概念<br />简而言之，组件就是对象。C++ Builder中叫组件，Delphi中叫部件，而在Visual BASIC中叫控件。<br />组件是对数据和方法的简单封装。C++ Builder中，一个组件就是一个从TComponent派生出来的特定对象。组件可以有自己的属性和方法。属性是组件数据的简单访问者。方法则是组件的一些简单而可见的功能。<br />组件是C++ Builder环境中最令人激动的部分。使用组件可以实现拖放式编程、快速的属性处理以及真正的面向对象的设计。VCL和CLX组件是C++ Builder系统的核心。<br />二、组件应用<br />使用现成的组件来开发应用程序时，组件工作在两种模式下：设计时态和运行时态。<br />在设计时态下，组件显示在C++ Builder窗体编辑器下的一个窗体中。设计时态下组件的方法不能被调用，组件不能与最终用户直接进行交互操作，也不需要实现组件的全部功能。<br />在运行状态下，组件工作在一个确实已经运行的应用程序中。组件必须正确地将自身表示出来，它需要对方法的调用进行处理并实现与其他组件之间有效的协同工作。<br />设计时态下所有的组件在窗体中都是可见的，但在运行时态下不一定可见。如TTable、TQuery和TDataSet在运行时态下就不可见，但他们均完成了重要的功能。<br />三、组件创建<br />创建组件就是自行设计制作出新的组件。<br />设计组件是一项繁重的工作。自行开发组件与使用组件进行可视化程序开发存在着极大的不同，要求程序员熟知原有的VCL类库结构，精通面向对象程序设计。<br />设计组件是一项艰苦的工作。对于组件的开发者，组件是纯粹的代码。组件的开发不是一个可视化的开发过程，而是用C++或Object Pascal严格编制代码的工作。实际上，创建新组件使我们回到传统开发工具的时代。虽然这是一个复杂的过程，但也是一个一劳永逸的过程。<br />创建组件的最大意义在于封装重复的工作，其次是可以扩充现有组件的功能。<br />组件创建过程包括设计、开发、调试（就是所谓的3D's）工作，然后是组件的使用。<br />组件开发者应该掌握的三项主要内容是：属性、事件和方法。<br /><br /><strong>什么是中间件？<br /><br /></strong>中间件作为一大类系统软件,与操作系统,数据库管理系统并称"三套车",其重要性是不言而语的. <br /><br />我们来看看以下的几种定义: <br />Middleware, is a layer of software between the network and the applications. This software provides services such as identification, authentication, authorization, directories, and security. In today's Internet, applications usually have to provide these services themselves, which leads to competing and incompatible standards. By promoting standardization and interoperability, middleware will make advanced network applications much easier to use. <br />同样,IDC给出的一个定义：中间件是一种独立的系统软件或服务程序，分布式应用软件借助这种软件在不同的技术之间共享资源，中间件位于客户机服务器的操作系统之上，管理计算资源和网络通信。 <br /><br />从这些定义中可以看出: <br />– 中间件是一类软件，而非一种软件； <br />– 中间件不仅仅实现互连，还要实现应用之间的互操作； <br />– 中间件是基于分布式处理的软件，最突出的特点是其网络通信功能。 <br /><br />　　<br /><b>2．为什么要用模式和框架</b><br />　　<br />　　因为模式是一种指导，在一个良好的指导下，有助于你完成任务，有助于你作出一个优良的设计方案，达到事半功倍的效果。而且会得到解决问题的最佳办法。<br />　　<br />　　因为软件系统发展到今天已经很复杂了，特别是服务器端软件，设计到的知识，内容，问题太多。在某些方面使用别人成熟的框架，就相当于让别人帮你完成一些基础工作，你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟，稳健的，他可以处理系统很多细节问题，比如，事物处理，安全性，数据流控制等问题。还有框架一般都经过很多人使用，所以结构很好，所以扩展性也很好，而且它是不断升级的，你可以直接享受别人升级代码带来的好处。<br /><div id="msgcns!7CE13A93E95C2C99!124"><div><table cellspacing="0" cellpadding="0" width="90%" align="center" border="0"><tbody><tr><td style="WIDTH: 520px; WORD-BREAK: break-all" width="100%"><br /><a href="http://www.vchome.net/dotnet/webservice/webservice15.htm"><font color="#0000ff"><u>http://www.vchome.net/dotnet/webservice/webservice15.htm</u></font></a><br /><a href="http://www.csdn.net/develop/read_article.asp?id=15399"><u><font color="#0000ff">http://www.csdn.net/develop/read_article.asp?id=15399</font></u></a><br /><br /><br /><br /><br /></td></tr></tbody></table></div></div></div>
<img src ="http://www.blogjava.net/renyangok/aggbug/99635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-02-13 11:14 <a href="http://www.blogjava.net/renyangok/archive/2007/02/13/99635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MVC 和 逻辑层内三层 的分法</title><link>http://www.blogjava.net/renyangok/archive/2007/02/13/99634.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Tue, 13 Feb 2007 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/02/13/99634.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/99634.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/02/13/99634.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/99634.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/99634.html</trackback:ping><description><![CDATA[
		<p>首先MVC是什么 <br />V：视图 <br />C：控制 <br />M：模型</p>
		<p>1。视图层是一有html，jsp文件组成的，用于显示的<br />2。控制不是动作所以一定不是Action <br />（什么叫控制？控制就是老板，老板手下有N个员工， <br />一个活所有人都有几会去作，但是老板只让张三去作。 <br />所以控制是由actionservlet+struts-config.xml组成的 <br />actionservlet是老板而struts-config.xml是为什么用张三） <br />3。模型不是Formbean <br />（什么叫模型？模型就是真实世界在计算机中的影子， <br />项目中的用户，模型就是真实世界中的某个人， <br />他要使用系统，那么他就是login <br />他还要含有用户信息，名子，密码 <br />含有用户信息的是模型？还是能login的是模型？ <br />只有又含有信息又能动作的才是模型 <br />FormBean中只是模型全部信息的一部分 <br />Action只是一条通向动作的一个电话线 <br />只有加上逻辑层后所有的东西才算的上 <br />模型。。。。。。）</p>
		<p>另三层架构是什么 <br />application <br />service <br />dao <br />从前面可知这三个加起来才叫业务逻辑 <br />由于业务逻辑复杂性 <br />才把逻辑代码分成了三块。。。。。 <br />（很早以前是都写在action中的 <br />现在把多个action中的代码分出来 <br />另外把相同的代码删去 <br />再分为三层为了删去更多的冗余代码 <br />） <br />application这东西大约就指调用这个模块的那一句话&amp;之外的其它视图类的东东 <br />如User.login(username,password); <br />dao数据层。。。。。把数据库的数据变成想要PO，主要是数据读与存 <br />service就是所有的可变他性的东西都放在这里。。。。 </p>
<img src ="http://www.blogjava.net/renyangok/aggbug/99634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-02-13 11:13 <a href="http://www.blogjava.net/renyangok/archive/2007/02/13/99634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于使用ssh框架时，pojo、dao、service三层的关系</title><link>http://www.blogjava.net/renyangok/archive/2007/02/13/99632.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Tue, 13 Feb 2007 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/02/13/99632.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/99632.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/02/13/99632.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/99632.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/99632.html</trackback:ping><description><![CDATA[
		<p>1，dao和service对应<br />一般情况下,Hibernate DAO只操作一个POJO对象，因此一个DAO对应一个POJO对象。</p>
		<p>Service层是为了处理包含多个POJO对象（即对多个表的数据操作）时，进行事务管理（声明式事务管理）。Service层（其接口的实现类）被注入多个DAO对象，以完成其数据操作。</p>
		<p>2, Service之有无</p>
		<p>   这一点我的看法未必正确,我的脑海现在有两种构建业务层的模式:</p>
		<p>   模式1是Service + DAO,即DAO中只做CRUD及类似的简单操作(称之为功能点,不包含业务逻辑),Service中通过调用一个或多个DAO中的功能点来组合成为业务逻辑.Service的数量应该由功能模块来决定。</p>
		<p>   在这种模型中业务逻辑是放在Service中的,事务的边界也应该在Service中控制. 当然,直接在Service中控制事务会引入非业务逻辑的代码,幸好<font color="#ff0000">Spring的AOP可以解决这个问题,这也是引入Spring的原因之一.</font></p>
		<p>    如果说到缺点,就在于对某些对象的操作就是简单的CRUD,Service层显得累赘.</p>
		<p>    模式2是Service + BO, 而BO = DAO + 业务方法, 在原先DAO的基础上添加业务方法,形成BO对象。需要注意的是BO中的业务方法往往是针对一个实体对象的，如果需要跨越多个实体对象，则方法应该放在Service中。</p>
		<p>    举例来说，一个简单的银行帐户管理系统，创建帐户这个BO对象，里面可以有修改密码，取钱等业务方法（不难看出，这些方法都只对单个帐户对象进行操作）。现在需要添加一个转账方法，就应该放在Service中。</p>
		<p>    这里Service和BO的关系是什么样的呢？再举一例：以国家行政机关为例：粮食局负责收粮，卖种子等，建设部负责审批土地买卖，建设公路等，这都是行政部分份内的事儿。突然某地发了水灾，救灾时需要粮食局开仓放粮，建设部修建临时房屋，如何协调两个部门？就需要成立专门的救灾委员会，由救灾委员会出面对两个部分的资源进行调拨。这里两个部分就是BO，而救灾委员会就是Service。不知我的意思是否表达准确了，呵呵。</p>
		<p>    模式1的在划分Service和DAO时界限清晰，但会带来一些无必要的代码。<br />    模式2的划分相对复杂，然而可以提高编码效率。</p>
		<p>   <font color="#ff0000"> 当然小规模的应用中，没有Service，完全是DAO或BO也是可以接受的。</font></p>
		<p>3，Service和DAO的接口之有无</p>
		<p>    接口是一种契约，它可以有多种实现。所以接口之有无取决于具体实现是否需要多样化。如果铁定一种DAO或一种Service只有一种实现，那么抽象出接口的意义不大。然而一些大型应用或许需要DAO和Service的多种实现（比如上面例子中的帐户DAO，可能需要一种Hibernate实现、一种CMP实现和一种JDO实现），为了向上一层隐藏具体实现类，需要采用接口。</p>
		<p>    隐藏具体实现类的创建过程，这有两种方法：一是实用工厂方法，代价是代码量大（每个DAO和Service一个工厂）。二是<font color="#ff0000">使用Spring的IoC，实现依赖注入，不需要写额外的代码，这也是引入Spring的理由之二。</font><br /></p>
<img src ="http://www.blogjava.net/renyangok/aggbug/99632.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-02-13 11:12 <a href="http://www.blogjava.net/renyangok/archive/2007/02/13/99632.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>结合struts和hibernate谈J2EE架构的数据表示 </title><link>http://www.blogjava.net/renyangok/archive/2007/02/13/99633.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Tue, 13 Feb 2007 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/02/13/99633.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/99633.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/02/13/99633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/99633.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/99633.html</trackback:ping><description><![CDATA[
		<p>  关于VO、PO的理解</p>
		<p>
				<br />O/R Mapping 是 Object Relational Mapping（对象关系映射）的缩写。通俗点讲，就是将对象与关系数据库绑定，用对象来表示关系数据。</p>
		<p>在O/R Mapping的世界里，有两个基本的也是重要的东东需要了解，即VO，PO。<br />　　VO，值对象(Value Object)，PO，持久对象(Persisent Object)，它们是由一组属性和属性的get和set方法组成。从结构上看，它们并没</p>
		<p>有什么不同的地方。但从其意义和本质上来看是完全不同的。</p>
		<p>１．VO是用new关键字创建，由GC回收的。 <br />　　PO则是向数据库中添加新数据时创建，删除数据库中数据时削除的。并且它只能存活在一个数据库连接中，断开连接即被销毁。 </p>
		<p>２．VO是值对象，精确点讲它是业务对象，是存活在业务层的，是业务逻辑使用的，它存活的目的就是为数据提供一个生存的地方。 <br />　　PO则是有状态的，每个属性代表其当前的状态。它是物理数据的对象表示。使用它，可以使我们的程序与物理数据解耦，并且可以简化对</p>
		<p>象数据与物理数据之间的转换。</p>
		<p>３．VO的属性是根据当前业务的不同而不同的，也就是说，它的每一个属性都一一对应当前业务逻辑所需要的数据的名称。 <br />　　PO的属性是跟数据库表的字段一一对应的。</p>
		<p>PO对象需要实现序列化接口。<br /><br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br /><br />在 struts+ hibernate 这种结构中，是不应该把Hibernate产生的PO直接传递给JSP的，不管他是Iterator，还是List，这是一个设计错误。</p>
		<p>我来谈谈在J2EE架构中各层的数据表示方法：</p>
		<p>Web层的数据表示是FormBean，数据来源于HTML Form POST <br />业务层的数据表示是VO <br />持久层的数据表示是PO，其数据来源于数据库，持久层的数据表示例如CMP</p>
		<p>在一个规范的J2EE架构中，不同层的数据表示应该被限制在层内，而不应该扩散到其它层，这样可以降低层间的耦合性，提高J2EE架构整体的</p>
		<p>可维护性和可扩展性。比如说Web层的逻辑进行了修改，那么只需要修改FormBean的结构，而不需要触动业务层和持久层的代码修改。同样滴，</p>
		<p>当数据库表进行了小的调整，那么也只需要修改持久层数据表示，而不需要触动业务层代码和Web层代码。</p>
		<p>不过由于Hibernate的强大功能，例如动态生成PO，PO的状态管理可以脱离Session，使得在应用了Hibernate的J2EE框架中，PO完全可以充当VO</p>
		<p>，因此我们下面把PO和VO合并，统称为PO。</p>
		<p>先来谈谈ActionFormBean和持久层的PO之间的重大区别。</p>
		<p>在简单的应用中，ActionFormBean和PO几乎是没有区别，所以很多人干脆就是用ActionFormBean来充当PO，于是ActionFormBean从JSP页面到</p>
		<p>Servlet控制层再到业务层，然后穿过持久层，最后一直映射到数据库表。真是一竿子捅到了底！</p>
		<p>但是在复杂的应用中，ActionFormBean和PO是分离的，他们也不可能一样。ActionFormBean是和网页里面的Form表单一一对应的，Form里面有</p>
		<p>什么元素，Bean里面就有什么属性。而PO和数据库表对应，因此如果数据库表不修改，那么PO也不会修改，如果页面的流程和数据库表字段对</p>
		<p>应关系不一致，那么你又如何能够使用ActionFormBean来取代PO呢？</p>
		<p>比如说吧，用户注册页面要求注册用户的基本信息，因此HTML Form里面包含了基本信息属性，于是你需要一个ActionFormBean来一一对应(注</p>
		<p>意：是一一对应)，每个Bean属性对应一个文本框或者选择框什么的。</p>
		<p>而用户这个持久对象呢？他的属性和ActionFormBean有什么明显不同呢？他会有一些ActionFormBean所没有的集合属性，比如说用户的权限属</p>
		<p>性，用户的组属性，用户的帖子等等。另外还有可能的是在ActionFormBean里面有3个属性，分别是用户的First Name, Middle Name, Last </p>
		<p>Name，而在我的User这个持久对象中就是一个 Name 对象属性。</p>
		<p>假设我的注册页面原来只要你提供First Name，那么ActionFormBean就这一个属性，后来我要你提供全名，你要改ActionFormBean，加两个属</p>
		<p>性。但是这个时候PO是不应该修改滴，因为数据库没有改。</p>
		<p>那么在一个完整的J2EE系统中应该如何进行合理的设计呢？</p>
		<p>JSP(View) ---&gt; ActionFormBean(Module) ---&gt; Action(Control)</p>
		<p>ActionFormBean是Web层的数据表示，它和HTML页面Form对应，只要Web页面的操作流程发生改变，它就要相应的进行修改，它不应该也不能被</p>
		<p>传递到业务层和持久层，否则一旦页面修改，会一直牵连到业务层和持久层的大面积的代码进行修改，对于软件的可维护性和可扩展性而言，</p>
		<p>是一个灾难，Actiont就是他的边界，到此为止！</p>
		<p>Action(Web Control) ---&gt; Business Bean ---&gt; DAO ---&gt; ORM ---&gt;DB</p>
		<p>而PO则是业务层和持久层的数据表示，它在业务层和持久层之间进行流动，他不应该也不能被传递到Web层的View中去，而ActionServlet就是</p>
		<p>他的边界，到此为止！</p>
		<p>然后来看一看整个架构的流程：</p>
		<p>当用户通过浏览器访问网页，提交了一个页面。于是Action拿到了这个FormBean，他会把FormBean属性读出来，然后构造一个PO对象，再调用</p>
		<p>业务层的Bean类，完成了注册操作，重定向到成功页面。而业务层Bean收到这个PO对象之后，调用DAO接口方法，进行持久对象的持久化操作。</p>
		<p>当用户查询某个会员的信息的时候，他用全名进行查询，于是Action得到一个UserNameFormBean包括了3个属性，分别是first name, middle </p>
		<p>name, last name，然后Action把UserNameFormBean的3个属性读出来，构造Name对象，再调用业务Bean，把Name对象传递给业务Bean，进行查</p>
		<p>询。</p>
		<p>业务Bean取得Name(注意: Name对象只是User的一个属性)对象之后调用DAO接口，返回一个User的PO对象，注意这个User不同于在Web层使用的</p>
		<p>UserFormBean，他有很多集合属性滴。然后业务Bean把User对象返回给Action。</p>
		<p>Action拿到User之后，把User的基本属性取出(集合属性如果不需要就免了)，构造UserFormBean，然后把UserFormBean </p>
		<p>request.setAttribute(...)，然后重定向到查询结果页面。</p>
		<p>查询页面拿到request对象里面的ActionFormBean，自动调用tag显示之。</p>
		<p>总结：</p>
		<p>FormBean是Web层的数据表示，他不能被传递到业务层；PO是持久层的数据表示，在特定情况下，例如Hibernate中，他可以取代VO出现在业务</p>
		<p>层，但是不管PO还是VO都必须限制在业务层内使用，最多到达Web层的Control，绝不能被扩散到View去。</p>
		<p>FormBean和PO之间的数据转化是在Action中进行滴。</p>
		<p>BTW:</p>
		<p>JDO1.x还不能像Hibernate功能这样强大，PO不能脱离持久层，所以必须在业务层使用VO，因此必须在业务层进行大量的VO和PO的转化操作，相</p>
		<p>对于Hibernate来说，编程比较烦琐。</p>
		<p>当然咯，理论是一回事，实际操作也不一定非要这样干，你可以自行取舍，在实际项目中灵活一点，增加一点bad smell，提高开发效率。只不</p>
		<p>过在大型项目中最好还是严丝合缝，不然的话，改版的时候会痛苦的很滴。</p>
<img src ="http://www.blogjava.net/renyangok/aggbug/99633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-02-13 11:12 <a href="http://www.blogjava.net/renyangok/archive/2007/02/13/99633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目一般需要的文档</title><link>http://www.blogjava.net/renyangok/archive/2007/01/05/92037.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Fri, 05 Jan 2007 09:17:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/01/05/92037.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/92037.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/01/05/92037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/92037.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/92037.html</trackback:ping><description><![CDATA[
		<p>1、需求文档<br />2、设计文档<br />3、源代码<br />4、测试用例<br />5、验收报告<br />6、用户手册</p>
<img src ="http://www.blogjava.net/renyangok/aggbug/92037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-01-05 17:17 <a href="http://www.blogjava.net/renyangok/archive/2007/01/05/92037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>