【Java Web】MVC与分层开发

news/2024/11/16 7:30:50/

文章目录

  • MVC
  • 分层开发

MVC

MVC(Model-View-Controller)架构模式将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller),以实现清晰的责任分离。

模型(Model)

  • 负责数据逻辑和业务规则的处理。模型与数据库直接交互,负责数据的存储、检索、操作等。
  • 模型并不关心如何显示这些数据,也不关心用户的输入,它只关注数据本身。

视图(View)

  • 负责展示数据给用户,是用户看到并与之交互的部分。
  • 视图从模型获取其需要展示的数据,并且当数据发生变化时,视图会自动更新以反映最新的数据状态。
  • 视图不应该包含任何业务逻辑或数据处理代码。

控制器(Controller)

  • 作为模型和视图之间的中介,处理用户的输入,控制应用程序的流程。
  • 控制器接收用户的请求,调用模型的方法进行数据处理,然后选择合适的视图来显示结果。

在这里插入图片描述

交互流程

  1. 用户向视图发出请求。
  2. 视图将请求发送给控制器。
  3. 控制器调用模型进行业务处理。
  4. 模型处理业务流程后通知视图业务状态更新。
  5. 视图显示响应结果。同时,视图可在有数据更新请求时通知模型,模型响应状态查询等。整个流程通过方法调用和事件进行交互。

在这里插入图片描述

优缺点

MVC 优点

  • 多视图共享一个模型,大大提高代码的可重用性
  • MVC三个模块相互独立,松耦合架构
  • 控制器提高了应用程序的灵活性和可配置性
  • 有利于软件工程化管理

完美的系统架构 = 松耦合 + 高重用性 + 高扩展性

MVC 缺点

  • 原理复杂
  • 增加了系统结构和实现的复杂性
  • 视图对模型数据的低效率访问

分层开发

分层开发是一种软件架构设计模式,它将应用程序的功能划分为不同的层次或模块,每一层负责特定的任务,并且层与层之间通过定义良好的接口进行通信。

  • 视图表示层:与用户交互、展示数据
  • 业务逻辑层:控制业务流程及事务
  • 数据持久层:实现数据库操作

DAO 层 (Data Access Object)

数据持久层。主要负责与数据库进行交互,提供基础的数据访问功能。它隐藏了数据访问的具体实现细节,使得上层逻辑更加简洁和易于维护。

  • 数据访问:负责与数据库或其他持久化存储进行交互。
  • CRUD 操作:提供基本的创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作。
  • 封装数据源:隐藏数据访问的具体实现细节,使得上层逻辑不受底层数据存储技术的影响。

Service 层

业务逻辑层。主要负责处理业务逻辑,包括事务管理、安全性检查、复杂的业务规则等。它通过调用 DAO 层的方法来实现对数据的操作。

  • 业务逻辑:处理应用程序的核心业务逻辑。
  • 事务管理:管理数据库事务,确保数据的一致性和完整性。
  • 调用 DAO 方法:封装对 DAO 层方法的调用,提供更高层次的抽象。
  • 安全性检查:进行权限验证等安全相关的检查。

升级示例4-1

创建 service 层

用户业务逻辑层及其实现

java">public interface SmbmsUserService {/*** 登录* @param name 用户名* @param pwd 密码* @return 用户对象*/public SmbmsUser login(String name, String pwd);
}
java">public class SmbmsUserServiceImpl implements SmbmsUserService {// 实例化 SmbmsUserDaoprivate SmbmsUserDao smbmsUserDao = new SmbmsUserDaoImpl();@Overridepublic SmbmsUser login(String name, String pwd) {// 业务逻辑实现return smbmsUserDao.login(name,pwd);}
}

在实现类中实例化 SmbmsUserDao,通过 SmbmsUserDao 实现实际的数据库操作(用户验证)。实现了业务逻辑与数据访问逻辑的分离。

java">// 调用 Java 方法 登录
SmbmsUserDao smbmsUserDao = new SmbmsUserDaoImpl();
SmbmsUser smbmsUser =  smbmsUserDao.login(uname,upwd);// 调用 登录方法
SmbmsUserService smbmsUserService = new SmbmsUserServiceImpl();
SmbmsUser smbmsUser =  smbmsUserService.login(uname,upwd);

使用 DAO 直接调用缺乏服务层的抽象,可能导致业务逻辑不够清晰,也不利于后续的扩展。使用 Service 层调用的方式更加符合分层架构的设计原则,所有的业务逻辑通过 Service 层来组织,使得代码结构更加清晰、可维护。如果有更多的业务逻辑需要加入(例如,检查密码是否符合某些规则,或者记录登录日志等),可以更容易地扩展。

服务商查询列表功能

java">public interface SmbmsProviderService {/*** 全查* @return*/public List<SmbmsProvider> findAll();
}
java">public class SmbmsProviderServiceImpl implements SmbmsProviderService {// 实例化 SmbmsProviderDaoprivate SmbmsProviderDao smbmsProviderDao = new SmbmsProviderDaoImpl();@Overridepublic List<SmbmsProvider> findAll() {return smbmsProviderDao.findAll();}
}
java">SmbmsProviderServiceImpl smbmsProviderService = new SmbmsProviderServiceImpl();
List<SmbmsProvider> providerList = smbmsProviderService.findAll();

http://www.ppmy.cn/news/1547392.html

相关文章

鸿蒙学习生态应用开发能力全景图-鸿蒙生态伙伴 SDK 市场(4)

鸿蒙生态伙伴 SDK 市场帮助开发者获得更优质安全的闭源 SDK&#xff0c;与 SDK 伙伴、开发者共建一站式的 SDK 选用平台&#xff0c;实现开发者、SDK 伙伴和华为共赢。鸿蒙生态伙伴 SDK市场汇聚热门 SDK 助力开发者构建高品质鸿蒙原生应用。同时伙伴 SDK 市场通过 SDK 签名认证…

综合文化信息管理系统|基于java和小程序的综合文化信息管理系统设计与实现(源码+数据库+文档)

综合文化信息管理系统 目录 基于java和小程序的打印室预约系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&…

如何将java项目打包成docker 镜像并且可运行

java 项目打包成 Docker 可运行的镜像&#xff0c;其目的是便于运用docker容器来管理项目。下面是具体的步骤&#xff0c;如果大家遇到啥问题可以留言有空会逐一回复。 目录 1. 确保项目已经打包成 JAR 文件 2. 编写 Dockerfile 3. 构建 Docker 镜像 4. 运行 Docker 容器 …

Spring——单元测试

单元测试&#xff1a;JUnit 在之前的测试方法中&#xff0c;几乎都能看到以下的两行代码&#xff1a; ApplicationContext context new ClassPathXmlApplicationContext("xxx.xml"); Xxxx xxx context.getBean(Xxxx.class); 这两行代码的作用是创建Spring容器&a…

微信小程序点击跳转打电话功能

wx.makePhoneCall 属性类型默认值必填说明phoneNumberstring是需要拨打的电话号码successfunction否接口调用成功的回调函数failfunction否接口调用失败的回调函数completefunction否接口调用结束的回调函数&#xff08;调用成功、失败都会执行&#xff09; <view class&q…

【计算机网络】设备网卡NIC的工作内容有哪些呢?

我们平时上网&#xff0c;都需要经过设备网卡的处理&#xff0c;网络接口卡&#xff08;Network Interface Card&#xff0c;简称 NIC&#xff09;是计算机与网络之间的物理连接设备&#xff0c;负责处理网络数据的发送和接收。NIC 的功能涵盖了从物理层到数据链路层的多个方面…

更简单快捷的处理URL参数

在开发前端页面时候&#xff0c;经常会用到跳转页面&#xff0c;在页面进行交互的时候&#xff0c;经常会用到参数携带&#xff0c;我们一般处理方法就是在路由的后面携带我们需要传递的参数。 URL拼接即字符串拼接&#xff0c;在最开始的时候&#xff0c;我们对字符串的拼接都…

js像循环数组那样循环一个数字,Array.from()

Array.from() 是 JavaScript 中的一个静态方法&#xff0c;它可以从类数组对象或可迭代对象中创建一个新的数组实例。这个方法非常有用&#xff0c;尤其是在处理那些不是真正的数组但可以像数组一样访问其元素的对象时。 基本语法 Array.from(arrayLike, mapFn, thisArg) ar…