目录
1.3 创建一个SpringMVC Web项目-详细步骤如下截图
1.3.2 为这个空工程添加一个SpringMVC Web模块
1.3.3 添加完SpringMVC Web模块之后的初始的Web项目示意图
1.4 在刚才创建好的SpringMVC Web中实现功能:前后端打通
1.4.1 在main目录下创建一个java源代码目录和resources资源目录
1.4.2 在pom.xml文件中配置SpringMVC和Servlet依赖
1.4.3 在web.xml文件中注册中央处理器DispatchServlet
1.4.4 在java包中写具体的控制器: MyController(some.do请求的doSome处理器与other.do请求的doOther处理器)
1.4.5 在springmvc.xml文件中配置组件扫描器和视图解析器
1.4.6 在WEB-INF工程目录下创建jsp视图:show.jsp和other.jsp
1.5.1 SpringMVC对前端请求的处理流程-源码分析
注:
(1)本套SpringMVC学习专题来自于B站动力节点视频:https://www.bilibili.com/video/BV1sk4y167pD?p=1
(2)专题内容概览如下截图:
1、第一章:SpringMVC概述
1.1 SpringMVC简介
SpringMVC 也叫 Spring web mvc,是 Spring 框架的一部分,是在 Spring3.0 后发布的。
1.2 SpringMVC优点
(1)基于 MVC 架构:基于 MVC 架构,功能分工明确,解耦合。
(2)容易理解,上手快,使用简单:学习完Spring就可以开发一个注解的 SpringMVC 项目,SpringMVC 也是轻量级的, jar 很小。不依赖的特定的接口和类。
(3)作为 Spring 框架一部分,能够使用 Spring 的 IoC 和 Aop:方便整合 Strtus,MyBatis,Hiberate,JPA 等其他框架。
(4)SpringMVC 强化注解的使用,在控制器,Service,Dao 都可以使用注 解,方便灵活。
使用@Controller 创建处理器对象,@Service 创建业务对象,@Autowired 或者@Resource 在控制器类中注入 Service,Service 类中注入 Dao。
1.3 创建一个SpringMVC Web项目-详细步骤如下截图
1.3.1 创建一个空工程
1.3.2 为这个空工程添加一个SpringMVC Web模块
1.3.3 添加完SpringMVC Web模块之后的初始的Web项目示意图
1.4 在刚才创建好的SpringMVC Web中实现功能:前后端打通
1.4.0 需求与实现步骤
1.4.1 在main目录下创建一个java源代码目录和resources资源目录
1.4.2 在pom.xml文件中配置SpringMVC和Servlet依赖
<?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.wind</groupId>
<artifactId>springmvc-web</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<!--注册站点用,默认生成的,暂时用不到-->
<name>springmvc-web 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>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--添加servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--添加SpringMVC依赖,会自动把里面整合的Spring依赖添加进来-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>springmvc-web</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- 编码和编译和JDK版本 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
1.4.3 在web.xml文件中注册中央处理器DispatchServlet
(1)web.xml文件中web依赖的约束版本太低,更换成功能强大的高版本:
(2)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">
<!--
注册SpringMVC的核心对象DispatcherServlet,需要在Tomcat服务器启动的时候创建一个DispatcherServlet实例对象。
为什么要创建DispatcherServlet对象实例呢?
因为在创建DispatcherServlet对象实例的时候,会创建SpringMVC容器对象,也即会读取SpringMVC的配置文件,把这个配置文件
中声名的bean对象都创建好,这样的话,当用户发起请求时就可以直接这些对象来处理ajax请求了。
servlet的初始化方法init(),DispatcherServlet对象的创建在这个init方法中:
{
//读取配置文件,创建SpringMVC的Web容器
WebApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml");
//把容器对象放到ServletContext对象中
getServletContext().setAttribute("key", ctx);
}
测试:启动Tomcat的时候报了一个错:Could not open ServletContext resource [/WEB-INF/springMVC-servlet.xml]
-->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--自定义SpringMVC读取的配置文件:
(1)contextConfigLocation:SpringMVC配置文件位置的属性
(2)classpath:指定SpringMVC配置文件的位置
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--Tomcat服务器启动后,就开始创建该SpringMVC容器对象。值是一个大于等于的0的整数,值越小,说明被创建的时间越早。-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--解释url-pattern:
在使用框架的时候,url-pattern可以有两种取值:
(1)使用扩展名的方式,语法:*.xxx,其中的xxx是自定义的扩展名,比如:*.action,*.do,*.mvc
此时针对它们有效:
http://localhost:8008/springmvc-web/*.do
http://localhost:8008/springmvc-web/*.action
http://localhost:8008/springmvc-web/*.mvc
(2)使用斜杠 / :代表所有类型的路由类型
-->
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
1.4.4 在java包中写具体的控制器: MyController(some.do请求的doSome处理器与other.do请求的doOther处理器)
package com.wind.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* @Controller 用来创建一个控制器对象,并且存储在SpringMVC容器中,通过这个控制器对象来处理前端请求。
* 位置:在类的上面
* 功能:能够处理前端发起的HTTP请求。能够处理请求的都是控制器(处理器),MyController能够处理请求,叫做后端控制器。
*/
@Controller
public class MyController {
/**
* 在SpringMVC中,使用方法来处理前端请求。方法是自定义的,可以有多种参数,多种返回值。
* ModelAndView:使用SpringMVC框架中自带的视图类。
* (1)在类中添加数据,以便在视图中展示:
* 比如:modelAndView.addObject("fun", "doSome处理器");
* (2)在类中添加视图,读取之前在类中添加好的数据:
* 比如:modelAndView.setViewName("show");
*/
@RequestMapping(value = "/some.do")
public ModelAndView doSome() {
System.out.println("处理some.do这个请求了");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", "使用注解的SpringMVC应用项目");
modelAndView.addObject("fun", "doSome处理器");
modelAndView.setViewName("show");
return modelAndView;
}
@RequestMapping(value = "/other.do")
public ModelAndView doOther() {
System.out.println("处理other.do这个请求了");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", "使用注解的SpringMVC应用项目");
modelAndView.addObject("fun", "doOther处理器");
modelAndView.setViewName("other");
return modelAndView;
}
}
1.4.5 在springmvc.xml文件中配置组件扫描器和视图解析器
<?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 http://www.springframework.org/schema/context/spring-context.xsd">
<!--声名组件扫描器-->
<context:component-scan base-package="com.wind"/>
<!--视图解析器:添加前缀和后缀。
SpringMVC框架为了避免对于请求资源路径与扩展名上的冗余,在视图解析器 InternalResouceViewResolver
中引入了请求的前辍与后辍。而 ModelAndView 中只需给出要跳转页面的文件名即可,对于具体的文件路径与文件扩展名,
视图解析器会自动完成拼接。-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--视图文件的路径-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--视图文件的扩展名-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
1.4.6 在WEB-INF工程目录下创建jsp视图:show.jsp和other.jsp
<%--
Created by IntelliJ IDEA.
Date: 2021/1/1
Time: 12:22
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>/WEB-INF/jsp/show.jsp从request作用域中myController控制器获取的处理结果</h3>
<h3>msg数据是:${msg}</h3>
<h3>fun数据是:${fun}</h3>
</body>
</html>
<%--
Created by IntelliJ IDEA.
Date: 2021/1/1
Time: 12:22
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>/WEB-INF/jsp/other.jsp从request作用域中myController控制器获取的处理结果</h3>
<h3>msg数据是:${msg}</h3>
<h3>fun数据是:${fun}</h3>
</body>
</html>
1.4.7 前面的操作完成后最终的项目结构图
1.4.8 前后端测试
1.5 使用SpringMVC框架对web请求的处理流程
1.5.1 SpringMVC对前端请求的处理流程-源码分析
【IntelliJ IDEA for macOS 快速显示一个类中的所有方法快捷键:command + 7】
1.5.2 WEB-INF目录解释
(1)WEB-INF目录下资源对用户来说都是不开放的,也即用户不可直接访问。
(2)因此,通常情况下,会把用户访问的页面资源,比如show.jsp这个页面放在WEB-INF/jsp目录下。
(3)同时,在开发时,在sppringmvc.xml文件中配置一个视图解析器,用来给视图添加前缀和后缀,以减少冗余代码编写。
<?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 http://www.springframework.org/schema/context/spring-context.xsd">
<!--声名组件扫描器-->
<context:component-scan base-package="com.wind"/>
<!--视图解析器:添加前缀和后缀。
SpringMVC框架为了避免对于请求资源路径与扩展名上的冗余,在视图解析器 InternalResouceViewResolver
中引入了请求的前辍与后辍。而 ModelAndView 中只需给出要跳转页面的文件名即可,对于具体的文件路径与文件扩展名,
视图解析器会自动完成拼接。-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--视图文件的路径-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--视图文件的扩展名-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
1.6 SpringMVC的MVC组件
1.6.1 SpringMVC执行流程的流程图
1.6.2 SpringMVC执行流程的简单分析
(1)浏览器提交请求到中央调度器。
(2)中央调度器直接将请求转给处理器映射器。
(3)处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行链后返回给中央调度器。
(4)中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器。
(5)处理器适配器调用执行处理器。
(6)处理器将处理结果及要跳转的视图封装到一个对象 ModelAndView 中,并将其返回给处理器适配器。
(7)处理器适配器直接将结果返回给中央调度器。
(8)中央调度器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象。
(9)视图解析器将封装了的视图对象返回给中央调度器。
(10)中央调度器调用视图对象,让其自己进行渲染,即进行数据填充,形成 响应对象。
(11)中央调度器响应浏览器。