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

Spring MVC源码分析 DispatcherServlet#getHandlerAdapter方法

Spring MVC是Spring框架中的一个重要模块,用于处理Web请求。DispatcherServlet是Spring MVC的前端控制器,负责将请求分发到合适的处理器。本文将深入分析 DispatcherServlet的 getHandlerAdapter方法,该方法用于获取请求处理器的适配器。

getHandlerAdapter方法简介

DispatcherServlet中 getHandlerAdapter方法的主要作用是根据处理器(handler)获取相应的处理器适配器(HandlerAdapter)。处理器适配器用于执行具体的处理器,适配不同类型的处理器,例如:控制器类、静态资源处理器等。

源码分析

首先,我们来看一下 getHandlerAdapter方法的源码:

@Nullable
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {for (HandlerAdapter adapter : this.handlerAdapters) {if (adapter.supports(handler)) {return adapter;}}throw new ServletException("No adapter for handler [" + handler +"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}
​
方法解析
  1. 方法签名

    • protected:方法受保护,子类可以访问。
    • @Nullable:方法可以返回 null,但在当前实现中总是返回一个非 null的 HandlerAdapter或抛出异常。
    • Object handler:传入的处理器对象。
    • throws ServletException:方法可能会抛出 ServletException
  2. 核心逻辑

    • 遍历 this.handlerAdapters,这是一个 HandlerAdapter列表。
    • 调用每个 HandlerAdapter的 supports方法,检查其是否支持当前处理器。
    • 如果找到支持当前处理器的 HandlerAdapter,则返回该适配器。
    • 如果没有找到支持当前处理器的适配器,则抛出 ServletException

HandlerAdapter接口

为了更好地理解 getHandlerAdapter方法,我们需要了解 HandlerAdapter接口。HandlerAdapter接口定义了一个处理器适配器必须实现的方法:

public interface HandlerAdapter {boolean supports(Object handler);ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;long getLastModified(HttpServletRequest request, Object handler);
}
​
  • supports(Object handler) :判断适配器是否支持给定的处理器。
  • handle(HttpServletRequest request, HttpServletResponse response, Object handler) :处理请求并返回 ModelAndView
  • getLastModified(HttpServletRequest request, Object handler) :返回处理器最后修改的时间。

适配器示例

Spring MVC提供了几个常用的 HandlerAdapter实现,例如 SimpleControllerHandlerAdapterRequestMappingHandlerAdapter等。以下是 SimpleControllerHandlerAdapter的部分实现:

public class SimpleControllerHandlerAdapter implements HandlerAdapter {@Overridepublic boolean supports(Object handler) {return (handler instanceof Controller);}@Overridepublic ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return ((Controller) handler).handleRequest(request, response);}@Overridepublic long getLastModified(HttpServletRequest request, Object handler) {return -1;}
}
http://www.lryc.cn/news/593461.html

相关文章:

  • LVS四种工作模式深度解析
  • Go 语言核心机制深度剖析:指针、defer、多态与空接口实战指南
  • 使用 go-redis-entraid 实现 Entra ID 无密钥认证
  • Go-Redis × RediSearch 全流程实践
  • leetcode_121 买卖股票的最佳时期
  • 力扣经典算法篇-26-长度最小的子数组(暴力求解法,左右指针法)
  • 【Java】【力扣】48.旋转图像
  • FPGA自学——整体设计思路
  • Redis数据库基础与持久化部署
  • 使用CCS6.2为C2000(DSP28335)生成.bin文件和.hex文件
  • 【LeetCode 热题 100】437. 路径总和 III——(解法一)递归递归!
  • CCF编程能力等级认证GESP—C++7级—20250628
  • STM32_Hal库学习ADC
  • IntelliJ IDEA中Mybatis的xml文件报错解决
  • SSM框架——注入类型
  • aws(学习笔记第四十九课) ECS集中练习(1)
  • Streamlit 官翻 5 - 部署、社区云 Deploy
  • Python绘制数据(三)
  • Matplotlib 30分钟精通
  • 人该怎样活着呢?55
  • Windows11下编译好的opencv4.8-mingw,可下载后直接用
  • Apache Kafka 学习笔记
  • 详细阐述 TCP、UDP、ICMPv4 和 ICMPv6 协议-以及防火墙端口原理优雅草卓伊凡
  • Python高级数据类型:字典(Dictionary)
  • Datawhale 7月学习
  • RK3568 Linux驱动学习——SDK安装编译
  • Oracle为什么需要临时表?——让数据处理更灵活
  • DAY 18 推断聚类后簇的类型
  • 【Project】kafka+flume+davinci广告点击实时分析系统
  • MySQL(145)如何升级MySQL版本?