文档章节

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

猪刚烈
 猪刚烈
发布于 2014/10/12 11:40
字数 1250
阅读 14
收藏 0
点赞 0
评论 0

  目前的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)实现相关业务,最后进行页面跳转。

本文转载自:http://blog.csdn.net/bluishglc/article/details/1677737

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
互联网分层架构系列之一: 分层的本质

上图是一个典型的互联网分层架构: 客户端层:典型调用方是browser或者APP 站点应用层:实现核心业务逻辑,从下游获取数据,对上游返回html或者json 数据-缓存层:加速访问存储 数据-数据库层...

wqhlmark64 ⋅ 04/12 ⋅ 0

软件的三层架构

软件的三层架构 引言 三层结构是传统的客户/服务器结构的发展,代表了企业级应用的未来,典型的有Web下的应用。多层结构和三层结构的含义是一样的,只是细节有所不同。之所以会有双层、三层这...

落霜枫 ⋅ 2014/01/16 ⋅ 1

互联网分层架构的本质

本文转载自公众号 架构师之路 作者:沈剑 58同城首席架构师 上图是一个典型的互联网分层架构: 客户端层:典型调用方是browser或者APP 站点应用层:实现核心业务逻辑,从下游获取数据,对上游...

bjweimengshu ⋅ 2017/11/28 ⋅ 0

企业应用架构模式学习(一):分层设计

在分解复杂的软件系统时,设计者用的最多的技术之一就是分层。 为什么要分层,分层有哪些优点? 优点:1、复杂问题分解简单化,每一层负责自己的实现,并向外提供服务。 2、职责分离,复杂的...

大风起兮 ⋅ 2013/05/24 ⋅ 0

OSI参考模型

OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互联模型。该体系结构标准定义了网络互连的七层框架(物理层、数...

bengozhong ⋅ 2016/09/06 ⋅ 0

DDD与分层架构

DDD是一种设计思想,它本身不绑定到任何一种具体的架构风格,可以应用在多种不同的架构风格中。本文探讨在经典的分层架构中如何应用DDD,以及在DDD的语境下,分层结构每一层的具体职责。 分层...

秋水逍遥 ⋅ 2014/10/10 ⋅ 12

针对架构设计的几个痛点,我总结出的架构原则和模式

分层架构是最常见的架构,也被称为n层架构。多年以来,许多企业和公司都在他们的项目中使用这种架构,它已经几乎成为事实标准,因此被大多数架构师、开发者和软件设计者所熟知。 。根据需求和...

陶邦仁 ⋅ 2016/03/07 ⋅ 0

基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET平台开发指南 - 实现业务

业务分层 依据行业经验来看,分层是解决复杂问题的简单方法,通过分层,可以把一个复杂问题分解为不同层次应用的小问题,解决各层小问题的难度小于总的问题难度;分层最成功能莫过于计算机网...

agilelab ⋅ 2010/09/14 ⋅ 0

互联网分层bean设计的思考

不管是传统软件行业还是互联网软件行业,几乎都在大量使用分层设计及分层服务调用,那我们想一下最简单的问题,层与层之间的数据传递和交换是怎么设计的? 前提,我们讨论的前提是互联网模式...

wangshuaixin ⋅ 2016/12/23 ⋅ 1

Java Web应用的代码分层最佳实践。

代码分层,对于任何一个Java Web开发来说应该都不陌生。一个好的层次划分不仅可以能使代码结构更加清楚,还可以使项目分工更加明确,可读性大大提升,更加有利于后期的维护和升级。 从另外一...

⋅ 05/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

服务网关过滤器

过滤器作用 我们的微服务应用提供的接口就可以通过统一的API网关入口被客户端访问到了。但是,每个客户端用户请求微服务应用提供的接口时,它们的访问权限往往都需要有一定的限制,系统并不会...

明理萝 ⋅ 6分钟前 ⋅ 1

【2018.06.21学习笔记】【linux高级知识 14.1-14.3】

14.1 NFS介绍 14.2 NFS服务端安装配置 14.3 NFS配置选项

lgsxp ⋅ 14分钟前 ⋅ 0

Day18 vim编辑模式、命令模式与练习

编辑模式 命令模式 :nohl 不高亮显示 :x与:wq类似,如果在更改文件之后操作,两者效果一样;如果打开文件,没有任何操作; :wq会更改mtime,但是:x不会。 练习题 扩展 vim的特殊用法 ht...

杉下 ⋅ 18分钟前 ⋅ 0

Enum、EnumMap、EnumSet

1、Enum 不带参数 public enum Car { AUDI { @Override public int getPrice() { return 25000; } }, MERCEDES { ......

职业搬砖20年 ⋅ 18分钟前 ⋅ 0

Java中的锁使用与实现

1.Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。 在Lock出现之前,java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,...

ZH-JSON ⋅ 20分钟前 ⋅ 0

线程组和 ThreadLocal

前言 在上面文章中,我们从源码的角度上解析了一下线程池,并且从其 execute 方法开始把线程池中的相关执行流程过了一遍。那么接下来,我们来看一个新的关于线程的知识点:线程组。 线程组 ...

猴亮屏 ⋅ 21分钟前 ⋅ 0

相对路径和绝对路径

基本概念   文件路径就是文件在电脑中的位置,表示文件路径的方式有两种,相对路径和绝对路径。在网页设计中通过路径可以表示链接,插入图像、Flash、CSS文件的位置。   物理路径:物理路...

临江仙卜算子 ⋅ 25分钟前 ⋅ 0

消息队列属性及常见消息队列介绍

什么是消息队列? 消息队列是在消息的传输过程中保存消息的容器,用于接收消息并以文件的方式存储,一个队列的消息可以同时被多个消息消费者消费。分布式消息服务DMS则是分布式的队列系统,消...

中间件小哥 ⋅ 27分钟前 ⋅ 0

java程序员使用web3j进行以太坊开发详解

如何使用web3j为Java应用或Android App增加以太坊区块链支持,教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤器...

笔阁 ⋅ 28分钟前 ⋅ 0

vim编辑模式、vim命令模式

vim编辑模式 使用vim filename 进入的界面是一般模式,在这个模式下虽然我们能够查看,复制,剪切,粘贴,但是不能编辑新的内容,如何能直接写入东西呢?这就需要进入编辑模式了,从一般模式...

李超小牛子 ⋅ 30分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部