SpringMVC学习笔记(一)基础案例

概念

一种基于spring的表现层web框架,利用了spring框架的IoC和AOP特性,同时也提供了一些web应用程序开发所需的组件和功能。

案例

步骤:

1.创建maven项目

maven archetype选择org.apache.maven.archetypes:maven-archetype-webapp类型

2.补全目录结构

image-20230310204100895

3.导入jar包

删除pom.xml中多余的内容,添加springmvc需要的依赖

 <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/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.yuan</groupId>
   <artifactId>springmvc_01_quickstart</artifactId>
   <packaging>war</packaging>
   <version>1.0-SNAPSHOT</version>
     <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>
         <!--1.导入坐标springmvc和servlet-->
         <dependency>
           <groupId>javax.servlet</groupId>
           <artifactId>javax.servlet-api</artifactId>
           <version>3.1.0</version>
           <scope>provided</scope>
         </dependency>
         <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-webmvc</artifactId>
           <version>5.2.10.RELEASE</version>
         </dependency>
       </dependencies>
 ​
       <!--添加tomcat插件-->
       <build>
         <plugins>
           <plugin>
             <groupId>org.apache.tomcat.maven</groupId>
             <artifactId>tomcat7-maven-plugin</artifactId>
             <version>2.1</version>
             <configuration>
               <port>80</port>
               <path>/</path>
             </configuration>
           </plugin>
         </plugins>
       </build>
 </project>

tomcat是一个web应用服务器,主要功能是提供 Web 应用程序的运行环境。它可以处理 HTTP 请求并将其传递给相应的 Web 应用程序进行处理。

注意

  • 这里的springmvc,servlet和tomcat版本不能随便写,否则会起冲突。
  • servlet的坐标为什么需要添加<scope>provided</scope>?
    • scope是maven中jar包依赖作用范围的描述,
    • 如果不设置默认是compile,在编译、运行、测试时均有效
    • 如果运行有效的话就会和tomcat中的servlet-api包发生冲突,导致启动报错
    • provided代表的是该包只在编译和测试的时候用,运行的时候无效直接使用tomcat中的,就避免冲突
  • 这里项目打包方式选择war而不是jar,具体区别参考Jar和War的区别

4.创建配置类

 @Configuration
 @ComponentScan("com.itheima.controller")
 public class SpringMvcConfig {
 }

5.创建Controller类

 @Controller
 public class UserController {
     
     @RequestMapping("/save")
     public void save(){
         System.out.println("user save ...");
    }
 }

6.使用配置类替换web.xml

因为web项目需要在服务器启动,所以需要配置tomcat容器:删除web.xml,建立ServletContainersInitConfig

 public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
     //让tomcat加载springmvc配置类
     protected WebApplicationContext createServletApplicationContext() {
         //初始化WebApplicationContext对象
         AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
         //加载指定配置类
         ctx.register(SpringMvcConfig.class);
         return ctx;
    }
 ​
     //设置由springmvc控制器处理的请求映射路径
     protected String[] getServletMappings() {
         return new String[]{"/"};
    }
 ​
     //加载spring配置类
     protected WebApplicationContext createRootApplicationContext() {
         return null;
    }
 }

观察spring和springmvc配置所在的方法名的不同可以发现,root配置是spring(使用bean ioc aop基础框架功能),而springmvc承担了servlet的作用(controller)。

7.配置tomcat环境

image-20230310205049604

案例工作流程分析

image-20230310210242568

1.启动服务器初始化过程

  1. 服务器启动,执行ServletContainersInitConfig类,初始化web容器
    • 功能类似于以前的web.xml
  2. 执行createServletApplicationContext方法,创建了WebApplicationContext对象
    • 该方法加载SpringMVC的配置类SpringMvcConfig来初始化SpringMVC的容器
  3. 加载SpringMvcConfig配置类1630433335744
  4. 执行@ComponentScan加载对应的bean
    • 扫描指定包及其子包下所有类上的注解,如Controller类上的@Controller注解
  5. 加载UserController,每个@RequestMapping的名称对应一个具体的方法1630433398932
    • 此时就建立了 /save 和 save方法的对应关系
  6. 执行getServletMappings方法,设定SpringMVC拦截请求的路径规则1630433510528
    • /代表所拦截请求的路径规则,只有被拦截后才能交给SpringMVC来处理请求

2.单次请求过程

  1. 发送请求http://localhost/save
  2. web容器发现该请求满足SpringMVC拦截规则,将请求交给SpringMVC处理
  3. 解析请求路径/save
  4. 由/save匹配执行对应的方法save()
    • 上面的第五步已经将请求路径和方法建立了对应关系,通过/save就能找到对应的save方法
  5. 执行save()
  6. 检测到有@ResponseBody直接将save()方法的返回值作为响应体返回给请求方

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注