关于Struts 2请求线程数及架构中响应发送主体的疑问
关于Struts 2架构中响应发送的疑问解答
兄弟,你这个观察真的很细致!先给你确认:Servlet容器为每个请求创建新线程完全是对的,这是Java Web容器的标准行为,每个请求都在独立线程里处理,避免互相干扰。
再说说Struts 2的入口:其实它的入口并不是传统意义上的Servlet Controller,而是**
StrutsPrepareAndExecuteFilter**(早期版本叫FilterDispatcher)——有些架构图会把这个过滤器笼统归为Controller,应该是从“请求入口+调度”的职责角度来命名的。这个过滤器的核心工作就是拦截匹配的请求,初始化请求上下文,接着把请求交给ActionInvocation处理。你疑惑的“为什么是ActionInvocation而非Controller发送响应”,其实是流程视角的差异:
- 过滤器接收到请求后,会创建并初始化
ActionInvocation,这个组件就像个“流程调度器”,会依次调用配置的拦截器、执行目标Action,最后触发结果视图(比如JSP、Freemarker模板)的渲染。 - 在视图渲染阶段,视图组件会把处理好的内容写入
HttpServletResponse对象——这个对象从一开始就是Servlet容器创建的,然后一步步传递给过滤器、ActionInvocation,直到视图组件。 - 当ActionInvocation完成整个流程(包括视图渲染)后,会通知过滤器流程结束,最终还是由Servlet容器负责把
HttpServletResponse里的内容发送给客户端浏览器。
- 过滤器接收到请求后,会创建并初始化
简单总结:架构图里标注的“ActionInvocation发送响应”,其实是指它负责协调完成了响应内容的生成和准备工作,真正把响应字节流推送给浏览器的还是Servlet容器,只是Struts 2把响应准备的核心调度逻辑交给了ActionInvocation,而非入口的过滤器(也就是你说的Controller)。
内容的提问来源于stack exchange,提问作者Raghav
相关产品推荐
相关产品推荐

