五、SpringBoot——Web开发
5.2 常用参数注解使用
注意:以下注解只是为了学习起来方便所以没有进行混合使用,但混合使用也是没有问题的。
5.2.1 @PathVariable——获取路径变量
@PathVariable注解用于将路径指定变量的值传到Controller。 用法: 1、通过给路径上预读取的值设置读取的参数名,加{属性值} 2、在方法的形参使用@PathVariable(“属性值”)获取对应的路径上的属性值 3、使用你想要接收的类型去接收这个属性值 ????1) 建议对每个属性使用String类型接收,不容易报错 ????2) 使用Map<String,String>把所有参数都接收,这种方式@PathVariable不需要加参数 代码演示如下:
package com.example.boot.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.sql.Struct;
import java.util.HashMap;
import java.util.Map;
@RestController
public class ParameterController {
@GetMapping("/animal/{id}/owner/{name}")
public Map<String, Object> getAnimal(@PathVariable("id") Integer id,
@PathVariable("name") String name,
@PathVariable Map<String, Object> animal){
Map<String,Object> map = new HashMap<>();
map.put("id",id);
map.put("name",name);
map.put("animal",animal);
return map;
}
}
运行结果: 上面的代码,其实我故意用了Integer去接收id的值,然后用Map<String,Object>去接收,最后我们发现,animal这个map中,key和value都变成了String类型,而id的值是Integer类型。 我想表达的是:你可以用Integer接收 用户只能输入Integer类型数字的数据。但是,如果你用Map接收的话,那么,他底层一定会帮你转化成String类型。所以要特别注意。
5.2.2 @RequestHeader——获取请求头信息
@RequestHeader用于获取我们想要的请求头信息。(比如Host:用户的ip和端口号,User-Agent:用户使用的浏览器) 用法: 1、获取单个请求头:在形参中添加@RequestHeader("请求头的名称") String 变量名 。 2、获取所有请求头:在形参中添加@RequestHeader Map<String,String> 变量名
代码演示:
@GetMapping("/animal/header")
public Map<String,Object> getHeader( @RequestHeader("Host") String host,
@RequestHeader("User-Agent") String userAgent,
@RequestHeader Map<String,String> heads){
Map<String,Object> map = new HashMap<>();
map.put("host",host);
map.put("user-agent",userAgent);
map.put("heads",heads);
return map;
}
结果:
5.2.3 @RequestParam——获取指定请求参数
@RequestParam用来获取路径中?后特定的值。 用法: 1、获取单个属性值,在形参中使用@RequestParam("属性") String 变量名 2、获取单个属性的多个值,在形参中使用@RequestParam("属性") List<String> 变量名 3、获取全部属性值,在形参中使用@RequestParam Map<String,String> 变量名
代码演示:
@GetMapping("/animal")
public Map<String,Object> getAnimalByUsernameAndPassword(@RequestParam("username") String username,
@RequestParam("password") String password,
@RequestParam("lovers") List<String> lovers,
@RequestParam Map<String,String> params){
Map<String,Object> map = new HashMap<>();
map.put("username",username);
map.put("password",password);
map.put("lovers",lovers);
map.put("params",params);
return map;
}
显示: 注意,使用Map的形式获取到的lovers只有Amy,因为他固定是String类型的,有人可能会说,那我把接收的Map改成Map<String,Object>不就行了吗,你以为我没想到吗,天真,行不通的哦,你写了Map,那就是两个String类型的key和value。
5.2.4 @RequestBody——获取请求头[POST请求专用]
作用:获取POST表单发送过来的信息。 用法:在形参中添加@RequestBody String 变量名 注意:这个只能这么获取,跟上面用Map<String,String>不同哈,他没有这种获取方式,也没有那种@RequestBody(“参数名”)的获取方式。 代码演示:
@PostMapping("/requestBody")
public Map<String,Object> getRequestBody(@RequestBody String content){
Map<String,Object> map = new HashMap<>();
map.put("content",content);
return map;
}
显示: 在浏览器按F12,其实也可以看到:
5.2.5 @RequestAttribute——获取request域中的值
作用:获取Request域中的值 用法:在形参中添加@RequestAttribute("request域中的key值") String 变量名 代码演示:
package com.example.boot.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import java.util.HashMap;
import java.util.Map;
@Controller
public class RequestController {
@GetMapping("/toSuccess")
public ModelAndView toSuccess(ModelAndView modelAndView){
modelAndView.addObject("msg","跳转成功");
modelAndView.addObject("code",200);
modelAndView.setViewName("forward:/success");
return modelAndView;
}
@ResponseBody
@GetMapping("/success")
public Map<String, Object> success(@RequestAttribute("msg") String msg,
@RequestAttribute("code") String code){
Map<String, Object> map = new HashMap<>();
map.put("msg",msg);
map.put("code",code);
return map;
}
}
显示:
5.2.6 @MatrixVariable——矩阵变量
什么是矩阵变量? 之前我们的请求路径有用过/cars/{path}?key1=value1&key2=value2 ,这种呢,叫查询字符串(他终于有名字了) 矩阵变量呢,是使用请求路径/cars/{path;low=34;brand=byd,aodi,yd} ,他的语法是分号左边是访问路径,分号右边是矩阵变量;而多个变量又以分号区分。 比如: 汽车销售中查询brand是byd和aodi的。可能这么写:/cars/sell;low=34;brand=byd;brand=aodi 或者这么写/cars/sell;low=34;brand=byd,aodi
注意:SpringBoot默认禁用矩阵变量的功能,开启方式如下(下面代码有两种方式,都可以开启解析矩阵变量):
package com.example.boot.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.util.UrlPathHelper;
@Configuration(proxyBeanMethods = false)
public class MyConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}
演示代码:(记得放在@RestController注解的类下)
@GetMapping("/cars/{path}")
public Map<String,Object> carSell(@MatrixVariable("low") Integer low,
@MatrixVariable("brand") List<String> brands,
@PathVariable("path") String path){
Map<String,Object> map = new HashMap<>();
map.put("low",low);
map.put("brand",brands);
map.put("path",path);
return map;
}
显示: 如果现在的请求路径下有多个/,且每个/下都有相同的属性,该怎么读取咧? 我们可以使用他的pathVar属性指定读取哪个{值}。 代码演示:
@GetMapping("/boss/{bossAge}/{empAge}")
public Map<String,Object> boss(@MatrixVariable(value = "age", pathVar = "bossAge") Integer bossAge,
@MatrixVariable(value = "age", pathVar = "empAge") Integer empAge){
Map<String,Object> map = new HashMap<>();
map.put("bossAge",bossAge);
map.put("empAge",empAge);
return map;
}
显示:
|