`
flyingis
  • 浏览: 296948 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

    作者: Flyingis

    在Web应用和J2EE框架中经常可以碰到各种Object相关的名词,在网上搜索了一下,讨论各种Object术语的帖子一大筐,大的讨论整个框架,小的描述各个层次之间的细微差别,甚至有钻牛角尖之嫌。 BlogJava 上也有讨论VO和PO的贴子,例如 非飞 《各层共享使用PO的代价》 等。其实无论怎么讨论,这些术语、分层结构、应用框架无非都是为我们的应用而服务的,因此,我们需要的是理解这些术语提出的意义,是理解我们的项目需求,是理解我们采用的框架结构能否最大限度的满足项目的需要。

    在刚刚学习MVC/Model2之前,我是不了解VO/TO/PO/DTO/BO等等这些术语的含义的,至少理解上只是停留在浅层面,现在多看了一些,做了一点项目,多了些想法,但肯定还是存在理解上的偏差或误解,欢迎大家讨论指出!

    VO: 通常指ValueObject或ViewObject。ViewObject指的是UI需要的对象,Struts的FormBean就是其中的一种,它是Value Object和Transfer Object的总称。

    TO: Transfer Object,它和Value Object的区别可以参考Patterns of Enterprise Application Architecture。

    PO: Persistent Object,即可以被持久化的实体对象。

    POJO : Plain Ordinary Java Object。

    DTO: Data Transfer Object,J2EE 中常用的一种设计模式,现在一般可以将使用Value Object的模式称为DTO模式,在 Jdon 上一篇《ValueObject和DTO模式的一些疑问》 阐述了两者的关系。

    BO: Business Object,可以分为三种情况,只包含业务对象的属性,或只包含业务方法,或两者都包含。对于BO的详细讨论,可以 参见这里

    这些概念经常交错在一起提出,给初学者造成了一些理解上的困难,其实只需要理顺下面几点,基本上就能弄清楚层次之前的前后关系和如何合理使用这些对象。

    1. VO能否和PO相同。首先回答是肯定的,VO是概念模型的一种抽象反映,当一个业务实体可以用一个物理实体表示的时候,VO和PO属性相同,那么它们是相等的。例如学生成绩管理系统中,成绩表单业务实体中包含学生信息、课程信息、成绩等,此时它已经不能用一个物理实体所能描述,而其中的学生信息,其VO和PO在属性上是一样的,此时的VO和PO相同。

    2. PO能否代替VO。仅仅从功能实现上来说,当VO和PO相同的时候,PO可以代替VO,这样可以减少一些代码量,但需要注意的是,这样会带来一些问题:当一个业务实体需要多个物理实体来表达的时候,在客户端显示一个业务实体就会多次访问数据库,即进行多次单表访问,非视图;当一个业务实体属性远少于一个物理实体的时候,可能会因装载过多不必要的数据而影响网络传输;对物理实体进行改动的时候会直接影响到表现层。简单的说,这样做增加了代码的耦合性,也增加了代码维护的难度,项目的可扩展性也大大降低,如果仅仅是为了减少代码量而付出这些代将显然是不值的,当然极为简单的应用可以考虑,一切从项目实际出发。

    3. VO包含的属性可以多于PO、少于PO、或等于PO中的属性。

    4. 一个基于Struts应用的简单数据提交流程(VO和PO单独存在):HTML 页面中包含了基本的信息,例如文本框、下拉框、单选等,构建一个ActionForm Bean与之一一对应,它是Web层数据的表示,当Web页面的操作流程发生改变的时候,需要对它进行修改,但不能将修改传递到业务层和持久层。然后Action读取ActionForm Bean的属性,构造PO对象,调用BO ,当BO收到这个PO之后,调用DAO接口方法,对PO进行持久化操作,完成数据的提交。这里,PO在业务层和持久层之间,没有被传递到Web层的View中去。

    5. 一个基于Struts应用的简单数据查询流程(VO和PO单独存在):Action读取ActionForm Bean中的查询属性信息,然后调用BO,BO获取ActionForm Bean之后调用DAO接口进行查询,返回所要查询的PO对象,交给Action,Action通过该PO构建 ActionForm Bean,通过request.setAttribute()或session.setAttribute(),重定向到查询结果页面输出需要的信息。

    6. 表现层中的字段一般定义为String或boolean类型,因此VO中的属性在传到Action并构建PO对象时需要进行数据类型的转换,或由ActionForm的helper方法来进行转换。

    参考文章和贴子:
    http://www.jdon.com/jive/article.jsp?forum=91&thread=23672
    http://www.jdon.com/jive/article.jsp?forum=91&thread=21571
    http://www.hibernate.org.cn/viewtopic.php?t=627&postdays=0&postorder=asc&start=0
    http://bbs.hidotnet.com/704/ShowPost.aspx
    http://lifework.cnblogs.com/archive/2005/09/03/229596.html
    http://www.microsoft.com/china/MSDN/library/architecture/patterns/esp/DesDTO.mspx  

分享到:
评论

相关推荐

    【ASP.NET编程知识】剖析ASP.NET MVC的DependencyResolver组件.docx

    ASP.NET MVC 的 DependencyResolver 组件剖析 在 ASP.NET MVC 框架中,DependencyResolver 组件扮演着非常重要的角色,它负责解析依赖对象,可以说它是 MVC 框架内部使用的一个 IOC 容器。许多对象的创建都是通过它...

    C#软件项目开发全程剖析

    《C#软件项目开发全程剖析》是一本深入探讨C#编程语言在软件项目开发中的实践应用的书籍。这本书全面覆盖了C#从基础到高级,再到实际项目开发的各个环节,旨在帮助读者掌握C#的核心技术和实际操作技能。 首先,我们...

    Struts2+Hibernate+Spring整合开发深入剖析与范例应用05

    在"Struts2+Hibernate+Spring整合开发深入剖析与范例应用05"的源码中,我们可以看到具体的配置文件(如struts.xml、spring-context.xml、hibernate.cfg.xml)、Action类、Service类、DAO类以及实体类等。通过对这些...

    ASP·NET与WebService实例剖析中文版

    在《ASP·NET与WebService实例剖析中文版》中,我们可以期待学习到以下关键知识点: 1. ASP·NET基础:包括如何设置开发环境,理解请求生命周期,以及使用控件和事件模型构建Web Forms应用。 2. MVC框架介绍:讲解...

    Struts2框架剖析.zip

    OGNL(Object-Graph Navigation Language)是Struts2中的默认表达式语言,用于在Action和JSP之间传递数据。而插件体系使得Struts2具有高度的可扩展性,可以方便地添加新的功能或集成其他库。 Struts2还引入了主题和...

    spring运行机制源码剖析

    Spring框架是Java开发中最常用的轻量级框架之一,它的运行机制源码剖析是理解其工作原理的关键。在本文中,我们将深入探讨Spring的核心组件、依赖注入(DI)以及AOP(面向切面编程)的实现。 首先,让我们从Spring...

    c#经典项目开发全程剖析~

    以下是对C#项目开发全程剖析中的关键知识点进行的详细解析: 1. **C#基础语法**:C#的基础包括变量、数据类型、运算符、控制流程(如条件语句和循环)、数组、字符串和异常处理。这些是任何C#程序员必须掌握的基本...

    ASP.NET与Web Service实例剖析中文版

    在本书《ASP.NET与Web Service实例剖析中文版》中,读者可以深入理解这两种技术的原理及其实际应用。 ASP.NET是.NET框架的一部分,主要用于构建动态网站、web应用程序和web服务。它提供了丰富的控件、事件驱动模型...

    剖析WEBWORK源代码

    这种理解对于开发者来说是非常宝贵的,因为它可以帮助我们更好地利用WebWork框架的优势,解决实际开发中的各种问题。无论是对于初学者还是经验丰富的开发者来说,深入了解WebWork源代码都是非常有益的。随着技术的...

    ASP.NET与Web Service实例剖析中文版(PPT)

    PPT可能会深入讲解ASP.NET的控件、事件处理、状态管理、数据绑定等核心概念,以及MVC(Model-View-Controller)和Web Forms两种开发模式的区别和应用场景。 Web Service是一种基于标准的、平台无关的方式来交换数据...

    (李维大作)深入核心VCL架构剖析part9

    9. **设计模式与最佳实践**:作者可能会介绍在VCL开发中常用的设计模式,如MVC、工厂方法等,并提供编写高效、可维护代码的建议。 10. **自定义组件开发**:对于高级开发者,自定义组件是扩展VCL功能的关键。这部分...

    Ajaxj技术剖析大全

    通过使用JavaScript,开发者可以构建动态和交互性的UI,而XML则用于数据交换,尽管JSON(JavaScript Object Notation)在现代Ajax应用中更为常见,因为它更易于处理和更轻量级。 Ajax的工作原理是:当用户在网页上...

    asp.net与webservice实例剖析

    5. **MVC模式**:ASP.NET MVC是一个轻量级的框架,它遵循Model-View-Controller模式,提供了更好的代码组织和测试性。 **Web服务(WebService)详解** Web服务是一种基于HTTP协议的、开放的、跨平台的数据交换标准...

    剖析webwork源码

    WebWork框架,作为Struts2.0的核心技术之一,源自于OpenSymphony组织的开源项目,旨在提供一种组件化和代码重用的MVC模式解决方案,特别适用于J2EE环境下的Web开发。随着技术的发展,WebWork经历了从单一框架到拆分...

    剖析Webwork源码

    其中,前端拦截器(interceptor)、运行时表单属性验证、类型转换、OGNL表达式语言(Object Graph Notation Language)以及IoC(Inversion of Control)容器等核心功能,极大地提升了Web应用的开发效率和质量。OGNL,作为...

    spring-framework-4.3.2.RELEASE.zip

    《深入剖析Spring Framework 4.3.2.RELEASE》 Spring Framework是Java开发中的一个核心框架,它为构建企业级应用提供了全面的解决方案。本文将深入探讨Spring 4.3.2.RELEASE版本的关键特性、设计理念及其源码解析,...

    C# WebApi 路由机制剖析

    在MVC中,默认的路由规则是通过UrlRoutingModule来实现的,而在Web Api中,则是通过HttpConfiguration来实现的。 在MVC中,默认的路由规则是通过url路径去匹配对应的action方法。例如,/Home/GetUser这个url,就...

    ASP.NET AJAX框架编程之JSON序列化剖析

    虽然这不是 `JavaScriptSerializer` 的直接功能,但在 ASP.NET AJAX 中,可以通过配置 `WebHttpBinding` 或 `JsonResult` 类在 MVC 中支持 JSONP。 总结来说,ASP.NET AJAX 框架通过 `JavaScriptSerializer` 类支持...

    spring4.0.5源码

    《Spring 4.0.5源码深度剖析》 Spring框架是Java开发中不可或缺的一部分,其4.0.5版本是历史上的一个重要里程碑。本文将深入探讨Spring 4.0.5的源码,帮助开发者理解其核心机制,提升编程技巧。 一、IoC...

Global site tag (gtag.js) - Google Analytics