M:Model 代表模型层,作用就是处理数据,在我们SpringMVC中,分为两种Bean
V: View 代表视图层,为我们提供前端页面的显示,与用户进行交互
C:Controller 代表控制层,负责接收请求和响应服务器【Service】

MVC的工作流程:
用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器


<?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.atguigu</groupId>
<artifactId>springMVC-demo1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.1</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- ServletAPI -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- Spring5和Thymeleaf整合包 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
</dependencies>
</project>
File >> Project Structure >> 点击我们的模块 >> Web 右侧上方加号 >> 根据提示补充路径 >> 点击应用

我们知道 web.xml 一般是用来注册 Servlet 、监听器等
因为我们springMVC基于原生的Servlet,为我们提供一个功能强大的前端控制器【本身就是一个Servlet】,所以我们要到web.xml中进行注册
那我们为什要去注册?注册有什么用呢?
springMVC 为我们提供两种配置方式:
第一种为默认配置方式:对于springMVC的配置文件的位置和命名都是固定的,很不方便
<!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理 -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<!--设置springMVC的核心控制器所能处理的请求的请求路径 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
为什么此处不比配jsp文件呢?
因为jsp文件本质就是一种Servlet,应该使用特殊的Servlet去处理,而不是我们springMVC的前端控制器
为什么说默认配置不方便呢?
对于上面的这个配置文件而言,我们的配置文件的位置只能为WEB-INF目录下,文件名为springMVC-servlet.xml
第二种为扩展配置方式:在servlet标签中使用参数初始化子标签
<!--我们需要通过前端控制器Dispatcher来处理所有前端的请求,因为它是一个Servlet所以需要我们在web.xml中进行注册-->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--我们不采用默认的配置方式,因为默认的配置方式路径和配置文件命名都是固定的-->
<!--我们采用拓展的配置方式,在此给出初始化参数-->
<init-param>
<!--这个参数名值固定的,我们在前端控制器中已经配置好的-->
<param-name>contextConfigLocation</param-name>
<!--classpath 代表根路径,对应我们main下的java和resource-->
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<!--我们servlet默认是在第一次被调用的时候进行加载,为了解决第一次启动的时候加载慢
我们可以通过load-on-startup来提高启动优先级,也就是让服务器初始化的时候进行加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!--对应映射的name要与我们上面的name一致-->
<servlet-name>springMVC</servlet-name>
<!--url的模式为 /,代表会处理所有除了.jsp结尾的请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
为什么我们要提高Servlet初始化的优先级呢?
我们知道Servlet是在第一次调用的时候进行初始化的,启动过程有很多初始化操作,这些操作如果都放到第一次访问的时候去做会影响我们的访问速度,所以我们就让服务器启动的时候执行servlet的初始化工作
package com.atguigu.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author Bonbons
* @version 1.0
*/
@Controller
public class HelloController {
// 我们希望对于所有的链接 "/" 的处理走我们控制器中指定的方法,是通过@RequestMapping来完成的
@RequestMapping("/") // 此处省略了value属性
public String index(){
/*
方法名不重要,我们在前端控制器的Servlet注册配置了我们处理哪些请求
然后找到我们的控制器,我们控制器的方法对应哪种处理,我们通过方法的
返回值获得视图名称,然后到我们springMVC的核心配置文件中的视图解析
器去解析,添加上我们的前缀和后缀 >> 就获得了我们要跳转的页面
*/
return "index";
}
@RequestMapping(value = "/target")
public String toTarget(){
return "target";
}
}
<?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.atguigu.mvc.controller"/>
<!-- 配置Thymeleaf视图解析器 -->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<!--优先级-->
<property name="order" value="1"/>
<property name="characterEncoding" value="UTF-8"/>
<property name="templateEngine">
<!--内部Bean-->
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/templates/"/>
<!-- 视图后缀 -->
<property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
<property name="characterEncoding" value="UTF-8" />
</bean>
</property>
</bean>
</property>
</bean>
</beans>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>首页</h1>
<!--th 代表使用thymeleaf去解析,使用@{}包裹属性值,识别到为绝对路径后,会自动为我们添加上下文路径-->
<a th:href="@{/target}">HelloWorld</a><br/>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>Hello World!</p>
</body>
</html>
Edit Configurations >>左上角加号 >> 找到Tomcat Server >> 选择我们应用的tomcat >> 选择Deployment 进行配置 【我们通常都会选择 exploded】





点击后跳转我们的 target 页面,至此我们的第一个springMVC 项目就结束了
