day6 web开发
静态资源访问
- 静态资源目录
类路径下 :/static 或者 /public 或者 /resources 或者 /META-INF/resources
访问:当前项目根路径 / + 静态资源名
原理: 静态映射 /**
请求进来后,先去找 controller 看是否可以处理,不能处理的所有请求又都交给静态资源处理器,静态资源也找不到,则404。
-
静态资源的访问前缀
默认为无,如果要配置
spring: mvc: static-path-pattern: /resource/**
当前项目 + static-path-pattern + 静态资源名 + 静态资源文件夹下找
-
改变默认静态资源路径
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 的。
- 请求是否正常,并且是POST
- 表单提交会带上
-
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