【Java Web】MVC与分层开发
文章目录
- MVC
- 分层开发
MVC
MVC(Model-View-Controller)架构模式将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller),以实现清晰的责任分离。
模型(Model)
- 负责数据逻辑和业务规则的处理。模型与数据库直接交互,负责数据的存储、检索、操作等。
- 模型并不关心如何显示这些数据,也不关心用户的输入,它只关注数据本身。
视图(View)
- 负责展示数据给用户,是用户看到并与之交互的部分。
- 视图从模型获取其需要展示的数据,并且当数据发生变化时,视图会自动更新以反映最新的数据状态。
- 视图不应该包含任何业务逻辑或数据处理代码。
控制器(Controller)
- 作为模型和视图之间的中介,处理用户的输入,控制应用程序的流程。
- 控制器接收用户的请求,调用模型的方法进行数据处理,然后选择合适的视图来显示结果。
交互流程
- 用户向视图发出请求。
- 视图将请求发送给控制器。
- 控制器调用模型进行业务处理。
- 模型处理业务流程后通知视图业务状态更新。
- 视图显示响应结果。同时,视图可在有数据更新请求时通知模型,模型响应状态查询等。整个流程通过方法调用和事件进行交互。
优缺点
MVC 优点
- 多视图共享一个模型,大大提高代码的可重用性
- MVC三个模块相互独立,松耦合架构
- 控制器提高了应用程序的灵活性和可配置性
- 有利于软件工程化管理
完美的系统架构 = 松耦合 + 高重用性 + 高扩展性
MVC 缺点
- 原理复杂
- 增加了系统结构和实现的复杂性
- 视图对模型数据的低效率访问
分层开发
分层开发是一种软件架构设计模式,它将应用程序的功能划分为不同的层次或模块,每一层负责特定的任务,并且层与层之间通过定义良好的接口进行通信。
- 视图表示层:与用户交互、展示数据
- 业务逻辑层:控制业务流程及事务
- 数据持久层:实现数据库操作
DAO 层 (Data Access Object)
数据持久层。主要负责与数据库进行交互,提供基础的数据访问功能。它隐藏了数据访问的具体实现细节,使得上层逻辑更加简洁和易于维护。
- 数据访问:负责与数据库或其他持久化存储进行交互。
- CRUD 操作:提供基本的创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作。
- 封装数据源:隐藏数据访问的具体实现细节,使得上层逻辑不受底层数据存储技术的影响。
Service 层
业务逻辑层。主要负责处理业务逻辑,包括事务管理、安全性检查、复杂的业务规则等。它通过调用 DAO 层的方法来实现对数据的操作。
- 业务逻辑:处理应用程序的核心业务逻辑。
- 事务管理:管理数据库事务,确保数据的一致性和完整性。
- 调用 DAO 方法:封装对 DAO 层方法的调用,提供更高层次的抽象。
- 安全性检查:进行权限验证等安全相关的检查。
升级示例4-1
创建 service 层
用户业务逻辑层及其实现
public interface SmbmsUserService {
/**
* 登录
* @param name 用户名
* @param pwd 密码
* @return 用户对象
*/
public SmbmsUser login(String name, String pwd);
}
public class SmbmsUserServiceImpl implements SmbmsUserService {
// 实例化 SmbmsUserDao
private SmbmsUserDao smbmsUserDao = new SmbmsUserDaoImpl();
@Override
public SmbmsUser login(String name, String pwd) {
// 业务逻辑实现
return smbmsUserDao.login(name,pwd);
}
}
在实现类中实例化 SmbmsUserDao
,通过 SmbmsUserDao
实现实际的数据库操作(用户验证)。实现了业务逻辑与数据访问逻辑的分离。
// 调用 Java 方法 登录
SmbmsUserDao smbmsUserDao = new SmbmsUserDaoImpl();
SmbmsUser smbmsUser = smbmsUserDao.login(uname,upwd);
// 调用 登录方法
SmbmsUserService smbmsUserService = new SmbmsUserServiceImpl();
SmbmsUser smbmsUser = smbmsUserService.login(uname,upwd);
使用 DAO 直接调用缺乏服务层的抽象,可能导致业务逻辑不够清晰,也不利于后续的扩展。使用 Service 层调用的方式更加符合分层架构的设计原则,所有的业务逻辑通过 Service 层来组织,使得代码结构更加清晰、可维护。如果有更多的业务逻辑需要加入(例如,检查密码是否符合某些规则,或者记录登录日志等),可以更容易地扩展。
服务商查询列表功能
public interface SmbmsProviderService {
/**
* 全查
* @return
*/
public List<SmbmsProvider> findAll();
}
public class SmbmsProviderServiceImpl implements SmbmsProviderService {
// 实例化 SmbmsProviderDao
private SmbmsProviderDao smbmsProviderDao = new SmbmsProviderDaoImpl();
@Override
public List<SmbmsProvider> findAll() {
return smbmsProviderDao.findAll();
}
}
SmbmsProviderServiceImpl smbmsProviderService = new SmbmsProviderServiceImpl();
List<SmbmsProvider> providerList = smbmsProviderService.findAll();