前言
初学Javaweb时对很多概念不理解, 很多时候写代码都是"不知道为什么要这样写, 但是别人都这样写"这种状态让我很不舒服, 比如为什么有dao
层为什么还要写个daoimpl
层, 为什么有些代码放在controller
层而不放在service
层等. 这些疑惑在学习初期对我造成了很大困扰也严重影响了学习的热情, 在此建议初学者遇到问题多问问前辈, 以下是个人总结的相关概念和常见问题.
常用概念
dao —— Data Access Object数据访问对象(接口) daoimpl —— DAO的实现类
entity/model —— 数据对象的实体
service(不是server)—— 就是中间层、业务逻辑层(接口)
serviceimpl —— service的实现类
util —— 自定义工具类
controller/servlet —— 控制器, 负责处理网站与服务器请求
常见问题
- JAVA中controller层、service层 、entity层 、 dao层的功能区分?
servlet层用于接收请求并且调用对应service层处理请求,是Java各层中最接近浏览器的一层。service层主要编写具体业务逻辑,每个service一般包含一组相关的业务逻辑(比如用户管理是一个service,文章管理是一个service)。modle/entity层(统称模型层)就是对应的数据库表的实体类,一般每个模型层类对应一个数据库“表”,一般是用于ORM对象关系映射,一方面方便从数据库取数据时保存为Java类,一方面也方便写入数据库,简而言之就是为了方便操作数据库。dao层一般用于对数据库的具体操作,包括各种具体的增删改查语句和数据库数据和Java模型的映射。Util层主要用于存在项目各层都有可能出现、不好划分到某层中、出现频率较高的功能(类),比如连接数据库、获取系统参数、导出Excel表…… - 为什么将service(dao)层设为接口层,单独拿出一个serviceImpl(daoImpl)作为实现层?
主要还是为了方便项目管理,增加代码的复用性。当项目很大、代码很多时,可能存在多种业务逻辑类似但具体业务有所区别的需求,此时让它们都集成同一个接口层就好了(只是情景之一)。 - 为什么要用service层封装?
这个问题就像Java为什么要分层一样。一般来说,某一个程序的有些业务流程需要连接数据库,有些不需要与数据库打交道而直接是一些业务处理,这样就需要我们整合起来到service中去,这样可以起到一个更好的开发与维护的作用,同时也是MVC设计模式中model层功能的体现。 - Entity、Pojo、JavaBean和DTO有什么区别?
Entity:实体bean,一般是用于ORM对象关系映射,一个实体映射成一张表,一般无业务逻辑代码,有些优秀框架中修改entity会直接同步到数据库。JavaBean:是一种Java语言写成的可重用组件,类必须是具体和公共的,并且具有无参数的构造器,可以把数据封装起来,把应用的业务逻辑和显示逻辑分离开,降低了开发的复杂程度和维护成本(说白了就是一种类的规范,符合这种规范的都可以叫JavaBean)。Pojo:简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。DTO:数据传输对象(Data Transfer Object),是一种设计模式之间传输数据的软件应用系统。(其实一般开发很难也不必去感受它们的差别,开发多了感觉就来了) - 模型类和VO类分别是什么
模型类一般都会与数据库一一对应(见上文),但仅有模型类无法满足所有需求场景(多表查询):对于一个商城网站,商品详情页面不仅要显示商品的一般信息,还要显示所属店家信息、店主信息、地理位置……此时数据库商品表中不可能存这么多字段(这会造成很大冗余),解决方案之一就是开发者手动分别查询商品表、店铺表、店主表数据然后将需要的数据拼接在一起传到前端,但这种方法会让开发者浪费不少时间。与此相对的另一个更好的方案是,我们可以将商品详情页需要的数据单独再封装成一个实体类——这便是VO类,我们在想要获取商品详情时单独写一个查询方法对应VO(可以直接将查询结果封装到VO中)便可实现想要的效果。简而言之,模型类对应数据库中“表”,VO类对应前端具体视图(或者说VO类对应数据库中“视图”)。