浅析Tomcat中Servlet的运行原理

最近几天在学习Servlet,由于个人学习能力有限,学的稀里糊涂的,于是今天花了将近八个小时的时间,才把Servlet的运行原理稍微弄懂了那么一点点,我把它分享出来,希望对你也有一些帮助。

Servlet是个啥?

当我们使用搜索引擎搜索内容时,第一步要做的就是输入搜索关键词,然后服务器根据关键词返回给我们想要的内容,当我们输入不同的关键词时,服务器返回的内容也会有所不同,而服务器向浏览器返回的不同内容也就是我们所说的动态的Web资源。如果想要开发这样的功能,就必须用到Servlet技术(此文章仅针对Java Web领域,至于其他的编程语言所使用的技术,因为个人能力有限,暂时还不知道)。讲到这里,可能大家还不是很清楚Servlet究竟是什么东西?其实Servlet是sun公司提供的一门用于开发动态web资源的技术。Sun公司在其API中提供了一个servlet接口,用户若想开发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:

        1、编写一个Java类,实现servlet接口。

        2、把开发好的Java类部署到web服务器中。

上面对Servlet的理解相对狭义,广义的对Servlet的理解是指任何实现了这个Servlet接口的类,而一般情况下,我们都将Servlet理解为后者。

Servlet运行全过程

写在前面:Servlet的生命周期包含实例化、初始化、服务和销毁四个阶段。

1、实例化Servlet

当浏览器向服务器发送一个请求之后,服务器首先做的是先检查是否已经装载并创建了该Servlet的实例对象,如果已经创建,则直接执行第四步,否则执行第二步。补充一点:如果我们在配置文件中为该Servlet类设置load-on-startup的属性值为1,那么服务器在启动之时便会直接创建该Servlet实例并初始化。

2、初始化Servlet

当我们在初始化Servlet之前,服务器会创建一个ServletConfig对象,同时将Servlet配置文件当前Servlet中的一些初始化参数封装进ServletConfig对象,然后会调用Servlet的init(ServletConfig config)初始化Servlet对象。

3、服务阶段

Tomcat 一接受到浏览器的请求首先将会创建 org.apache.coyote.Request 和 org.apache.coyote.Response,这两个类是 Tomcat 内部使用的描述一次请求和相应的信息类它们是一个轻量级的类,它们作用就是在服务器接收到请求后,经过简单解析将这个请求快速的分配给后续线程去处理,所以它们的对象很小,很容易被 JVM 回收。

接下来这两个对象会交给Tomcat的连接器Connector,Connector会创建一个Request和Response对象,用于和前端Client交换数据,然后产生一个线程,并将Request对象和Response对象传递给线程,注意此时的两个对象的类型分别是org.apache.catalina.connector. Request 和 org.apache.catalina.connector. Response。你以为到这里就完了吗?并不会tomcat会继续将其封装成RequestFacade和ResponseFacade,这里的封装使用了名为外观模式的设计模式,至于为什么这么做,因为我还没有了解过设计模式,所以就不多说了,但大体是为了屏蔽掉原本类的一些方法,避免干扰。

至此,请求的转换结束,tomcat会把这两个参数传递给servlet的service方法。那么问题又来了,我们查看servlet类的父类HttpServlet时,会发现它有两个service方法,一个是 public void service(ServletRequest req, ServletResponse res),一个是protected void service(HttpServletRequest req, HttpServletResponse resp),此时omcat调用的是哪个方法呢?答案是修饰符为public的service方法,因为只有这个方法才会被Tomcat自动调用,下面是该public void service方法的源码。

通过源码我们可以发现,在public的service方法中会将request和response强转,然后调用protected的service方法,所以我们在servlet中重写protected的service方法时完全可以的。

下面我们再看看protected的service方法的源码:

在这个方法中,service方法会根据的浏览器请求的类型再去调用相应的doXXX方法,比如doGet、doPost等。

4、销毁Servlet

当我们关闭服务器时,相应的Servlet实例就会执行destory方法进行销毁。


最后附上一张今天整理的和servlet相关的类以及它们之间的一些关系。

3.png

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值