简介
经典的三层架构
- 表现层:页面 + 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,请求我们的处理
```java
package 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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://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返回给前端