四、SpringBoot的Web场景
1、访问静态资源
-
只要静态资源放在类路径下:
/static /public /resources /META-INF/resources #这四个目录都可以存放静态资源
-
访问: 当前项目根路径/ + 静态资源名
-
映射原理:
- 请求进来,首先查看Controller能不能处理,若Controller不能处理则把请求交给静态资源处理器,若静态资源也找不到则404响应不到页面
- 也就是说,同样的请求动态资源优先
-
改变默认静态资源路径
# 可以配置静态资源访问前缀 spring: mvc: static-path-pattern: /res/** # 自定义静态资源存放目录,数组可以配置多个 resources: static-locations: [classpath:/staticRes/]
2、欢迎页以及Favicon
- 欢迎页:index.html 或者自己编写一个controller映射index请求
- 自己定义各一个Favicon图标放在静态目录下即可
3、RestFul请求映射
-
RestFulController.java
@RestController public class RestFulController { @GetMapping("/user") public String getRequest(){ return "GET - 请求"; } @PostMapping("/user") public String postRequest(){ return "POST - 请求"; } @DeleteMapping("/user") public String deleteRequest(){ return "DELETE - 请求"; } @PutMapping("/user") public String putRequest(){ return "PUT - 请求"; } }
-
表单如何提交DELETE、PUT请求(使用PostMan等工具是不需要的)
<form action="/user" method="POST"> <input type="hidden" name="_method" value="DELETE"> <input type="submit" value="提交DELETE请求"> </form> <form action="/user" method="POST"> <input type="hidden" name="_method" value="PUT"> <input type="submit" value="提交PUT请求"> </form>
-
SpringBoot默认是将处理表单的RestFul风格的请求关闭的,需要手动开启
spring: mvc: hiddenmethod: filter: enabled: true # 默认是false 表单的RestFul风格默认关闭,需要手动开启
-
如何自定义请求的name(即不使用默认的_method)
-
只需要自定义自定义配置hiddenHttpMethodFilter即可,指定methodParam参数值即可
@Bean public HiddenHttpMethodFilter hiddenHttpMethodFilter(){ HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter(); methodFilter.setMethodParam("_m"); return methodFilter; }
-
4、表单提交RestFul风格请求的原理
- 表单会带上 _mthod=PUT
- 请求过来会被HiddenHttpMethodFilter拦截
- 请求是否正常,请求方式必须是POST
- 获取到_method的值
- 原生的request(post),包装模式requestWrapper重写了getMethod方法,返回的是传入的值
- 过滤器链放行的时候用wrapper,以后的方法调用getMethod方法实际调用的是requestWrapper的
- 请求是否正常,请求方式必须是POST
5、请求映射的原理
-
doDispatch()方法中调用了getHandler()方法,getHandler()方法完成对处理的映射
-
//getHanlder() 方法执行逻辑:依次遍历寻找正确映射的HanlderMapping @Nullable protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { if (this.handlerMappings != null) { for (HandlerMapping mapping : this.handlerMappings) { HandlerExecutionChain handler = mapping.getHandler(request); if (handler != null) { return handler; } } } return null; }
-
我们也可以自定义映射处理,给容器添加HandlerMapping,自定义HandlerMapping
6、SpringBoot中的请求
-
SpringBoot中的请求就是SpringMVC中的请求,具体可查看博客(SpringMVC请求)
-
基本注解
-
@PathVariable @RequestHeader @ModelAttribute @RequestParam @MatrixVariable @CookieValue @RequestBody
-
@RestController public class RequestController { @GetMapping("/req/{id}/owner/{username}") public Map requestAnnotation( @PathVariable("id") Integer id, @PathVariable("username") String name, @RequestHeader("User-Agent") String userAgent,//获取是指定的请求头 @RequestHeader Map<String,String> headerMap//获取的是全部的请求头 // 获取Cookie之前要保证含有对应的Cookie否则 400错误 // @CookieValue("_ga") String cookieGa,//获取的是指定名称的cookie // @CookieValue Map<String,String> cookieMap,//获取是全部的cookie // @CookieValue("_ga") Cookie cookie//可以将Cookie装载到cookie类型的 ){ Map map = new HashMap(); map.put("id",id); map.put("username",name); map.put("user_agent",userAgent); map.put("headers",headerMap); // map.put("cookieGa",cookieGa); // map.put("cookieMap",cookieMap); // map.put("cookie",cookie); return map; } @PostMapping("/post") //只有post方式才有请求体 public Map requestPost(@RequestBody String content){ Map<String,Object> map = new HashMap<>(); map.put("content",content); return map; } }
-
对于**@ModelAttribute 和@RequestAttribute**则是可以获取请求域中的数据
-
@MatrixVariable矩阵变量
//1、语法: 请求路径:/cars/sell;low=34;brand=byd,audi,yd //2、SpringBoot默认是禁用了矩阵变量的功能 // 手动开启:原理。对于路径的处理。UrlPathHelper进行解析。 // removeSemicolonContent(移除分号内容)支持矩阵变量的 //3、矩阵变量必须有url路径变量才能被解析 @GetMapping("/cars/{path}") public Map carsSell(@MatrixVariable("low") Integer low, @MatrixVariable("brand") List<String> brand, @PathVariable("path") String path){ Map<String,Object> map = new HashMap<>(); map.put("low",low); map.put("brand",brand); map.put("path",path); return map; } // /boss/1;age=20/2;age=10 @GetMapping("/boss/{bossId}/{empId}") public Map boss( @MatrixVariable(value = "age",pathVar = "bossId") Integer bossAge, @MatrixVariable(value = "age",pathVar = "empId") Integer empAge ){ Map<String,Object> map = new HashMap<>(); map.put("bossAge",bossAge); map.put("empAge",empAge); return map; }
-
若要使用矩阵变量,SpringBoot默认是禁用的,需要手动设置
@Configuration(proxyBeanMethods = false) public class WebConfig /*implements WebMvcConfigurer*/ { //1、WebMvcConfigurer定制化SpringMVC的功能 //法1:给容器注册一个WebMvcConfigurer组件 @Bean public WebMvcConfigurer webMvcConfigurer(){ return new WebMvcConfigurer() { @Override public void configurePathMatch(PathMatchConfigurer configurer) { UrlPathHelper urlPathHelper = new UrlPathHelper(); // 不移除;后面的内容。矩阵变量功能就可以生效 urlPathHelper.setRemoveSemicolonContent(false); configurer.setUrlPathHelper(urlPathHelper); } }; } //法2:该配置类实现WebMvcConfigurer接口可以重写configurePathMatch()方法让矩阵变量的功能生效 // @Override // public void configurePathMatch(PathMatchConfigurer configurer) { // // UrlPathHelper urlPathHelper = new UrlPathHelper(); // // 不移除;后面的内容。矩阵变量功能就可以生效 // urlPathHelper.setRemoveSemicolonContent(false); // configurer.setUrlPathHelper(urlPathHelper); // } }
-
若Cookie被禁用了,该怎么获取session中的数据
- URL重写,使用矩阵变量将数据拼接在URL中
-