「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」
1、回顾MVC架构
1.1 MVC三层是什么?
MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。就是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式,MVC 是一种架构模式。当然不同的MVC存在差异。
Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。
最典型的MVC就是JSP + servlet + javabean的模式。
2、SpringMVC
2.1、什么是SpringMVC?
springMVC是Spring框架的一部分,是基于java实现的一个轻量级web框架。SpringMVC框架最核心的就是DispatcherServlet的设计。
2.2 SpringMVC的实现原理
springmvc的mvc模式:
DispatcherServlet(前端控制器):
Spring的web框架围绕DispatcherServlet设计。 DispatcherServlet的作用是将请求分发到不同的处理器。Spring MVC框架像许多其他MVC框架一样, 以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet基类)。
2.3 SpringMVC的具体执行流程:
当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据 库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返 回给中心控制器,再将结果返回给请求者。
1、DispatcherServlet表示前端控制器,是整个SpringMVC的控制中心。用户发出请求, DispatcherServlet接收请求并拦截请求。
2、HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请 求url查找Handler。
3、返回处理器执行链,根据url查找控制器,并且将解析后的信息传递给DispatcherServlet
4、HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
5、执行handler找到具体的处理器
6、Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
7、HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
8、DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
9、视图解析器将解析的逻辑视图名传给DispatcherServlet。
10、DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图,进行试图渲染
11、将响应数据返回给客户端
DispatcherServlet:前端调度器
负责将请求拦截下来分发到各控制器方法中。是整个SpringMVC的控制中心。用户发出请求, DispatcherServlet接收请求并拦截请求。
HandlerMapping:处理器映射器
负责根据请求的URL和配置@RequestMapping映射去匹配, 匹配到会返回Handler(具体控制器的方法)。 DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。返回处理器执行链,根据url查找控制器,并且将解析后的信息传递给DispatcherServlet
HandlerAdaper: 处理器适配器
负责调用Handler——》具体的方法——》返回视图的名字。Handler将它封装到 ModelAndView(封装视图名,request域的数据)。
ViewReslover: 视图解析器
根据ModelAndView里面的视图名地址去找到具体的jsp封装在View对象中
View:视图
进行视图渲染(将jsp转换成html内容)最终response到的客户端。
3、基于注解的SpringMVC-Hellow
3.1 添加pom依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.1</version>
</dependency>
</dependencies>
3.2 配置web.xml文件
<!--配置前端控制器 接收所有除了.jsp的请求 都交给springmvc去处理 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--初始化参数 contextConfigLocation 配置springmvc的xml配置文件, 指定路径
也可以不配置: 会自动去WEB-INF去找一个名字叫做 springmvc-servlet.xml 的文件
启动的时候,加载 Bean等操作
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--启动时加载servlet : 当web服务器 启动时就会创建servlet(会自动调用servlet的构造函数及init()方法) -->
<load-on-startup>1</load-on-startup>
</servlet>
<!--
配置DispatcherServlet映射
通常会为springmvc映射的路径为:
/ 除了.jsp的请求都会被匹配
/* 所有的请求都会匹配
*.do 、*.action url结尾以.do或者.action的请求会匹配
/request/* 要进行约定 将jsp放在/views/ 所有的servlet请求都用/request/
-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3.3 配置springmvc需要的spring配置文件,spring-mvc.xml
<context:component-scan base-package="com.zhl.controller"></context:component-scan>
3.4 HellowController.java
@Controller
public class HellowController {
@RequestMapping("/sayHellow")
public String sayHellow(){
System.out.println("欢迎使用Hellow!");
return "/index.jsp";
}
}
上述流程如下:
1、客户端发送请求http://localhost:8080/springmMVC/sayHellow
2、由tomcat接受到对应的请求
3、SpringMVC的前端控制器DispatcherServlet接收到所有的请求
4、查看请求地址和@RequestMapping注解的哪个匹配,来找到具体的类的处理方法
5、前端控制器找到目标处理类和方法之后,执行目标方法
6、方法执行完成之后会有一个返回值,SpringMVC会将这个返回值 用视图解析器进行解析拼接成完整的页面地址
7、DispatcherServlet拿到页面地址之后,转发到具体的页面