Servlet是Tomcat定义的,在Tomcat架构中一个Servlet就相当于一个请求资源,浏览器发出Http请求,当然,不一定就是Http协议的请求,就拿Http协议的Servlet举例,Tomcat会把请求封装成一个ServletRequest对象,同时会生成一个ServletResponse对象,然后交由Servlet的service处理,service接收一个ServletRequest对象和一个ServletResponse对象,用户(指Servlet的开发者)可以从ServletRequest中获取请求的相应信息,比如说请求路径、请求头信息以及请求参数等等,然后实现自己的业务逻辑,最后把返回结果写到ServletResponse。
这里,Servlet要维持一个Servlet的Config,在这个Config中包含了Servlet的URL,客户端请求这个URL的时候就会把Request分配给这个Servlet,这也被称为路由,由Mapper决定,当服务器启动时,就会去读取web.xml配置文件,在web.xml文件中就有servlet的相关配置。
首先有一个Servlet接口,把Servlet抽象出来,因为可能要实现不同协议的Servlet,方便扩展。在Servlet定义了init,service,destory和getConfig方法,init是在系统加载Servlet后调用的,主要用于初始化一些参数,init需要传入一个ServletConfig对象。在服务器启动时并不会初始化Servlet,而是当Servlet每一次被请求时会进初始化,或者在一些实现了热更新的容器中当Servlet重新Load时会进行初始化,而且Servlet在容器中默认是单例的,也就是说Servlet只会被实例化一次,当有多个请求到来时,容器会创建多个线程来执行任务,Servlet在多线程的环境中工作,因此在使用Servlet时应尽量避免使用Servlet的实例属性,这样可能会造成多线程不安全问题。service是Servlet的业务逻辑处理部分,在JavaWeb开发中doGet和doPost就是在service中调用的。destroy是容器关闭时调用的,主要用于做一些清理工作。
Servlet有一个上下文,这个上下文可以被看成是app应用的上下文,Servlet会被加入到Servlet上下文中,由ServletContext统一管理。详细的内容请参照Git上更新的源码。