Tomcat作为Servlet容器访问Controller的过程涉及多个层次的协作,下面我将详细描述这一过程的工作原理。
1. 请求到达Tomcat
当客户端发起HTTP请求时,请求首先到达Tomcat的连接器(Connector)组件:
-
Tomcat使用NIO或APR等I/O模型监听指定端口(默认8080)
-
连接器接收请求后创建Request和Response对象
-
请求被交给Coyote适配器转换为Servlet规范要求的ServletRequest/ServletResponse
2. 请求在容器层次中的传递
Tomcat采用分层容器架构处理请求:
-
Engine:代表整个Servlet引擎
-
Host:虚拟主机
-
Context:Web应用上下文(对应一个WAR包)
-
Wrapper:最底层容器,代表单个Servlet
请求按照Engine→Host→Context→Wrapper的顺序传递,每层容器都会执行相关的阀门(Valve)和过滤器(Filter)
3. 请求路由到DispatcherServlet
对于Spring MVC应用:
-
在web.xml中配置了DispatcherServlet,映射到"/"路径
-
Tomcat根据URL路径匹配到对应的Wrapper(DispatcherServlet)
-
调用StandardWrapper的allocate()方法获取Servlet实例
-
如果Servlet未初始化,则调用init()方法进行初始化
4. DispatcherServlet处理流程
DispatcherServlet是Spring MVC的核心,其处理流程如下:
4.1 初始化阶段
-
在init()方法中初始化各种策略组件:
-
HandlerMapping:将请求映射到处理器(Controller)
-
HandlerAdapter:执行处理器方法
-
ViewResolver:解析视图
-
HandlerExceptionResolver:处理异常
-
MultipartResolver:处理文件上传
-
4.2 请求处理阶段
-
doService():设置请求属性,准备处理环境
-
doDispatch() :核心分发方法
a. 检查是否为文件上传请求
b. 通过HandlerMapping找到对应的HandlerExecutionChain(包含Controller方法和拦截器)
c. 获取合适的HandlerAdapter
d. 执行拦截器的preHandle()方法
e. 通过HandlerAdapter执行Controller方法
f. 处理返回值(ModelAndView或ResponseEntity)
g. 执行拦截器的postHandle()方法
h. 处理视图渲染(如果需要)
i. 触发拦截器的afterCompletion()方法
5. HandlerMapping的实现原理
Spring MVC提供了多种HandlerMapping实现:
-
RequestMappingHandlerMapping:处理@Controller和@RequestMapping注解
-
BeanNameUrlHandlerMapping:根据Bean名称映射
-
SimpleUrlHandlerMapping:显式URL映射
以RequestMappingHandlerMapping为例:
-
在应用启动时扫描所有@Controller注解的类
-
解析@RequestMapping注解,构建RequestMappingInfo对象
-
将URL模式、HTTP方法等条件注册到映射表中
-
请求到来时,根据URL和HTTP方法查找最佳匹配
6. HandlerAdapter的实现原理
常用的HandlerAdapter有:
-
RequestMappingHandlerAdapter:处理@Controller注解的方法
-
HttpRequestHandlerAdapter:处理HttpRequestHandler接口
-
SimpleControllerHandlerAdapter:处理Controller接口
RequestMappingHandlerAdapter的工作流程:
-
解析方法参数(使用HandlerMethodArgumentResolver)
-
调用Controller方法
-
处理返回值(使用HandlerMethodReturnValueHandler)
-
可能涉及消息转换(HttpMessageConverter)
7. 视图渲染过程
如果返回ModelAndView:
-
通过ViewResolver解析视图名称得到View对象
-
调用View的render()方法,合并模型数据
-
生成响应内容写入ServletResponse
8. 异常处理机制
DispatcherServlet使用HandlerExceptionResolver处理异常:
-
@ExceptionHandler方法
-
HandlerExceptionResolver实现类
-
默认的DefaultHandlerExceptionResolver
9. 性能优化点
Tomcat和Spring MVC在此过程中的优化:
-
对象池技术重用Request/Response对象
-
缓存HandlerMapping查找结果
-
异步处理支持(AsyncContext)
-
静态资源缓存
总结
Tomcat访问Controller的过程是一个多层次的协作流程,从底层的网络I/O处理,到Servlet容器的请求传递,再到Spring MVC的精细控制,每个环节都经过精心设计以实现高效、灵活的Web请求处理。理解这一过程有助于开发者更好地优化应用性能和排查问题。