day6 web开发

day6 web开发

静态资源访问

  1. 静态资源目录

类路径下 :/static 或者 /public 或者 /resources 或者 /META-INF/resources

访问:当前项目根路径 / + 静态资源名

原理: 静态映射 /**

请求进来后,先去找 controller 看是否可以处理,不能处理的所有请求又都交给静态资源处理器,静态资源也找不到,则404。

  1. 静态资源的访问前缀

    默认为无,如果要配置

    spring:
    	mvc:
    		static-path-pattern: /resource/**
    

    当前项目 + static-path-pattern + 静态资源名 + 静态资源文件夹下找

  2. 改变默认静态资源路径

    spring:
    	resources:
    		static-locations: classpath:/res/
    

欢迎页设置

  • 静态资源路径下 index.html

    • 可以配置静态资源路径

    • 但不可以配置静态资源的访问前缀,否则会导致 index.html 不能被默认访问

      spring:
      	mvc:
      		static-path-pattern: /resource/**  这会导致welcome page功能失效
      
  • controller 能够处理 /index

自定义网站图标 Favicon

放到静态资源路径中,命名为 favicon.ico 即可

静态资源的访问前缀限制,也会影响 favicon 的访问。

静态资源的配置原理

  • springboot 启动默认加载 xxxAutoConfiguration 类(自动配置类)
  • springmvc 的自动配置类 WebMvcAutoConfiguration
  • 给容器中配了啥
  • 配置文件的相关属性和 xxx 进行了绑定
    • WebMvcProperties => spring.mvc
    • ResourcesProperties => spring.resources
配置类只有一个有参构造器

有参构造器所有参数的值都会从容器中确定

HandlerMapping:处理器映射,保存了每一个 Handler 能处理哪些请求

请求参数处理

1.请求映射
  • @xxxxMapping

  • Rest 风格支持,使用Http请求的动词来表示对资源的操作

    • 以前: /getUser

    • 现在:/user,GET: 获取用户,DELETE:删除用户,PUT:修改用户,POST:保存用户

    • 核心 Filter:HiddenHttpMethodFilter

      • 用法:表单 method=post,隐藏域:_method=put
      spring:
      	mvc:
      		hiddenmethod:
      			filter:
      				enable: true	# 开启页面表达的Rest模式
      
      <form action="/hello" method="POST">
      	<input type="hidden" name="_method" value="DELETE">
          <input value="REST_DELETE 提交" type="submit">
      </form>
      
      @RequestMapping(value="/user",method=RequestMethod.DELETE)
      public String deleteUser(){
          return "delete-zs";
      }
      
  • Rest 原理(表单提交时要使用 REST 的时候)

    • 表单提交会带上 _method=PUT
    • 请求过来时,被 HiddenHttpMethodFilter 拦截
      • 请求是否正常,并且是POST
        • 获取到 _method 的值
        • 兼容一下请求:PUT,DELETE,PATCH
        • 原生 request ( post ),包装模式 requestWrapper 重写了 getMethod 方法,返回的是传入的值
        • 过滤器链放行的时候,使用wrapper,以后的方法调用 getMethod 是调用 requestWrapper 的。
  • Rest 使用客户端工具

    • 如 PostMan 直接发送 Put,delete 等方式请求,无需 Filter
@GetMapping("/user")
@RequestMapping(value="/user",method=RequestMethod.GET)

@PostMapping("/user")
@RequestMapping(value="/user",method=RequestMethod.POST)

@PutMapping("/user")
@RequestMapping(value="/user",method=RequestMethod.PUT)

@DeleteMapping("/user")
@RequestMapping(value="/user",method=RequestMethod.DELETE)

等价

关于自定义 _method 替换

// 无依赖,快速放入
@Configuration(proxyBeanMethod = false)
public class WebConfig{
    
    @Bean
    public HiddenHttpMethodFilter hiddenHttpMethodFilter(){
        HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter();
        // 修改值
        methodFilter.setMethodParam("_m");
        return methodFilter
    }
}
2. 请求映射原理

HttpServlet ( doGet )

​ HttpServletBean

​ FrameworkServlet ( processRequest -> doService )

​ DispatcherServlet ( doService实现 )( doDispatch 每个请求都会调用 )

springmvc 功能分析,都从 org.springframework.web.servlet.DispatcherServlet -> doDispatch 开始

关于 HandlerMapping
  • RequestMappingHandlerMapping
  • WelcomPageHandlerMapping
  • BeanNameUrlHandlerMapping
  • RouteFunctionMapping
  • SimpleUrlHandlerMapping

所有的请求映射都在 HandlerMapping 中,

  • springboot 自动配置欢迎页的 HandlerMapping, 访问 / 能访问到 index.html

  • 请求进来,挨个尝试所有的 HandlerMapping,看是否有请求信息。

    • 如果有,就找到了这个请求对应的 handler
    • 如果没有就去下一个 HandlerMapping
  • 我们需要自定义一些映射处理,我们也可以字给容器中添加一些 HandlerMapping,自定义HandlerMapping

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值