[框架]Spring MVC框架

目录

关于Spring MVC框架

Spring MVC框架的依赖项

使用Spring MVC框架接收请求

关于@RequestMapping注解

关于RESTful

关于@RequestParam注解

@RequestParam注解是添加在方法的参数上的,它的作用主要有:  

其它


关于Spring MVC框架

MVCModel + View + Controller  

Spring MVC框架主要解决了接收请求、响应结果及相关问题(例如处理异常等),即主要关注C的问题,在不是前后端分离的项目,还关心V的问题,但是,并不关心M的问题。  

 Model:模型,数据处理的流程和规则。具体表现为service和mapper的整合。

 

Spring MVC框架的依赖项

Spring MVC框架的基础依赖项是:spring-webmvc  

在Spring Boot中,使用Spring MVC框架应该添加依赖项:spring-boot-starter-web  

 

使用Spring MVC框架接收请求

应该创建控制器类,并在控制器类上添加@Controller注解,在Spring MVC框架中,只有添加此注解的类才是控制器类!

默认情况下,在Spring MVC框架中,控制器处理请求的结果(方法的返回值)将被视为“视图组件的名称”,当在处理请求的方法上添加@ResponseBody注解后,返回的结果才会被视为“响应到客户端的数据”,@ResponseBody注解还可以添加在控制器类上,表示此类中所有处理请求的方法的返回结果都是“响应到客户端的数据”,这种做法称之为“响应正文”,或者,也可以将控制器类上的注解改为@RestController,它是@Controller@ResponseBody的组合注解!

包括处理异常的“全局异常处理器类”,需要添加的其实是@ControllerAdvice注解,添加此注解的类中的特定方法(例如处理异常的方法)将可以作用于每次处理请求的过程中,但是,默认情况下,仍不是“响应正文”的,所以,当处理异常需要响应正文时,需要在处理异常的方法上添加@ResponseBody注解,或在全局异常处理器的类上添加@ResponseBody注解,或将@ControllerAdvice改为@RestControllerAdvice

在控制器类上,可以自定义方法用于处理请求,关于这些方法:

  • 访问权限:应该是public

 

  • 返回值类型:当响应正文时,可自行将需要响应的数据属性封装在自定义类中,使用自定义类作为返回值类型

    • 当使用自定义类型进行响应正文时,需要:

      • 需要添加jackson-databind依赖项,在spring-boot-starter-web中已经包含

      • 需要启用Spring MVC的注解增强,如果使用XML配置(早些年用的多),需要添加<annotation-driven/>,如果使用配置类进行配置,需要在配置类上添加@EnableWebMvc注解,否则,响应时会出现406错误,在Spring Boot项目不需要手动配置

  • 方法名称:自定义

  • 参数列表:按需添加,且各参数不区分先后顺序,可以将各请求参数逐一作为参数列表中的参数,也可以将多个请求参数封装到自定义类型中,使用自定义类型作为方法参数列表中的参数,还可以按需添加HttpServletRequestHttpServletResponseHttpSession等,在使用其它技术框架后,还可以按需添加其它参数,例如结合@AuthenticationPrincipal注解添加Spring Security的当事人

  • 抛出异常:理论上,处理请求的方法不应该处理异常,而应该抛出,进而交由全局异常处理器进行处理

所有处理请求的方法都必须添加@RequestMapping系列(还有GetMapping,PostMapping等)的某个注解,通过这些注解来配置请求路径。

 

 

关于@RequestMapping注解

@RequestMapping注解的主要作用是配置请求路径,通常,在类上应该配置此注解,例如:  

@RestController
@RequestMapping("/admin")
public class AdminController {}

在方法上,建议使用限制了请求方式的某个基于@RequestMapping的注解,例如:

@RestController
@RequestMapping("/admin")
public class AdminController {
    
    @PostMapping("/login")
    public JsonResult login() {
        // ...
    }
    
    @GetMapping("/list")
    public JsonResult list() {
        // ...
    }
    
}

如果响应可能出现乱码,建议在类上的@RequestMapping上配置produces属性,以指定响应的文档类型,例如:

@RestController
@RequestMapping(value = "/admin", produces = "application/json; charset=utf-8")
public class AdminController {}

 

 

关于RESTful

RESTful是一种软件设计的风格(并不是规则或规范)。

RESTful的典型特征包括:

  •  将某些具有“唯一性”的参数值作为URL的一部分,例如:
http://localhost:9080/album/9527/delete
https://gitee.com/chengheng2022/jsd2302-csmall-server-teacher
  • 是前后端分离的,即:是响应正文的

  • 根据处理数据的方式来选择请求方式

    • 增加新的数据时,应该提交POST类型的请求

    • 修改数据时,应该提交PUT类型的请求

    • 删除数据时,应该提交DELETE类型的请求

    • 获取数据时,应该提交GET类型的请求

    • 通常不照做(因为业务的复杂性很难去界定具体使用哪一个)

Spring MVC框架很好的支持了RESTful风格,当设计URL时,如果URL中包含参数值,可以使用{自定义名称}进行占位,例如:

// http://localhost:9180/album/9527/delete
@PostMapping("/{id}/delete")
//             ↑↑↑↑ 占位符

然后,在处理请求的方法上,在对应的参数上添加@PathVariable注解,表示此参数值来自URL中同名占位符对应的值,例如:

@PostMapping("/{id}/delete")
public JsonResult delete(@PathVariable Long id) {
    // ...
}

如果占位符中的名字与参数的变量名不同,需要在@PathVariable注解上指定参数,例如:

@PostMapping("/{id}/delete")
public JsonResult delete(@PathVariable("id") Long albumId) {
    //                                ↑↑↑↑↑↑ 指定注解参数,与占位符名称一致,则方法参数的变量名已经不重要了
    // ...
}

在配置占位符名称时,可以在自定义名称的右侧添加冒号,然后,在冒号右侧添加正则表达式,以限制URL传入的值的格式,例如:

@PostMapping("/{id:[0-9]+}/delete")

经过以上配置,只有占位符位置是纯数字的请求才可以匹配上,如果占位符位置不是纯数字的请求(例如/abc/delete)则会响应404

注意:多不冲突的正则表式达的占位设计是允许共存的,例如:

@PostMapping("/{id:[0-9]+}/delete")
public JsonResult delete1() {}
@PostMapping("/{xx:[a-z]+}/delete")
public JsonResult delete2() {}

9527/delete的请求就走delete1,abcd/delete的请求就走delete2,彼此不冲突。 

另外,如果还有某个配置没有使用占位符的设计,也是允许与以上设计共存的,例如:

@PostMapping("/test/delete")
public JsonResult deleteTest() {}

关于RESTful风格的URL设计,如果你没有更好的选择,可以参考:

  • 查询数据列表,格式为:/数据类型的复数

    • 例如:/albums

  • 获取某类型的1个数据,格式为:/数据类型的复数/{数据ID}

    • 例如:/albums/{id:[0-9]+}

  • 对某类型的1个数据执行某个数据管理操作,格式为:/数据类型的复数/{数据ID}/命令

    • 例如:/albums/{id:[0-9]+}/delete

 

 

关于@RequestParam注解

@RequestParam注解是添加在方法的参数上的,它的作用主要有:  

  •  配置请求参数的名称(用于请求参数的名称与方法参数不同时),例如:
// http://localhost:8080/login?username=root
public JsonResult login(@RequestParam("username") String xxx) {
    // ...
}
  • 配置必须提交某个请求参数,因为此注解required属性默认值为true

    • 此功能可以通过Validation框架来实现

  • 配置某个请求参数的默认值,例如:  
// http://localhost:8080/list
public JsonResult list(@RequestParam(defaultValue = "1") Integer page) {
    // ...
}

 

 

其它

例如全局异常处理器等

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言——指针详解(进阶)

轻松学会C语言指针 一、字符指针二、数组指针2.1 数组指针的定义2.2 &数组名VS数组名2.3 数组指针的使用 三、指针数组四、数组参数和指针参数4.1 一维数组传参4.2 二维数组传参4.3 一级指针传参4.4 二级指针传参 五、函数指针六、函数指针数组七、指向函数指针数组的指针八…

Kubernetes - HPA-VPA - metrics介绍和安装 - HPA实验

目录 参考文章&#xff1a;(97条消息) Kubernetes-自动扩展器HPA、VPA、CA_hpa vpa_SRE运维充电站的博客-CSDN博客 HPA VPA 官方网址&#xff1a;autoscaler/vertical-pod-autoscaler at master kubernetes/autoscaler GitHub HPA和VPA进行扩缩容的区别&#xff1a; me…

小研究 - 面向 Java 的高对抗内存型 Webshell 检测技术(四)

由于 Web 应用程序的复杂性和重要性, 导致其成为网络攻击的主要目标之一。攻击者在入侵一个网站后, 通常会植入一个 Webshell, 来持久化控制网站。但随着攻防双方的博弈, 各种检测技术、终端安全产品被广泛应用, 使得传统的以文件形式驻留的 Webshell 越来越容易被检测到, 内存…

《TCP IP网络编程》第七章

第七章&#xff1a;优雅的断开套接字的连接 TCP 的断开连接过程比建立连接更重要&#xff0c;因为连接过程中一般不会出现大问题&#xff0c;但是断开过程可能发生预想不到的情况。因此应该准确掌控。所以要掌握半关闭&#xff08;Half-close&#xff09;&#xff0c;才能明确断…

windows10 搭建hadoop环境,并且使用hadoop命令

hadoop 环境创建 1. 八、window搭建spark IDEA开发环境 按照步骤安装完 2. windows下安装和配置hadoop 配置环境变量&#xff0c;注意JAVA_HOME路径&#xff0c;修改后&#xff0c;重启电脑&#xff0c;不重启容易报错&#xff01;&#xff01;&#xff01; ​ 新建dat…

数据结构(王道)——数据结构之 二叉树

一、数据结构之 二叉树概念&#xff1a; 特殊的二叉树结构&#xff1a; 满二叉树完全二叉树 二叉排序树 平衡二叉树 二叉树基本概念总结&#xff1a; 二、二叉树的常用性质&#xff1a; 1、叶子结点比二分支结点多一个

Kubernetes - kubeadm部署

Kubernetes - kubeadm部署 1 环境准备1.1 在各个节点上配置主机名&#xff0c;并配置 Hosts 文件1.2 关闭防护墙&#xff0c;禁用selinux&#xff0c;关闭swap1.3 配置免密登录1.4 配置内核参数1.5 配置br_netfilter 2. 安装K8s2.1 安装docker(各节点)2.2 安装K8s组件(各节点)2…

走进Vue2飞入Vue3

✅作者简介&#xff1a;大家好&#xff0c;我是Cisyam&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Cisyam-Shark的博客 &#x1f49e;当前专栏&#xff1a; Vue ✨特色专栏&#xff…

“掌握更多的快速排序技巧:三路划分、双路快排和非递归的深入理解”

快速排序是一种基于分治思想的排序算法&#xff0c;它能够以极快的速度将一个乱序的数组重新排列成有序的序列。不仅如此&#xff0c;快速排序还具有简洁的实现代码和良好的可扩展性&#xff0c;成为最受欢迎的排序算法之一。接下来&#xff0c;让我带你了解一下它的魅力吧&…

【Matlab】智能优化算法_麻雀搜索算法SSA

【Matlab】智能优化算法_麻雀搜索算法SSA 1.背景介绍2.数学模型3.文件结构4.伪代码5.详细代码及注释5.1 Get_Functions_details.m5.2 main.m5.3 SSA.m 6.运行结果7.参考文献 1.背景介绍 麻雀通常是群居的鸟类&#xff0c;有很多种类。它们分布在世界的大部分地区&#xff0c;喜…

Http host 标头攻击

一、什么是http host 标头攻击 HTTP Host 标头攻击是一种网络安全攻击技术&#xff0c;利用了 HTTP 协议中的 Host 标头字段的漏洞。Host 标头字段用于指定客户端请求的目标主机名或域名。 攻击者可以通过构造恶意的 HTTP 请求&#xff0c;伪造或篡改 Host 标头字段的值&#x…

高精尖领域数据暴增,分布式存储渐当大任

近年来&#xff0c;数据存储市场“最靓的仔”无疑就是分布式存储。 大模型火了之后&#xff0c;围绕Chat的应用也越来越多&#xff0c;通过AI生成图片、报表、音视频的应用比比皆是。众所周知&#xff0c;要想训练出一个有学习能力的、可理解的、响应迅速的大模型应用&#xf…

[NGINX] NGINX下载、安装编译、启动检查停止命令

一、NGINX 下载 mkdir -p /soft/nginx cd /soft/nginx wget https://nginx.org/download/nginx-1.21.6.tar.gz二、下载相关依赖 ①在线安装依赖&#xff1a; yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel ②下载依赖到本地安装依赖&#xff1a; y…

InsCode Stable Diffusion使用教程【InsCode Stable Diffusion美图活动一期】

记录一下如何使用 InsCode Stable Diffusion 进行 AI 绘图以及使用感受。 一、背景介绍 目前市面上比较权威&#xff0c;并能用于工作中的 AI 绘画软件其实就两款。一个叫 Midjourney&#xff08;简称 MJ&#xff09;&#xff0c;另一个叫 Stable Diffusion&#xff08;简称 …

使用 uiautomator2+pytest+allure 进行 Android 的 UI 自动化测试

目录 前言&#xff1a; 介绍 pytest uiautomator2 allure 环境搭建 pytest uiautomator2 allure pytest 插件 实例 初始化 driver fixture 机制 数据共享 测试类 参数化 指定顺序 运行指定级别 重试 hook 函数 断言 运行 运行某个文件夹下的用例 运行某…

RabbitMQ保证消息的可靠投递,Java实现RabbitMQ消息的可靠投递,Springboot实现RabbitMQ消息的可靠投递

文章目录 一、RabbitMQ消息可靠性概述1、引出问题2、RabbitMQ消息可靠性保证的四个环节 二、保证生产者消息发送到RabbitMQ服务器1、服务端确认&#xff1a;Transaction模式&#xff08;1&#xff09;JavaAPI&#xff08;2&#xff09;springbootAPI 2、服务端确认&#xff1a;…

laravel 的SQL使用正则匹配

案例场景 精准正则匹配 查询结果 代码如下 $regexp ^ . $new_str . [^0-9];$info Test::query()->where(is_del, 0)->whereRaw("name REGEXP $regexp")->pluck(name, id)->toArray();字符 “^” 匹配以特定字符或者字符串开头的文本 name 字段值包含…

【kubernetes系列】Kubernetes之调度器和调度过程

Kubernetes之调度器和调度过程 概述 当用户请求向API server创建新的Pod时&#xff0c;API server检查授权、权限等没有任何问题的话&#xff0c;他会把这个请求交由Scheduler&#xff0c;由Scheduler检查所有符合该Pod要求的列表&#xff0c;开始执行Pod调度逻辑&#xff0c…

AI智能助手的未来:与人类互动的下一代人工智能技术

自我介绍⛵ &#x1f4e3;我是秋说&#xff0c;研究人工智能、大数据等前沿技术&#xff0c;传递Java、Python等语言知识。 &#x1f649;主页链接&#xff1a;秋说的博客 &#x1f4c6; 学习专栏推荐&#xff1a;人工智能&#xff1a;创新无限、MySQL进阶之路、C刷题集、网络安…

WEB APIs day4 (1)

一、日期对象 1.实例化 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…
最新文章