mvc各层简单清晰的描述

声明:原文出处http://blog.youkuaiyun.com/Earl_yuan/article/details/50382431,本人出于学习,收集干货,不作商业用途!

这是我看到的较为简单清晰描述mvc的各层关系的文章

view-controller-model

这是在学校就接触到的概念,在正式加入程序员队伍之前,我对其的理解也只仅仅停留在字面意思,即模型层+视图层+控制层。但是逐渐通过工作的磨砺,现在已经对其有了比较清楚的认识。
其实按照用户请求的执行顺序应该从左向右依次为view-controller-model。

  • 视图层view:用于展示数据,与用户进行交互。
  • 控制层controller:用于分发控制到来的请求,并调用模型层与数据库进行交互,以及将数据返回给视图层展示。
  • 模型层model:数据模型,它与数据库进行交互,进行CURD操作。

如下图:
MVC模拟请求执行过程

这里模拟一个用户查询和新增的请求。
当用户通过浏览器的web界面发起查询请求时,首先会被控制层controller分发,然后会调取相应的model层进行数据库查询。然后model层再将数据库查询到的数据返回给控制层,控制层再将其返回view层,view层web页面中进行显示。

view-controller-service-dao

以前,我一直认为可以直接在控制层就调用model层来进行数据库的交互。因为之前接触到的项目业务逻辑比较简单,所以直接在控制层就将很多工作都完成了。当我慢慢理解了MVC的分层架构后,我觉得这是不严谨的,耦合性太强了,违背了MVC的初衷,即解耦。所以随着MVC学习的深入,慢慢地又加入到了业务层service和数据访问层dao。那么上述的情景就可以有如下的表示:
这里写图片描述

  • 视图层view:用于展示数据,与用户进行交互。
  • 控制层controller:用于分发控制到来的请求,并将请求分发给相应的业务层。以及将数据返回给视图层展示。
  • 业务层service:业务处理,调用数据访问层与数据库进行交互。
  • 数据访问层dao:它与数据库进行交互,封装了对数据库的CURD操作。

当请求来了,controller就会将相应的请求分发到相应的service层,在service层中再调用dao层进行数据库交互。这里的dao层其实就是之前的model层,封装了对数据库的操作。这样一来,就把业务处理逻辑从controller中分离出来,从而实现了解耦。

通过网上的了解,在有些项目中,其实也是没有完全按照分层进行架构,省略了service层,直接将业务逻辑与数据访问揉在了一起,这样其实是不便于扩展的,为了项目的架构清晰,易于管理,方便扩展,还是应该按照分层的架构来构建项目。

### MVC架构概述 MVC(Model-View-Controller)是一种软件架构设计模式,常用于分离应用程序的不同方面以便于管理和维护。具体来说: - **Model(模型)** 负责数据逻辑和业务规则的实现[^4]。 - **View(视图)** 处理数据显示给用户的部分。 - **Controller(控制器)** 接收用户的输入并调用相应的模型组件完成用户请求,然后返回结果到视图显示给用户[^5]。 ### Java中基于Spring框架的MVC实现 在Java环境中,特别是采用Spring框架时,可以通过注解的方式简化配置文件编写工作量,并且能够更直观地区分各个次的功能角色[^2]。下面是一个简单的例子展示如何构建一个基本的商品管理系统的MVC结构: #### 控制器 (Controller) ```java @RestController @RequestMapping("/products") public class ProductController { @Autowired private ProductService productService; @GetMapping("/{id}") public ResponseEntity<Product> getProductById(@PathVariable Long id){ Optional<Product> productOptional = productService.findById(id); return productOptional.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); } } ``` 这段代码定义了一个RESTful API端点`/products/{id}`用来获取指定ID的产品信息[^1]。 #### 服务 (Service) ```java @Service public class ProductService { @Autowired private ProductRepository repository; public Optional<Product> findById(Long id){ return this.repository.findById(id); } // Other business logic methods... } ``` 这里的服务类负责处理具体的商业逻辑操作,比如查询数据库查找特定产品实例等。 #### 数据访问对象 (DAO 或 Mapper) 对于持久化存储的操作通常放在这个面执行,在现代ORM工具的帮助下可以直接映射实体类至关系型表格记录之间转换而无需手动书写SQL语句。 ```java @Repository public interface ProductRepository extends JpaRepository<Product,Long>{ } ``` 上述接口继承自JpaRepository接口从而获得了一系列CRUD方法支持以及一些额外功能增强。 ### 总结 通过以上描述可以看出,利用MVC模式可以使程序具有更好的可读性和扩展性;同时借助像Spring这样的成熟框架还可以进一步提升开发效率降低复杂度。此外,这种分的设计理念有助于团队协作分工明确责任范围界定清晰[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值