1.何为Rest风格
之前我们设计映射层的时候习惯把不同的操作对应不同的方法映射不同的网页
例如我们对User进行增删改查的时候
保存用户的映射/saveUser 删除用户的映射/deleteUser
改变用户的映射/updateUser 查找用户的映射/selectUser
这样的坏处就是对应的网页过多,而且繁杂不堪
Rest风格就是对同一对象的增删改查对应同一个对象
同样对User进行操作,不论增删改查都对应/User
那么对应的映射一样,增删改查必定对应不同的controller,那么我们如何区别呢?
答案是通过请求方法动词
保存用户的请求方法动词POST 删除用户的请求方法动词DELETE
改变用户的请求方法动词PUT 查找用户的请求方法动词GET
2.下面我们开始测试
以下是我的index代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
welcome
<a href="rest">rest</a><br>
<form action="/user" method="get">
<input type="submit" value="Get">
</form><br>
<form action="/user" method="post">
<input type="submit" value="Post">
</form><br>
<form action="/user" method="post">
<input type="submit" value="Delete">
</form><br>
<form action="/user" method="post">
<input type="submit" value="Put">
</form><br>
</body>
</html>
这是controller代码
package com.sptingbootlearn3.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class firstcontroller {
// 处理资源请求时候是先找controller的mapping,然后找静态资源,都找不到报错
@RequestMapping("bug.jpg")
public String string(){
return "aaaaa";
}
@RequestMapping("/rest")
public String rest(){
return "rest";
}
@RequestMapping(value = "/user",method = RequestMethod.GET)
public String GETrest(){
return "GET";
}
@RequestMapping(value = "/user",method = RequestMethod.POST)
public String POSTrest(){
return "POST";
}
@RequestMapping(value = "/user",method = RequestMethod.PUT)
public String PUTrest(){
return "PUT";
}
@RequestMapping(value = "/user",method = RequestMethod.DELETE)
public String DELETErest(){
return "DELETE";
}
}
我们开始运行
然后自上而下依次点击
发现问题没有,PUT跟DELETE全部当成了POST,这是由于html的问题,我们使用form的时候有且只有两种方法get跟post,所以必须进行配置上的修改
学过MVC的应该知道可以通过配置HiddenHttpMethodFilter来解决,但是我们现在是在使用springboot,里面给我们进行了很多自动配置,我们需要用到用到什么的时候自动装配
那么我们先对代码进行一下修改
<form action="/user" method="get">
<input type="submit" value="Get">
</form><br>
<form action="/user" method="post">
<input type="submit" value="Post">
</form><br>
<form action="/user" method="post">
<input name="_method" type="hidden" value="delete"/>
<input type="submit" value="Delete">
</form><br>
<form action="/user" method="post">
<input name="_method" type="hidden" value="put"/>
<input type="submit" value="Put">
</form><br>
我们来执行查看一下delete跟put的结果
发现依然不对,那么我们就需要查看一下源码了
我们搜索点进WebMvcAutoConfiguration即webmvc的自动配置类
里面找到配置HiddenHttpMethodFilter的部分代码
@Bean
@ConditionalOnMissingBean({HiddenHttpMethodFilter.class})
@ConditionalOnProperty(
prefix = "spring.mvc.hiddenmethod.filter",
name = {"enabled"}
)
public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
return new OrderedHiddenHttpMethodFilter();
}
这里面有三个注解
@Bean @ConditionalOnMissingBean({HiddenHttpMethodFilter.class}) @ConditionalOnProperty( prefix = "spring.mvc.hiddenmethod.filter", name = {"enabled"} )
其中第一个是一个简单的bean无关紧要
第二个是条件注解,条件就是我们没有自己配置专属HiddenHttpMethodFilter,显然我们没有配置
条件成立
第三个也是条件注解,该注解要求我们的spring.mvc.hiddenmethod.filter属性数值是enabled的时候成立
这个属性我们之前没有配置,条件注解一个不成立就会导致整段方法不执行,那么我们在application.yaml中配置该属性
再次执行
成功执行