当前位置: 首页 > news >正文

自主建站网站平台/个人网站制作模板主页

自主建站网站平台,个人网站制作模板主页,重庆网站整合营销,无锡网建公司文章目录0.前记1.HandlerMapping和HandlerAdapter的交互2.RequestMappingHandlerAdapter 如何工作3.RequestMappingHandlerAdapter 如何执行目标方法的0.前记 根据之前的文章, 在DispatcherServlet初始化的时候会发生HandlerAdapter的初始化 DispatcherServlet#doDispatch() p…

文章目录

      • 0.前记
      • 1.HandlerMapping和HandlerAdapter的交互
      • 2.RequestMappingHandlerAdapter 如何工作
      • 3.RequestMappingHandlerAdapter 如何执行目标方法的

0.前记

根据之前的文章, 在DispatcherServlet初始化的时候会发生HandlerAdapter的初始化

在这里插入图片描述

DispatcherServlet#doDispatch()

    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {HttpServletRequest processedRequest = request;HandlerExecutionChain mappedHandler = null;boolean multipartRequestParsed = false;WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);try {try {ModelAndView mv = null;Object dispatchException = null;try {processedRequest = this.checkMultipart(request);multipartRequestParsed = processedRequest != request;mappedHandler = this.getHandler(processedRequest);if (mappedHandler == null) {this.noHandlerFound(processedRequest, response);return;}HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());String method = request.getMethod();boolean isGet = HttpMethod.GET.matches(method);if (isGet || HttpMethod.HEAD.matches(method)) {long lastModified = ha.getLastModified(request, mappedHandler.getHandler());if ((new ServletWebRequest(request, response)).checkNotModified(lastModified) && isGet) {return;}}if (!mappedHandler.applyPreHandle(processedRequest, response)) {return;}mv = ha.handle(processedRequest, response, mappedHandler.getHandler());if (asyncManager.isConcurrentHandlingStarted()) {return;}this.applyDefaultViewName(processedRequest, mv);mappedHandler.applyPostHandle(processedRequest, response, mv);} catch (Exception var20) {dispatchException = var20;} catch (Throwable var21) {dispatchException = new NestedServletException("Handler dispatch failed", var21);}this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);} catch (Exception var22) {this.triggerAfterCompletion(processedRequest, response, mappedHandler, var22);} catch (Throwable var23) {this.triggerAfterCompletion(processedRequest, response, mappedHandler, new NestedServletException("Handler processing failed", var23));}} finally {if (asyncManager.isConcurrentHandlingStarted()) {if (mappedHandler != null) {mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);}} else if (multipartRequestParsed) {this.cleanupMultipart(processedRequest);}}}

1.HandlerMapping和HandlerAdapter的交互

在这里插入图片描述

在这里插入图片描述

生成的默认的HandlerAdapter

  1. HttpRequestHandlerAdapter
  2. SimpleControllerHandlerAdapter
  3. RequestMappingHandlerAdapter
  4. HandlerFunctionAdapter

在这里插入图片描述

在这里插入图片描述

这里通过适配器模式+策略模式匹配对应的HandlerMapping
supports 为策略模式, handler 为适配器模式

在这里插入图片描述

通过策略模式, 不同的HandlerAdapter 进行工作。

在这里插入图片描述

  • 比如:HttpRequestHandlerAdapter 判断是否是HttpRequestHandler接口

在这里插入图片描述

@Controller("/helloReq")
public class Controller02 implements HttpRequestHandler {@Overridepublic void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}
  • SimpleControllerHandlerAdapter 判断是否是Controller 接口

在这里插入图片描述

@org.springframework.stereotype.Controller("/helloSimple")
public class Controller01 implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {return null;}
}
  • RequestMappingHandlerAdapter

在这里插入图片描述

判断是否符合HandlerMethod接口

这种适配器比较麻烦 需要和HandlerMethod适配, 和参数和返回值和注解的处理关系。

标注解的都是这个适配器处理的

2.RequestMappingHandlerAdapter 如何工作

适配过程: 将request, response, handler连接起来处理, 返回ModelAndView

HandlerAdapter#handler()

在这里插入图片描述

DispatcherServlet#doDipspatch()

在这里插入图片描述

  • 前置拦截
  • 目标方法执行
  • 后置拦截

ha.handler -> RequestMappingHandlerAdapter#handleInternal()

	@Overrideprotected ModelAndView handleInternal(HttpServletRequest request,HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {ModelAndView mav;checkRequest(request);// Execute invokeHandlerMethod in synchronized block if required.if (this.synchronizeOnSession) {HttpSession session = request.getSession(false);if (session != null) {Object mutex = WebUtils.getSessionMutex(session);synchronized (mutex) {mav = invokeHandlerMethod(request, response, handlerMethod);}}else {// No HttpSession available -> no mutex necessarymav = invokeHandlerMethod(request, response, handlerMethod);}}else {// No synchronization on session demanded at all...mav = invokeHandlerMethod(request, response, handlerMethod);}if (!response.containsHeader(HEADER_CACHE_CONTROL)) {if (getSessionAttributesHandler(handlerMethod).hasSessionAttributes()) {applyCacheSeconds(response, this.cacheSecondsForSessionAttributeHandlers);}else {prepareResponse(response);}}return mav;}

3.RequestMappingHandlerAdapter 如何执行目标方法的

在这里插入图片描述

invokeHandlerMethod(request, response, handlerMethod);

	protected ModelAndView invokeHandlerMethod(HttpServletRequest request,HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {ServletWebRequest webRequest = new ServletWebRequest(request, response);try {WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);if (this.argumentResolvers != null) {invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);}if (this.returnValueHandlers != null) {invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);}invocableMethod.setDataBinderFactory(binderFactory);invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);ModelAndViewContainer mavContainer = new ModelAndViewContainer();mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));modelFactory.initModel(webRequest, mavContainer, invocableMethod);mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);asyncWebRequest.setTimeout(this.asyncRequestTimeout);WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);asyncManager.setTaskExecutor(this.taskExecutor);asyncManager.setAsyncWebRequest(asyncWebRequest);asyncManager.registerCallableInterceptors(this.callableInterceptors);asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);if (asyncManager.hasConcurrentResult()) {Object result = asyncManager.getConcurrentResult();mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];asyncManager.clearConcurrentResult();LogFormatUtils.traceDebug(logger, traceOn -> {String formatted = LogFormatUtils.formatValue(result, !traceOn);return "Resume with async result [" + formatted + "]";});invocableMethod = invocableMethod.wrapConcurrentResult(result);}invocableMethod.invokeAndHandle(webRequest, mavContainer);if (asyncManager.isConcurrentHandlingStarted()) {return null;}return getModelAndView(mavContainer, modelFactory, webRequest);}finally {webRequest.requestCompleted();}}
  1. 建立一个空的DataBinder工厂, 建立一个存放处理器方法和DataBinder工厂的模型工厂
    这里注意一些, Model 相当于数据, View相当于视图
  2. 封装HandlerMethod ServletInvocableHandlerMethod, 装饰器模式, 提供了参数解析器和返回值解析器
  3. ModelAndViewContainer是模型和视图的容器, 把处理过程中产生和模型与视图有关的数据先放这里
    在请求过程中共享的数据的ModelAndView
  4. invocableMethod.invokeAndHandle(webRequest, mavContainer);执行目标方法, 数据存放在mavContainer
  5. getModelAndView(mavContainer, modelFactory, webRequest); 提取到ModelAndView 数据并返回。可以去View视图展示
http://www.lbrq.cn/news/1596205.html

相关文章:

  • 小白怎么做网页/关键词优化软件
  • 清远市企业网站seo联系方式/关键词优化步骤简短
  • 做教育网站销售的好吗/游戏推广文案
  • 有没有做底单的网站/网络优化工程师
  • 上海建站模板网站/实训百度搜索引擎的总结
  • 兼职做ps网站/seo外链论坛
  • 个体做外贸的网站/上海网站排名seo公司
  • 网站制作公司承担/爱站网备案查询
  • 常州 网站建设/百度售后服务电话
  • 什么是网络营销信息/seo百度站长工具
  • 图书馆网站的建设的重要性/b站软件推广大全
  • 四川省建设厅注册管理中心网站/中国北京出啥大事了
  • 室内设计心得体会800字/名优网站关键词优化
  • 知名的wordpress模板/百度权重优化软件
  • 网上兼职做网站/百度seo营销推广多少钱
  • linux wordpress 建站教程/小程序开发文档
  • 上海市建设教育网站/抖音搜索关键词排名查询
  • 网页创建站点/百度网站关键词优化
  • 去西安旅游最佳路线/南京seo关键词排名
  • 可以做词云的网站/推广链接让别人点击
  • 专业的扬州网站建设/营销推广是什么
  • 北京海岸设计公司网站/网店运营推广登录入口
  • 网站制作应该注意到的问题/精准营销的概念
  • 重庆专业建网站/电子商务网站推广
  • 有没有做装修的大型网站而不是平台/南京疫情最新情况
  • 网站源码程序修改/软文营销方法有哪些
  • 怎样创建个人购物网站/百度竞价排名费用
  • 博客论坛网站开发/电商运营是做什么的
  • 三杰网站建设/合肥头条今日头条新闻最新消息
  • 福州做网站的公司电话/学历提升
  • k8s简介
  • Android的UI View是如何最终绘制成一帧显示在手机屏幕上?
  • 区块链 和 一致性哈希的结合
  • trace-cmd记录线程被中断打断的时间
  • 【1】WPF界面开发入门—— 图书馆程序:登录界面设计
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现各类垃圾的分类检测识别(C#代码UI界面版)