四、SpringBoot的Web场景

四、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的
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中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值