Spring MVC 中的常用注解和用法

目录

一、什么是 Spring MVC

二、MVC定义 

 三、简述 SpringMVC 起到的作用有哪些?

 四、注解

 五、请求转发或请求重定向


一、什么是 Spring MVC

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”。
从上述定义我们可以得出两个关键信息:
1. Spring MVC 是⼀个 Web 框架。
2. Spring MVC 是基于 Servlet API 构建的。

二、MVC定义 

MVC 是 Model View Controller 的缩写,它是软件工程中的⼀种软件架构模式,它把软件系统分 为模型、视图和控制器三个基本部分。
  • Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据 库中存取数据。
  • View(视图)是应⽤程序中处理数据显示的部分。通常视图是依据模型数据创建的。
  • Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据, 控制用户输入,并向模型发送数据。
MVC 和 Spring MVC 的关系:
MVC 是⼀种思想,而 Spring MVC 是对 MVC 思想的具体实现。
总结来说,Spring MVC 是⼀个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web 框架,那么当用户在浏览器中输入了 url 之后,我们的 Spring MVC 项目就可以感知到用户的请求。

 三、简述 SpringMVC 起到的作用有哪些?

SpringMVC 是一个 Spring 内置的 MVC 框架,使用它可以开发出 RESTful 接口,为网站或手机 APP 提供接口支持,并且它可以轻松的解决 WEB 开发中常见的问题,如参数接收、文件上传、表单验证、国际化等等,且使用简单。

 四、注解

@RequestMapping:支持 GET/POST 类型的请求。

@GetMapping:支持 GET 类型的请求。

@PostMapping:支持 POST 类型的请求。

@ResponseBody:返回非静态 HTML 页面数据。

@RequestParam:接收前端参数。

@RequestBody:接收 JSON 对象参数。


@PathVariable  :获取URL中参数

例子:
@PostMapping("/m6/{name}/{password}")
public Object method_6(@PathVariable String name, @PathVariable String pass
word) {
 System.out.println("name:" + name);
 System.out.println("password:" + password);
 return "redirect:/index.html";
}
注意事项:@PostMapping("/m6/{name}/{password}") 中的 {password} 参数不能省略。

@RequestPart:获取上传的文件。

@RequestMapping("/param9")
public String param9(String name, @RequestPart("myfile") MultipartFile fil
e) throws IOException {
 // 获取⽂件后缀名
 String fileName = file.getOriginalFilename().substring(file.getOrigina
lFilename().lastIndexOf("."));
 // ⽂件保存地址
 String filePath = ClassUtils.getDefaultClassLoader().getResource("stat
ic").getPath() +
 "/" + UUID.randomUUID() + fileName;
 // 保存⽂件
 file.transferTo(new File(filePath));
 return filePath + " 上传成功.";
}

获取项目目录的几种方式:

ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX).getPath();
new ClassPathResource("").getFile().getAbsolutePath();
ClassUtils.getDefaultClassLoader().getResource("").getPath();
ResourceUtils.getFile("classpath:static/").getPath();

@CookieValue:获取 Cookie 信息。

@RequestHeader : 获取头部信息

传统获取 header/cookie
@RequestMapping("/param10")
@ResponseBody
public String param10(HttpServletResponse response, HttpServletRequest requ
est) {
 String name = request.getParameter("name");
 // 获取所有 cookie 信息
 Cookie[] cookies = request.getCookies();
 String userAgent = request.getHeader("User-Agent");
 return name + ":"+userAgent;
}
简洁的获取 Cookie—@CookieValue
@RequestMapping("/cookie")
@ResponseBody
public String cookie(@CookieValue("cookie") String cookie) {
 return "cookie:" + cookie;
}
简洁获取 Header—@RequestHeader
@RequestMapping("/header")
@ResponseBody
public String header(@RequestHeader("User-Agent") String userAgent) {
 return "userAgent:"+userAgent;
}

Session 存储和获取
Session 存储和 Servlet 类似,是使⽤ HttpServletRequest 中获取的,如下代码所示:
@RequestMapping("/setsess")
@ResponseBody
public String setsess(HttpServletRequest request) {
 // 获取 HttpSession 对象,参数设置为 true 表示如果没有 session 对象就创建⼀个
session
 HttpSession session = request.getSession(true);
 if(session!=null){
 session.setAttribute("username","java");
 }
 return "session 存储成功";
}
读取 Session 可以使用 HttpServletRequest,如下代码所示:
@RequestMapping("/sess")
@ResponseBody
public String sess(HttpServletRequest request) {
 // 如果 session 不存在,不会⾃动创建
 HttpSession session = request.getSession(false);
 String username = "暂⽆";
 if(session!=null && session.getAttribute("username")!=null){
 username = (String) session.getAttribute("username");
 }
 return "username:"+username;
}
获取 Session 更简洁的方式 - @SessionAttribute :
@RequestMapping("/sess2")
@ResponseBody
public String sess2(@SessionAttribute(value = "username",required = false)
String username) {
     return "username:"+username;
}

 五、请求转发或请求重定向

forward - 请求转发 VS redirect - 请求重定向
请求转发和重定向的使用对比:
// 请求重定向
@RequestMapping("/index")
public String index(){
 return "redirect:/index.html";
}
// 请求转发
@RequestMapping("/index2")
public String index2(){
 return "forward:/index.html";
}
举例说明 forward 和 redirect:
forward(请求转发)和 redirect(请求重定向)的区别,举例来说,例如,你告诉你妈妈,你想吃辣 条,如果你妈妈,说好,我帮你去买,这就是 forward 请求转发;如果你妈妈让你自己去买,那么就是请求 redirect 重定向。

forward 和 redirect 具体区别如下:
1. 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
2. 请求重定向地址发生变化,请求转发地址不发生变化。
3. 请求重定向与直接访问新地址效果⼀样,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。

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

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

相关文章

为什么MCU在ADC采样时IO口有毛刺?

大家在使用MCU内部ADC进行信号采样一个静态电压时,可能在IO口上看到这样的波形。这个时候大家一般会认识是信号源有问题,但仔细观察会发现这个毛刺的频率是和ADC触发频率一样的。 那么为什么MCU在ADC采样时IO口会出现毛刺呢?这个毛刺对结果有…

深度解析Python爬虫中的隧道HTTP技术

前言 网络爬虫在数据采集和信息搜索中扮演着重要的角色,然而,随着网站反爬虫的不断升级,爬虫机制程序面临着越来越多的挑战。隧道HTTP技术作为应对反爬虫机制的重要性手段,为爬虫程序提供了更为灵活和隐蔽的数据采集方式。本文将…

基于视触觉的柔性机械爪与水果硬度无损检测

近日,课题组柑橘全程机械化平台研究团队以“Non-destructive fruit firmness evaluation using a soft gripper and vision-based tactile sensing”为题在农业计算机与电子信息领域期刊“Computers and Electronics in Agriculture”(IF20238.3)发表研究论文。 果…

Zero date value prohibited 异常处理

项目场景: 在项目中,我们会时常遇到数据查询,今天在对数据进行查询的时候,遇到一个之前闻所未闻的异常,所以记录下来,分享给大家。 问题描述 查询数据为datetime类型的数据时,发现该字段的值为…

Linux Docker本地部署WBO在线协作白板结合内网穿透远程访问

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板,允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…

生日蜡烛C语言

分析&#xff1a;假设这个人只能活到100岁&#xff0c;如果不这样规定的话&#xff0c;那么这个人就可以假设活到老236岁&#xff0c;直接一次吹236个蜡烛&#xff0c;我们就枚举出所以情况&#xff0c;从一岁开始。 #include <stdio.h> int f(int a,int b){//计算从a到…

案例分享|企业为什么要选择数字化转型?

数字化在现代社会中扮演着重要的角色&#xff0c;成为企业转型的必由之路。随着科技的发展和信息化的进程&#xff0c;越来越多的企业开始拥抱数字化转型&#xff0c;以应对市场的变化和竞争的压力。数字化带来了诸多好处&#xff0c;不仅提高了企业的效率和生产力&#xff0c;…

Pytorch:Tensorboard简要学习

目录 一、TensorBoard简介二、TensorBoard的安装与启动Tensorboard的安装Tensorboard的启动 三、TensorBoard的简单使用3.1 SummaryWriter()3.2 add_scalar()和add_scalars()3.3 add_histogram()3.4 模型指标监控 四、总结参考博客 一、TensorBoard简介 TensorBoard 是Google开…

一款简单的单节锂电池电量指示芯片 XC260A 适用于四个指示灯的电量指示

XC260A是一款单节鲤电池电量指示芯片&#xff0c;该芯片采用CMOS 工艺实现&#xff0c;体积小&#xff0c;便于便携式产品安装 XC260A内置比较器和反馈回路,实现4个电压点的检测通过内部修调技术&#xff0c;可以保证电压检测精度达到士2%。输出采用 OPENDRAIN结构,便于…

基于DINOv2的图像相似性比对(含代码和模型数据)

目录 一、概述二、实践2.1 安装环境2.2 示例代码 一、概述 2023年4月份&#xff0c;Meta发布了DINOv2预训练模型。DINOv2属于一种自监督学习算法&#xff0c;相比于以往的自监督技术有了显著改进&#xff0c;并达到了与弱监督算法相当的性能。 DINOv2算法可以在任何图像数据集…

嵌入式开发行业会不会也变成java行业?

今日话题&#xff0c;嵌入式开发行业会不会也变成java行业&#xff1f;关于嵌入式行业的未来&#xff0c;与一些人的担忧不同&#xff0c;它并不会内卷化&#xff0c;而是具有相对稳定性的领域。嵌入式开发在制造业等重要第二产业中扮演着关键角色&#xff0c;这些领域的稳定性…

什么是AI数字人互动大屏?

AI数字人结合互动大屏凭借其智能化、互动化、信息化等优势为企业服务、展馆展厅、数字会议带来全新的交互体验和数字化升级。有效为企业提高了沟通效率&#xff0c;节省人力成本&#xff0c;提升服务温度&#xff0c;满足技术创新。 一.数字人互动对话流程&#xff1a; 1.文本转…

【MAC】M2 安装docker 与 mysql

一、docker下载地址 下载地址 二、安装docker完成 罗列一下docker常用命令 # 查看docker版本 docker --version# 拉取镜像 docker pull 镜像名# 查看当前所有镜像 docker images# 查看运行中的容器 docker ps -a docker ps grep| 镜像名#镜像启动操作&#xff1a; sudo dock…

魔众文库系统v5.8.0版本发布:水印、分类与移动端升级,打造更高效文档管理体验

魔众文库系统迎来了全新的v5.8.0版本更新&#xff01;此次更新不仅对水印功能进行了升级&#xff0c;还新增了辅助分类样式&#xff0c;同时优化了移动端体验。让我们一起来看看这次更新的亮点吧&#xff01; 一、水印功能全新升级 在v5.8.0版本中&#xff0c;魔众文库系统的…

Addressables资源如何进行完整性校验

1&#xff09;Addressables资源如何进行完整性校验 2&#xff09;使用SpriteAtlas时出现冗余精灵&#xff0c;如何指定用哪一个图集 3&#xff09;anim文件进行精度处理后某些信息丢失 这是第365篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了…

STM32----HAL库函数

1.STM32系统框架 1.1 Cortex-M内核&芯片 1.2 F1系统框架 4个主动单元4个被动单元 AHB&#xff1a;高级高性能总线 APH&#xff1a;高级外围总线 其中 1 为 主动单元 &#xff0c; 2为被动单元 总线时钟频率&…

轻量化压缩之【剪枝】

在深度学习领域&#xff0c;剪枝是一种常用的模型轻量化技术&#xff0c;主要是通过移除神经网络中被认为不重要的连接&#xff08;即权重&#xff09;来减少模型的大小和计算量。移除的连接可以是单独的权重&#xff08;非结构化剪枝&#xff09;&#xff0c;也可以是整个神经…

深度学习模型轻量化方法介绍

深度学习模型轻量化是指通过一系列技术手段减少模型的大小和计算需求&#xff0c;使其能够在资源有限的环境中&#xff08;如移动设备、嵌入式系统&#xff09;运行。下面是一些常见的模型轻量化方法&#xff1a; 模型剪枝&#xff08;Pruning&#xff09;: 描述: 模型剪枝涉及…

【智能家居远程控制系统】ESP8266连接阿里云(一)

系列文章目录 第一章 阿里云物联网平台搭建 第二章 订阅与发布MQTT消息 第三章 为ESP8266-NodeMCU搭建ArduinoIDE环境 第四章 ESP8266连接阿里云 第五章 阿里云平台云产品流转 第六章 使用Aruino与云产品流转实现远程控制ESP8266 文章目录 目录 系列文章目录 前言 一…

Python 面向对象(1)

软件编程的实质是将我们的思维转变成计算机能够识别语言的一个过程。 目录 面向过程 面向对象 理解面向对象 面向过程&#xff1a; 面向对象&#xff1a; 面向对象的特点 完成需求时&#xff1a; 类的设计 类与对象的关系 创建类 设计类 类的介绍 格式 创建类实例…