springboot请求

请求映射

SpringMVC功能分析都从 org.springframework.web.servlet.DispatcherServlet-》doDispatch()
RequestMappingHandlerMapping:保存了所有@RequestMapping 和handler的映射规则。
所有的请求映射都在HandlerMapping中。
● SpringBoot自动配置欢迎页的 WelcomePageHandlerMapping 。访问 /能访问到index.html;
● SpringBoot自动配置了默认 的 RequestMappingHandlerMapping
● 请求进来,挨个尝试所有的HandlerMapping看是否有请求信息。
○ 如果有就找到这个请求对应的handler
○ 如果没有就是下一个 HandlerMapping
● 我们需要一些自定义的映射处理,我们也可以自己给容器中放HandlerMapping。自定义 HandlerMapping

 

普通参数与基本注解

@PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、@CookieValue、@RequestBody
@MatrixVariable(矩阵变量)cookie禁用了,session里面的内容怎么使用?
url重写:把cookie的值使用矩阵变量的方式进行传递。

 

参数处理原理

● HandlerMapping中找到能处理请求的Handler(Controller.method())
● 为当前Handler 找一个适配器 HandlerAdapter; RequestMappingHandlerAdapter
● 适配器执行目标方法并确定方法参数的每一个值

 

数据响应与内容协商

@ResponseBody注解解析器
● 1、返回值处理器判断是否支持这种类型返回值 supportsReturnType
● 2、返回值处理器调用 handleReturnValue 进行处理
● 3、RequestResponseBodyMethodProcessor 可以处理返回值标了@ResponseBody 注解的。
○ 1.  利用 MessageConverters 进行处理 将数据写为json
■ 1、内容协商(浏览器默认会以请求头的方式告诉服务器他能接受什么样的内容类型)
■ 2、服务器最终根据自己自身的能力,决定服务器能生产出什么样内容类型的数据,
■ 3、SpringMVC会挨个遍历所有容器底层的 HttpMessageConverter ,看谁能处理?
● 1、得到MappingJackson2HttpMessageConverter可以将对象写为json
● 2、利用MappingJackson2HttpMessageConverter将对象转为json再写出去。

 

浏览器内容协商Accept

根据客户端接收能力不同,返回不同媒体类型的数据。就不用写多套代码
浏览器接收json、手机接收xml
xml返回依赖

com.fasterxml.jackson.dataformat
jackson-dataformat-xml

 

postman只需要改变请求头中Accept字段。Http协议中规定的,告诉服务器本客户端可以接收的数据类型。
spring:
contentnegotiation:
favor-parameter: true  #开启请求参数内容协商模式

 

拦截器

实现HandlerInterceptor接口,将拦截的业务逻辑写里面
WebMvcConfigurer接口,将实现的类注册到拦截器中

 

文件上传

@RequestPart("headerImg") MultipartFile headerImg,
@RequestPart("photos") MultipartFile[] photos
○ 1、请求进来使用文件上传解析器判断(isMultipart)并封装(resolveMultipart,返回MultipartHttpServletRequest)文件上传请求
○ 2、参数解析器来解析请求中的文件内容封装成MultipartFile
○ 3、将request中文件信息封装为一个Map;MultiValueMap<String, MultipartFile>
FileCopyUtils。实现文件流的拷贝

 

异常处理

默认情况下,Spring Boot提供/error处理所有错误的映射
对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据

 

Web原生组件注入(Servlet、Filter、Listener)
@WebServlet(urlPatterns = "/my"):效果:直接响应,没有经过Spring的拦截器?
@WebFilter(urlPatterns={"/css/","/images/"})
@WebListener

 

Filter、Interceptor区别

Filter是Servlet定义的原生组件。脱离spring应用也能用
Interceptor是spring定义的接口

 

嵌入式servlet容器

○ Tomcat, Jetty, or Undertow
○ ServletWebServerApplicationContext 容器启动寻找ServletWebServerFactory 并引导创建服务器

 

原理分析套路

场景starter - xxxxAutoConfiguration - 导入xxx组件 - 绑定xxxProperties -- 绑定配置文件项

posted @ 2023-02-12 14:57  sugarstar  阅读(53)  评论(0)    收藏  举报