Spring MVC 接口数据

访问路径设置

@RequestMapping("springmvc/hello") 就是用来向handlerMapping中注册的方法注解!
秘书中设置路径和方法的对应关系,即@RequestMapping("/springmvc/hello"),设置的是对外的访问地址,

路径设置

精准路径匹配:

精准设置访问地址 /user/login,@RequestMapping 不要求必须以 / 开头(系统会默认在开头加上 / )

模糊路径匹配:

路径设置为 /product/* 

/* 为单层任意字符串 /product/a     /product/aaa 可以访问此handler

/product/a/a 不可以

路径设置为 /product/** 

/** 为任意层任意字符串

/product/a   /product/aaa  可以访问此handler 

/product/a/a 也可以访问

单层匹配和多层匹配:/*:只能匹配URL地址中的一层,如果想准确匹配两层,那么就写“/*/*”以此类推。/**:可以匹配URL地址中的多层。
其中所谓的一层或多层是指一个URL地址字符串被“/”划分出来的各个层次
这个知识点虽然对于@RequestMapping注解来说实用性不大,但是将来配置拦截器的时候也遵循这个规则。

类上和方法上的区别

类上提取公共部分,类上的不是必须有注解的,方法上是必须有注解的

//1.标记到handler方法
@RequestMapping("/user")
@RequestMapping("/user/login")
@RequestMapping("/user/register")
@RequestMapping("/user/logout")//2.优化标记类+handler方法
//类上
@RequestMapping("/user")
//handler方法上
@RequestMapping
@RequestMapping("/login")
@RequestMapping("/register")
@RequestMapping("/logout")

附带请求方式设定

method属性设置请求方式

@Controller
public class UserController {/*** 精准设置访问地址 /user/login* method = RequestMethod.POST 可以指定单个或者多个请求方式!* 注意:违背请求方式会出现405异常!*/@RequestMapping(value = {"/user/login"} , method = RequestMethod.POST)@ResponseBodypublic String login(){System.out.println("UserController.login");return "login success!!";}/*** 精准设置访问地址 /user/register*/@RequestMapping(value = {"/user/register"},method = {RequestMethod.POST,RequestMethod.GET})@ResponseBodypublic String register(){System.out.println("UserController.register");return "register success!!";}}

注解设置请求方式

- `@GetMapping`
- `@PostMapping`
- `@PutMapping`
- `@DeleteMapping`
- `@PatchMapping`
@RequestMapping(value = "/springmvc/hello", method = RequestMethod.GET)// 等于@GetMapping("/springmvc/hello")

 

但是 

@GetMapping("/springmvc/hello") 只能添加在方法上

接收参数

Param格式参数:key=value&key=value

json格式参数:{key:value, key:value}

param参数接收

1/直接接收

@Controller
public class HelloController {@GetMapping("/springmvc/hello")// @ResponseBody 只直接返回字符串给前端,不要找视图解析器@ResponseBody// http://localhost:8080/springmvc/hello?age=2&name=liu// todo 即使不传,也不会报错,所以在接口内最好进行参数校验public String hello(int age, String name){System.out.println("HelloController.hello");return "hello springmvc!!";}
}

2/@RequestParam注解 

可以设置是否必传,也可以设置默认值

value=“指定请求参数名”,默认与形参一致

@GetMapping(value="/data")
@ResponseBody
// http://localhost:8080/data?stuAge=2&name=liu
public Object paramForm(@RequestParam("name") String name, @RequestParam(value = "stuAge",required = false,defaultValue = "18") int age){System.out.println("name = " + name + ", age = " + age);return name+age;
}
一key多value

多选框,提交的数据的时候一个key对应多个值,我们可以使用集合进行接收!

@GetMapping("/param/mul")// @ResponseBody 只直接返回字符串给前端,不要找视图解析器@ResponseBody// http://localhost:8080/param/mul?hbs=吃&hbs=喝public String hello(@RequestParam List<String> hbs){System.out.println("HelloController.hello");return "hello springmvc!!";}

必须加@RequestParam,如果不加 @RequestParam ,会将 hbs 后的数据当作一个字符串直接赋值给  List<String> hbs

3/用实体接收

前端请求: http://localhost:8080/springmvc/hello?age=2&name=liu

可以不传,可以多传

 定义一个用于接收参数的实体类:

public class User {private String name;private int age = 18;// getter 和 setter 略
}
@Controller
@RequestMapping("param")
public class ParamController {@RequestMapping(value = "/user", method = RequestMethod.POST)@ResponseBodypublic String addUser(User user) {// 在这里可以使用 user 对象的属性来接收请求参数System.out.println("user = " + user);return "success";}
}

路径参数接收 

http://localhost:8080/springmvc/hello/23456

// 设置动态路经@GetMapping("/login/{account}/{password}")// @ResponseBody 只直接返回字符串给前端,不要找视图解析器@ResponseBody// @PathVariable String account 注解表示接收动态路经参数account位置的值// String account 表示接收param中key=account时对应的value值public String login(@PathVariable String account, @PathVariable String password){System.out.println("HelloController.hello");return "hello springmvc!!";}

路径参数与形参不一样时,也可以  @PathVariable("account") 注解指定

// 设置动态路经@GetMapping("/login/{account}/{password}")// @ResponseBody 只直接返回字符串给前端,不要找视图解析器@ResponseBody// @PathVariable String account 注解表示接收动态路经参数account位置的值// String account 表示接收param中key=account时对应的value值public String login(@PathVariable("account") String id, @PathVariable String password){System.out.println("HelloController.hello");return "hello springmvc!!";}

 json参数接收

 前端发送 JSON 数据的示例:

{"name": "张三","age": 18,"gender": "男"
}

 定义一个用于接收 JSON 数据的 Java 类:

public class Person {private String name;private int age;private String gender;// getter 和 setter 略
}

 controller:使用 @RequestBody 注解(即接收请求体)来接收 JSON 数据,并将其转换为 Java 对象

如果不加 @RequestBody ,那它接收的是param数据

@PostMapping("/person")
@ResponseBody
public String addPerson(@RequestBody Person person) {// 在这里可以使用 person 对象来操作 JSON 数据中包含的属性return "success";
}

利用postman验证之后发现报错:

原因: 无法处理json

解决:1/导入json处理的依赖;2/handlerAdapter配置json转化器

 pom.xml 加入jackson依赖 :

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.0</version>
</dependency>

 @EnableWebMvc handlerAdapter配置json转化器

//json数据处理,必须使用此注解,因为他会加入json处理器

 

接收cookie数据

 使用 @CookieValue 注释将 HTTP Cookie 的值绑定到控制器中的方法参数

JSESSIONID=415A4AC178C59DACE0B2C9CA727CDD84
@GetMapping("/demo")
public void handle(@CookieValue("JSESSIONID") String cookie) { //...
}

 存cookie:

@GetMapping("save")public String save(HttpServletResponse response){Cookie cookie = new Cookie("JSESSIONID", "415A4AC178C59DACE0B2C9CA727CDD84");response.addCookie(cookie);return "ok";}

接收请求头数据

 @RequestHeader 批注将请求标头绑定到控制器中的方法参数

Host                    localhost:8080
Accept                  text/html,application/xhtml+xml,application/xml;q=0.9
Accept-Language         fr,en-gb;q=0.7,en;q=0.3
Accept-Encoding         gzip,deflate
Accept-Charset          ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive              300
@GetMapping("/demo")
public void handle(@RequestHeader("Accept-Encoding") String encoding, @RequestHeader("Keep-Alive") long keepAlive) { //...
}

 

原生API对象操作????

 

Controller method argument 控制器方法参数Description
jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse请求/响应对象
jakarta.servlet.http.HttpSession强制存在会话。因此,这样的参数永远不会为 null
java.io.InputStream, java.io.Reader用于访问由 Servlet API 公开的原始请求正文。
java.io.OutputStream, java.io.Writer用于访问由 Servlet API 公开的原始响应正文。
@PathVariable接收路径参数注解
@RequestParam用于访问 Servlet 请求参数,包括多部分文件。参数值将转换为声明的方法参数类型。
@RequestHeader用于访问请求标头。标头值将转换为声明的方法参数类型。
@CookieValue用于访问Cookie。Cookie 值将转换为声明的方法参数类型。
@RequestBody用于访问 HTTP 请求正文。正文内容通过使用 HttpMessageConverter 实现转换为声明的方法参数类型。
java.util.Map, org.springframework.ui.Model, org.springframework.ui.ModelMap共享域对象,并在视图呈现过程中向模板公开。
Errors, BindingResult验证和数据绑定中的错误信息获取对象!
/*** 如果想要获取请求或者响应对象,或者会话等,可以直接在形参列表传入,并且不分先后顺序!* 注意: 接收原生对象,并不影响参数接收!*/
@GetMapping("api")
@ResponseBody
public String api(HttpSession session , HttpServletRequest request,HttpServletResponse response){String method = request.getMethod();System.out.println("method = " + method);return "api";
}

 

共享域对象操作????

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术分享 | MySQL内存使用率高问题排查

本文为墨天轮数据库管理服务团队第51期技术分享&#xff0c;内容原创&#xff0c;如需转载请联系小墨&#xff08;VX&#xff1a;modb666&#xff09;并注明来源。 一、问题现象 问题实例mysql进程实际内存使用率过高 二、问题排查 2.1 参数检查 mysql版本 &#xff1a;8.0.…

【redis】什么是持久化之 RDB

什么是持久化 MySQL 的事务&#xff0c;有四个比较核心的特性&#xff1a; 原子性一致性持久性>持久化&#xff08;说的一回事&#xff09; 把数据存储在硬盘上>持久把数据存在内存上>不持久重启进程/重启主机之后&#xff0c;数据是否还存在 隔离性 Redis 是一个内存…

Python、MATLAB和PPT完成数学建模竞赛中的地图绘制

参加数学建模比赛时&#xff0c;很多题目——诸如统计类、数据挖掘类、环保类、建议类的题目总会涉及到地理相关的情景&#xff0c;往往要求我们制作与地图相关的可视化内容。如下图&#xff0c;这是21年亚太赛的那道塞罕坝的题目&#xff0c;期间涉及到温度、降水和森林覆盖率…

Python(冒泡排序、选择排序、插入法排序、快速排序,算法稳定性)

算法的稳定性 冒泡排序 # 冒泡排序 # 1 思想: 相邻位置两个元素比较, 前面的元素比后面的元素大则交换, 把最大的数给找到 # 经过一轮一轮的比较最终把序列给排序 # 2 关键点1: 两层for循环 外层循环控制多少轮 内层for循环控制比较次数 # 3 关键点2: 若遍历一遍没有数字…

【自用】NLP算法面经(5)

一、L1、L2正则化 正则化是机器学习中用于防止过拟合并提高模型泛化能力的技术。当模型过拟合时&#xff0c;它已经很好地学习了训练数据&#xff0c;甚至是训练数据中的噪声&#xff0c;所以可能无法在新的、未见过的数据上表现良好。 比如&#xff1a; 其中&#xff0c;x1和…

PyCharm安装redis,python安装redis,PyCharm使用失败问题

报错信息 Usage: D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip install [options] [package-index-options] … D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip install [options] -r [package-index-options] … D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip instal…

学习笔记|arduino uno r3|DS1307时钟芯片|Atmega328P| 设置时间|读取时间|无源晶振:DS1307时钟芯片实验

目录 芯片pinout&#xff1a; 实验器件&#xff1a; 实验连线 解决AVR 架构不支持 printf() 方法 使用GetTimeAndDate.ino设置时间&#xff1a; 使用SetTimeAndDate.ino设置时间&#xff1a; 芯片pinout&#xff1a; DS1307 是美国 DALLAS 公司推出的 I 总线接口实时时钟芯…

uniapp可拖拽消息数徽标draggable-badge,仿手机qq聊天列表未读数徽标动效

组件下载地址&#xff1a;https://ext.dcloud.net.cn/plugin?id22679 兼容性&#xff1a; 测试了h5和微信小程序&#xff0c;理论支持全平台&#xff0c;暂不支持pc端&#xff0c;不过可以自己修改事件兼容pc 使用uniapp仿写了一个手机qq聊天列表右侧未读数的徽标组件&#x…

【设计模式】策略模式

以下是格式优化后的Markdown文档&#xff0c;仅调整代码缩进&#xff0c;保持内容不变&#xff1a; 四、策略模式 策略(Strategy) 模式是一种行为型模式&#xff0c;其实现过程与模板方法模式非常类似——都 是以扩展的方式支持未来的变化。本章通过对一个具体范例的逐步重构…

STM32配套程序接线图

1 工程模板 2 LED闪烁 3LED流水灯 4蜂鸣器 5按键控制LED 6光敏传感器控制蜂鸣器 7OLED显示屏 8对射式红外传感器计次 9旋转编码器计次 10 定时器定时中断 11定时器外部时钟 12PWM驱动LED呼吸灯 13 PWM驱动舵机 14 PWM驱动直流电机 15输入捕获模式测频率 16PWMI模式测频率占空…

【C语言】使用结构体实现位段

一、位段 前面我们学习了结构体&#xff0c;位段的声明和结构体是一样的&#xff0c;其区别如下&#xff1a; 1、位段的成员必须是int 、unsigned int 、signed int 、在C99中位段的成员的类型也可以选择其他类型。 2、位段的成员名后边有一个冒号和一个数字 如下&#xff…

【大模型系列篇】硅基智能开源数字人模型HeyGem.ai,开启数字人时刻

硅基智能开源数字人模型HeyGem.ai, 1秒克隆生成4K视频, 支持离线多语言, 开源72小时狂揽1.3k星, 目前已经获得3.4k星。 硅基智能正式宣布在GitHub开源全球TOP级数字人模型&#xff0c;同时发布基于该模型的同名数字人工具硅基数字人克隆的本地安装包&#xff0c;这一举措标志着…

【C++】STL库面试常问点

STL库 什么是STL库 C标准模板库&#xff08;Standard Template Libiary&#xff09;基于泛型编程&#xff08;模板&#xff09;&#xff0c;实现常见的数据结构和算法&#xff0c;提升代码的复用性和效率。 STL库有哪些组件 STL库由以下组件构成&#xff1a; ● 容器&#xf…

knowledge-微前端(多个前端应用聚合的一个应用架构体系,每个小的应用可独立运行,独立开发,独立部署上线)

1.前言 微前端&#xff0c;将一个大的前端应用拆分为多个小型的&#xff0c;独立开发的前端应用&#xff0c;每一个小型的应用都可以单独的开发&#xff0c;部署和运行。这种结构允许不同的团队使用不同的技术栈来开发应用的不同部分&#xff0c;提高开发的效率与灵活性。 2.实…

三格电子PLC数据采集网关-工业互联的智能枢纽

在工业自动化领域&#xff0c;设备间的数据互通与协议兼容是核心挑战之一。三格电子推出的PLC据采集网关SG-PLC-Private&#xff0c;凭借其多协议兼容、高稳定性和灵活配置能力&#xff0c;成为工业物联网&#xff08;IIoT&#xff09;中实现设备互联的关键设备。本文将从产品功…

鸿蒙NEXT项目实战-百得知识库05

代码仓地址&#xff0c;大家记得点个star IbestKnowTeach: 百得知识库基于鸿蒙NEXT稳定版实现的一款企业级开发项目案例。 本案例涉及到多个鸿蒙相关技术知识点&#xff1a; 1、布局 2、配置文件 3、组件的封装和使用 4、路由的使用 5、请求响应拦截器的封装 6、位置服务 7、三…

leetcode热题100道——字母异位词分组

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", &…

【Vue3】01-vue3的基础 + ref reactive

首先确保已经有了ES6的基础 本文介绍 vue 的基础使用以及 两种响应数据的方式。 目录 1. 创建一个vue应用程序 2. Vue模块化开发 3. ref 和 reactive 的区别 1. 创建一个vue应用程序 所需的两个文件&#xff1a; https://unpkg.com/vue3/dist/vue.global.js https://un…

Linux中的selinux,磁盘管理

一、selinux 作用&#xff1a;通过对软件进程限制某些权限&#xff0c;从而保证系统的安全。通过上下文类型和设定好的上下文类型是否一致。如果一致&#xff0c;那么软件就可以完成后续的操作&#xff0c;例如访问文件中数据&#xff0c;或者让数据通过某个端口。做好个人防护…

Linux应用:Linux的信号

什么是信号 信号是一种软件中断&#xff0c;用于通知进程系统中发生了某种特定事件。它是操作系统与进程之间&#xff0c;以及进程与进程之间进行异步通信的一种方式。在 Linux 系统中&#xff0c;信号是一种比较简单的进程间通信机制。当一个信号产生时&#xff0c;内核会通过…