简介

经典的三层架构

  • 表现层:页面 + controller
  • 控制层:service
  • dao层:数据访问层,包括mapper

    MVC的模式

  • M:Model,模型,包括了数据库实体对应和业务模型(业务逻辑)

  • V:View,视图,页面
  • C:Controller,控制器,servlet等

    关系

    MVC模式是三层架构中的表现层,如何理解呢?其实就是页面与控制器进行交互的方式与内容就是数据模型。

    概念

    Spring MVC是一个基于Java实现了MVC设计模式的请求驱动类型的轻量级的Web框架,属于Spring Framework的后续产品。

    Spring MVC与普通Servlet的区别

    普通的Servlet与前端的交互:前端发起请求到Servlet,由Servlet来进行处理,不同类型的请求可能对于不同的Servlet,比如说用户请求、订单请求、商品请求等等。

那Spring MVC是如何做的呢?Spring MVC是利用自己已经声明的Servlet也就是DispatcherServlet,来处理客户端的全部请求,但是它本身不进行任何的处理,你可以将它当做是一个分发器,它接受请求,根据请求的路由来转发到不同的Java类,只不过这里的Java要做一些处理,比如说要使用注解声明呀等等,这个具体的细节后面研究流程的时候说。

那这样看的话,Spring MVC就是对Servlet的一个封装,简化了我们的Servlet的开发,主要的功能由两点:

  • 接受请求
  • 返回数据,跳转页面

其实这不仅仅是Spring MVC的功能,也是所有的表现层框架要实现的功能,表现层框架的职责就是处理请求,返回响应。

SpringMVC的开发流程

http://localhost:8080/demo/handle01 使用该请求,来返回服务器的当前时间,操作的一个流程:
从常见Web项目开始,引入Springmvc的jar包,配置tomcat的插件,这部分不必多说,直接展示代码,下面才是关键

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.wangzhi</groupId>
  6. <artifactId>springmvc_demo</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <packaging>war</packaging>
  9. <name>springmvc_demo Maven Webapp</name>
  10. <!-- FIXME change it to the project's website -->
  11. <url>http://www.example.com</url>
  12. <properties>
  13. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  14. <maven.compiler.source>11</maven.compiler.source>
  15. <maven.compiler.target>11</maven.compiler.target>
  16. </properties>
  17. <dependencies>
  18. <dependency>
  19. <groupId>junit</groupId>
  20. <artifactId>junit</artifactId>
  21. <version>4.11</version>
  22. <scope>test</scope>
  23. </dependency>
  24. <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
  25. <dependency>
  26. <groupId>org.springframework</groupId>
  27. <artifactId>spring-webmvc</artifactId>
  28. <version>5.3.3</version>
  29. </dependency>
  30. </dependencies>
  31. <build>
  32. <plugins>
  33. <plugin>
  34. <groupId>org.apache.tomcat.maven</groupId>
  35. <artifactId>tomcat7-maven-plugin</artifactId>
  36. <version>2.2</version>
  37. <configuration>
  38. <port>8080</port>
  39. <path>/</path>
  40. </configuration>
  41. </plugin>
  42. </plugins>
  43. </build>
  44. </project>

关键操作流程

  1. web.xml中配置前端控制器,也就是配置Servlet,类是DispatcherServlet,也就是我们Spring MVC请求统一处理的控制器,还需要配置mapping,也就是拦截的请求
    ```xml <!DOCTYPE web-app PUBLIC “-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN” “http://java.sun.com/dtd/web-app_2_3.dtd“ >

Archetype Created Web Application

springmvc org.springframework.web.servlet.DispatcherServlet springmvc /

  1. 2. 创建我们的请求处理类,也就是Controller,请求我们的处理
  2. ```java
  3. package com.wangzhi.controller;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.servlet.ModelAndView;
  7. import java.time.LocalDateTime;
  8. @Controller
  9. @RequestMapping("/demo")
  10. public class DemoController {
  11. @RequestMapping("/handle01")
  12. public ModelAndView handle01() {
  13. ModelAndView modelAndView = new ModelAndView();
  14. modelAndView.addObject("date", LocalDateTime.now());
  15. modelAndView.setViewName("handle01");
  16. return modelAndView;
  17. }
  18. }
  1. 配置我们的前端页面 ```java <%— Created by IntelliJ IDEA. User: Administrator Date: 2021/2/20 Time: 22:49 To change this template use File | Settings | File Templates. —%> <%@ page contentType=”text/html;charset=UTF-8” language=”java” isELIgnored=”false” %> 当前的服务器时间为:${date}
  1. 4. 创建我们mvc的配置类,里面的内容需要包括扫描我们的controller所在的路径,以及mvc的三大核心组件:处理器适配器、处理器映射器以及视图解析器
  2. ```xml
  3. <?xml version="1.0" encoding="UTF-8"?>
  4. <beans xmlns="http://www.springframework.org/schema/beans"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xmlns:mvc="http://www.springframework.org/schema/mvc"
  7. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  8. xsi:schemaLocation="http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context.xsd
  12. http://www.springframework.org/schema/mvc
  13. http://www.springframework.org/schema/mvc/spring-mvc.xsd
  14. ">
  15. <!--注解扫描controller所在的包-->
  16. <context:component-scan base-package="com.wangzhi.controller"/>
  17. <!--配置视图解析器-->
  18. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  19. <!--前缀,用来指明前端文件所在的路径-->
  20. <property name="prefix" value="/WEB-INF/jsp/"/>
  21. <!--后缀,用来指明前端文件的后缀-->
  22. <property name="suffix" value=".jsp"/>
  23. </bean>
  24. <!--自动注册最合适的处理器适配器和处理器映射器-->
  25. <mvc:annotation-driven/>
  26. </beans>
  1. 将mvc的配置类写去web.xml中,启动的时候加载,由前端控制器去加载 ```xml <!DOCTYPE web-app PUBLIC “-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN” “http://java.sun.com/dtd/web-app_2_3.dtd“ >

Archetype Created Web Application

springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc.xml springmvc /

```

Spring MVC的请求流程解析

流程解析:

  1. 前端发起请求到DispatcherServlet,也就是前端控制器,这里要注意前端控制器只是做一个转发的作用,类似于协调商,不做具体的处理
  2. DispatcherServlet会将请求发给处理器映射器,处理器映射器会根据具体的请求找到具体的handler,生成处理器对象和处理器拦截器一并返回给前端控制器
  3. 前端控制器会根据handler发给处理器适配器,由处理器适配器去调用handler,之后handler执行完成后会返回ModelAndView给前端控制器,ModelAndView是MVC框架的一个底层对象,包括Model和View
  4. 前端控制器拿到ModelAndView去发给视图解析器去进行解析,之后会返回view给前端控制器
  5. 前端控制器拿到View回去进行试图渲染,也就是将数据模型填充到request域中
  6. 将最终的view返回给前端