02 SpringMVC接收数据之访问路径设置+四种接参方式+@EnableWebMvc

1.1 访问路径设置

@RequestMapping注解的作用就是将请求的 URL 地址和处理请求的方式(handler方法)关联起来,建立映射关系。

SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的方法来处理这个请求。

1.1.1 精准路径匹配

@Controller
public class UserController {/*** 精准设置访问地址 /user/login*/@RequestMapping(value = {"/user/login"})@ResponseBodypublic String login(){System.out.println("UserController.login");return "login success!!";}

1.1.2 模糊路径匹配

在@RequestMapping注解指定 URL 地址时,通过使用通配符,匹配多个类似的地址。

@Controller
public class ProductController {/***  路径设置为 /product/*  *    /* 为单层任意字符串  /product/a  /product/aaa 可以访问此handler  *    /product/a/a 不可以*  路径设置为 /product/** *   /** 为任意层任意字符串  /product/a  /product/aaa 可以访问此handler  *   /product/a/a 也可以访问, /product/a/a/a还可以访问*  * 将来的配置拦截器也遵循这个规则*/@RequestMapping("/product/*")@ResponseBodypublic String show(){System.out.println("ProductController.show");return "product show!";}
}

1.1.3 类和方法级的@RequestMapping

  1. 设置到类级别:@RequestMapping 注解可以设置在控制器类上,用于映射整个控制器的通用请求路径。这样,如果控制器中的多个方法都需要映射同一请求路径,就不需要在每个方法上都添加映射路径。
  2. 设置到方法级别:@RequestMapping 注解也可以单独设置在控制器方法上,用于更细粒度地映射请求路径和处理方法。当多个方法处理同一个路径的不同操作时,可以使用方法级别的 @RequestMapping 注解进行更精细的映射。
  3. 并且, 可以将两者结合优化代码的实现 :
//1.标记到handler方法@Controllerpublic class UserController {@RequestMapping(value = {"/user/login"})@ResponseBodypublic String login(){System.out.println("UserController.login");return "login success!!";}@RequestMapping(value = {"/user/register"})@ResponseBodypublic String register(){System.out.println("UserController.register");return "register success!!";}
}//2.优化标记类+handler方法//类上定位到/user@RequestMapping("/user")@Controllerpublic class UserController {//handler方法上再进一步指明@RequestMapping(value = {"/login"})@ResponseBodypublic String login(){System.out.println("UserController.login");return "login success!!";}@RequestMapping(value = {"/register"})@ResponseBodypublic String register(){System.out.println("UserController.register");return "register success!!";}
}

1.1.4 请求方法限制

HTTP 协议定义了八种请求方式,在 SpringMVC 中封装到了下面这个枚举类:

public enum RequestMethod {GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}
  • 默认情况下:@RequestMapping所注解的方法/类, 任何请求方式都可以对接过来!
  • 可以在在@RequestMapping中增加一个字段method=RequestMethod.xxx来指定请求方式 ,
  • 可同时指定多种请求方式 :
  • 违背请求方式,会出现405异常!!
@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!!";}/*** 指定多种请求方式*/@RequestMapping(value = {"/user/register"},method = {RequestMethod.POST,RequestMethod.GET})@ResponseBodypublic String register(){System.out.println("UserController.register");return "register success!!";}}

1.1.5 优化请求方法限制的代码 :

@RequestMapping 的 HTTP 方法特定快捷方式变体:

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

注意:进阶注解只能添加到handler方法上,无法添加到类上!

@RequestMapping(value="/login",method=RequestMethod.GET)
||
@GetMapping(value="/login")

1.1.7 @GetMapping和@PostMapping :

  1. 安全性:
    涉及敏感数据或操作时,使用POST请求可能更安全。因为GET请求的参数直接暴露在URL中,可能会被记录在服务器日志或浏览器历史记录中,而POST请求的参数通常在请求体中,相对更安全。
  2. 请求体:
    如果操作需要接收复杂的请求体,例如JSON或表单数据,使用POST请求更为合适。POST请求的请求体可以用于传递较大或复杂的数据。
  3. RESTful设计原则:
    根据RESTful原则,GET请求用于读取资源,而POST请求用于创建或修改资源。

1.1.6常见问题 :

出现原因:多个 handler 方法映射了同一个地址,导致 SpringMVC 在接收到这个地址的请求时该找哪个 handler 方法处理。

There is already ‘demo03MappingMethodHandler’ bean method com.atguigu.mvc.handler.Demo03MappingMethodHandler#empGet() mapped.


1.2 接收参数

1.2.1 param和json参数比较

在 HTTP 请求中,我们可以选择不同的参数类型,如 param 类型和 JSON 类型。下面对这两种参数类型进行区别和对比:

  1. 参数编码:

    param 类型的参数会被编码为 ASCII 码。例如,假设 name=john doe,则会被编码为 name=john%20doe。而 JSON 类型的参数会被编码为 UTF-8。

  2. 参数顺序:

    param 类型的参数没有顺序限制。但是,JSON 类型的参数是有序的。JSON 采用键值对的形式进行传递,其中键值对是有序排列的。

  3. 数据类型:

    param 类型的参数仅支持字符串类型、数值类型和布尔类型等简单数据类型。而 JSON 类型的参数则支持更复杂的数据类型,如数组、对象等。

  4. 嵌套性:

    param 类型的参数不支持嵌套。但是,JSON 类型的参数支持嵌套,可以传递更为复杂的数据结构。

  5. 可读性:

    param 类型的参数格式比 JSON 类型的参数更加简单、易读。但是,JSON 格式在传递嵌套数据结构时更加清晰易懂。

总的来说,param 类型的参数适用于单一的数据传递,而 JSON 类型的参数则更适用于更复杂的数据结构传递。根据具体的业务需求,需要选择合适的参数类型。在实际开发中,常见的做法是:在 GET 请求中采用 param 类型的参数,而在 POST 请求中采用 JSON 类型的参数传递。


1.2.2 param参数接收

  1. 直接传值
    例如客户填写表单后 , 参数直接放在链接中传递:
    此时在handler中 , 只要形参名和类型都与传递参数一一对应.即可自动接收 :
@Controller
@RequestMapping("param")
public class ParamController {/*** 前端请求链接 : localhost:8080/param/value?name=你好age=18* 利用形参列表,直接接收前端传递的param参数!*    要求: 参数名 = 形参名* *          类型相同* 出现乱码正常,json接收具体解决!!* @return 返回前端数据*/@GetMapping(value="/value")@ResponseBodypublic String setupForm(String name,int age){System.out.println("name = " + name + ", age = " + age);return name + age;}
}

直接传值有一个显然的缺点 , 形参和传递参数并不一定同名也一一对应(例如用户干脆就不填age)

  1. @RequestParam注解传值 (仅可在形参列表中声明)

@RequestParam使用场景:

  • 指定绑定的请求参数名
  • 要求请求参数必须传递 (默认为必须传递)
  • 为请求参数提供默认值
 /*** 前端请求: http://localhost:8080/param/data?name=xx&stuAge=18* *  使用@RequestParam注解标记handler方法的形参*  指定形参对应的请求参数@RequestParam(请求参数名称)*/
@GetMapping(value="/data")
@ResponseBody
//通过@RequestPararm注解,指定传递参数name赋给形参name ,
//                      指定stuAge传给age , 且修改为不必须传递 , 设定默认值18
public Object paramForm(@RequestParam(value = "name") String name, @RequestParam(value = "stuAge",required = false,defaultValue = "18") int age){System.out.println("name = " + name + ", age = " + age);//return name+age;
}

默认情况下,使用@RequestPararm注解的方法参数是必需的,但可以通过将 @RequestParam 注解的 required 标志设置为 false

  1. 特殊场景接值

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

  /*** 前端请求: http://localhost:8080/param/mul?hbs=吃&hbs=喝*  一名多值,可以使用集合接收即可!但是需要使用@RequestParam注解指定*/@GetMapping(value="/mul")@ResponseBodypublic Object mulForm(@RequestParam List<String> hbs){System.out.println("hbs = " + hbs);return hbs;}

b. 实体接收

优点 : 可以在方法内部直接使用对象的属性来访问请求参数,而不需要每个参数都写一遍。
缺点 : 由于是通过对象传值 , 无法采用@RequestParam绑定形参和传递参数 , 因此二者的属性名必须要相同 . 即User类内部定义的是name和age,那么传递参数的名也必须是name和age.

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

public class User {private String name;private int age = 18;// getter 和 setter 略
}

在控制器中,使用实体对象接收,示例代码如下:

@Controller
@RequestMapping("param")
public class ParamController {@POSTMapping(value = "/user")@ResponseBodypublic String addUser(User user) {// 在这里可以使用 user 对象的属性来接收请求参数System.out.println("user = " + user);return "success";}
}

在上述代码中,将请求参数name和age映射到实体类属性上!要求属性名必须等于参数名!否则无法映射!

使用postman传递参数测试:


1.2.3 接收JSON参数(@RequestBody)

  • @RequestBody 注解来将 JSON 数据转换为 Java 对象
  • @RequestBody 注解表示当前方法参数的值应该从请求体中获取,并且需要指定 value 属性来指示请求体应该映射到哪个参数上
  1. 定义一个用来接收json数据的实体类
public class Person {private String name;private int age;private String gender;// getter 和 setter 略
}
  1. 前端发送 JSON 数据的示例:(使用postman测试)
{"name": "张三","age": 18,"gender": "男"
}
  1. 在控制器中,使用 @RequestBody 注解来接收 JSON 数据,并将其转换为 Java 对象:
@PostMapping("/person")
@ResponseBody
public String addPerson(@RequestBody Person person) {// 在这里可以使用 person 对象来操作 JSON 数据中包含的属性return "success";
}

Java原生只支持param传参和路径传参 , json是前端定义的格式 .因此需要做两件事.
a. 导入json依赖
b.handlerAdapter配置json转化器(即在config类上增加@EnableWebMvc)

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

此时运行程序 , 可以接收到传来的json。


插播一条@EnableWebMvc注解:

原本,MvcConfig类中,我们需要重写handlerMapping,handlerAdapter两个方法,上例中又加入了一个新需求即配置一个json转化器。然而这一切只需要MvcConfig上声明一个@EnableWebMvc注解即可实现。


1.2.4 路径参数接收(动态传参)

先理解是什么:

http://localhost:8080/user/login?account=root&password=12345
||
http://localhost:8080/user/root/12345
即将每个参数视为路径 , 这就是路径传参
  • 路径传递参数是一种在 URL 路径中传递参数的方式。在 RESTful 的 Web应用程序中,经常使用路径传递参数来表示资源的唯一标识符或更复杂的表示方式。
  • Spring MVC 框架提供了 @PathVariable 注解来处理路径传递参数 , 该注解允许将 URL 中的占位符映射到控制器方法中的参数。

例如,如果我们想将 /user/{id} 路径下的 {id} 映射到控制器方法的一个参数中,则可以使用 @PathVariable 注解来实现。

 /*** 动态路径设计: /user/{动态部分}/{动态部分}   动态部分使用{}包含即可! {}内部动态标识!* 形参列表取值: @PathVariable Long id  如果形参名 = {动态标识} 自动赋值!*              @PathVariable("动态标识") Long id  如果形参名 != {动态标识} 可以通过指定动态标识赋值!*              和RequestParama一样 , 通过value属性绑定两个属性(@PathVariable(value="stuAge") int age)*///动态路径设计, 可在形参列表获取传入的参数
@GetMapping("/user/{id}/{name}")
@ResponseBody
//形参列表获取参数, 分别传入上头的GetMapping和下面的方法
public String getUser(@PathVariable Long id, @PathVariable("name") String uname) {System.out.println("id = " + id + ", uname = " + uname);return "user_detail";
}
//访问测试:  /param/user/1/root 可得结果: id = 1  uname = root

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

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

相关文章

京东ES支持ZSTD压缩算法上线了:高性能,低成本 | 京东云技术团队

1 前言 在《ElasticSearch降本增效常见的方法》一文中曾提到过zstd压缩算法[1]&#xff0c;一步一个脚印我们终于在京东ES上线支持了zstd&#xff1b;我觉得促使目标完成主要以下几点原因&#xff1a; Elastic官方原因&#xff1a;zstd压缩算法没有在Elastic官方的开发计划中&…

【Leetcode Sheet】Weekly Practice 24

Leetcode Test 447 回旋镖的数量(1.8) 给定平面上 n 对 互不相同 的点 points &#xff0c;其中 points[i] [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 &#xff0c;其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等&#xff08;需要考虑元组的顺序&#xff09;。 …

最新智能AI系统ChatGPT网站程序源码+详细图文搭建部署教程,Midjourney绘画,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

如何增加服务器的高并发

随着互联网的快速发展和普及&#xff0c;越来越多的应用程序需要支持高并发的请求处理。在这种情况下增加服务器的高并发能力成为了一个热门的话题。下面简单的介绍如果提高服务器的高并发能力。 负载均衡 是把请求分发到多个服务器上&#xff0c;来实现请求的平衡和分担。负…

使用JavaScript实现实时在线协作编辑器:从设计到实现

一、引言 随着Web技术的发展&#xff0c;实现在线协作编辑文档已经成为一种常见的需求。通过在线协作&#xff0c;多位用户可以同时编辑同一个文档&#xff0c;并实时看到其他用户的更改。这样的功能需要复杂的技术实现&#xff0c;包括数据同步、冲突解决和实时通信。本篇博客…

(一)环境部署

Python虚拟环境 安装virtualenv pip install virtualenv 创建环境 virtualenv -p D:\python\python.exe(python解释器目录) env-py3.6(虚拟环境目录&#xff0c;名称随意) 在当前目录下生成env-py3.6目录。 激活环境 ...\env-py3.6\Scripts> .\activate 关闭&#xf…

应用架构演变过程、rpc及Dubbo简介

一、应用架构演变历史&#xff1a; 单一应用架构 -> 垂直应用架构 -> 分布式服务架构 -> 微服务架构。 单一应用架构 当网站流量很小时&#xff0c;只需一个应用&#xff0c;将所有功能都部署在一起&#xff0c;以减少部署节点和成本。 此时&#xff0c;用于简化增删…

STM32 CubeIDE 使用 CMSIS-DAP烧录 (方法2--外部小工具)

前言&#xff1a; 本篇所用方法&#xff0c;需要借助一个外部的工具小软件。 优点&#xff1a;烧录更稳定; 缺点&#xff1a;不能在线仿真调试。 下面链接&#xff0c;是另一种方法&#xff1a;修改CubeIDE调试文件。能在CubeIDE直接烧录、仿真&#xff0c;但不稳定。…

Bazel

简介&#xff1a; Bazel 是 google 研发的一款开源构建和测试工具,也是一种简单、易读的构建工具。 Bazel 支持多种编程语言的项目&#xff0c;并针对多个平台构建输出。 高级构建语言&#xff1a;Bazel 使用一种抽象的、人类可读的语言在高语义级别上描述项目的构建属性。与其…

uniapp 简易自定义日历

1、组件代码 gy-calendar-self.vue <template><view class"calendar"><view class"selsct-date">请选择预约日期</view><!-- 日历头部&#xff0c;显示星期 --><view class"weekdays"><view v-for"…

Linux常用命令大全(三)

系统权限 用户组 1. 创建组groupadd 组名 2. 删除组groupdel 组名 3. 查找系统中的组cat /etc/group | grep -n “组名”说明&#xff1a;系统每个组信息都会被存放在/etc/group的文件中1. 创建用户useradd -g 组名 用户名 2. 设置密码passwd 用户名 3. 查找系统账户说明&am…

蓝桥杯java基础

2. AB问题II 时间限制&#xff1a;1.000S 空间限制&#xff1a;32MB 题目描述 计算ab&#xff0c;但输入方式有所改变。 输入描述 第一行是一个整数N&#xff0c;表示后面会有N行a和b&#xff0c;通过空格隔开。 输出描述 对于输入的每对a和b&#xff0c;你需要在相应的…

openssl快速生成自签名证书

系统&#xff1a;Centos 7.6 确保已安装openssl openssl version生成私钥文件 private.key &#xff08;文件名自定义&#xff09; openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keygen_bits:2048-out private.key&#xff1a;生成的私钥文件-algorithm RS…

探索设计模式的魅力:工厂方法模式

工厂方法模式是一种创建型设计模式&#xff0c;它提供了一种创建对象的接口&#xff0c;但将具体实例化对象的工作推迟到子类中完成。这样做的目的是创建对象时不用依赖于具体的类&#xff0c;而是依赖于抽象&#xff0c;这提高了系统的灵活性和可扩展性。 以下是工厂方法模式的…

MySQL 8.0中移除的功能(二)

PROCEDURE ANALYSE()​ 语法已被移除。客户端的 ​--ssl​ 和 ​--ssl-verify-server-cert​ 选项已被移除。使用 ​--ssl-modeREQUIRED​ 代替 ​--ssl1​ 或 ​--enable-ssl​。使用 ​--ssl-modeDISABLED​ 代替 ​--ssl0​、​--skip-ssl​ 或 ​--disable-ssl​。使用 ​-…

chatgpt的基本技术及其原理

ChatGPT是一种基于生成式预训练的语言模型&#xff0c;它的基本技术包括预训练和微调。下面我将为你解释这些技术及其原理。 1. 预训练&#xff08;Pre-training&#xff09;: ChatGPT的预训练阶段是在大规模的文本数据上进行的。模型通过对大量的互联网文本进行自监督学习来学…

学习视频一些杂乱的东西

文章目录 ref获取dom元素监听深层的某个属性? 可选链操作符 和 ?? 双问号表达式v-slot 语法糖作用域插槽动态插槽 初始化数组骚操作数字滚动 -> gsapstyle妙招新奇的原型链 object.createB站笔记链接JS相关设计模式ajaxsvgvue3scsswebpack内存泄漏 ref获取dom元素 直接给…

基于深度学习的实例分割的Web应用

基于深度学习的实例分割的Web应用 1. 项目简介1.1 模型部署1.2 Web应用 2. Web前端开发3. Web后端开发4. 总结 1. 项目简介 这是一个基于深度学习的实例分割Web应用的项目介绍。该项目使用PaddlePaddle框架&#xff0c;并以PaddleSeg训练的图像分割模型为例。 1.1 模型部署 …

【iOS】数据存储方式总结(持久化)沙盒结构

在iOS开发中&#xff0c;我们经常性地需要存储一些状态和数据&#xff0c;比如用户对于App的相关设置、需要在本地缓存的数据等等&#xff0c;本篇文章将介绍六个主要的数据存储方式 iOS中数据存储方式&#xff08;数据持久化&#xff09; 根据要存储的数据大小、存储数据以及…

案例:应用内字体大小调节

文章目录 介绍相关概念完整实例 代码结构解读保存默认大小获取字体大小修改字体大小 介绍 本篇Codelab将介绍如何使用基础组件Slider&#xff0c;通过拖动滑块调节应用内字体大小。要求完成以下功能&#xff1a; 实现两个页面的UX&#xff1a;主页面和字体大小调节页面。拖动…