MVC 模式,全称为 Model-View-Controller(模型-视图-控制器)模式,它是一种软件架构模式,其目标是将软件的用户界面(即前台页面)和业务逻辑分离,使代码具有更高的可扩展性、可复用性、可维护性以及灵活性。
MVC 模式将应用程序划分成模型(Model)、视图(View)、控制器(Controller)等三层,如下图所示:
分层 | 描述 |
---|---|
Model(模型) | 它是应用程序的主体部分,主要由以下 2 部分组成: 实体类 Bean:专门用来存储业务数据的对象,它们通常与数据库中的某个表对应,例如 User、Student 等。业务处理 Bean:指 Service 或 Dao 的对象,专门用于处理业务逻辑、数据库访问。一个模型可以为多个视图(View)提供数据,一套模型(Model)的代码只需写一次就可以被多个视图重用,有效地减少了代码的重复性,增加了代码的可复用性。 |
View(视图) | 指在应用程序中专门用来与浏览器进行交互,展示数据的资源。在 Web 应用中,View 就是我们常说的前台页面,通常由 HTML、JSP、CSS、JavaScript 等组成。 |
Controller(控制器 | 通常指的是,应用程序的 Servlet。它负责将用户的请求交给模型(Model)层进行处理,并将 Model 层处理完成的数据,返回给视图(View)渲染并展示给用户。在这个过程中,Controller 层不会做任何业务处理,它只是 View(视图)层和 Model (模型)层连接的枢纽,负责调度 View 层和 Model 层,将用户界面和业务逻辑合理的组织在一起,起粘合剂的效果。 |
和 MVC 模式类似,三层架构同样将系统划分成了 3 层:
虽然三层架构和 MVC 模式一样,都是将应用划分成了 3 层,但它们的划分方式是不同的。
下图展示了三层架构的划分方式,我们可以很清楚地分辨出它与 MVC 模式的不同。
从上图可以看出,三层架构是由表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三个层次构成的,而 MVC 则是由视图(View)层、控制(Controller)层以及模型(Model)层,且它们之间并不是一一对应的。
三层架构将应用中的各个模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)等三层,各层之间采用接口相互访问,并通过实体类作为数据传递的载体。不同的实体类一般对应于数据库中不同的数据表,且实体类的属性与数据库表的字段名一一对应 。
从上面的划分方式来看,三层架构和 MVC 模式确实是不一样的,但从它们的核心来看,两者又是一样的,它们的核心都是“分层、解耦”。
MVC 的工作流程如下:
MVC 模式具有以下优点:
MVC 模式存在以下不足之处:
SpringMVC 是一种基于 Java 实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,它和 Struts2 都属于表现层的框架,属于 Spring FrameWork 的后续产品,Spring MVC 分离了控制器、模型对象、过滤器以及处理程序对象的角色,这种分离让它们更容易进行定制。
SpringMVC 已经成为目前最主流的 MVC 框架之一,并且随着 Spring3.0 的发布,全面超越 Struts2,成 为最优秀的 MVC 框架,它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持 RESTful 编程风格的请求。
SpringMVC是一种基于Java实现MVC模型轻量级框架, 底层基于Servlet封装。
在pom.xml中添加 Maven 依赖。
org.springframework spring-webmvc 5.2.1.RELEASE
javax.servlet javax.servlet-api 3.1.0 provided
package com.qizekj.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;
import java.util.Map;/*** @author chenqun* @date 2023/3/18 13:03*/
@Controller
public class QizekjController {/*** 1.@Controller作用:需要在我们的类上加上@Controller注解 标记该类是为springmvc控制类* 2. @RequestMapping:定义url映射* 3. @ResponseBody:该接口返回我们的json数据*//*** 访问到该请求 返回json数据* @return*/
// @RequestMapping("/getQizekj")
// @ResponseBody
// public Map getQizekj() {
// HashMap result = new HashMap<>();
// result.put("code", "200");
// result.put("msg", "ok");
// //访问该接口的 返回json数据
// return result;
// }@RequestMapping("/getQizekj")@ResponseBodypublic String getQizekj() {return "{code:'200',msg:'ok'}";}}
package com.qizekj.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;/*** @author chenqun* @date 2023/3/18 13:07*/
@Configuration
@ComponentScan("com.qizekj.controller")
public class SpringMVCConfig {/*** 1.@Configuration 定义SpringMVCConfig.xml配置文件* 2.需要将我们的控制类注入到ioc容器 @ComponentScan("com.qizekj.springmvc")* @ComponentScan("com.qizekj.springmvc")将该包下所有的类 注入到IOC容器种* 3.在springmvc原理 所有请求过来先达到DispatcherServlet 分发具体控制类 方法执行*/
}
package com.qizekj.config;import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;/*** @author chenqun* @date 2023/3/18 13:09*/
public class ServletInitializer extends AbstractDispatcherServletInitializer {@Overrideprotected WebApplicationContext createServletApplicationContext() {// 注册我们的 springmvc config 配置类AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext= new AnnotationConfigWebApplicationContext();annotationConfigWebApplicationContext.register(SpringMVCConfig.class);return annotationConfigWebApplicationContext;}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}@Overrideprotected WebApplicationContext createRootApplicationContext() {return null;}
}
org.apache.tomcat.maven tomcat8-maven-plugin 3.0-r1655215 85 / true
alfresco-public https://artifacts.alfresco.com/nexus/content/groups/public alfresco-public-snapshots https://artifacts.alfresco.com/nexus/content/groups/public-snapshots true daily beardedgeeks-releases http://beardedgeeks.googlecode.com/svn/repository/releases
http://localhost:8081/getQizekj
org.springframework spring-webmvc 5.2.1.RELEASE
javax.servlet javax.servlet-api 3.1.0 provided
package com.qizekj.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** @author chenqun* @date 2023/3/18 15:51*/
@Controller
public class QizekjController {/*** 1.@Controller作用:需要在我们的类上加上@Controller注解 标记该类是为springmvc控制类* 2. @RequestMapping:定义url映射* 3. @ResponseBody:该接口返回我们的json数据*//*** 访问到该请求 返回json数据* @return*/@RequestMapping("/getQizekj")@ResponseBodypublic String getQizekj() {return "{code:'200',msg:'ok'}";}
}
dispatcherServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring-mvc.xml 1 dispatcherServlet /
下一篇:蚂蚁一面面试经历