许多设计良好的web应用,可以被按职责分为四层。这些层次是表现层、持久层、业务层、和域模型层。每一个层次都有其独特的职责,不能把各自的功能与其它层次相混合。每一个应用层都应该和其它层隔离开来,但允许使用接口在层间进行通信。我们开始来看看每个层,并讨论一下它们各自都应该提供什么和不应该提供什么。

对表现层,我们使用 Struts ;业务层使用 spring ;对于持久层我们使用的是 hibernate 。你尽可以取代这里的某个框架而使用你喜欢的框架已达到同样的效果。上图显示了框架被整合起来时,从最高层次看到的视图。
ref:http://www.blogjava.net/jiabao/archive/2007/04/08/109189.html

1. 持久层(Persistence layer–DAO–hibernate)

所谓持久,就是把数据保存到可以永久保持的存储设备当中。一般来说,持久更为直接的理解就是对数据库的各种操作,如增加,删除,修改,查询,更新等操作。
持久层,就是把持久的动作封装成一个独立的层,这是为了降低功能代码之间的关联。创建一个更清晰的抽象,提高代码的内聚力,降低代码的耦合度,从而增强代码的要劳动局生和可重用性。
持久层可以封装数据访问细节,为大部分业务逻辑提供面向对象的API。它是一种松散耦合,使持久化不依赖于义愤数据库和上层业务逻辑来实现。我们在设计代码的时候,应该避免在业务逻辑代码中混杂数据访问代码。
DAO,即持久层数据访问对象。利用来抽象和封装所有对数据源的访问,由DAO来管理各种数据源的连接以便于检索和存储数据。DAO一般由业务对象,数据访问对象,数据源和值对象组成。通过DAO实现了数据访问逻辑的抽象与实现细节的封装,只对外提供一个抽象化的数据访问API。我们通过调用API的方法就能实现对数据库的操作。而不必再去理解具体是怎么对数据库进行操作的。这样由于业务操作和数据访问实现分离,也使得开发人员的专业划分成为可能。
在DAO中业务对象仅仅包含与本领域相关的逻辑对象和算法就可以了。针对不同的数据库提供各自的数据访问代码,可以通过定义一个调用接口,针对该接口实现不同数据的数据访问。这样就可以避免对具体实现的依赖,在以后数据库变更时,不用改实现的代码。
Dao层是可以使用Hibernate连接数据库、操作数据库(简单的增删改查)。其和DAO设计模式还不完全是一个概念,我们此处的Dao层中不包含实体类的描述,这部分写在域模型层:
DAO设计模式一般分为几个类:
1.VO(Value Object):一个用于存放网页的一行数据即一条记录的类,比如网页要显示一个用户的信息,则这个类就是用户的类。
2.DatabaseConnection:用于打开和关闭数据库。
3.DAO接口:用于声明对于数据库的操作。
4.DAOImpl:必须实现DAO接口,真实实现DAO接口的函数,但是不包括数据库的打开和关闭。
5.DAOProxy:也是实现DAO接口,但是只需要借助DAOImpl即可,但是包括数据库的打开和关闭。
6.DAOFactory:工厂类,含有getInstance()创建一个Proxy类。
ref:http://blog.csdn.net/xiazdong/article/details/6895465/

2. 表现层(UI Layer –Presentation Layer–struts-action层 )

action层负责选择不同的展示UI,为了保证系统能够在不同的UI界面做移植,action不要涉及业务逻辑。
一个典型的web 应用的末端是表现层。许多Java 开发者都知道Struts提供了什么东西。然而,太多时候,耦合代码比如业务逻辑被放进org.apache.struts.Action中。所以,我们先总结一下Struts之类的框架应该提供什么。下面就是Struts 的职责所在:
1.管理用户的请求和响应
2.提供一个控制起来将调用委托到业务逻辑和其他上游处理
3.将来自于抛出例外的其他层的例外处理到Struts Action 中
4.组装可以在视图中表现的模型对象
5.执行UI 校验
下面是一些经常可以使用Struts进行编码但是不应该和表现层关联的事情:
1.直接和数据库交互,比如JDBC 调用
2.与应用相关的业务逻辑和校验
3.事务管理
在表现层中引入这些类型的代码将导致类型耦合和维护负担。

3. 业务层(Bussiness Layer –service-spring-beanFactory)

Service层:引用对应的Dao数据库操作,在这里可以编写自己需要的代码(比如简单的判断)。
service层是调用各种dao的业务操作,比如你有一个业务是 添加,然后修改。 那么你分别调用dao的添加和修改操作,包括里面的一些数据转换,逻辑判断都放到service层,dao只是单纯的增删改查。 而且事务一般会放到service层。
其中Service层和DAO层由于可能都会对数据库进行操作,其具体区别为:

  1. dao和service对应

    一般情况下,Hibernate DAO只操作一个POJO对象,因此一个DAO对应一个POJO对象。 Service层是为了处理包含多个POJO对象(即对多个表的数据操作)时,进行事务管理(声明式事务管理)。Service层(其接口的实现类)被注入多个DAO对象,以完成其数据操作。

  2. Service之有无
    这一点我的看法未必正确,我的脑海现在有两种构建业务层的模式:
    模式1是Service + DAO,即DAO中只做CRUD及类似的简单操作(称之为功能点,不包含业务逻辑),Service中通过调用一个或多个DAO中的功能点来组合成为业务逻辑.Service的数量应该由功能模块来决定。
    在这种模型中业务逻辑是放在Service中的,事务的边界也应该在Service中控制. 当然,直接在Service中控制事务会引入非业务逻辑的代码,幸好Spring的AOP可以解决这个问题,这也是引入Spring的原因之一.
    如果说到缺点,就在于对某些对象的操作就是简单的CRUD,Service层显得累赘. 模式2是Service + BO, 而BO = DAO + 业务方法, 在原先DAO的基础上添加业务方法,形成BO对象。需要注意的是BO中的业务方法往往是针对一个实体对象的,如果需要跨越多个实体对象,则方法应该放在Service中。
    举例来说,一个简单的银行帐户管理系统,创建帐户这个BO对象,里面可以有修改密码,取钱等业务方法(不难看出,这些方法都只对单个帐户对象进行操作)。现在需要添加一个转账方法,就应该放在Service中。
    这里Service和BO的关系是什么样的呢?再举一例:以国家行政机关为例:粮食局负责收粮,卖种子等,建设部负责审批土地买卖,建设公路等,这都是行政部分份内的事儿。突然某地发了水灾,救灾时需要粮食局开仓放粮,建设部修建临时房屋,如何协调两个部门?就需要成立专门的救灾委员会,由救灾委员会出面对两个部分的资源进行调拨。这里两个部分就是BO,而救灾委员会就是Service。不知我的意思是否表达准确了,呵呵。 模式1的在划分Service和DAO时界限清晰,但会带来一些无必要的代码。
    模式2的划分相对复杂,然而可以提高编码效率。
    当然小规模的应用中,没有Service,完全是DAO或BO也是可以接受的。

  3. Service和DAO的接口之有无

接口是一种契约,它可以有多种实现。所以接口之有无取决于具体实现是否需要多样化。如果铁定一种DAO或一种Service只有一种实现,那么抽象出接口的意义不大。然而一些大型应用或许需要DAO和Service的多种实现(比如上面例子中的帐户DAO,可能需要一种Hibernate实现、一种CMP实现和一种JDO实现),为了向上一层隐藏具体实现类,需要采用接口。

隐藏具体实现类的创建过程,这有两种方法:一是实用工厂方法,代价是代码量大(每个DAO和Service一个工厂)。二是使用Spring的IoC,实现依赖注入,不需要写额外的代码,这也是引入Spring的理由之二。
ref:http://blog.csdn.net/njujmj/article/details/5202915

4. 域模型层(Domain model)

软件开发要干什么:
反映真实世界要自动化的业务流程
解决现实问题
领域Domain
Domain特指软件关注的领域
在不能充分了解业务领域的情况下是不可能做出一个好的软件
Domain层是整个系统的核心层,该层维护一个使用面向对象技术实现的领域模型,几乎全部的业务逻辑会在该层实现。
Domain层包含:
1.Entity(实体):
有一类对象拥有唯一标识符能够跨越系统的生命周期甚至能超越软件系统的一系列的延续性和标识符这样的对象称为实体。
2.ValueObject(值对象)
对某个对象是什么不感兴趣,只关心它拥有的属性用来描述领域的特殊方面、且没有标识符的一个对象,叫做值对象,能被简单的创建和丢弃,生命周期中不会被持久化值对象可以被共享,值对象应该不可变
3.Domain Event(领域事件)
4.Repository(仓储)等

Javaweb项目各个模块的用途相关推荐

  1. JavaWEB二十一:BookShop项目 - 各模块功能

    BookShop项目 - 各模块功能 导读:各模块的开发逻辑架构 业务逻辑 对项目的各部分进行开发时,首要任务是明确该部分的业务逻辑.明确任务逻辑后,才可能对html文件.dao层.service层. ...

  2. 【Web】JavaWeb项目为什么我们要放弃jsp?为什么要前后端解耦?为什么要前后端分离?2.0版,为分布式架构打基础。 - CSDN博客

    前戏 前后端分离已成为互联网项目开发的业界标准使用方式,通过nginx+tomcat的方式(也可以中间加一个nodejs)有效的进行解耦, 并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务 ...

  3. JavaWeb项目前端规范(采用命名空间使js深度解耦合)

    没有规矩不成方圆,一个优秀的代码架构不仅易于开发和维护,而且是一门管理与执行的艺术. 这几年来经历了很多项目,对代码之间的强耦合及书写不规范,维护性差等问题深恶痛绝.在这里,通过仔细分析后,结合自己的 ...

  4. JavaWeb项目(登录注册页面)全过程详细总结

    文章目录 JavaWeb项目(登录注册页面)全过程总结 一.环境准备与开发工具 二.创建 JavaWeb 项目2.1 新建Dynamic Web Project项目2.2 创建前端页面2.2.1 登录 ...

  5. 关于写javaweb项目,遇到的问题:三层架构

    关于写javaweb项目,遇到的问题 三层架构: 表示层(UI)业务逻辑层(BLL) 数据访问层(DAL) 高内聚,低耦合. 高内聚:一个模块内各元素彼此结合紧密程度高(只负责单一功能) 低耦合:简单 ...

  6. JavaWeb项目-快递代领-需求分析(二)-软件工程-小组项目

    快递带领-需求分析 1.项目简介 1.1项目背景 快递又称速递或快运,是指物流企业(含货运代理) 通过自身的独立网络或以联营合作(即联网)的方式,将用户委托的文件或包裹,快捷而安全地从发件人送达收件人 ...

  7. 计算机毕业设计-ssm智能小区管理系统(源码+数据库+文档)社区维修管理系统-小区缴费管理系统javaweb项目

    计算机毕业设计-ssm智能小区管理系统(源码+数据库+文档)社区维修管理系统-小区缴费管理系统javaweb项目 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 作者:IT跃迁谷 1.开发环境 ...

  8. javaweb项目图书借阅管理系统设计与实现(有文档+调试视频教程+项目源码).rar

    图书管理系统 管理员账户:1001/1234 介绍 <数据库原理>课程设计,一个Javaweb项目 环境与架构 环境:Eclipse+Mysql 架构:Jsp+servelet+Javab ...

  9. 记录一次在JavaWeb项目中,运行tomcat的时候,遇到XX程序包不存在的一系列排查问题。

    记录一次在JavaWeb项目中,运行tomcat的时候,遇到XX程序包不存在的一系列排查问题. idea2020.1 maven版本3.3.9 tomcat版本8.5.31 第一次遇到的问题 程序包不 ...

  10. 计算机毕业设计-ssm+vue宿舍管理系统源码-宿舍维修管理系统javaweb项目

    计算机毕业设计-ssm+vue宿舍管理系统源码-宿舍维修管理系统javaweb项目 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 作者:IT跃迁谷 1.开发环境 开发语言:Java 后台框架 ...

最新文章

  1. DO YOU WANNA BUILD A SNOW MAN ?
  2. 2016年我国研究的超级计算机,盘点2016:我国科研取得的重大成果
  3. Android下ListView的分页(9.6)
  4. JS疑惑-2(作用域)
  5. LeetCode 336. 回文对(哈希map/Trie树)
  6. css技巧中placeholder的颜色
  7. 计算机网络数据链路层次学习
  8. python调用程序压缩文件_Python实现文件压缩和解压的示例代码
  9. iis6 php url重写,IIS下 Yii Url重写,iisyiiurl重写_PHP教程
  10. Axure RP一个专业的高速原型设计工具
  11. ZOJ 3993 2017CCPC秦皇岛 M:Safest Buildings
  12. limitBy过滤器是配合数组使用的,限制数组元素的个数,话不多说,来个小例子。...
  13. 北京邮电大学砸彩蛋大作业
  14. 英国加入亚投行是顺从中国还是想玩无间道?
  15. keras 中的 verbose 参数详解
  16. 基于一阶倒立摆系统的模糊神经网络PID控制
  17. android opop状态栏透明,oppo状态栏美化
  18. 《软件设计的哲学》读书总结
  19. 终于搞掂博文自动发送
  20. 工作展望简短_工作展望简短_时间2017工作展望

热门文章

  1. 小米商城静态页面制做
  2. Hi3519AV100 MPP部署
  3. java开发自学怎么样_Java工程师的薪资待遇怎么样,自学Java开发可以吗?
  4. Renascence架构介绍——文件夹
  5. 在网页中创建表格(1)
  6. 泰戈尔专集:飞鸟集·新月集·园丁集(美冠纯美阅读书系·外国卷) 读后感
  7. 使用Xshell重启远程服务器指令
  8. 可以上网但是不能ping通局域网
  9. sublime text2-text3 定义的不同浏览器的预览快捷键
  10. springboot集成Stream上传插件+图片缩略图+视频缩略图