使用springboot 获取控制器参数的几种方法小结

目录
  • 无注解下获取参数
  • 使用@RequestParam获取参数
  • 接收前端传递的数组
  • 通过URL传递参数

如题,这里介绍springboot 获取控制器参数有四种方式

1、无注解下获取参数

2、使用@RequestParam获取参数

3、传递数组

4、通过URL传递参数

无注解下获取参数

无注解下获取参数,需要控制器层参数与HTTP请求栏参数名称一致,这样后台就可以获取到请求栏的参数。

	/**
	 * 无注解获取参数时,参数名称和HTTP请求参数必须一致
	 * @param name String 姓名
	 * @param age int 年龄
	 * @param score double 分数
	 * @return 响应json字符-@ResponseBody注解将map转为json
	 */
	@RequestMapping("/param/noannotation")
	@ResponseBody
	public Map<String, Object> noAnnotation(String name,int age, double score) {
		Map<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put("name", name);
		paramMap.put("age", age);
		paramMap.put("score", score);
		return paramMap;
	}

方法中,我们接收三个参数,分别为name,age和score

启动springboot后,在浏览器中请求URL:http://localhost:8080/param/noannotation?name=zhangsan&age=14&score=89.1

前端页面会自动得到我们输入的参数的json形式

如果我们的请求URL中name不给参数值 http://localhost:8080/param/noannotation?name=&age=12&score=89.1

请求可以正常跳转

如果我们将int 或 long 参数为空,给URL http://localhost:8080/param/noannotation?name=lisi&age=12&score=

请求会报错

无法将String型参数转化为需要的double型。

这里可以看出,如果我们不给参数赋值,那么spring会将空着的参数默认按照String型空字符串处理。所以,如果是String型的参数,为空时不报错的;若是非String型参数,则必须非空。

使用@RequestParam获取参数

上面的无注解情况下,HTTP参数与控制器参数名称必须一致。若HTTP参数与控制器参数不一致时,我们就需要将前端参数与后端参数对应起来,这里我们使用@RequestParam来确定前后端参数名称的映射关系。

	/**
	 * 使用@RequestParam获取参数
	 * 这里RequestParam注解会将括号里面的前端参数名称转化为后面的参数名称
	 * @param name String 姓名,接收前端username参数
	 * @param age int 年龄,接收前端user_age参数
	 * @param score double 分数,接收前端score参数
	 * @return 响应json字符
	 */
	@RequestMapping("/param/requestparam")
	@ResponseBody
	public Map<String, Object> requestParam(
			@RequestParam("username") String name,
			@RequestParam("user_age") int age,
			@RequestParam("score") double score) {
		Map<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put("name", name);
		paramMap.put("age", age);
		paramMap.put("score", score);
		return paramMap;
	}

方法中,我们接收前端的username,user_age和score,然后使用@RequestParam注解将其转化映射为name,age和age。

启动springboot后,URL栏输入 http://localhost:8080/param/requestparam?username=lisi&user_age=12&score=45.6

可以正常跳转,并将结果展示在前端

如果将URL中username后面值置空,页面可以正常跳转,测试URL

http://localhost:8080/param/requestparam?username=&user_age=12&score=45.6

若我们将user_age 或 score值置空,则页面会报错

与上面无注解时错误相同,这里不做解释了。

如果我们删除掉URL栏里面username参数项,URL为 http://localhost:8080/param/requestparam?user_age=12&score=45.6

页面无法正常跳转,报错如下

那如果实际中,我们确实有前端可传可不传的参数时,怎么办?@RequestParam注解给了一个required属性,标注该参数项是否必须有,其默认值为true,即必须传值;若该值可能为空,则将required置为false。注意,此时,@RequestParam后面的数据类型必须为包装类型,不可以是简单类型,若为简单类型,依然会报错。包装类型时,可以接收null对象;若为简单类型,则系统依然会将空字符串与对应的简单类型进行强转,转换失败的,则抛异常出来。

我们将上面方法参数做部分修改,修改如下,由于篇幅关系,这里不再整体贴整个方法

	@RequestMapping("/param/requestparam")
	@ResponseBody
	public Map<String, Object> requestParam(
			@RequestParam("username") String name,
			@RequestParam(value = "user_age", required = false) Integer age,
			@RequestParam(value = "score", required = false) double score) {

上面,我们将age对应的类型修改为Integer包装类型,required设置为false;score,只是设置required设置为false

启动springboot做测试,http://localhost:8080/param/requestparam?username=zhangsan&user_age=&score=89

这里我们将user_age后面的参数值设置为空,请求可以正常跳转

我们再修改一下URL参数项,http://localhost:8080/param/requestparam?username=zhangsan&user_age=&score=

系统会报400错误,提示score是空字符串,如果将数据类型double修改为Double,就会返回null了,这个这里就不测试了

接收前端传递的数组

springMVC中,前端往后端除了可以传递一些单值外,也可以传递数组。传递数据部分没有太多规则可言,在后台控制器部分,定义数组形式接收数据,前端传递时,将一组数据用英文的逗号“,”隔开就可以了。

	@RequestMapping("/param/requestarray")
	@ResponseBody
	public Map<String, Object> requestArray(String[] names, int[] ages, double[] scores) {
		Map<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put("name", names);
		paramMap.put("age", ages);
		paramMap.put("score", scores);
		return paramMap;
	}

启动springboot,URL为

http://localhost:8080/param/requestarray?names=zhangsan,lisi,wangwu&ages=12,14,15&scores=78.9,98,67

我们使用names接收所有的name,多个name值“zhangsan”、“lisi”和“wangwu”之间用“,”隔开

页面可以正常跳转

通过URL传递参数

这里通过URL传递参数与上面的URL不同,上面的URL中均需写明参数名和对应参数值,这里的URL传递参数,仅需要在地址栏输入参数值,然后后台自动匹配到对应的参数名。springMVC通过使用处理器映射和@PathVariable注解的组合来获取URL参数。首先通过处理器映射可以定位参数的位置和名称,而@PathVariable则可以通过名称来获取参数。

	/**
	 * 使用URL传参
	 * URL传参时,方法请求URL后使用{}包含参数名称,多个参数之间使用/分隔
	 * @param name 姓名
	 * @param age 年龄
	 * @param score 成绩
	 * @return 响应的json数据
	 */
	@RequestMapping("/param/geturl/{name}/{age}/{score}")
	@ResponseBody
	public Map<String, Object> getUrlParam(
			@PathVariable("name") String name,
			@PathVariable("age") Integer age,
			@PathVariable("score") Double score) {
		Map<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put("name", name);
		paramMap.put("age", age);
		paramMap.put("score", score);
		return paramMap;
	}

方法中,我们使用了3个{ },分别代表变量name、age和score,方法变量中使用@PathVariable来接收变量,并映射为方法的变量

启动springboot测试,URL为 http://localhost:8080/param/geturl/zhangsan/12/89

正常跳转

如果中间某个参数可能为空呢,查了下@PathVariable注解有required属性,但是经测试,发现这个属性无法单独使用。

如果中间某个参数为空,还得借用@RequestMapping 支持多URL的属性进行处理

假如,age属性可能为空,那么修改代码为

	@RequestMapping(value = {"/param/geturl/{name}/{age}/{score}",
			"/param/geturl/{name}/{score}"})
	@ResponseBody
	public Map<String, Object> getUrlParam(
			@PathVariable("name") String name,
			@PathVariable(value = "age", required = false) Integer age,
			@PathVariable("score") Double score) {

其中,后面的URL中没有了age参数,这里,视有无age的请求为不同的请求

使用URL http://localhost:8080/param/geturl/zhangsan//89 做测试,可以正常跳转

以上介绍的四种获取前端参数的四种方式,内容均为本人学习整理所得,若其中有不严谨之处,欢迎批评斧正。关于获取前端参数,不止上面四种方式,就了解到的还有获取json和格式化参数两种形式,由于涉及页面内容,本篇博文暂时不做介绍,后面单独整理。 希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 亲测SpringBoot参数传递及@RequestBody注解---踩过的坑及解决

    目录 SpringBoot 参数传递及@RequestBody注解注意点 前台正确的js书写格式是 后台正确的Controller书写格式是 RequestBody 作为参数使用 为了证实这个想法,自己书写一个请求类 小结一下 SpringBoot 参数传递及@RequestBody注解注意点 前台正确的js书写格式是 //点击查询, 执行下面这个函数 $("#searchByCriteria").click(function () { //var paramdata = $(&quo

  • java开发SpringBoot参数校验过程示例教程

    目录 为什么需要参数校验 SpringBoot中集成参数校验 第一步,引入依赖 第二步,定义要参数校验的实体类 常见的约束注解如下: 第三步,定义校验类进行测试 第四步,体验效果 自定义参数校验 第一步,创建自定义注解 第二步,自定义校验逻辑 第三步,在字段上增加注解 第四步,体验效果 分组校验 第一步:定义分组接口 第二步,在模型中给参数分配分组 第三步,给需要参数校验的方法指定分组 第四步,体验效果 小结 大家好,我是飘渺. 前几天写了一篇SpringBoot如何统一后端返回格式?老鸟们都是

  • Springboot自带定时任务实现动态配置Cron参数方式

    目录 Springboot自带定时任务实现动态配置Cron参数 SpringBoot定时任务的四种实现方式(主要) spring动态配置cron表达式,不需要停服 SchedulingConfigurer接口实现动态加载cron表达式 Springboot自带定时任务实现动态配置Cron参数 同学们,我今天分享一下SpringBoot动态配置Cron参数.场景是这样子的:后台管理界面对定时任务进行管理,可动态修改执行时间,然后保存入库,每次任务执行前从库里查询时间,以达到动态修改Cron参数的效

  • SpringBoot中自定义注解实现控制器访问次数限制实例

    今天给大家介绍一下SpringBoot中如何自定义注解实现控制器访问次数限制. 在Web中最经常发生的就是利用恶性URL访问刷爆服务器之类的攻击,今天我就给大家介绍一下如何利用自定义注解实现这类攻击的防御操作. 其实这类问题一般的解决思路就是:在控制器中加入自定义注解实现访问次数限制的功能. 具体的实现过程看下面的例子: 步骤一:先定义一个注解类,下面看代码事例: package example.controller.limit; import org.springframework.core.

  • springboot控制层传递参数为非必填值的操作

    目录 springboot控制层传递参数为非必填值 Controller层接收参数的形式 1.参数存在于请求路径中 2.参数在请求体中 springboot控制层传递参数为非必填值 需求是查询全部评价时,后端控制层的level为非必选项,即为空. 这里@RequestParam(required=false)就可以处理level为非必须值的情况. 如果没有这一行,当level为空时,会返回空白页面. 这里要注意一下!是个坑 Controller层接收参数的形式 1.参数存在于请求路径中 1.请求

  • SpringBoot项目中使用@Scheduled读取动态参数

    目录 使用@Scheduled读取动态参数 1.基于@Scheduled可配置开发 2.基于代码实现 spring boot Scheduled动态配置 使用@Scheduled读取动态参数 1.基于@Scheduled可配置开发 application.propertites: read.timer.parmas=0 0/1 * * * * 定时类: @Component public class ScheduledService { Logger logger= LoggerFactory.

  • 使用springboot 获取控制器参数的几种方法小结

    目录 无注解下获取参数 使用@RequestParam获取参数 接收前端传递的数组 通过URL传递参数 如题,这里介绍springboot 获取控制器参数有四种方式 1.无注解下获取参数 2.使用@RequestParam获取参数 3.传递数组 4.通过URL传递参数 无注解下获取参数 无注解下获取参数,需要控制器层参数与HTTP请求栏参数名称一致,这样后台就可以获取到请求栏的参数. /** * 无注解获取参数时,参数名称和HTTP请求参数必须一致 * @param name String 姓名

  • JS获取地址栏参数的几种方法小结

    复制代码 代码如下: <script> // 获取地址栏的参数数组 function getUrlParams() {  var search = window.location.search;  // 写入数据字典  var tmparray = search.substr(1, search.length).split("&");  var paramsArray = new Array;  if (tmparray != null) {   for (var

  • Java Spring Controller 获取请求参数的几种方法详解

    Java Spring Controller 获取请求参数的几种方法  1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交.若"Content-Type"="application/x-www-form-urlencoded",可用post提交 url形式:http://localhost:8080/SSMDemo/demo/addUser1?username=lixiaoxi&password=1

  • JS获取地址栏参数的两种方法(简单实用)

    js获取地址栏参数的方法有两种:第一种,采用正则表达式获取地址栏参数,第二种,是比较传统的方法,在这小编给大家强烈推荐使用第一种方法,既方便有实用,具体实现过程请看下文详述. 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)"); var r = window

  • vue 获取url里参数的两种方法小结

    我就废话不多说了,大家还是直接看代码吧~ 第一种: const query = Qs.parse(location.search.substring(1)) let passport = query.passport; 第二种: var query=this.$route.query; let lat = query.lat; 补充知识:Vue通过query获取路由参数 现在来讲Vue通过query获取路由参数 可以看见com1组件里的路由参数为 name=zhangsan&job=teache

  • 前端JS获取URL参数的4种方法总结

    目录 前言 方法1: 字符串 split 方法 方法2: 利用 URLSearchParams 方法 方法3: 利用正则匹配方法 方法4: 使用第三方库 qs 总结: 前言 对于前端来说,无论是在面试或者工作中都可能遇到处理 url 参数的问题,使用框架进行项目开发时或许不用,有自带的获取参数方式,但是抛开使用框架来说我们也可以使用原生 js 方式或者借用第三方库来实现参数的获取并对象化,下面就对具体用法进行介绍整理. 方法1: 字符串 split 方法 因为一个 url 地址是字符串形式的,所

  • JavaScript重定向URL参数的两种方法小结

    这篇文章主要介绍的是JavaScript重定向URL参数的两种方法,下面话不多说,直接看示例代码. 一.字符拼接形式 function setUri(para, val) { var strNewUrl = new String(); var strUrl = new String(); var url = window.location.href; strUrl = window.location.href; if (strUrl.indexOf("?") != -1) { strU

  • js获取地址栏参数的两种方法

    项目中经常遇到获取上个页面跳转过来获取当前的参数 //获取地址栏参数,name:参数名称 function getUrlParms(name){ var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if(r!=null) return unescape(r[2]); return n

  • asp获取URL参数的几种方法分析总结 原创

    需要用到这个功能,没怎么测试呢,测试后给具体代码 假如地址是: http://dxy.com:8082/test/geturl.asp?Param-VR52tmx3syn03777.html 方法一:简单,得不到参数,只有一个虚拟路径 复制代码 代码如下: GetUrl =request("url")  '这个因为我们没有url=什么字样所以直接pass掉 方法二:得到整个URL,得到参数  复制代码 代码如下: '得到当前页面的地址       Function GetUrl()  

  • php获取mysql版本的几种方法小结

    select VERSION() 当前$res=mysql_query("select VERSION()");$row=mysql_fetch_row($res);这样的形式调用SQL查询来获取. 如果查询PHP自身安装的MYSQL支持库(CLIENT)的版本,可以用<?php phpinfo();?> 更为简便的方法使用PHP自带函数mysql_get_server_info();

随机推荐