MVC架构详细介绍与分析

这篇具有很好参考价值的文章主要介绍了MVC架构详细介绍与分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MVC

   Mvc概念:M:model(模型),V:view(视图),C:Controller(控制器)
mvc框架,javaweb,mvc,架构,spring,java

MVC控制流程图
   Mvc的处理过程是由控制器是接收业务请求,并决定调用那个模型来进行处理,然后模型业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过视图层呈现给用户。

层次概念

视图层:用于做数据的展示以及与用户进行交互的一个界面
控制层:能够接收客户端的请求,具体的业务功能还是需要模型组件来完成。
模型层:负责处理业务逻辑以及数据库的交互,承载数据。模型分为多种,有简单的pojo/vo(value object),有业务模型组件,以及数据访问层组件。

模型层类别:
1)pojo/vo:值对象:一个fruit类就是值对象,可以获取相应的属性数据。
mvc框架,javaweb,mvc,架构,spring,java

2)DAO:数据访问对象:连接数据库并操作相应数据库表单的DAO类

mvc框架,javaweb,mvc,架构,spring,java

3)BO: 业务对象:业务对象调用相应的数据对象进行一系列操作。
mvc框架,javaweb,mvc,架构,spring,java

区分业务对象以及数据访问对象:
1)DAO中的方法都是单精度方法或细粒度的方法,一个方法只考虑一个操作,比如添加到数据库就是insert,无需考虑其他操作的影响。
2)BO中的方法属于业务方法,实际的业务是比较复杂的,因此业务方法粒度是比较粗的。service层的业务实现,具体要调用已经定义的dao层接口,封装service层业务逻辑有利于通用的业务逻辑的独立性和重复利用性。程序显得非常简洁。
   例如账户注册这个功能属于业务功能,因此注册这个方法属于业务方法。
那么这个业务方法就包含了许多DAO方法,也就是说注册这个业务功能需要通过多个DAO方法的组合进行调用,从而完成注册功能的实现。
注册:
1、检查用户名是否被注册-DAO中的select操作
2、向用户表新增一条新用户记录-DAO中的insert操作
3、向用户表新增一条新用户记录-DAO中的insert操作
4、向系统消息表新增一条新用户记录-DAO中的insert操作
5、向系统日志表新增一条新用户记录-DAO中的insert操作
6、。。。
简单的说DAO层是跟数据库打交道的,service层是处理一些业务流程(不仅仅包括DAO调用操作)。

MVC构建的优点

  能够将各个层次强制性分开,这样分开之后就会减少层与层之间的依赖,这样就能最大化的重用代码了。例如MVC层的话多个视图就能共享一个模型,控制器也可以连接不同的模型和视图来完成用户的需求,三个部件相互独立这种设计思想能构造好的松耦合构建。

在水果项目系统中添加实现业务层的概念

  在原来优化后的水果系统中用户发送请求的处理流程如下图所示:
mvc框架,javaweb,mvc,架构,spring,java
  用户中央控制器接收请求后直接向控制层发出命令,由控制层访问model进行一系列的DAO方法调用获取数据,最后view渲染页面。
  当日积月累的使用MVC模式开发之后,会逐渐感受到层与层之间的粘连以及模棱两可的地方存在,这就是service层出现的重要原因。业务逻辑粘连了C层以及M层,因此需要将业务逻辑解耦出来,成为独立的Service层。
  假设现在你做这个功能会用到user表和权限表,那么你前台的页面访问action,action再去调用用户模块service,用户模块service判断你是操作user表还是权限表,如果你操作的是user表则service的实现类就去调用userDAO。如果是操作的是权限表则调用权限的DAO。也就是说DAO一定是和数据库的每张表一一对应,而service则不是。


没有service层会产生的问题:
   只能在控制层直接实现业务逻辑导致多个控制器无法共享通用的业务逻辑,如果业务逻辑需要升级,则需要直接在源代码上修改兼容,会导致控制器代码不断膨胀复杂。

service层的作用:
 service是业务层,是使用一个或者多个模型执行操作的方法。
      1:封装一些通用的业务逻辑。
      2:与数据层交互。
     3:其他请求:如获取远程服务数据。

因此需构建一个业务模型来进行模型的调用,这样控制器能够更专注于模型构建的调用以及视图的处理。

package com.ck.fruit.biz.impl;
import com.ck.dao.FruitDAO;
import com.ck.fruit.biz.FruitService;
import com.ck.fruit.pojo.Fruit;
import java.util.List;
public class FruitServiceImpl implements FruitService {
    FruitDAO fruitDAO=null;
    @Override
    public List<Fruit> getFruitList(String keyword, Integer pageNo) {
        return  fruitDAO.getFruitList(keyword,pageNo);
    }
    @Override
    public void addFruit(Fruit fruit) {
        fruitDAO.addFruit(fruit);
    }
    @Override
    public Fruit getFruitById(Integer fid) {
        return fruitDAO.getFruitByFid(fid);
    }
    @Override
    public void delFruit(Integer fid) {
        fruitDAO.deleteFruit(fid);
    }
    @Override
    public Integer getPageCount(String keyword) {
        Integer fruitCount=fruitDAO.countNum(keyword);
        Integer pageCount=(fruitCount+5-1)/5;
        return pageCount;
    }
    @Override
    public void updateFruit(Fruit fruit) {
        fruitDAO.updateFruit(fruit);
    }
}

构建上述模型之后在控制器上进行业务调用即可,无需再直接再调用fruitDAO中的方法。
mvc框架,javaweb,mvc,架构,spring,java
mvc框架,javaweb,mvc,架构,spring,java
  Service层是建立在DAO层之上的,建立了DAO层后才可以建立Service层,而Service层又是在Controller层之下的,因而Service层应该既调用DAO层的接口,又要提供接口给Controller层的类来进行调用,它刚好处于一个中间层的位置。每个模型都有一个Service接口,每个接口分别封装各自的业务处理方法。

IOC

  采用MVC综合设计模式,MVC本身不属于设计模式的一种,它描述的是一种结构,最终目的达到解耦,解耦说的意思是你更改某一层代码,不会影响我其他层代码,如果你会像spring这样的框架,你会了解面向接口编程,表示层调用控制层,控制层调用业务层,业务层调用数据访问层。初期也许都是new对象去调用下一层,比如你在业务层new一个DAO类的对象,调用DAO类方法访问数据库,这样写是不对的,因为在业务层中是不应该含有具体对象,最多只能有引用,如果有具体对象存在,就耦合了。因此在层与层之间实现解耦很有必要,IOC就能实现此需求。

概念理解

  1. 耦合/依赖
    依赖指的是某某某离不开某某某
    在软件系统中,层与层之间是存在依赖的。我们也称之为耦合。
    我们系统架构或者是设计的一个原则是: 高内聚低耦合。
    层内部的组成应该是高度聚合的,而层与层之间的关系应该是低耦合的,最理想的情况0耦合(就是没有耦合)
  2. IOC - 控制反转 / DI - 依赖注入
    控制反转:
    1)在之前项目中的ControllerServlet中,我们创建了service对象,FruitService fruitservice=new FruitServiceImpl();
    如果出现在Servlet的某个方法中,那么这个fruitservice的作用域(生命周期)就是方法级别。
    如果出现在servlet类中,也就是fruitService是一个成员变量,那么这个fruitservice的作用域就是这个servlet实例级别。
    2)之后我们在applicationContext.xml中定义了这个fruitService,然后通过解析XML,产生fruitService实例,存放在beanMap中,这个beanMap在beanFactory类中产生其他类的实例。因此,我们转移(改变)了之前的service实例,DAO实例等等他们的生命周期。控制权从程序员转移到了BeanFactory。这个现象称为控制反转。

    依赖注入:
    1.之前我们在控制层出现代码:FruitService fruitService=new FruitServiceImpl(),那么,控制层与service层存在耦合.
    2.之后,我们将代码修改成FruitService fruitService=null,然后在配置文件中配置:
<bean id="fruit" class="com.ck.fruit.controllers.FruitController">
    <property name="fruitService" ref="fruitService"/>
</bean>

这样就可以通过配置中的属性找到类所需要的依赖并进行实例化,这就是注入依赖。

在水果项目系统中添加控制反转与依赖注入

  1.在原先的项目中在控制器以及service层中均存在实例化其它层的类再进行调用,这样层与层之间就存在耦合依赖的情况,因此需要对当前结构进行改进。
mvc框架,javaweb,mvc,架构,spring,javamvc框架,javaweb,mvc,架构,spring,java

  2.将需要的类先赋值为null
mvc框架,javaweb,mvc,架构,spring,javamvc框架,javaweb,mvc,架构,spring,java

   3.建立一个Beanfactory接口并创建其实现类用来构建一个MAP集合存放xml配置文件中存放的类
xml配置文件,各个bean节点对应各个类,bean中的property节点表示该bean代表的类需要依赖的类,用于后续注入依赖使用。
mvc框架,javaweb,mvc,架构,spring,java

  ClassPathXmlApplicationContext类实现beanFactory接口,将xml配置文件中的类全部通过反射映射入相应集合中:
mvc框架,javaweb,mvc,架构,spring,java

   将xml中所有的类注入集合后就要开始组装bean之间的依赖关系,通过获取bean下的property子节点,来从集合中获取相应的类实例,然后通过反射技术将相应的类中的属性赋值,注入依赖。
mvc框架,javaweb,mvc,架构,spring,java
最终实现水果系统:

mvc框架,javaweb,mvc,架构,spring,java文章来源地址https://www.toymoban.com/news/detail-741577.html

到了这里,关于MVC架构详细介绍与分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Java]JavaWeb学习笔记(动力节点老杜2022)【Javaweb+MVC架构模式完结】

    视频地址:动力节点最新JavaWeb视频教程,javaweb零基础入门到精通IDEA版https://www.bilibili.com/video/BV1Z3411C7NZ?p=1vd_source=93ab990b9131a1b90943874a5448830a 资料链接:https://pan.baidu.com/s/1y-Dm0dGjQQOvARFBmGiG1w?pwd=1234 提取码:1234 【Tomcat服务器版本与支持Java版本的对应关系:https://tomcat.apache.org/whi

    2023年04月09日
    浏览(196)
  • JavaWeb编程面试题——Spring Web MVC

    面试题==知识点,这里所记录的面试题并不针对于面试者,而是将这些面试题作为技能知识点来看待。不以刷题进大厂为目的,而是以学习为目的。这里的知识点会持续更新,目录也会随时进行调整。 关注公众号:编程火箭车 。在【粉丝福利】中点击【面题大全】,其中的

    2024年02月06日
    浏览(30)
  • JavaWeb学习|JavaBean;MVC三层架构;Filter;Listener

    实体类 JavaBean有特定的写法: 必须要有一个无参构造 属性必须私有化。 必须有对应的get/set方法 用来和数据库的字段做映射 ORM; ORM:对象关系映射 表---类 字段--属性 行记录----对象   Filter:过滤器,用来过滤网站的数据 处理中文乱码 登录验证.... 弄一个过滤器的demo 空maven+web项

    2024年02月13日
    浏览(30)
  • Spring MVC学习随笔-Spring MVC介绍

    学习视频:孙哥说SpringMVC:结合Thymeleaf,重塑你的MVC世界!|前所未有的Web开发探索之旅 概念: SpringMVC是基于Spring Framework衍生而来的MVC框架,主要解决了原有MVC框架开发过程中,控制器(Controller)的问题 SpringMVC是一个MVC框架 MVC是一个架构思想,在JavaEE开发中多用于Web开发

    2024年02月05日
    浏览(35)
  • [框架]Spring MVC框架

    目录 关于Spring MVC框架 Spring MVC框架的依赖项 使用Spring MVC框架接收请求 关于@RequestMapping注解 关于RESTful 关于@RequestParam注解 @RequestParam注解是添加在方法的参数上的,它的作用主要有:   其它 MVC : M odel + V iew + C ontroller   Spring MVC框架主要解决了接收请求、响应结果及相关问

    2024年02月11日
    浏览(34)
  • 【Spring MVC】快速学习使用Spring MVC的注解及三层架构

    💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【Spring MVC】快速学习使用Spring MVC的注解及三层架构 🎉欢迎大家点赞👍评论📝收藏⭐文章 SpringWebMVC是基于ServletAPI构建的原始Web框架,从⼀开始就包含在Spring框架中。它的正式名称“SpringWebMVC”来⾃其源模块的名称(Spri

    2024年04月17日
    浏览(32)
  • 【Spring MVC】Spring MVC的功能使用和相关注解介绍

    Spring MVC主要有三个功能: 连接 获取参数 输出数据 对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了Spring MVC。 连接的功能:将⽤户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的Spring 程序。 先创建一个SpringMVC项目,过程和SpringBoot项目创建相

    2024年02月16日
    浏览(31)
  • Spring MVC框架

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一

    2024年02月05日
    浏览(30)
  • 关于Spring MVC框架

    目录 Spring MVC框架的作用 关于控制器  关于统一处理异常的方法: 在处理异常的类中,关于处理异常的方法: Knife4j框架 添加依赖 关于Knife4j的配置类: Spring MVC框架的基础依赖项是spring-webmvc。 Spring MVC框架主要解决了接收请求、响应结果及相关的问题。 控制器(Controller)是

    2024年02月05日
    浏览(25)
  • Spring MVC学习笔记,包含mvc架构使用,过滤器、拦截器、执行流程等等

    😀😀😀创作不易,各位看官点赞收藏. Spring MVC:Spring MVC是Spring Framework的一部分,是基于java实现的MVC的轻量级Web框架。 官网文档地址:https://docs.spring.io/spring-framework/docs/4.2.4.RELEASE/spring-framework-reference/html/mvc.html 轻量级,简单易学。 高效,基于请求和响应的MVC框架。 与Spri

    2024年02月15日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包