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
2
3
4
5
6
7
8
9
10
11
public interface Servlet {
void init(ServletConfig config) throws ServletException;

ServletConfig getServletConfig();

void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;

String getServletInfo();

void destroy();
}

三、Servlet容器

上面提到HTTP服务器不会直接调用Servlet,而是把请求交给Servlet容器来处理。

  • Servlet是如何工作的呢?

  • WEB服务器的目录是什么样的?(配置

  • 提供了哪些扩展机制?(扩展点

工作流程

当客户请求某个资源时

  1. HTTP服务器会用一个ServletRequest对象把客户的请求信息封装起来,然后调用Servlet容器的service方法
  2. Servlet容器拿到请求后,根据请求的URL和Servlet的映射关系,找到相应的Servlet
    1. 如果Servlet还没有被加载,就用反射机制创建这个Servlet,并调用Servlet的init方法来完成初始化
  3. 接着调用Servlet的service方法来处理请求,把ServletResponse对象返回给HTTP服务器
  4. HTTP服务器会把响应发送给客户端。

HTTP服务器和Servlet容器的协作

Web应用

Servlet容器会实例化和调用Servlet,那Servlet是怎么注册到Servlet容器中的呢?一般来说,我们是以Web应用程序的方式来部署Servlet的,而根据Servlet规范,Web应用程序有一定的目录结构,在这个目录下分别放置了Servlet的类文件、配置文件以及静态资源,Servlet容器通过读取配置文件,就能找到并加载Servlet。Web应用的目录结构大概是下面这样的:

1
2
3
4
5
| -  MyWebApp
| - WEB-INF/web.xml -- 配置文件,用来配置Servlet等
| - WEB-INF/lib/ -- 存放Web应用所需各种JAR包
| - WEB-INF/classes/ -- 存放你的应用类,比如Servlet类
| - META-INF/ -- 目录存放工程的一些信息

Servlet规范里定义了ServletContext这个接口来对应一个Web应用。Web应用部署好后,Servlet容器在启动时会加载Web应用,并为每个Web应用创建唯一的ServletContext对象。你可以把ServletContext看成是一个全局对象,一个Web应用可能有多个Servlet,这些Servlet可以通过全局的ServletContext来共享数据,这些数据包括Web应用的初始化参数、Web应用目录下的文件资源等。由于ServletContext持有所有Servlet实例,你还可以通过它来实现Servlet请求的转发。

扩展机制

Filter + Listener


tomcat-1 Servlet
https://yzaf.top/2023/tomcat/tomcat-1/
作者
why
发布于
2023年12月16日
许可协议