源码级梳理Web服务流程

web服务的规范,不得不提Servlet,Servlet指定了web应用的规范,其中定义了servlet相关的接口和filter相关的接口。

Servlet接口

filter接口

这些接口怎么用?

大致的规则是,web容器,如tomcat 执行/调用 Servlet

ServletContext接口

tomcat实现该接口的类:

这里的context的作用是什么?

用来 将 servlet 和 web服务器关联起来的吧。

 ServletContainerInitializer接口

通过接口名,可以知道是 servlet容器初始化的,那么初始化什么呢?

public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException;

该接口唯一的方法,入参是  ServletContext接口,难道是初始化 ServletContext吗?

看下 spring boot 2.3.12版本的 TomcatStarter 实现:

ServletContextInitializer接口好像不是 servlet规范里的接口,纯粹是 spring boot 2.3.12自己定义的接口,方便扩展。

再看下 spring web 模块的实现SpringServletContainerInitializer:

WebApplicationInitializer接口好像不是 servlet规范里的接口,纯粹是 spring web模块自己定义的接口,方便扩展。

目的都是 构建ServletContext,添加 servlet,filter,listener这些。

分析下tomcat的代码执行逻辑:

web服务再创建ApplicationContext时,会执行createWebServer方法,该方法是启动tomcat。

ServletWebServerFactory 接口用来创建 web服务器,实现类可以看下 TomcatServletWebServerFactory,

这里的代码也比较清晰,创建tomcat实例,配置连接器等。

看下prepareContext(tomcat.getHost(), initializers); 

这里 准备 context,是什么context?

 TomcatEmbeddedContext 是 tomcat内置的上下文,跟servletContext不是一回事。

该方法放下看,

TomcatStarter,上面描述过,是用来初始化servlet容器的。也就是 通过传入的 ServletContextInitializer 来初始化的。

这里有 servlet注册,filter注册,listener注册的 ServletContextInitializer bean,

servlet注册的 DispatcherServlet,到这里,是不是恍然大悟。

看下TomcatEmbeddedContext

开始调用 ServletContainerInitializer

到这里才实例化 servletContext, ApplicationContext,

这里的servletContext 和 下图红框里获取的是同一个 对象吗? 是的

这里 会把 servletContext 塞给 ServletWebServerApplicationContext。

通过以上的分析,大致了解了 servlet /filter 用再哪里,再哪里注册,以及web服务启动过程。

如何响应请求,执行的逻辑是什么? 当链接器接受的一个请求后:

执行service的 engine的 pipeline

engine 执行host的 pipeline

host 执行 context的 pipeline

context 执行 wrapper的 pipeline

wrapper 执行 filter

filter 执行完后,执行 servlet的service方法

最终执行到目标服务方法。 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值