SpringMVC概述

news2024/11/19 11:20:20

在这里插入图片描述

SpringMVC概述

      • 1. SpringMVC概述
        • 1.1 SpringMVC概述
      • 2. 入门案例【重点】
        • 2.1 实现步骤
        • 2.2 代码实现
          • 【第一步】创建web工程(Maven结构)
          • 【第二步】设置tomcat服务器,加载web工程
          • 【第三步】导入坐标(SpringMVC+Servlet)
          • 【第四步】定义处理请求的功能类(UserController)
          • 【第五步】编写SpringMVC配置类,加载处理请求的Bean。
          • 【第六步】加载SpringMVC配置,并设置SpringMVC请求拦截的路径
        • 2.3 运行结果
        • 2.4 案例注解和类解析
          • 2.4.1 @Controller注解
          • 2.4.2 @RequestMapping注解
          • 2.4.3 @ResponseBody注解
          • 2.4.4 AbstractDispatcherServletInitializer类
        • 2.5 入门程序开发总结(1+N)
      • 3. 入门案例工作流程分析
        • 3.1 启动服务器初始化过程
        • 3.2 单次请求过程
      • 4. Controller加载控制
        • 4.1 Controller加载控制与业务bean加载控制
        • 4.2 Spring相关bean加载控制
        • 4.3 Bean的加载格式
      • 5. PostMan【工具】
        • 5.1 PostMan介绍
        • 5.2 PostMan安装
        • 5.3 PostMan的使用
          • 5.3.1 创建WorkSpace工作空间
          • 5.3.2 发送请求获取json数据
          • 5.3.3 保存当前请求

1. SpringMVC概述

1.1 SpringMVC概述

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

image-20210804185234370

2. 入门案例【重点】

问题导入

在Controller中如何定义访问路径,如何响应数据?

2.1 实现步骤

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

2.2 代码实现

【第一步】创建web工程(Maven结构)
【第二步】设置tomcat服务器,加载web工程
<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>
【第三步】导入坐标(SpringMVC+Servlet)
<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>

注意事项:

  1. 基于Spring主版本5.2.10.RELEASE制作
  2. 导入spring-webmvc坐标自动依赖spring相关坐标
【第四步】定义处理请求的功能类(UserController)
//定义表现层控制器bean
@Controller
public class UserController {
    //设置映射路径为/save,即外部访问路径
    @RequestMapping("/save")
    //设置当前操作返回结果为指定json数据(本质上是一个字符串信息)
    @ResponseBody
    public String save(){
        System.out.println("user save ...");
        return "{'info':'springmvc'}";
    }
}

注意事项:

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

【第五步】编写SpringMVC配置类,加载处理请求的Bean。
//springmvc配置类,本质上还是一个spring配置类
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
【第六步】加载SpringMVC配置,并设置SpringMVC请求拦截的路径
//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
    //加载springmvc配置类,产生springmvc容器(本质还是spring容器)
    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;
    }
}

2.3 运行结果

image-20210804191218260

2.4 案例注解和类解析

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

注意:其实@RequestMapping注解还可以写到类上面,笔记后面会介绍到。

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

2.5 入门程序开发总结(1+N)

  • 一次性工作
    • 创建工程,设置服务器,加载工程
    • 导入坐标
    • 创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径
    • SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean)
  • 多次工作
    • 定义处理请求的控制器类
    • 定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody)

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

3.1 启动服务器初始化过程

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

image-20210804193122709

3.2 单次请求过程

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

image-20210804193327981

4. Controller加载控制

问题导入

因为功能不同,如何避免Spring错误的加载到SpringMVC的bean?

4.1 Controller加载控制与业务bean加载控制

  • SpringMVC相关bean(表现层bean)

  • Spring控制的bean

    1. 业务bean(Service)

    2. 功能bean(DataSource等)

  • SpringMVC相关bean加载控制

    1. SpringMVC加载的bean对应的包均在com.itheima.controller包内
  • Spring相关bean加载控制

    1. 方式一:Spring加载的bean设定扫描范围为com.itheima,排除掉controller包内的bean
    2. 方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
    3. 方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中

4.2 Spring相关bean加载控制

方式一代码实现

  • 名称:@ComponentScan
  • 类型:类注解
  • 范例
@Configuration
@ComponentScan(value = "com.itheima",
               excludeFilters = @ComponentScan.Filter(
                   type = FilterType.ANNOTATION,
                   classes = Controller.class
               )
              )
public class SpringConfig {
}
  • 属性
    1. excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)与具体项(classes)
    2. includeFilters:加载指定的bean,需要指定类别(type)与具体项(classes)

4.3 Bean的加载格式

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { 
    protected WebApplicationContext createServletApplicationContext() { 
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringMvcConfig.class);
        return ctx;  
    }   
    protected WebApplicationContext createRootApplicationContext() {  
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();      
        ctx.register(SpringConfig.class);        
        return ctx;  
    }   
    protected String[] getServletMappings() { 
        return new String[]{"/"}; 
    }
}

简化格式

public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class}
    };
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }
}

5. PostMan【工具】

image-20210804194708518

5.1 PostMan介绍

  • Postman是一款功能强大的网页调试与发送网页HTTP请求的软件。
  • 作用:常用于进行接口测试
  • 特征
    • 简单
    • 实用
    • 美观
    • 大方

5.2 PostMan安装

双击官网下载的“Postman-win64-8.3.1-Setup.exe”即可自动按照,打开之后需要注册,如果底部有如下链接,可以点击跳过注册

image-20210804194952058

5.3 PostMan的使用

5.3.1 创建WorkSpace工作空间

image-20210805150044862

5.3.2 发送请求获取json数据

image-20210805150206831

5.3.3 保存当前请求

image-20210805150417692

注意:第一次请求需要创建一个新的目录,后面就不需要创建新目录,直接保存到已经创建好的目录即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/492215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

璞华助力“数字人社”,为成都市人社数字化建设提供多方位的产品与技术支持!

新的时期&#xff0c;人力资源和社会保障事业进入新一轮的制度创新和加快发展阶段。把对各项人力资源和社会保障业务的支持和服务纳入信息化建设&#xff0c;通过 “数字人社”信息化建设项目&#xff0c;是充分利用新一代信息技术&#xff0c;有效整合各类信息资源&#xff0c…

ChatGPT背后的打工人:你不干,有的是AI干

AI“出圈” 如今&#xff0c;数字技术发展速度惊人&#xff0c;AI提高了社会生产效率&#xff0c;更真切地冲击到原有的生产秩序。 年初AI技术的爆发&#xff0c;让国内看到了进一步降本增效的希望。 国内多家互联网企业相继推出类ChatGPT产品&#xff0c;复旦大学邱锡鹏教授…

清洁赛道新势力,米博凭“减法”突围?

在五四青年节这个特殊的日子&#xff0c;方太旗下的高端智能清洁品牌“米博”发布了新一代无滚布洗地机7系列。 5月4日晚&#xff0c;米博以“减法生活&#xff0c;净请7代”为主题&#xff0c;举办了新品发布会。在发布会上&#xff0c;从小红书翻红的董洁作为方太集团米博产…

持之以恒奖牌来啦,带你提前看~

加油&#xff0c;让我们继续持之以恒吧&#xff01;

Flutter 中使用 dart:html 的条件导入

Flutter 中使用 dart:html 的条件导入 Flutter 是一个跨平台的 UI 框架&#xff0c;可以让你用一套代码开发 Android、iOS、Web 和桌面应用。但是&#xff0c;不同的平台有不同的特性和限制&#xff0c;所以有时候你可能需要根据平台来导入不同的库或代码。这时候&#xff0c;…

社交“搭子”火了!小红书数据分析,品牌正用“陪伴”种草?

找搭子&#xff0c;年轻人在搞一种很新的社交 朋友&#xff0c;你找搭子了吗&#xff1f;近期&#xff0c;“搭子”这种新型社交关系走红&#xff0c;饭搭子、奶茶搭子、厕所搭子、旅游搭子……遍布于各式各样的场景中&#xff0c;主打的就是一个垂直细分领域的精准陪伴。“搭子…

数字化转型:制造业企业,如何创新技术并借力发展?

数字中国峰会刚刚拉开帷幕&#xff0c;紧跟一波潮流。 在这个数字技术全面升级的关口&#xff0c;企业如何进更时代步伐&#xff0c;更好完成数字化转型和升级&#xff1f; 到底什么是数字化转型&#xff1f; 我们当下所看到的很多对“数字化”的理解&#xff0c;依然是“信…

【c++修行之路】模板

模板 一般我们在实现一个函数的时候&#xff0c;都会使用模板&#xff0c;因为如果将类型写死&#xff0c;下次再使用的时候就要新写一个函数&#xff0c;尽管重载可以让名字方便&#xff0c;但每重载都要自己去写一个函数&#xff0c;这样非常麻烦&#xff0c;所以模板就是让…

025 - C++ 接口(纯虚函数)

上一期我们学习了虚函数&#xff0c;本期我们学习一种特殊的虚函数&#xff0c;纯虚函数。 C 纯虚函数本质上与其他语言中的抽象方法或接口相同&#xff0c;基本上&#xff0c;纯虚函数允许我们在基类中定义一个没有实现的函数&#xff0c;然后强制子类去实现该函数。 我们可…

uni-app获取手机号

登录微信公众平台拿到自己的AppID(小程序ID)和AppSecret(小程序密钥) 微信公众平台 1.获取手机号首先要先登录拿到code&#xff0c;用code去获取session_key 2.获取 code需要知道自己的AppID(小程序ID)和AppSecret(小程序密钥) 3.解密 uni.login({success: (loginRes) > {…

提取Windows中系统自带的图标资源

写应用程序&#xff0c;如果想使用Windows下的图标&#xff0c;可以使用Visual Studio中的图标&#xff0c;比如VS2008的ImageLibrary&#xff08;笔者已经打包上传到CSDN&#xff09;&#xff0c;也可以使用Windows系统自带的图标。 Windows系统自带了不少高质量的图标资源&a…

2019临沂中考数学解析

一、选择 考点&#xff1a; 绝对值&#xff1a;数轴上某个数与原点的距离叫做这个数的绝对值。 其中距离一定是非负的&#xff0c;即大于等于0 考点&#xff1a; 两直线平行&#xff0c;同位角相等邻补角&#xff1a; 指两条直线相交后所得的有一个公共顶点且有一条公共边的两…

一篇SEO指南:新手如何从零开始优化自己的网站

在如今的数字时代&#xff0c;拥有一个优化良好的网站对于任何企业或个人来说都是至关重要的。但是&#xff0c;对于SEO新手来说&#xff0c;如何从零开始优化自己的网站可能是一项看似艰巨的任务。在本文中&#xff0c;我们将为您提供一份SEO指南&#xff0c;帮助您了解从零开…

C++之STL顺序容器

目录 一、STL容器简介 二、顺序容器 一、STL容器简介 STL容器是一个通用的数据结构&#xff0c;可以处理不同数据类型&#xff0c;包含基本的数据结构如链表、堆栈、队列等。可以分为顺序容器、关联容器、 容器适配器、特殊容器。本篇博客将简要介绍一下STL容器中的顺序容器…

Mysql 学习(八)单表查询方法 一

单表访问方法 前面几节我们了解 innodb 的底层数据结构的设计&#xff0c;究其本源我们其实是为了更好的理解如何查询&#xff0c;并且如何使得查询语句更加快速的问题&#xff0c;这节我们就来好好讲一讲首先我们先来创建一个表 CREATE TABLE index_value_table (id INT NOT…

Redis --- 哨兵、分片集群

一、Redis哨兵 Redis提供了哨兵&#xff08;Sentinel&#xff09;机制来实现主从集群的自动故障恢复。 1.1、哨兵原理 集群结构和作用 哨兵的结构如图&#xff1a; 哨兵的作用如下&#xff1a; 监控&#xff1a;Sentinel 会不断检查您的master和slave是否按预期工作 自动故障…

mysql 排名与排序

MySQL 8.0 版本新增 两个排名函数 分别是 ROW_NUMBER() 与 RANK() 用法 SELECT ROW_NUMBER() OVER(ORDER BY id) AS rowNo, name FROM users; SELECT RANK() OVER(ORDER BY score DESC) AS rankNo, name, score FROM students;后面跟 OVER&#xff08;&#xff09;括号里…

惠普星 TP01-055ccn电脑重装系统步骤

如果你的惠普星 TP01-055ccn电脑出现了系统问题&#xff0c;或者你想更换一个全新的微软操作系统&#xff0c;自己有不清楚相关的重装系统步骤怎么办&#xff1f;别担心&#xff0c;你可以参考以下的惠普星 TP01-055ccn电脑重装系统步骤来执行。 ​ 惠普星 TP01-055ccn电脑怎…

第1章 .Net7 Areas实现

1 集成路由匹配模式 var builder WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllersWithViews(); var app builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { …

【LeetCode】376. 摆动序列

376. 摆动序列 思路 首先&#xff0c;我们可以将摆动序列分为两种&#xff1a; 「上升摆动序列」&#xff0c;当且仅当该序列是摆动序列&#xff0c;且最后一个元素呈上升趋势。如序列 [1,3,2,4] 即为「上升摆动序列」。 「下降摆动序列」&#xff0c;当且仅当该序列是摆动序…