SpringBoot2核心技术-核心功能(Web开发)
Web开发
深入Web原理
- SpringMVC自动配置概览
- 简单功能分析
- 请求参数处理
- 数据响应与内容协商
- 视图解析与模板引擎
- 拦截器
- 跨域
- 异常处理
- 原生Servlet组件
- 嵌入式Web容器
- 定制化原理
SpringMVC自动配置概览
- 内容协商视图解析器和BeanName视图解析器
- 静态资源(resources下的static)
- 自动注册Converter,GenericConverter,Formatter(往SpringMVC里提交的日期什么的格式可以自动格式化)
- 支持HttpMessageConverters(配合内容协商理解原理)
- 自动注册MessageCodesResolver(国际化用)
- 静态index.html页支持(静态欢迎页放到指定位置自动识别)
- 自定义Favicon(网站标签页的小图标可以进行自定义)
- 自动使用ConfigurableWebBindingInitializer(DataBinder负责将请求数据绑定到JavaBean上)
静态资源目录
静态资源只要放到类路径下的static,public,resources,META-INF/resources都可以访问到
访问:当前项目根路径/+静态资源名
原理: 静态映射/**,请求进来先去找Controller看能不能处理,不能处理的所有请求又都交给静态资源处理器,静态资源能找到,就访问,静态资源找不到就返回404
静态资源访问前缀
静态资源访问默认是无前缀的 => /** 让他有前缀要
spring:
mvc:
static-path-pattern: /recources/**
当前项目+static-path-pattern+静态资源名
上面的static,public,resources,META-INF/resources这四个文件夹官方给定义的可以存放静态资源的目录,那我们想把静态资源存放的位置不放在这四个目录下呢?
spring:
mvc:
static-location: [classpath:/mulu/]
#这样存放静态文件的目录就改变了,放到了mulu这个文件夹下
webjar
像jqurey样的文件,我们导入项目时可能有些麻烦我们就可以使用webjar,它把包变成了依赖可以让我们进行引入
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jqurey</artifactId>
<version>3.5.1</version>
</dependency>
<!-- 这样我们就成功的引入了jquery,那我们对jquery进行使用就跟上面的静态文件访问是一样的了,但是格式是webjars/jqurey/.. -->
欢迎页
- 在静态文件夹下放index.html,就会当成欢迎页(必须是index.html)
- 但是如果在yaml中配置了静态资源访问的前缀的话,我们就无法访问到index了
- 写了一个contrller能处理index请求,最终返回的也是index页面
页面的小图标
小图标图片的名字必须是favicon.ico,放到项目的静态文件中就可以了,这个使用也不能设置静态资源访问的前缀
SpringMVC的配置源码在spring-boot-autoconfigure/web/servclet/WebMvcAutoConfiguration
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class}) //全面接管SpringMVC配置要有WebMvcConfigurationSupport这个类,全部由我们自己配置
扩展
- 一个配置类中只有一个有参构造器
- 参构造器所有参数的值都会从容器中确定
请求参数处理
请求映射
rest使用和原理
- @xxxMapping:
- Rest风格支持(使用HTTP请求方式动词来表示对资源的操作,表单提交)
- POST(增),DELETE(删),PUT(改),GET(查)
- 核心Filter:HiddenHTTPMethodFilter
- 用法:表单method=post,隐藏域_method=put
- 在配置文件中手动开启Rest风格
<form>
<input name="_method" type="hidden" value="DELETE"/>
</form>
mvc:
hiddenmethod:
filter:
enabled:true
Rest原理(表单提交要使用REST的时候)
- 表单提交会带上_method=PUT
- 请求过来被HiddenHttpMethodFilter拦截
- 请求是否正常,并且是POST
- 获取到_method的值
- 兼容PUT,DELETE,PATCH请求
- 原生request(post),包装模式requestWrapper重写了getMethod方法,返回的是传入的值
- 过滤器链放行的时候用wrapper,以后的方法调用getMethod是调用requestWrapper的
- 请求是否正常,并且是POST
SpringMVC接受的注解
@PathVariable(获取路径上的变量)
@RequestMapping("/user/{id}")
public string demo(@PathVariable("id") Integet id){}
@RequestHaeader(获取请求头信息)
@RequestParam(获取请求参数)
@CookieValue(获取cookie值)
@RequestBody(获取请求体)
@RequestAttribute(获取request域属性)(请求转发forward到另一个页面,获取request域中的数据,就可以使用@RequestAttribute)
@MatrixVariable(矩阵变量)
/cars/{path}?xxx=xxx&aaa=ccc qureyString查询字符串@RequestParam
/cars/{path;low=34;brand=byd,aidi,yd} 矩阵变量
页面开发,cookie禁用了,session里面的内容怎么使用:
session.set(a,b) ---> jsessionid ---> cookie ---> 每次发请求携带
url重写: /abc;jsessionid=xxxx 把cookie的值使用矩阵变量的方式进行传递
SpringBoot默认禁用了矩阵变量的功能手动开启
RequestMappingHandlerAdapter //支持方法上标注@RequestMapiing
HandlerFunctionAdapter //支持函数式编程
HttpRequestHandlerAdapter //
SimpleControllerHandlerAdapter //
SpringMVC目标方法能写多少种参数类型,取决于参数解析器
(源码课程太多了,有些看不懂,先进行一个实践学习,然后在进行源码学习)