`
javahigh1
  • 浏览: 1223164 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

web开发中的分层原则和各层之间的数据传递问题

 
阅读更多

  目前的Web Application大多采用流行的基于B/S模式的三层架构开发,这里的三层架构指的就是Web层、业务层和数据访问层。采用分层的开发方式有很多好处,下面只简单地来说两点:

  1:分层开发使不同的开发人员关注他们擅长的特定层面,有助于开发优质的系统。因为很少有程序员可以精通从JS,CSS,DHTML到struts再到hibernate直至最后的数据库设计这一整套开发流程所要使用到的所有技术。大家各司其职,全力关注自己擅长的层面,这要比一个人或一个小组负责某一模块从页面到最底层的开发方式要好的多。

  2:.分层分离了逻辑,使得系统结构层次明晰,系统变得灵活和易于维护。开发人员应该尽量使系统的各层之间保持相对独立的松耦合状态,这是实现分层的必要条件,也是构建良构系统的重要保证。

  下面重点说说在各层之间进行数据传递的问题。在讨论这个问题之前我想有必要阐明几个概念,即VO、PO、POJO、BO、DAO、DTO。VO:值对象(Value Object),另外也有人认为VO指的是View Object,视图对象,亦或者它就是表示两个概念。 PO:迟久化对象(Persistence Object) POJO:(Plain Old Java Object)字面意思应该是无格式的传统Java对象。对于这个概念我看网上有很多人都弄不明白,有的人甚至把它认为是PO,就我个人的理解,我认为 POJO是一个相对概念,就像它的字面意思一样,它指的就一个普普通通的java对象,这一概念主要是用来和像java bean这样遵从特定规范的java objcet进行区别而创造的。BO:业务对象(Business Object),有人把BO理解成是业务层操纵的数据对象是不对的,BO指的是封装了业务处理逻辑的对象(就是我们要在service层实现的那些类的实例)而业务层操纵的数据对象其实是VO。DAO就不用多说了(Data Access Object)数据访问对象,DTO:(Data T ransfers Object)数据传输对象。对于这个概念也是比较好理解的,Struts中的ActionForm其实就是一个DTO,用于在页面和Action之间进行数据的传递。另外如果把VO理解成视图对象的话,那么ActionForm就算是VO了。网上好像还流传一种叫做QO的对象,我想应该指的是(Query Object)查询对象吧,不过我好像真没怎么见过这东西。

  弄明白上面几个概念以后,我想说一下这两天一直在考虑的问题,那就是各个层上操纵的数据对象以层与层这间的数据传输问题。

  首先来看各层之间操纵的数据对象:Web层(JSP/Action):ActionForm 业务层:VO(注意:如果我们使用了Hibernate那么我可以使用它生成的PO来替代业务层的VO,这是因为从结构上讲VO和PO几乎没有什么不同,而又由于Hibernate的强大功能,使得它的PO可以可以离开持久化层而存在。要知道并不是所有ORM工具都具有这种能力:比如JDO1.x就不可以)数据访问层:PO。下面是详细的解说:

  ActionForm是Web层的数据表示,他不能被传递到业务层;PO是持久层的数据表示,在特定情况下,例如Hibernate中,他可以取代VO出现在业务层,但是不管PO还是VO都必须限制在业务层内使用,最多到达Web层的Control(即Action),绝不能被扩散到View去。

  ActionForm和PO之间的数据转化是在Action中进行的。

  其实放开来看,每一层都有自己特定的数据对象,而不是各层共用一种结构的数据对象,这样的话各层之前将严重耦合。在彼此相临的层之间,应该会有这么一个操作过程,即从它的上层或下层接收数据对象,并从中提取出需要的数据封装进自己层要操纵的数据对象里。例如在Action中就是这样做的,但由于业务层和数据访问层使用了同一种数据访问对象而省去了这种操作。

  这里的焦点是Action,我们在Action要的做工作是:接受从页面传来的ActionForm,从中取出数据,封装到PO中,然后调用业务层组件(BO)实现相关业务,最后进行页面跳转。

分享到:
评论

相关推荐

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    该案例采用目前最流行、最规范的java ee架构,整个应用分为jpa实体层、eao层、业务逻辑层、mvc层和视图层,各层之间分层清晰,层与层之间以松耦合的方法组织在一起。该案例既提供了ide无关的、基于ant管理的项目源码...

    ASP.NET 3.5 开发大全

    3.4.3 分层设计中使用命名空间 3.5 类的方法 3.5.1 编写方法 3.5.2 给方法传递参数 3.5.3 通过引用来传递参数 3.5.4 方法的重载 3.6 封装 3.6.1 为什么要封装 3.6.2 类的设计 3.7 属性 3.7.1 语法 3.7.2 只读/只写...

    微软UWP开发教程_2263页.pdf

    分层和提升 材料 图标 版式 设计基础知识 概述 应用设计简介 导航基础知识 概述 实现基本导航 导航历史记录和向后导航 命令基础知识 内容基础知识 教程 创建用户界面 创建自适应布局 设置控件的样式 布局 概述 页面...

    ASP.NET 3.5 开发大全11-15

    3.4.3 分层设计中使用命名空间 3.5 类的方法 3.5.1 编写方法 3.5.2 给方法传递参数 3.5.3 通过引用来传递参数 3.5.4 方法的重载 3.6 封装 3.6.1 为什么要封装 3.6.2 类的设计 3.7 属性 3.7.1 语法 3.7.2 只读/只写...

    ASP.NET 3.5 开发大全1-5

    3.4.3 分层设计中使用命名空间 3.5 类的方法 3.5.1 编写方法 3.5.2 给方法传递参数 3.5.3 通过引用来传递参数 3.5.4 方法的重载 3.6 封装 3.6.1 为什么要封装 3.6.2 类的设计 3.7 属性 3.7.1 语法 3.7.2 只读/只写...

    ASPNET35开发大全第一章

    3.4.3 分层设计中使用命名空间 3.5 类的方法 3.5.1 编写方法 3.5.2 给方法传递参数 3.5.3 通过引用来传递参数 3.5.4 方法的重载 3.6 封装 3.6.1 为什么要封装 3.6.2 类的设计 3.7 属性 3.7.1 语法 3.7.2 只读/只写...

    ASP.NET 3.5 开发大全word课件

    3.4.3 分层设计中使用命名空间 3.5 类的方法 3.5.1 编写方法 3.5.2 给方法传递参数 3.5.3 通过引用来传递参数 3.5.4 方法的重载 3.6 封装 3.6.1 为什么要封装 3.6.2 类的设计 3.7 属性 3.7.1 语法 3.7.2 只读/只写...

    ASP.NET3.5从入门到精通

    3.4.3 分层设计中使用命名空间 3.5 类的方法 3.5.1 编写方法 3.5.2 给方法传递参数 3.5.3 通过引用来传递参数 3.5.4 方法的重载 3.6 封装 3.6.1 为什么要封装 3.6.2 类的设计 3.7 属性 3.7.1 语法 3.7.2 只读/只写...

    软件工程知识点

    “喷泉”一词用于形象地表达面向对象软件开发过程中的迭代和无缝过渡。 7.组件复用模型 组件复用方法是最近几年发展起来的先进的软件复用技术,在基于组件复用的软件开发中,软件由组件装配而成,这就如同用标准...

    领域驱动设计与模式实战

    10.1.1 层和分区 10.1.2 分区的原因 10.1.3 限界上下文 10.1.4 限界上下文与分区有何关联 10.1.5 向上扩展DDD项目 10.1.6 为什么对领域模型——SO分区 10.2 SOA简介 10.2.1 什么是SOA 10.2.2 为什么需要SOA 10.2.3 ...

    windows 程序设计

    系统必须能够将闲置的内存空间组织在一起,因此系统必须能够移动内存中的程序代码和数据块。 即使是在8088微处理器上跑的Windows 1.0也能进行这类内存管理。在实际模式限制下,这种能力被认为是软件工程一个令人...

    Struts in Action中文版

    2.4.3. 应用层—视图之间的去耦合...............................................................................47 2.4.4. Struts如何实现 Model 2, MVC, 和分层...............................................

    struts in Action

    2.4.3. 应用层—视图之间的去耦合...............................................................................47 2.4.4. Struts 如何实现Model 2, MVC, 和分层................................................

Global site tag (gtag.js) - Google Analytics