精品专题:
01.《C语言从不挂科到高绩点》课程详细笔记
https://blog.csdn.net/yueyehuguang/category_12753294.html?spm=1001.2014.3001.5482
02. 《SpringBoot详细教程》课程详细笔记
https://blog.csdn.net/yueyehuguang/category_12789841.html?spm=1001.2014.3001.5482
03.《SpringBoot电脑商城项目》课程详细笔记
https://blog.csdn.net/yueyehuguang/category_12752883.html?spm=1001.2014.3001.5482
04.《VUE3.0 核心教程》课程详细笔记
https://blog.csdn.net/yueyehuguang/category_12769996.html?spm=1001.2014.3001.5482
================================
|| 持续分享系列教程,关注一下不迷路 ||
|| 视频教程:墨轩大楼 ||
================================
1. Spring Web MVC 简介
1.1. 什么是MVC
MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分
M:Model,模型层,指工程中的JavaBean,作用是处理数据 。
V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据。
C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器
JavaBean分为两类:
- 一类称为实体类Bean:专门存储业务数据的,如 Student、User 等 。
- 一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问。
MVC的工作流程:
- 用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller 。
- 调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果 。
- 找到相应的View视图,渲染数据后最终响应给浏览器。
1.2. 什么是Spring web MVC
Spring Web MVC 是Spring框架一个非常重要的功能模块,实现了MVC结构,便于简单、快速开发MVC结构的Web程序。Spring Web MVC 提供的API封装了Web开发中常用的功能,简化了Web过程。
SpringMVC的特点:
- Spring 家族原生产品,与IOC 容器等基础设施无缝对接
- 基于原生的Servlet ,通过了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理 .
- 表述层各细分领域需要解决的问题全方位覆盖 ,提供全面解决方案
- 代码清新简洁,大幅度提升开发效率
- 内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
- 性能卓著,尤其适合现代大型、超大型互联网项目要求
1.3. Spring MVC 入门
首先我们先来搭一个简单的SpringMVC应用,来研究一下它的运行原理。
》》首先基于IDEA创建一个web应用,在pom.xml中添加Springmvc的依赖
<dependencies>
<!-- JSTL -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- JSTL实现包 -->
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!-- 必须添加servlet依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
》》 配置前端控制器
前端控制器(DispactcherServlet)是用来集中处理请求的,它负责接收所有的请求,再将对应的请求转发到其他程序处理,然后再接收处理后的结果。最终将处理好的结果返回给浏览器,其实他就是一个中央处理器,每次请求都需要经过它。
前端控制器需要配置在web.xml中,具体代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--前端控制器将所有的请求都交给springmvc.xml 去处理-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--配置接收所有的请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
》》 创建springMVC的配置文件
SpringMVC 配置管理文件,主要用来根据不同的请求转发到对应的业务逻辑类去处理,并获取处理结果返回给前端控制器,主要配置自动扫描注解以及视图解析器,其内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置注解扫描: 扫描指定包下面所有的注解-->
<context:component-scan base-package="com.moxuan.study"></context:component-scan>
<mvc:annotation-driven/>
<!-- 配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 在/WEB-INF/view/ 目录下,寻找后缀为.jsp的文件-->
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
》》编写控制器
控制器主要作用是为了可以根据不同的URL请求进行相应的业务逻辑处理,控制器类需要创建在springmvc.xml配置的Controller包扫描路径内,这样才能被容器扫描到。
package com.moxuan.study.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MainController {
/**
* @ReuqestMapping 用于绑定客户端请求地址
* 下面的配置,当客户端发送http://127.0.0.1:8080/hello时会执行此hello方法
* @return
*/
@RequestMapping("/hello")
public ModelAndView hello(){
System.out.println("hello,you listen to me! 攀哥 is very 帅");
// 创建数据模型
ModelAndView mv = new ModelAndView();
// 向数据模型中绑定数据,
mv.addObject("msg","攀哥 show");
// 设置视图名字,用于响应用户请求
mv.setViewName("hello");
// 由于在springmvc.xml中配置了前缀和后缀
// 视图解析器会将数据发向/WEB-INF/view/hello.jsp中
// 将数据返回给视图解析器
return mv;
}
}
》》 编写视图页面
前面一步,我们将数据发送到了/WEB-INF/view/hello.jsp中,接下来我们需要编写这个hello.jsp
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
hello,攀哥真帅
<c:forEach begin="0" end="100">
<h2 style="color:red">${msg}</h2>
</c:forEach>
</body>
</html>
》》 运行效果:
2. SpringMVC的运行流程:
2.1. 流程图
2.2. 流程描述
- 浏览器向Spring发出请求,请求交给前端控制器DispatcherServlet处理。
- 控制器通过HandlerMapping找到相应的Controller组件处理请求。
- 执行Controller组件中约定的方法处理请求,在约定的方法中调用模型组件完成业务处理,约定方法可以返回一个ModelAndView对象,封装了处理结果数据和视图名称信息。
- 控制器接收ModelAndView之后,调用ViewResolver组件,定位view(例如:JSP)并传递数据信息,生成相应界面结果。
2.3. SpringMVC 核心组件
前端控制器DispatcherServlet
接收请求,响应结果,相当于转发器,中央处理器。有了dispatcherServlet减少了其它组件之间的耦合度。用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
处理器映射器HandlerMapping
根据请求的url查找Handler,HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
处理器适配器HandlerAdapter
按照特定规则(HandlerAdapter要求的规则)去执行Handler通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler通过扩展适配器可以对更多类型的处理器进行执行。
处理器Handler
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。
视图解析器ViewResolver
进行视图解析,根据逻辑视图名解析成真正的视图(view)。ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstl View、freemarker View、pdf View等。