tomcat-1 Servlet
一、背景
浏览器发给服务端的是一个HTTP格式的请求,HTTP服务器收到这个请求后,需要调用服务端程序来处理。
这样就会出现HTTP服务器对服务端程序的依赖。
为了解除这种耦合,我们建立了一个中间的抽象层 Servlet ,让具体的业务类和HTTP服务器都依赖这种抽象。
业务类实现Servlet接口,这种业务类有时候也被叫做Servlet。
可是又会有一个问题:HTTP服务器虽然不用调用业务类的接口了,但还是要把请求分发到不同的Servlet中,
还是会依赖一部分业务逻辑。
因此,我们又发明了一个Servlet容器,专门用来管理Servlet。因此Servlet接口是Servlet容器和业务类之间的接口。
而Servlet接口和Servlet容器这一整套规范叫作Servlet规范。
Tomcat和Jetty都按照Servlet规范的要求实现了Servlet容器,同时它们也具有HTTP服务器的功能。
对于开发者来说,要实现新的业务功能,只需要实现一个Servlet,并把它注册到Tomcat(Servlet容器)中。
二、Servlet接口
Servlet定义了如下五个接口。最重要的是service
方法,业务逻辑在其中
1 |
|
三、Servlet容器
上面提到HTTP服务器不会直接调用Servlet,而是把请求交给Servlet容器来处理。
那
Servlet是如何工作的呢?
WEB服务器的目录是什么样的?(配置
- 提供了哪些扩展机制?(扩展点
工作流程
当客户请求某个资源时
- HTTP服务器会用一个ServletRequest对象把客户的请求信息封装起来,然后调用Servlet容器的service方法
- Servlet容器拿到请求后,根据请求的URL和Servlet的映射关系,找到相应的Servlet
- 如果Servlet还没有被加载,就用反射机制创建这个Servlet,并调用Servlet的init方法来完成初始化
- 接着调用Servlet的service方法来处理请求,把ServletResponse对象返回给HTTP服务器
- HTTP服务器会把响应发送给客户端。
Web应用
Servlet容器会实例化和调用Servlet,那Servlet是怎么注册到Servlet容器中的呢?一般来说,我们是以Web应用程序的方式来部署Servlet的,而根据Servlet规范,Web应用程序有一定的目录结构,在这个目录下分别放置了Servlet的类文件、配置文件以及静态资源,Servlet容器通过读取配置文件,就能找到并加载Servlet。Web应用的目录结构大概是下面这样的:
1 |
|
Servlet规范里定义了ServletContext这个接口来对应一个Web应用。Web应用部署好后,Servlet容器在启动时会加载Web应用,并为每个Web应用创建唯一的ServletContext对象。你可以把ServletContext看成是一个全局对象,一个Web应用可能有多个Servlet,这些Servlet可以通过全局的ServletContext来共享数据,这些数据包括Web应用的初始化参数、Web应用目录下的文件资源等。由于ServletContext持有所有Servlet实例,你还可以通过它来实现Servlet请求的转发。
扩展机制
Filter + Listener