简介
经典的三层架构
- 表现层:页面 + controller
- 控制层:service
-
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的插件,这部分不必多说,直接展示代码,下面才是关键
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.wangzhi</groupId><artifactId>springmvc_demo</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><name>springmvc_demo Maven Webapp</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.3</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8080</port><path>/</path></configuration></plugin></plugins></build></project>
关键操作流程
- 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“ >
2. 创建我们的请求处理类,也就是Controller,请求我们的处理```javapackage com.wangzhi.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;import java.time.LocalDateTime;@Controller@RequestMapping("/demo")public class DemoController {@RequestMapping("/handle01")public ModelAndView handle01() {ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("date", LocalDateTime.now());modelAndView.setViewName("handle01");return modelAndView;}}
- 配置我们的前端页面 ```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}
4. 创建我们mvc的配置类,里面的内容需要包括扫描我们的controller所在的路径,以及mvc的三大核心组件:处理器适配器、处理器映射器以及视图解析器```xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--注解扫描controller所在的包--><context:component-scan base-package="com.wangzhi.controller"/><!--配置视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--前缀,用来指明前端文件所在的路径--><property name="prefix" value="/WEB-INF/jsp/"/><!--后缀,用来指明前端文件的后缀--><property name="suffix" value=".jsp"/></bean><!--自动注册最合适的处理器适配器和处理器映射器--><mvc:annotation-driven/></beans>
- 将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“ >
```
Spring MVC的请求流程解析
流程解析:
- 前端发起请求到DispatcherServlet,也就是前端控制器,这里要注意前端控制器只是做一个转发的作用,类似于协调商,不做具体的处理
- DispatcherServlet会将请求发给处理器映射器,处理器映射器会根据具体的请求找到具体的handler,生成处理器对象和处理器拦截器一并返回给前端控制器
- 前端控制器会根据handler发给处理器适配器,由处理器适配器去调用handler,之后handler执行完成后会返回ModelAndView给前端控制器,ModelAndView是MVC框架的一个底层对象,包括Model和View
- 前端控制器拿到ModelAndView去发给视图解析器去进行解析,之后会返回view给前端控制器
- 前端控制器拿到View回去进行试图渲染,也就是将数据模型填充到request域中
- 将最终的view返回给前端
