1、SpringMVC简单介绍与使用

277 阅读4分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

1、回顾MVC架构

1.1 MVC三层是什么?

MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。就是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式,MVC 是一种架构模式。当然不同的MVC存在差异。

image.png

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模式: image.png DispatcherServlet(前端控制器): Spring的web框架围绕DispatcherServlet设计。 DispatcherServlet的作用是将请求分发到不同的处理器。Spring MVC框架像许多其他MVC框架一样, 以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet基类)。

2.3 SpringMVC的具体执行流程:

当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据 库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返 回给中心控制器,再将结果返回给请求者。

image.png 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拿到页面地址之后,转发到具体的页面