Tomcat学艺-Tomcat中对静态资源的访问也会用servlet来处理吗?

时间:2024-05-19 08:49:16

tomcat,熟悉的陌生人。我们所有的项目都运行在它上面,而我们却往往对它视而不见。现实中也是如此,我们周围充满了空气,我们无时无刻不在呼吸,但你从来没关心过它。同样的,Tomcat于我们而言,也只是在创建环境或者运行项目爆出各种错误时,才会去看看它。

上世纪90年代在大洋彼岸,有一家名唤SUN的公司,创造了一门全新的语言,叫Java。经过短短几年的发展,一跃成为市场上最炙手可热的语言。随后又悟出“Java13绝技”,也就是所谓的JavaEE规范:JDBC,JNDI,EJB,RMI,JSP,Servlets,XML,JMS,Java IDL,JTS,JTA,JavaMail,JAF。

在大洋彼岸还有一家公司,准确来说它是一个组织,专门搞开源的,叫Apache。这家公司搞出了一个叫Tomcat的服务器。这个名字取得真好啊。中国有个词叫三脚猫,专门来吐槽别人功夫不到家。巧了,Tomcat也没完全实现JavaEE规范。13种核心技术,Tomcat只实现了俩:Servlet和JSP。而其他服务器比如JBoss、Weblogic啥的都是完全支持的。所以人们往往更愿意叫Tomcat为轻量级的服务器,也有叫它Servlet/JSP容器的。

听到这,你不禁大叫:不对啊,我记得自己写的程序里有用到JDBC啊,还可以运行哩!

啊,那是因为你导了JDBC包...但是你安装了Tomcat后另外导过Servlet/JSP的包吗?没有嘛!人家实现了Servlet/JSP规范,都整到自己源码里了。

说到这,我也是泪流满面。因为我才发现自己也是个三脚猫。上面“Java13绝技”我特么也就学过JDBC/XML/JSP/Servlet...所以我更愿意称自己是JavaWeb程序员,而不是JavaEE程序员。JavaEE其实很重,我拿不动,打扰了。

 

  • Web服务器?Web容器?

其实,Tomcat服务器 = Web服务器 + Servlet/JSP容器(Web容器)。

eb服务器的作用是接收客户端的请求,给客户端作出响应。但是很明显,服务器不止静态资源呀,所以客户端发起请求后,如果是动态资源,Web服务器不可能直接把它响应回去(比如JSP),因为浏览器只认识静态资源。所以对于JavaWeb程序而言,还需要JSP/Servlet容器,JSP/Servlet容器的基本功能是把动态资源转换成静态资源。我们JavaWeb工程师需要使用Web服务器和JSP/Servlet容器,而通常这两者会集于一身,比如Tomcat。

Tomcat学艺-Tomcat中对静态资源的访问也会用servlet来处理吗?

Web服务器接收、响应客户端请求,Web容器装载Servlet/JSP,让它们去处理动态资源

 

  • 动手实现"Tomcat"

最后,还有个很无聊的问题留给大家思考:JavaSE阶段,我们无论做什么,都是上来先敲main()。学了JavaWeb后,我想问问,你有多久没敲main()了?她去哪了呢?
Tomcat学艺-Tomcat中对静态资源的访问也会用servlet来处理吗?

 

  • tomcat中对静态资源的访问也会用servlet来处理吗?

Tomcat访问所有的资源,都是用Servlet来实现的。

在Tomcat看来,资源分3种

1. 静态资源,如css,html,js,jpg,png等

2. Servlet

3. JSP

对于静态资源,Tomcat最后会交由一个叫做DefaultServlet的类来处理

对于Servlet ,Tomcat最后会交由一个叫做 InvokerServlet的类来处理

对于JSP,Tomcat最后会交由一个叫做JspServlet的类来处理

所以Tomcat又叫Servlet容器嘛,什么都交给Servlet来处理。

那么什么时候调用哪个Servlet呢? 有一个类叫做org.apache.tomcat.util.http.mapper.Mapper,它一共进行了7个大的规则判断,第7个,就是判断是否是该用DefaultServlet。

简单地说。。。先看是不是servlet,然后看是不是jsp,如果都不是,那么就是你DefaultServlet的活儿了。

Tomcat学艺-Tomcat中对静态资源的访问也会用servlet来处理吗?

到了DefaultServlet之后,就是一个普通的HttpServlet了,doPost方法会交由doGet处理:

Tomcat学艺-Tomcat中对静态资源的访问也会用servlet来处理吗?

doGet又交由一个叫做 serveResource的方法处理

Tomcat学艺-Tomcat中对静态资源的访问也会用servlet来处理吗?

在serveResource方法里又瞎搞八搞了许多事情,最后在一个叫做copy()方法里,把静态资源对应的输入流 读取出来,扔到了输出流里,这样你的浏览器就看到数据了。

Tomcat学艺-Tomcat中对静态资源的访问也会用servlet来处理吗?

 

@转载整理

https://zhuanlan.zhihu.com/p/54121733

https://www.zhihu.com/question/57400909