这里介绍springboot 获取控制器参数有四种方式前端
一、无注解下获取参数spring
二、使用@RequestParam获取参数json
三、传递数组后端
四、经过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和scorespringboot
启动springboot后,在浏览器中请求URL:http://localhost:8080/param/noannotation?name=zhangsan&age=14&score=89.1app
前端页面会自动获得咱们输入的参数的json形式测试
若是咱们的请求URL中name不给参数值 http://localhost:8080/param/noannotation?name=&age=12&score=89.1ui
请求能够正常跳转
若是咱们将int 或 long 参数为空,给URL http://localhost:8080/param/noannotation?name=lisi&age=12&score=
请求会报错 没法将String型参数转化为须要的double型。
这里能够看出,若是咱们不给参数赋值,那么spring会将空着的参数默认按照String型空字符串处理。因此,若是是String型的参数,为空时不报错的;如果非String型参数,则必须非空。
这里能够用引用类型 好比:用Integer=>int 就行 下面我对于这个问题我就不说了。
使用@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 作测试,能够正常跳转