基本介绍
1.Rest风格支持(使用HTTP请求方式动词来表示对资源的操作)
2.举例说明:
·请求方式:/monster
·GET-获取怪物
·DELETE-删除怪物
·PUT-修改怪物
·POST-保存怪物
代码实现
在Controller里面使用REST风格请求
GET请求的两种写法。完整例子:
@RestController
public class MonsterController {
//@RequestMapping(value="/monster",method = RequestMethod.GET)
@GetMapping("/monster")
public String selectMonster(){
return "GET-Monster请求";
}
POST请求的两种写法
@RequestMapping(value = "/monster",method=RequestMethod.POST)
@PostMapping("/monster")
PUT请求的两种写法
@RequestMapping(value = "monster",method = RequestMethod.PUT)
@PutMapping("/monster")
DELETE请求的两种写法
@RequestMapping(value = "/monster",method = RequestMethod.DELETE)
@DeleteMapping("/monster")
注意事项和细节
客户端是PostMan可以直接发送Put、Delete等方式请求,可不设置Filter
如果要SpringBoot支持页面表单的Rest功能,则需要注意如下细节
a. Rest风格请求核心Filter;HiddenHttpMethodFilter,表单请求会被HiddenHttpMethodFilter拦
截,获取到表单_method的值,再判断是PUT/DELETE/PATCH(老师注释:PATCH方法是新引入的,是
对PUT方法的补充,用来对己知资源进行局部更新:
https://segmentfault.com/q/1010000005685904)
b. 如果要SpringBoot支持页面表单的Rest功能,需要在application.yml启用filter功能,否则无效
前端form只支持get和post两种方式请求,解决办法通常是添加隐藏_method,然后后端通过过滤器来,将原有的post调整为相应的put、delete、patch等请求方式。
<form action="/spring/monster" method="post">
<input type="hidden" name="_method" value="delete">//前端隐藏字段设置
<input type="submit" value="提交">
</form>
尝试使用postman提交post,参数_method="delete"的方式提交,却失败了。。
c.修改application.yml启用HiddenHttpMethodFilter的filter过滤器功能
spring:
mvc:#以上重复可删,显式标出是为了体现层次结构
hiddenmethod: #在行首找这个关键字,即可自动输出层次结构
filter:
enabled: true #启用了HiddenHttpMethodFilter,开启页面表单的Rest功能
区分字符串与资源;视图解析器与映射
思考题:为什么这里return "GET-Monster请求",返回的是字符串,而不是转发到对应的资源文件?
解读:因为@ResController是一个复合注解,含有@ResponseBody,所以springboot底层(springmvc),在处理return"xxx"时,会以@ResponseBody注解进行解析处理,即返回字符串"xxx”,而不会使用视图解析器来处理
可以试一下,如果我们把@RestController改成@Controller,当你访问go()时,如果你有xxx.html就会转发到xxx.html,如果没有xxx.html,就会报404
'视图解析器' 与 'controller的RequestMapping映射' 的优先级顺序
程序是通过@Response来确定return返回的是字符串 还是 一个需要视图解析器的页面
当注解是@Controller的时候,说明return返回的是一个页面/资源
没有配置视图解析器的时候,只有与controller的RequestMapping映射进行匹配,没有就显示404;
当配置了视图解析器,无论controller的RequestMapping映射是否匹配,都按照视图解析器的匹配结果进行显示。明显视图解析器的优先级>controller
注意事项:
静态资源是否在target目录下,再次确认,否则出问题。
rebuild project的方法感觉消耗资源少一些。还是不行就用maven的clean
需要注意prefix需要和当前static-path-pattern一致
spring:
mvc:
static-path-pattern: /prefix/**
view:
prefix: /prefix/ #搜索视图解析器的关键词;需要和当前static-path-pattern一致
suffix: .html #搜索视图解析器的关键词。配置视图解析器的方法。