网站建设项目规划书目录,电子商务网站建设阶段,网站开发文档总结,新开三端互通传奇网站转载自 Java Web应用的代码分层最佳实践代码分层#xff0c;对于任何一个Java Web开发来说应该都不陌生。一个好的层次划分不仅可以能使代码结构更加清楚#xff0c;还可以使项目分工更加明确#xff0c;可读性大大提升#xff0c;更加有利于后期的维护和升级。从另外一个角…转载自 Java Web应用的代码分层最佳实践代码分层对于任何一个Java Web开发来说应该都不陌生。一个好的层次划分不仅可以能使代码结构更加清楚还可以使项目分工更加明确可读性大大提升更加有利于后期的维护和升级。从另外一个角度来看好的代码分层架构应该是可以很好的匹配上单一职责原则的。这样就可以降低层与层之间的依赖还能最大程度的复用各层的逻辑。本文就来介绍下Java Web项目的代码到底应该如何分层。三层架构在软件体系架构设计中分层式结构是最常见也是最重要的一种结构。微软推荐的分层式结构一般分为三层从下至上分别为数据访问层、业务逻辑层又或称为领域层、表示层。这也是Java Web中重要的三层架构中的三个层次。区分层次的目的即为了“高内聚低耦合”的思想。
所谓三层体系结构是在客户端与数据库之间加入了一个“中间层”也叫组件层。这里所说的三层体系不是指物理上的三层不是简单地放置三台机器就是三层体系结构也不仅仅有B/S应用才是三层体系结构三层是指逻辑上的三层即把这三个层放置到一台机器上。
数据访问层
主要是对非原始数据数据库或者文本文件等存放数据的形式的操作层而不是指原始数据也就是说是对数据库的操作而不是数据具体为业务逻辑层或表示层提供数据服务。
业务逻辑层
主要是针对具体的问题的操作也可以理解成对数据层的操作对数据业务逻辑处理如果说数据层是积木那逻辑层就是对这些积木的搭建。
界面层
主要表示WEB方式。如果逻辑层相当强大和完善无论表现层如何定义和更改逻辑层都能完善地提供服务。
三层架构与MVC的区别
MVC模型Model-视图View-控制器Controller是一种架构模式可以用它来创建在域对象和UI表示层对象之间的区分。同样是架构级别的相同的地方在于他们都有一个表现层但是他们不同的地方在于其他的两个层。
在三层架构中没有定义Controller的概念。这是最不同的地方。而MVC也没有把业务的逻辑访问看成两个层这是采用三层架构或MVC搭建程序最主要的区别。分层的最佳实践随着网站的用户量的不断提升系统架构也在不断的调整。有时候随着业务越来越复杂有时候三层架构好像不够用了。比如我们的应用除了要给用户提供页面访问以外还需要提供一些开放接口供外部系统调用。这个接口既不属于界面层也不应该属于业务逻辑层因为他还可能包含一些和业务逻辑无关的处理如权限控制、流量控制等。
还有随着微服务的盛行我们应用中可能要依赖很多外部接口或第三方平台。这部分代码放下业务逻辑层和数据访问层也都不合适。
所以渐渐的在三层架构的基础上系统架构的分层变得更加复杂了。也正是因为复杂就非常考验架构设计能力因为层次划分的不好很可能会影响后面的开发给代码维护带来很大的困难。
下图是阿里巴巴(参考《阿里巴巴Java开发手册》)提倡的应用分层结构开放接口层
可直接封装 Service 方法暴露成 RPC 接口通过 Web 封装成 http 接口进行网关安全控制、流量控制等。
终端显示层
各个端的模板渲染并执行显示的层。当前主要是 velocity 渲染JS 渲染JSP 渲染移动端展示等。
Web 层
主要是对访问控制进行转发各类基本参数校验或者不复用的业务简单处理等。
Service 层
相对具体的业务逻辑服务层。
Manager 层
通用业务处理层它有如下特征 1 对第三方平台封装的层预处理返回结果及转化异常信息 2 对 Service 层通用能力的下沉如缓存方案、中间件通用处理 3 与 DAO 层交互对多个 DAO 的组合复用。
DAO 层
数据访问层与底层 MySQL、Oracle、Hbase 等进行数据交互。
外部接口或第三方平台
包括其它部门 RPC 开放接口基础平台其它公司的 HTTP 接口。事务处理在了解了分层之后我们再来看一下写Java Web代码的时候大家比较关心的一个问题那就是涉及到数据库操作的时候事务处理应该在哪一层控制呢
关于这个问题仁者见仁智者见智。作者认为事务处理应该放在Service层和Manager层。
DAO层不应该有事务应该只是很纯的 CRUD 等比较通用的数据访问方法。一个DAO应该只处理和自己相关的操作不要有任何组合。组合的事情交给上层。
Service层和Manager层一般会组合多个DAO的CRUD操作例如在注册一个用户的时候需要往日志表里 INSERT 日志那么就在 Service 层构造事务在该事务中调用 Dao 层的 User.Insert () 与 Log.Insert ()。异常处理异常处理是Java中比较重要的一个话题在《Effective Java》中有很多关于异常处理的最佳实践这里不详细介绍了本文主要简单说一下在应用代码分层之后各个层次之间的异常应该如何处理是自己捕获还是向上一层抛出。
首先每一层都是可能发生异常的。由于每一层的职责都不通处理方式也可能有差别。
DAO层
在 DAO 层产生的异常类型可能有很多可能是SQL相关的异常也可能是数据库连接相关的异常。
这一层的处理方式可以简单一点直接try-catch(Exception)然后封装成DAOException抛给上一层。这一层一般不需要打印日志交给Service或者Manager层来打印。
try{ CRUD}catch(Exception e){ throw new DAOException(e);}
Manager/Service
首先对于DAO层抛上来的异常一定要捕获的并且记录日志打印现场。
但是值得注意的是如果是需要事务控制的方法要注意捕获到异常之后再向上抛一个新的异常如 TransactionRolledbackException否则事务无法回滚。
这两层发生的异常可以根据情况决定是继续向上抛还是自己处理掉。如果是自己可以处理的异常就捕获打日志然后通过ErrorCode等方式返回给上一层。如果是自己无法处理或者不知道该如何处理的异常就直接抛给上一层来处理。
Web
首先可以明确的一点Web层不应该再往外抛异常因为这一层一旦抛异常就可能会导致用户跳转到不友好的错误页面甚至看到错误信息等。
如果意识到这个异常将导致页面无法正常渲染那么就应该直接跳转到友好错误页面加上用户容易理解的错误提示信息。
开放接口层
这一层和Web层一样不可以抛出异常。一般通过ErrorCode和ErrorMessage反馈给外部调用方。
这一层要自己处理好所有的异常定义好ErrorCode并记录好日志便于日后排查问题。总结本文主要介绍了Java Web项目中代码分层的方案通过分层之后可以使没一层更加专注解除耦合。并简单介绍了一下分层之后的事务处理和异常处理的逻辑。