1、Rest请求映射
按照rest风格,比如:对一个用户的操作,访问路径都是相同的,通过请求方式的不同来访问不同的controller
示例如下:
@RestController
public class HelloController {
@RequestMapping("/1.jpg")
public String hello(){
return "aaa";
}
//获取用户
@RequestMapping(value = "/user",method = RequestMethod.GET)
public String getUser(){
return "GET-张三";
}
//保存用户
@RequestMapping(value = "/user",method = RequestMethod.POST)
public String saveUser(){
return "POST-张三";
}
//修改用户
@RequestMapping(value = "/user",method = RequestMethod.PUT)
public String putUser(){
return "PUT-张三";
}
//删除用户
@RequestMapping(value = "/user",method = RequestMethod.DELETE)
public String deleteUser(){
return "DELETE- 张三";
}
}
同时还需要在配置文件中开启rest风格的支持
spring:
mvc:
hiddenmethod:
filter:
enabled: true
并且在html的form表单中,需要写一项隐藏参数项,参数为method,值为需要提交的请求参数,form标签的method属性依然为post。
示例如下:
<form action="/user" method="get">
<input value="REST-GET 提交" type="submit"/>
</form>
<form action="/user" method="post">
<input value="REST-POST 提交" type="submit"/>
</form>
<form action="/user" method="post">
<input name="_method" type="hidden" value="delete"/>
<input value="REST-DELETE 提交" type="submit"/>
</form>
<form action="/user" method="post">
<input name="_method" type="hidden" value="PUT"/>
<input value="REST-PUT 提交" type="submit"/>
</form>
2、参数与基本注解
1)可以在参数上标注的注解
@PathVariable
标注路径变量的参数
如果有多个路径变量,会将所有路径变量的k,v都放进map里,所以也可以标注一个Map参数来获取到所有的路径变量的值
例如:
@RestController
public class ParameterTestController{
@GetMapping("/stu/{id}/name/{stuName}")
public Map<String,Object> gteStu(@PathVariable("id") Integer id,
@PathVariable("stuName") String name,
@PathVariable Map<String,String> pv){
Integer id1=id;
Integer id2=pv.get("id");
String name1=name;
String name2=pv.get("stuName");
}
}
@RequestHeader 标注请求头参数
如果想获取请求头里的参数值,则可以使用@RequestHeader 属性值就是想获取的请求头里的参数名
如果想获取多个请求头参数,也可以标注在一个Map<String,String>上,会将所有的k,v都放入该map中
例如:
@RestController
public class ParameterTestController{
@GetMapping("/stu/{id}/name/{stuName}")
public Map<String,Object> gteStu(@RequestHeader("User-Agent") String userAgent,
@RequestHeader Map<String,String> header){
String userAgent1=header.get("User-Agent");
}
}
@RequestParam
获取请求参数
也可以标注一个Map<String,String>,来获取所有的参数
例如:
请求路径为:locahost:8080/user?age=19&&inters=basketball&inters=soccer
@RestController
public class ParameterTestController{
@GetMapping("/user")
public Map<String,Object> gteStu(@RequestParam("age") Integer age,
@RequestParam("inters") Lsit<String> inters,
@RequestParam Map<String,String> params){
Integer age1=age;
List<String> interests1=inters;
Integer age2==params.get("age");
List<String> interests2=params.get("inters");
}
}
@CookieValue
获取一次请求中cookie的值
可以直接标注在一个String类型的参数上,注解的属性写cookie的名字
也可以标注一个Cookie类型的参数,直接拿到cookie
例如:
@RestController
public class ParameterTestController{
@GetMapping("/user")
public Map<String,Object> gteStu(@CookieValue("JSESSIONID") String jSessionId,
@CookieValue("JSESSIONID") Cookie cookie){
String cookieValue=cookie;
String cookieName=cookie.getName();
String cookieValue=cookie.getVAlue();
}
}
@RequestBody
获取请求体中的内容(post请求才有请求体)
获取前端返回的json字符串的数据
例如:
<form action="/save" method="post">
用户名:<input type="text" name="userName" /><br>
邮箱: <input type="text" name"email" />
<input type="submit" value="提交">
</form>
如userName=zhangsan
email=123456@qq.com
@RestController
public class ParameterTestController{
@PostMapping("/save")
public Map<String,Object> postMethodTest(@RequestBody() String content){
System.out.printLn(content);
}
}
输出结果是:
“userName=zhangsan&email=123456@qq.com”
@RequestAttribuite
如在请求转发过程中想要获取请求域中的参数值,可以使用@RequestAttribuite注解拿到数据
也可以直接通过HttpServletRequest 获取请求域中的值
例如:
@Controller
public class RequestController{
@GetMapper("/goto")
public String gotoPage(HttpServletRequest request){
request.setAttribute("msg","将要进行请求转发");
request.setAttribute("code","200");
return "forward:/success";
}
@ResponseBody
@GetMapping("/success")
public String success(@RequestAttribute("msg") String msg,
@RequestAttribute("code") Integer code,
HttpServletRequest request){
System.out.println(msg);
System.out.println(code);
return "success";
}
}
@MatrixVariable(矩阵变量)
矩阵变量是绑定在路径变量中的,所以controller的访问路径必须要写路径变量
a、url只有一个路径变量
在MatrixVariable中,多个变量可以使用分号(;)分隔,如:
/car;brand=byd;price=200000
如果一个变量对应多个值,可以用逗号分隔(,)如
/car;brand=byd,benz,audi
也可以使用重复的变量名,如:
/car;brand=byd;brand=benz;brand=audi
controller里写法如下:
如url:localhost:8080/car/sell;price=200000;brand=byd,benz,audi
@GetMapping("/car/{path}")
public Map<String,Object> carsSell(@MatrixVariable("price") Integer price,
@MatrixVariable("brand") List<String> brand,
@PathVariable("path") String path){
Map<String,Object> map=new HashMap<>();
map.put("price",price);
map.put("brand",brand);
map.put("path",path);
return map;
}
输出结果:
200000
[byd,benz,audi]
b、url有多个路径变量,且不同的路径变量中有相同的参数名
url如下:
/stu/1;name=zhangsan/3;name=lisi
controller如下:
@GetMapping("/stu/{stuId}/{teacherId}")
public Map<String,Object> carsSell(@MatrixVariable(value="name",pathVal="stuId") String stuName,
@MatrixVariable(value="name",pathVal="teacherId") String teacherName){
Map<String,Object> map=new HashMap<>();
map.put("stuName",stuName);
map.put("teacherName",teacherName);
return map;
}
输出结果:
zhangsan
lisi
c、开启矩阵变量功能
springBoot默认关闭矩阵变量功能,如果要使用,则需要手动开启
方法一:
写一个配置类,实现WebMvcAutoConfiguration接口
@Configuration(proxyBeanMethods = false)
public class WebConfig{
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper=new UrlPathHelper();
//设置不移除分号后的内容,矩阵变量功能就可以生效
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}
方法二:
在容器中放入WebMvcConfiguration组件
@Configuration(proxyBeanMethods = false)
public class WebConfig{
@Bean
public WebMvcConfigurer webMvcConfigurer(){
return new WebMvcConfigurer() {
/**
* 自定义使矩阵变量功能生效
* @param configurer
*/
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper=new UrlPathHelper();
//设置不移除分号后的内容,矩阵变量功能就可以生效
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}
}
}