- 当Tomcat接收到客户端请求时,会将请求交给
CoyoteAdapter
进行处理。 CoyoteAdapter
根据请求的方法(GET、POST等)和URL找到对应的Connector
和Processor
。Processor
是一个Servlet容器,负责创建和维护Servlet对象,处理HTTP请求,并将产生的响应返回给客户端。Processor
会在调用StandardWrapperValve
时创建和初始化Servlet实例,并调用其相应的生命周期方法来处理请求和产生响应。
下面是StandardWrapperValve
中处理Servlet请求的代码片段:
public final class StandardWrapperValve extends ValveBase {
public void invoke(Request request, Response response) throws IOException, ServletException {
......
// 在这里获取到对应的Servlet对象
Servlet servlet = wrapper.allocate();
try {
// 初始化Servlet并调用相应的生命周期方法
request.setServletPath(wrapper.getServletPath());
request.setAttribute(Globals.SERVLET_MAPPING_ATTR, wrapper.getServletMapping().getMatchValue());
support.fireInstanceEvent(InstanceEvent.BEFORE_INIT_EVENT, servlet);
servlet.init(config);
support.fireInstanceEvent(InstanceEvent.AFTER_INIT_EVENT, servlet);
pipeline.invoke(request, response);
support.fireInstanceEvent(InstanceEvent.BEFORE_DESTROY_EVENT, servlet);
} finally {
// 销毁Servlet实例
if (servlet != null) {
wrapper.deallocate(servlet);
}
request.recycle();
response.recycle();
}
}
}
在这个代码片段中,我们可以看到:
StandardWrapperValve
是一个Valve
的实现类,用于在Tomcat的请求处理流程中处理Servlet请求。- 在
invoke
方法中,StandardWrapperValve
首先根据包含在请求中的URL路径信息(servlet path)找到对应的Servlet
对象。 - 然后,
StandardWrapperValve
通过调用Servlet
的生命周期方法(init()
、service()
等)来处理HTTP请求和产生响应。 - 最后,在
finally
块中,Servlet容器会调用servlet
的destroy()
方法来销毁Servlet实例。
需要注意的是,这只是Tomcat的Servlet请求处理逻辑的简要示例。实际代码实现可能比这更加复杂,并涉及多个模块和类的协同工作。