【SpringMVC】| SpringMVC执行流程原理 | 常用注解 剥析

news2024/9/30 9:37:58

MVC目录

  • 一. 🦁 MVC模型
  • 二. 🦁 SpringMVC
    • 1. SpringMVC执行流程(重点)
      • Ⅰ. SpringMVC四大组件
      • Ⅱ. 执行流程
    • 2. @RequestMapping
    • 3. @RequestParam
    • 4. @ReuqestHeader & @CookieValue
    • 5. RESTful风格支持
      • Ⅰ. 传统 vs restful
      • Ⅱ. @PathVariable
      • Ⅲ. @PostMapping @GetMapping
      • Ⅳ. @PutMapping @DeleteMapping
    • 6. @ResponseBody
    • 7. @RestController
    • 8. @RequestBody

一. 🦁 MVC模型

MVC全称Model View Controller,是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分:

  • Model(模型):指数据模型。用于存储数据以及处理用户请求的业务逻辑。在Web应用中,JavaBean对象,业务模型等都属于Model。

  • View(视图):用于展示模型中的数据的,一般为jsp或html文件。

  • Controller(控制器):是应用程序中处理用户交互的部分。接受视图提出的请求,将数据交给模型处理,并将处理后的结果交给视图显示

image-20230414200622538

二. 🦁 SpringMVC

SpringMVC是一个基于MVC模式的轻量级Web框架,是Spring框架的一个模块,和Spring可以直接整合使用。SpringMVC代替了

Servlet技术,它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。

1. SpringMVC执行流程(重点)

面试重点!!!

Ⅰ. SpringMVC四大组件

  • DispatcherServlet:前端控制器,接受所有请求,调用其他组件。

  • HandlerMapping:处理器映射器,根据配置找到方法的执行链。

  • HandlerAdapter:处理器适配器,根据方法类型找到对应的处理器。

  • ViewResolver:视图解析器,找到指定视图。

Ⅱ. 执行流程

image-20230414202259515

  1. 客户端将请求发送给前端控制器。

  2. 前端控制器将请求发送给处理器映射器,处理器映射器根据路径找到方法的执行链,返回给前端控制器。

  3. 前端控制器将方法的执行链发送给处理器适配器,处理器适配器根据方法类型找到对应的处理器。

  4. 处理器执行方法,将结果返回给前端控制器。

  5. 前端控制器将结果发送给视图解析器,视图解析器找到视图文件位置。

  6. 视图渲染数据并将结果显示到客户端。

2. @RequestMapping

作用:给控制器方法设置请求路径

位置:方法或类上方。用于类上,表示类中的所有控制器方法都是以该地址作为父路径。

属性:

  • value/path:请求路径
  • method:指定请求方式
  • params:规定必须发送的请求参数
  • headers:规定请求必须包含的请求头

3. @RequestParam

作用:在控制器方法中获取请求参数

位置:方法参数前

属性:

  • name:指定请求参数名称
  • defaultValue: 为参数设置默认值
  • required:设置是否是必须要传入的参数
/*
  定义请求的参数名为username,默认值为sxt,不是必须的参数
 */
@RequestMapping("/annotation2")
public String annotation2(@RequestParam(name = "username",defaultValue = "sxt",required = false) String name){
  System.out.println(name);
  return "baizhan";
}

请求URL的写法:http://localhost:8080/c3/annotation2?username=bz

4. @ReuqestHeader & @CookieValue

@RequestHeader

作用:在控制器方法中获取请求头数据

位置:方法参数前

@CookieValue

作用:在控制器方法中获取Cookie数据

位置:方法参数前

/*
    获取User-Agent请求头
    获取JSESSIONID的Cookie值
   */
@RequestMapping("/annotation3")
public String annotation3(@RequestHeader("User-Agent") String userAgent, @CookieValue("JSESSIONID") String jSessionId){
  System.out.println(userAgent);
  System.out.println(jSessionId);
  return "lion";
}

image-20230414211210704

5. RESTful风格支持

RESTful风格是一种URL路径的设计风格,而每个资源都会占据一个网络路径,无论对该资源进行增删改查,访问的路径是一致的。

Ⅰ. 传统 vs restful

传统:

查找id为1的学生:

http://localhost:8080/student/findById?id=30

删除id为1的学生:

http://localhost:8080/student/deleteById?id=30

RESTful风格URL:

查找id为30的学生:

http://localhost:8080/student/30

删除id为30的学生:

http://localhost:8080/student/30

  1. 那么如何区分对该资源是哪一种操作?

通过请求方式不同,判断进行的是什么操作。

RESTful风格的URL一共有四种请求方式:

  • GET请求:查询操作

  • POST请求:新增操作

  • DELETE请求:删除操作

  • PUT请求:修改操作

  1. 优点

结构清晰、符合标准、易于理解、扩展方便。

Ⅱ. @PathVariable

作用:在RESTful风格的URL中获取占位符的值

位置:方法参数前

属性:

value:获取哪个占位符的值作为参数值,如果占位符和参数名相同,可以省略该属性。

对比 deleteStudent 和 findStudentById。

@Controller
@RequestMapping("/student")
// 模拟学生的增删改查控制器
public class StudentController {
  // 路径中的{id}表示占位符,最后会封装到方法的参数中使用
  // 删除学生
  @RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
  public String deleteStudent(@PathVariable("id") int id){
    System.out.println("删除id为"+id+"的学生");
    return "lion";
   }
    
  // 如果占位符和参数名相同,可以省略@PathVariable的value属性
  // 根据id查询学生
  @RequestMapping(value = "/{id}",method = RequestMethod.GET)
  public String findStudentById(@PathVariable int id){
    System.out.println(id);
    System.out.println("根据id查询学生");
    return "lion";
   }

    // 新增学生
  @RequestMapping(value = "/{id}",method = RequestMethod.POST)
  public String addStudent(@PathVariable int id, Student student){
    System.out.println(id);
    System.out.println(student);
    System.out.println("新增学生");
    return "lion";
   }


  // 修改学生
  @RequestMapping(value = "/{id}",method = RequestMethod.PUT)
  public String updateStudent(@PathVariable int id, Student student){
    System.out.println(id);
    System.out.println(student);
    System.out.println("修改学生");
    return "lion";
   }
}

Ⅲ. @PostMapping @GetMapping

Ⅳ. @PutMapping @DeleteMapping

作用:简化设置请求方式的@RequestMapping写法

位置:方法上方。

@Controller
@RequestMapping("/student")
public class StudentController {
  // 删除学生
  @DeleteMapping("/{id}")
  public String deleteStudent(@PathVariable("id") int id){
    System.out.println("删除id为"+id+"的学生");
    return "baizhan";
   }


  // 根据id查询学生
  @GetMapping("/{id}")
  public String findStudentById(@PathVariable int id){
    System.out.println(id);
    System.out.println("根据id查询学生");
    return "baizhan";
   }


  // 新增学生
  @PostMapping("/{id}")
  public String addStudent(@PathVariable int id, Student student){
    System.out.println(id);
    System.out.println(student);
    System.out.println("新增学生");
    return "baizhan";
   }


  // 修改学生
  @PutMapping("/{id}")
  public String updateStudent(@PathVariable int id, Student student){
    System.out.println(id);
    System.out.println(student);
    System.out.println("修改学生");
    return "baizhan";
   }
}

6. @ResponseBody

作用:方法返回的对象转换为JSON格式并将JSON数据直接写入到输出流中,使用此注解后不会再经过视图解析器。使用该注解可

以处理Ajax请求。

位置:方法上方或方法返回值前

7. @RestController

如果一个控制器类下的所有控制器方法都返回JSON格式数据且不进行跳转可以使用@RestController代替@Controller,此时每个方

法上的@ResponseBody都可以省略。

8. @RequestBody

作用:将请求中JSON格式的参数转为JAVA对象

位置:写在方法参数前

@PostMapping("/addStudent2")
@ResponseBody
public Result addStudent2(@RequestBody Student student) {
    System.out.println(student);
    // 返回添加结果
    Result result = new Result(true, "添加学生成功!");
    return result;
}

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

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

相关文章

5. Docker——先快速入门

本章讲解知识点 Docker 是什么为什么要使用 DockerDocker 引擎Docker 常用命令Docker 生命周期详解虽然我们上一章教大家搭建好了 Kubernetes + Docker 环境,但是我们本章是先从 Docker 讲起,为后面学习 Kubernetes 打好基础。 1. Docker 是什么 Docker 是一种开源的容器化…

spring5源码篇(9)——mybatis-spring整合原理

spring-framework 版本:v5.3.19 spring和mybatis的整合无非主要就是以下几个方面: 1、SqlSessionFactory怎么注入? 2、Mapper代理怎么注入? 3、为什么要接管mybatis事务? 文章目录 一、SqlSessionFactory怎么注入SqlSe…

离散数学_九章:关系(4)

9.4 关系的闭包 1、闭包(closure)的定义2、不同类型的闭包1. 自反闭包(reflexive closure)2. 对称闭包(symmetric closure)3. 传递闭包(transitive closure) 3、闭包的几个定理定理1定理2定理3 - R1∪R2定理4定理5📘例题: 4、有向图中的路径5、传递闭包1…

2000-2019年30省研发资本存量(含计算过程和原始数据)

2000-2019年30省份研发资本存量(含计算过程和原始数据)/2000-2019年30个省市R&D资本存量或研发资本存量数据 1、时间:2000-2019年 2、范围:包括30个省市不含西藏 3、指标:省研发资本存量 4、参考文献&#xff…

家用 NAS 服务器搭建 | 网络 | DNS域名解析

1、前言 使用NAS,一般除了在家里通过局域网访问,还会有外网访问的需求,即在外面通过移动网络或者其他网络访问家中的NAS。 正常情况下在外面是没有办法访问家庭网络的,甚至是nas,因为nas获取的是局域网IP,…

【Python】flask

一、Flask教程 Flask是一个免费的web框架,也是一个年轻、充满活力的小型框架,开发文档齐 全,社区活跃度高,有着众多支持者。 Flask的设计目标是实现一个WSGI的微框架, 其核心代码十分简单。 Flask框架在中小型企业中的…

pwn的kali64虚拟机环境搭建记录

自己记着备用,pwn的环境和工具 虚拟机:VMware Workstation Pro Linux版本:kali64 总参考: pwn 环境搭建(wsl/vmware) pwn入门之环境搭建 目前就装这些,以后改了再更新(但愿 安装ka…

第 4 章 HBase 进阶

第 4 章 HBase 进阶 4.1 Master 架构1)Meta 表格介绍:(警告:不要去改这个表) 4.2 RegionServer 架构1)MemStore2)WAL(预写日志)3)BlockCache 4.3 写流程2&…

使用kubeadm搭建生产环境的多master节点k8s高可用集群

环境centos 7.9 目录 1.对安装 k8s 的节点进行初始化配置 2 通过 keepalivednginx 实现 k8s apiserver 节点高可用 3、kubeadm 初始化 k8s 集群 4.扩容 k8s 控制节点,把 xuegod62 加入到 k8s 集群 5、扩容 k8s 控制节点,把 xuegod64 加入到 k8s 集群…

06_Uboot顶层Makefile分析_前期所做内容

目录 U-Boot顶层Makefile分析 版本号 MAKEFLAGS变量 命令输出 静默输出 设置编译结果输出目录 代码检查 模块编译 获取主机架构和系统 设置目标架构、交叉编译器和配置文件 调用scripts/Kbuild.include 交叉编译工具变量设置 导出其他变量 U-Boot顶层Makefile分析…

Kafka架构原理(三)

三、Kafka架构原理 3.1 整体架构图 一个典型的kafka集群中包含若干个Producer,若干个Broker,若干个Consumer,以及一个zookeeper集群; kafka通过zookeeper管理集群配置,选举leader,以及在Consumer Group发…

软件多语言文案脚本自动化方案

开发高效提速系列目录 软件多语言文案脚本自动化方案 软件多语言文案脚本自动化方案 背景目标整体方案1. 创建文案资源文件2. python脚本开发3. Python脚本执行与管理4. 人员职责分配 PyCharm使用说明1. PyCharm下载2. PyCharm安装配置3. 异常情况解决 总结 博客创建时间&…

中间件漏洞(一)CVE-2013-4547(文件名逻辑漏洞)

目录 1. 了解nginx的工作原理 2. 漏洞原理及举例分析 3. 前端php源码分析 4. 注入思路 5. 漏洞复现 5.1 上传文件并抓包分析 5.2 通过访问文件执行php 注意一点 6. 漏洞修复 1. 了解nginx的工作原理 nginx是以PHP语言为主。像Apache一样,Nginx自身是不支持解…

基于黏菌算法的极限学习机(ELM)回归预测-附代码

基于黏菌算法的极限学习机(ELM)回归预测 文章目录 基于黏菌算法的极限学习机(ELM)回归预测1.极限学习机原理概述2.ELM学习算法3.回归问题数据处理4.基于黏菌算法优化的ELM5.测试结果6.参考文献7.Matlab代码 摘要:本文利用黏菌算法对极限学习机进行优化,并…

国民技术N32G430开发笔记(15)- IAP升级 树莓派串口发送数据

IAP升级 树莓派串口发送数据 1、树莓派接入usb转串口模块后,会生成/dev/ttyUSB0节点,因为树莓派内核已经编译usb_serial以及各模块的驱动。 我们直接对ttyUSB0节点编程即可。 2、协议同上一节 cmd data_lenght data0 … datax checksum 1、获取版本…

AutoDL-GPU租用平台使用(LLM 备用)

网址:AutoDL-品质GPU租用平台-租GPU就上AutoDL 1 打开网址 查看下显卡型号及价格:A100 ( 80 G 显存) 6.68/小时 、4090(24G 显存)2.68/小时 2 创建实例 1.注册登录后进入控制台(页面右上角)&#xff0…

08 KVM虚拟机配置-总体介绍

文章目录 08 KVM虚拟机配置-总体介绍8.1 概述8.2 基本格式8.3 配置流程 08 KVM虚拟机配置-总体介绍 8.1 概述 Libvirt工具采用XML格式的文件描述一个虚拟机特征,包括虚拟机名称、CPU、内存、磁盘、网卡、鼠标、键盘等信息。用户可以通过修改配置文件,对…

【应急响应】日志自动提取分析项目ELKLogkitLogonTracerAnolog等

日志自动提取-七牛Logkit&观星应急工具 1、七牛Logkit:(Windows&Linux&Mac等) https://github.com/qiniu/logkit/ 支持的数据源(各类日志,各个系统,各个应用等) File: 读取文件中的日志数据,包…

第二章 主机规划与磁盘分区

要安装好一部Linux主机并不是那么简单的事情,你必须要针对distributions的特性、服务器软件的能力、未来的升级需求、硬件扩充性需求等等来考虑,还得要知道磁盘分区、文件系统、Linux操作较频繁的目录等等,都得要有一定程度的了解才行。 2.1…

训练CV模型常用的Tips Tricks

训练CV模型常用的Tips & Tricks主要从以下9个方面进行介绍: 图像增强更好的模型学习率和scheduler优化器正则化手段标签平滑知识蒸馏伪标签错误分析 1. 图像增强 以下列出了许多增强方式,有的甚至没见过,但是也不是每一种增强方式都是…