攀枝花网站seo褚明宇wordpress

张小明 2026/1/19 20:51:29
攀枝花网站seo,褚明宇wordpress,建设学院网站的通知书,做暧昧网站#x1f4dd; 导言#xff1a;Spring MVC 路由的基石 在现代 Web 开发中#xff0c;Spring MVC#xff08;Model-View-Controller#xff09;框架以其灵活、强大的特性占据了主导地位。Spring MVC 的核心机制之一是请求路由#xff08;Request Routing#xff09;… 导言Spring MVC 路由的基石在现代 Web 开发中Spring MVCModel-View-Controller框架以其灵活、强大的特性占据了主导地位。Spring MVC 的核心机制之一是请求路由Request Routing它决定了传入的 HTTP 请求应该由哪个业务处理器通常是 Controller 中的方法来处理。这一核心功能主要由HandlerMapping体系负责实现。本文将深入剖析 Spring MVC 是如何利用RequestMapping注解在应用启动时构建内部映射表并在请求到达时高效地将 URL 匹配到正确的处理器并最终构建出完整的HandlerExecutionChain处理器执行链的全过程。理解这一机制是掌握 Spring MVC 底层工作原理的关键。I. 核心概念与架构概览在开始深入细节之前我们首先需要理解涉及到的几个关键角色和它们在 Spring MVC 架构中的位置。1. DispatcherServlet路由的协调者DispatcherServlet是 Spring MVC 的前端控制器是所有请求的入口。它不直接处理请求映射而是将这个任务委托给HandlerMapping策略接口的实现类。当一个请求到达时DispatcherServlet的核心任务流程如下请求进入接收HttpServletRequest。查找处理器调用HandlerMapping.getHandler(request)。获取执行链获得HandlerExecutionChain包含处理器和拦截器。执行处理通过HandlerAdapter实际执行处理器。视图解析处理结果并渲染视图。2. HandlerMapping请求映射的策略接口HandlerMapping是一个策略接口它定义了根据请求查找处理器执行链的能力。Spring MVC 可以配置多个HandlerMapping实现它们会按照特定的顺序Order属性依次尝试查找处理器。接口/实现描述关键方法HandlerMapping核心策略接口定义了查找处理器的方法。HandlerExecutionChain getHandler(HttpServletRequest request)RequestMappingHandlerMappingSpring 3.1 默认且推荐的实现专门处理基于RequestMapping注解的处理器。内部维护映射表 (MapRequestMappingInfo, HandlerMethod)3. RequestMappingHandlerMapping注解驱动的核心RequestMappingHandlerMapping是本文分析的重点。它是 Spring Boot/Spring MVC 默认用于处理Controller和RestController中RequestMapping注解的组件。它的工作可以清晰地划分为两大阶段初始化阶段 (Application Startup)扫描所有 Bean解析RequestMapping构建映射查找表。请求处理阶段 (Runtime)根据传入的请求 URL 和 HTTP 方法查询映射表返回HandlerExecutionChain。II. 初始化阶段构建映射查找表RequestMappingHandlerMapping的初始化过程是 Spring MVC 路由机制的基石。这一过程发生在应用启动时通过扫描和解析注解将逻辑映射转化为高效的查找结构。1. Bean 生命周期与初始化入口RequestMappingHandlerMapping实现了 Spring 的InitializingBean接口或继承了其父类AbstractHandlerMethodMapping的相关初始化逻辑。核心入口方法afterPropertiesSet()或其内部调用的initHandlerMethods()。在 Spring 容器完成 Bean 的实例化和属性设置后该方法被调用启动以下流程获取 Spring 容器中所有的 Bean 名称。遍历这些 Bean筛选出合适的处理器 Bean。2. 筛选处理器 BeanRequestMappingHandlerMapping主要关注两类 Bean标记了Controller的类。标记了RestController的类RestController内部包含Controller。它通过is /抽象方法来判断一个 Bean 是否符合条件通常是检查其类定义上是否存在Controller注解。3. 解析RequestMapping注解HandlerMethod 的诞生对于每一个筛选出的处理器 BeanRequestMappingHandlerMapping会迭代检查其类级别和方法级别上的所有方法。3.1 封装 HandlerMethod当发现方法上存在RequestMapping或其变体如GetMapping、PostMapping等时该方法就被确定为一个可处理请求的处理器方法Handler Method。HandlerMethod是 Spring MVC 对处理器方法的抽象封装。它包含bean处理器实例Controller 对象。methodJava 反射中的Method对象用于后续实际调用。beanType处理器类的类型。3.2 解析并合并 RequestMappingInfoHandlerMethod对应的映射条件被封装在RequestMappingInfo对象中。解析类级别注解如果 Controller 类上也有RequestMapping例如/api/v1这部分信息首先被解析。解析方法级别注解方法上的RequestMapping例如/users/{id}也被解析。合并类级别和方法级别的映射信息通过combine()方法合并形成最终的RequestMappingInfo。RequestMappingInfo的结构它实际上是多个条件的复合体每个条件都抽象为一个RequestCondition接口的实现内部组件 (Condition)描述对应RequestMapping属性PatternsRequestCondition路径匹配条件value或pathRequestMethodsRequestConditionHTTP 方法条件methodParamsRequestCondition请求参数条件paramsHeadersRequestCondition请求头条件headersConsumesRequestCondition客户端希望发送的数据类型Content-TypeconsumesProducesRequestCondition服务器希望返回的数据类型Acceptproduces3.3 注册映射构建核心查找表最终RequestMappingHandlerMapping调用核心方法registerHandlerMethod()将解析得到的RequestMappingInfo和对应的HandlerMethod注册到其内部的查找表mappingRegistry中。这个查找表的核心结构是一个MapRequestMappingInfo, HandlerMethod它构成了请求映射的核心数据结构。4. 潜在冲突检测在注册过程中RequestMappingHandlerMapping会检查是否存在重复映射。如果两个不同的HandlerMethod解析出了完全相同的RequestMappingInfo即路径、方法、参数等所有条件都一样Spring 容器将抛出异常阻止应用启动确保路由的唯一性。III. 请求处理阶段从请求到执行链的构建当应用启动完成内部映射表构建完毕后每一次客户端请求的到来都会触发RequestMappingHandlerMapping的运行时查找逻辑。1.DispatcherServlet调用getHandler()当一个 HTTP 请求到达DispatcherServlet的doService()或doDispatch()方法时它会按顺序遍历已配置的HandlerMapping列表并调用其核心方法HandlerExecutionChain g e t H a n d l e r ( HttpServletRequest r e q u e s t ) \text{HandlerExecutionChain} \ getHandler(\text{HttpServletRequest}\ request)HandlerExecutionChaingetHandler(HttpServletRequestrequest)2. 匹配逻辑lookupHandlerMethod()RequestMappingHandlerMapping内部的查找逻辑主要集中在lookupHandlerMethod()方法中。2.1 提取查找路径首先它从HttpServletRequest中提取出用于路径匹配的 URI。2.2 遍历与匹配RequestCondition.getMatchingCondition()HandlerMapping遍历其内部查找表中的所有RequestMappingInfoKey。对于每一个RequestMappingInfo它会执行一个关键步骤条件匹配依次调用RequestMappingInfo内部的各个RequestCondition路径、方法、参数等的getMatchingCondition(request)方法。如果请求满足某个条件该条件会返回一个经过处理的、可能包含路径变量信息的新的RequestCondition实例。如果请求不满足某个条件例如 HTTP 方法不匹配匹配过程会立即终止该RequestMappingInfo被跳过。最终匹配只有当一个RequestMappingInfo内部的所有条件都匹配成功时它才被视为一个候选匹配。2.3 最佳匹配的确定Comparator在一个复杂的应用中一个请求 URI 可能会同时匹配多个RequestMappingInfo例如/users/{id}和/users/new。Spring MVC 必须决定哪个是最佳匹配。RequestMappingInfo实现了Comparable接口它定义了一套优先级规则Comparator路径精确度优先匹配更精确的路径例如/users/new比/users/{id}优先级高。路径变量数量路径变量{id}越少的优先级越高。HTTP 方法精确度匹配特定 HTTP 方法GetMapping的比匹配所有方法未指定method的优先级高。Consumes/Produces匹配特定Content-Type/Accept的优先级高。通过compareTo()方法RequestMappingHandlerMapping会对所有候选匹配进行排序选择优先级最高的那个对应的HandlerMethod。3. 构建 HandlerExecutionChain整合拦截器一旦最佳匹配的HandlerMethod被确定RequestMappingHandlerMapping的下一个任务就是构建HandlerExecutionChain。HandlerExecutionChain是 Spring MVC 灵活性的关键所在它是一个**处理器Handler和一系列拦截器HandlerInterceptor**组成的链式结构。3.1 确定 HandlerInterceptorHandlerMapping会根据当前的请求路径从配置的拦截器列表中通常在配置类中通过addInterceptors()方法配置找出所有适用的拦截器。路径匹配拦截器通常配置了includePatterns包含路径和excludePatterns排除路径。HandlerMapping会检查请求 URI 是否符合这些模式。3.2 实例化 HandlerExecutionChainHandlerMapping实例化HandlerExecutionChain并将以下两个关键元素放入其中Handler确定的HandlerMethod对象。Interceptors确定的一组HandlerInterceptor实例。4. 返回执行链与路径变量存储最终RequestMappingHandlerMapping将构建好的HandlerExecutionChain返回给DispatcherServlet。路径变量Path Variables的处理在匹配过程中如果路径包含变量如/users/{id}RequestMappingHandlerMapping会解析出{id}对应的值并将其存储在HttpServletRequest的请求属性Attributes中。存储位置键值对以URI_TEMPLATE_VARIABLES_ATTRIBUTE常量作为 KeyMapString, String作为 Value 存储在HttpServletRequest中。后续使用在处理器调用阶段HandlerAdapter会从请求属性中读取这些变量并通过PathVariable注解注入到 Controller 方法参数中。IV. 流程总结与扩展HandlerAdapter 的协作阶段关键角色核心动作产出结果初始化(Startup)RequestMappingHandlerMapping扫描Controller解析RequestMapping创建RequestMappingInfo和HandlerMethod。核心查找表(MapRequestMappingInfo, HandlerMethod)查找(Runtime)RequestMappingHandlerMapping根据请求 URI/Method遍历查找表进行条件匹配确定最佳匹配的HandlerMethod。确定的HandlerMethod构建链(Runtime)RequestMappingHandlerMapping查找适用的HandlerInterceptor将HandlerMethod与HandlerInterceptor封装。HandlerExecutionChain返回给DispatcherServlet执行(Runtime)DispatcherServletHandlerAdapter收到HandlerExecutionChain后先依次调用拦截器的preHandle()然后通过HandlerAdapter实际调用HandlerMethod。ModelAndView或null1. HandlerAdapter 的协作HandlerExecutionChain返回后DispatcherServlet找到对应的HandlerAdapter通常是RequestMappingHandlerAdapter来执行处理器。拦截器前置处理DispatcherServlet依次调用执行链中所有拦截器的preHandle()方法。执行处理器RequestMappingHandlerAdapter接收HandlerMethod利用反射机制调用其核心方法invokeAndHandle()。参数解析在调用方法前HandlerAdapter负责处理方法参数读取请求中的路径变量、查询参数、请求体等。通过HandlerMethodArgumentResolver体系如PathVariableMethodArgumentResolver、RequestResponseBodyMethodProcessor将数据绑定到方法的参数上。拦截器后置/完成处理器执行后依次调用postHandle()和afterCompletion()。2. 拦截器执行顺序HandlerExecutionChain保证了拦截器按照注册顺序Order属性执行但前置处理和后置处理的顺序是相反的前置处理 (preHandle)按照注册顺序依次执行。如果任何一个preHandle返回false链条中断。后置处理 (postHandle)按照注册顺序的逆序依次执行。完成处理 (afterCompletion)按照注册顺序的逆序依次执行。3. 总结HandlerMapping机制是 Spring MVC 路由功能的心脏。它将开发者友好的RequestMapping注解经过精心设计的分阶段处理初始化时的映射表构建和运行时的最佳匹配算法高效地转化为一个可执行的、包含了所有前置/后置逻辑的HandlerExecutionChain。这一过程确保了请求能够被准确、灵活且高性能地路由到正确的业务代码上构成了 Spring MVC 强大路由能力的基础。 附录核心组件接口与类关系为了更全面地理解这一过程下面列出关键接口与实现类的关系使用 UML 风格标记。1. 核心抽象类继承关系classDiagram direction TB interface HandlerMapping { getHandler(request): HandlerExecutionChain } AbstractHandlerMapping |-- HandlerMapping abstract class AbstractHandlerMapping { #getHandlerInternal(request): Object getHandler(request): HandlerExecutionChain setInterceptors(interceptors: ListHandlerInterceptor) } AbstractHandlerMethodMapping |-- AbstractHandlerMapping abstract class AbstractHandlerMethodMapping { -mappingRegistry: MappingRegistry #initHandlerMethods() #lookupHandlerMethod(lookupPath, request): HandlerMethod afterPropertiesSet() } RequestMappingHandlerMapping --| AbstractHandlerMethodMapping class RequestMappingHandlerMapping { isHandler(beanType): boolean get : RequestMappingInfoHandlerMethod }2. 映射信息与处理器关系1*1*uses11contains11contains1*RequestMappingInfo-patternsCondition: PatternsRequestCondition-methodsCondition: RequestMethodsRequestCondition// ... more conditionsgetMatchingCondition(request)compareTo(other)HandlerMethodbean: Objectmethod: MethodgetMethodParameters()MappingRegistryMap registryRequestMappingHandlerMappingHandlerExecutionChainhandler: Objectinterceptors: HandlerInterceptor[]getHandler()getInterceptors()HandlerInterceptor你好 这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持除了标准的Markdown编辑器功能我们增加了如下几点新功能帮助你用它写博客全新的界面设计将会带来全新的写作体验在创作中心设置你喜爱的代码高亮样式Markdown将代码片显示选择的高亮样式进行展示增加了图片拖拽功能你可以将本地的图片直接拖拽到编辑区域直接展示全新的KaTeX数学公式语法增加了支持甘特图的mermaid语法1功能增加了多屏幕编辑Markdown文章功能增加了焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置等功能功能按钮位于编辑区域与预览区域中间增加了检查列表功能。功能快捷键撤销Ctrl/CommandZ重做Ctrl/CommandY加粗Ctrl/CommandB斜体Ctrl/CommandI标题Ctrl/CommandShiftH无序列表Ctrl/CommandShiftU有序列表Ctrl/CommandShiftO检查列表Ctrl/CommandShiftC插入代码Ctrl/CommandShiftK插入链接Ctrl/CommandShiftL插入图片Ctrl/CommandShiftG查找Ctrl/CommandF替换Ctrl/CommandG合理的创建标题有助于目录的生成直接输入1次#并按下space后将生成1级标题。输入2次#并按下space后将生成2级标题。以此类推我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。如何改变文本的样式强调文本强调文本加粗文本加粗文本标记文本删除文本引用文本H2O is是液体。210运算结果是 1024.插入链接与图片链接: link.图片:带尺寸的图片:居中的图片:居中并且带尺寸的图片:当然我们为了让用户更加便捷我们增加了图片拖拽功能。如何插入一段漂亮的代码片去博客设置页面选择一款你喜欢的代码片高亮样式下面展示同样高亮的代码片.// An highlighted blockvarfoobar;生成一个适合你的列表项目项目项目项目1项目2项目3计划任务完成任务创建一个表格一个简单的表格是这么创建的项目Value电脑$1600手机$12导管$1设定内容居中、居左、居右使用:---------:居中使用:----------居左使用----------:居右第一列第二列第三列第一列文本居中第二列文本居右第三列文本居左SmartyPantsSmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如TYPEASCIIHTMLSingle backticksIsnt this fun?‘Isn’t this fun?’QuotesIsnt this fun?“Isn’t this fun?”Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash创建一个自定义列表MarkdownText-to-HTMLconversion toolAuthorsJohnLuke如何创建一个注脚一个具有注脚的文本。2注释也是必不可少的Markdown将文本转换为HTML。KaTeX数学公式您可以使用渲染LaTeX数学表达式 KaTeX:Gamma公式展示Γ ( n ) ( n − 1 ) ! ∀ n ∈ N \Gamma(n) (n-1)!\quad\forall n\in\mathbb NΓ(n)(n−1)!∀n∈N是通过欧拉积分Γ ( z ) ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) \int_0^\infty t^{z-1}e^{-t}dt\,.Γ(z)∫0∞​tz−1e−tdt.你可以找到更多关于的信息LaTeX数学表达式here.新的甘特图功能丰富你的文章2014-01-072014-01-092014-01-112014-01-132014-01-152014-01-172014-01-192014-01-21已完成进行中计划一计划二现有任务Adding GANTT diagram functionality to mermaid关于甘特图语法参考 这儿,UML 图表可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图张三李四王五你好李四, 最近怎么样?你最近怎么样王五我很好谢谢!我很好谢谢!李四想了很长时间, 文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五这将产生一个流程图。:链接长方形圆圆角长方形菱形关于Mermaid语法参考 这儿,FLowchart流程图我们依旧会支持flowchart的流程图Created with Raphaël 2.3.0开始我的操作确认结束yesno关于Flowchart流程图语法参考 这儿.导出与导入导出如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到文章导出生成一个.md文件或者.html文件进行本地保存。导入如果你想加载一篇你写过的.md文件在上方工具栏可以选择导入功能进行对应扩展名的文件导入继续你的创作。mermaid语法说明 ↩︎注脚的解释 ↩︎
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

报名网站如何做国外室内设计网

FFXIV TexTools终极指南:轻松打造个性化最终幻想14游戏体验 【免费下载链接】FFXIV_TexTools_UI 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_TexTools_UI FFXIV TexTools是一款专为最终幻想14(Final Fantasy XIV)玩家设计的…

张小明 2026/1/17 20:37:59 网站建设

杭州市建设网站东莞百度seo哪里强

VxeTable 导出 Excel 记录 ACE-Step 生成日志:便于数据分析 在 AI 内容创作工具日益普及的今天,一个常见的痛点浮出水面:模型跑得越来越快,输出也越来越惊艳,但背后的“黑箱”却让开发者和产品团队难以看清——某次生…

张小明 2026/1/17 20:38:03 网站建设

重庆市建设考试报名网站微信公众平台做微网站

深海探测器故障诊断:历史维修记录智能匹配 在深海科考任务中,时间就是生命。一次下潜窗口往往只有短短几小时,若探测器在水下突发姿态漂移或推进失灵,地面团队必须在极短时间内定位问题并给出应对方案。然而,面对动辄数…

张小明 2026/1/17 20:38:04 网站建设

化妆品商城网站建设策划方案wordpress实现登录

小红书下载工具完整使用教程:轻松保存无水印作品 【免费下载链接】XHS-Downloader 免费;轻量;开源,基于 AIOHTTP 模块实现的小红书图文/视频作品采集工具 项目地址: https://gitcode.com/gh_mirrors/xh/XHS-Downloader 还在…

张小明 2026/1/17 20:38:03 网站建设

php网站开发代码网店代运营费用

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个React项目,使用Lucide-React图标库实现以下功能:1. 页面顶部导航栏包含首页、产品、关于我们三个菜单项,每个菜单项左侧显示对应图标&am…

张小明 2026/1/17 20:38:04 网站建设

西安模板网站建设套餐软件项目管理过程五个阶段

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

张小明 2026/1/17 20:46:32 网站建设