当前位置: 首页 > news >正文

1. SpringMVC概述与入门

1. SpringMVC简介

  1. SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
  2. 优点
    1. 使用简单,开发便捷(相比于Servlet)
    2. 灵活性强
image-20221222170559755

2. 入门案例

2.1 实现步骤分析

1 创建web工程(Maven结构)
2 设置tomcat服务器,加载web工程(tomcat插件)
3 导入坐标(SpringMVC+Servlet)
4 定义处理请求的功能类(UserController)
5 编写SpringMVC配置类,加载处理请求的Bean。
6 加载SpringMVC配置,并设置SpringMVC请求拦截的路径

2.2 代码实现

2.2.1 创建web工程(Maven结构)

image-20221222171117507

补全java源代码目录

image-20221222171504380 image-20221222171703542

2.2.2 设置tomcat服务器,加载web工程(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>

2.2.3 导入坐标(SpringMVC+Servlet)

  1. 基于Spring主版本5.2.10.RELEASE制作
  2. 导入spring-webmvc坐标自动依赖spring相关坐标
<dependencies>
    <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>

2.2.4 定义处理请求的功能类(LoginController)

package com.zhang.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
//定义表现层控制器bean
@Controller
public class LoginController {

    //设置映射路径为/login,即外部访问路径
    @RequestMapping("/login")
    @ResponseBody //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
    public String login(){

        System.out.println("登录成功");
        return "login successfully";
    }
}

注意事项:

对于SpringMVC而言,Controller方法返回值默认表示要跳转的页面,没有对应的页面就会报错。如果不想跳转页面而是响应数据,那么就需要在方法上使用@ResponseBody注解。

2.2.5 编写SpringMVC配置类,加载处理请求的Bean。

package com.zhang.config;


import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//springmvc配置类,本质上还是一个spring配置类
@Configuration
@ComponentScan("com.zhang.controller")
public class SpringMvcConfig {
}

2.2.6 加载SpringMVC配置,并设置SpringMVC请求拦截的路径

定义一个类继承AbstractDispatcherServletInitializer

package com.zhang.config;


import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {

   //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext webApplicationContext = new AnnotationConfigWebApplicationContext();
        //加载指定配置类
        webApplicationContext.register(SpringMvcConfig.class);
        return webApplicationContext;
    }
     //设置由springmvc控制器处理的请求映射路径
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //加载spring配置类
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}

运行结果

image-20221222173458063

2.3 案例注解解析

2.3.1 @Controller注解

  • 名称:@Controller
  • 类型:类注解
  • 位置:SpringMVC控制器类定义上方
  • 作用:设定SpringMVC的核心控制器bean
  • 范例
@Controller
public class UserController {
}

2.3.2 @RequestMapping注解

  • 名称:@RequestMapping
  • 类型:方法注解
  • 位置:SpringMVC控制器方法定义上方
  • 作用:设置当前控制器方法请求访问路径
  • 范例
@RequestMapping("/save")
public void save(){
    System.out.println("user save ...");
}

2.3.3 @ResponseBody注解

  • 名称:@ResponseBody
  • 类型:方法注解
  • 位置:SpringMVC控制器方法定义上方
  • 作用:设置当前控制器方法响应内容为当前返回值,无需解析
  • 范例
@RequestMapping("/save")
@ResponseBody
public String save(){
    System.out.println("user save ...");
    return "{'info':'springmvc'}";
}

2.4 案例类解析

AbstractDispatcherServletInitializer类

  • AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类

  • AbstractDispatcherServletInitializer提供三个接口方法供用户实现

    • createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围。
    //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;
    }
    
    • getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理。
    //设置由springmvc控制器处理的请求映射路径
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    
    • createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()
    //加载spring配置类
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
    

3. 入门案例工作流程分析

3.1 启动服务器初始化过程

  1. 服务器启动,执行ServletContainersInitConfig类,初始化web容器
  2. 执行createServletApplicationContext方法,创建了WebApplicationContext对象
  3. 加载SpringMvcConfig配置类
  4. 执行@ComponentScan加载对应的bean
  5. 加载LoginController,每个@RequestMapping的名称对应一个具体的方法
  6. 执行getServletMappings方法,定义所有的请求都通过SpringMVC

3.2 单次请求过程

  1. 发送请求localhost/login
  2. web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
  3. 解析请求路径/login
  4. 由/login匹配执行对应的方法login()
  5. 执行login()
  6. 检测到有@ResponseBody直接将login()方法的返回值作为响应求体返回给请求方

ing的名称对应一个具体的方法
6. 执行getServletMappings方法,定义所有的请求都通过SpringMVC

3.2 单次请求过程

  1. 发送请求localhost/login
  2. web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
  3. 解析请求路径/login
  4. 由/login匹配执行对应的方法login()
  5. 执行login()
  6. 检测到有@ResponseBody直接将login()方法的返回值作为响应求体返回给请求方

image-20221222175401420

相关文章:

  • 接口自动化测试(Python+Requests+Unittest)
  • MMIM(2021 EMNLP)分级互信息最大化
  • 万德L2接口怎样复权股票数据?
  • 动态规划|最短Hamilton路径
  • 非零基础自学Golang 第15章 Go命令行工具 15.6 性能分析 15.6.2 通过文件方式 15.6.3 通过HTTP方式 15.7 小结
  • 单机模拟主从复制(一主三从)
  • 【vue设计与实现】编译器 - AST的转换
  • 高通 OpenXR SDK 使用指南(2)
  • middlebury立体匹配评估使用方法总结(三)——线上版教程
  • 软件产品登记前需要准备什么
  • 力扣刷题笔记day7(数组中重复的数字+在排序数组中查找数字+0~n-1中缺失的数字)
  • Windows下安装VTK8.2.0
  • 带你读AI论文丨针对文字识别的多模态半监督方法
  • Docker的常规操作使用
  • 多兴趣建模中兴趣向量多样性度量
  • Java中的序列化
  • 构建高性能内存队列:Disruptor
  • 仪表盘读数识别检测 Python+yolov5
  • Ubuntu: Docker安装与操作
  • 大数据基础平台搭建-(一)基础环境准备