Tomcat概述-web容器

2019-08-08  本文已影响0人  贪睡的企鹅

1 web容器

web容器是部署在web服务器上的应用程序,客户端可以在WEB浏览器(IE、FireFox等)输入一个请求URL,浏览器解析URL并向服务器发起HTTP请求,web容器作为web服务器上的应用程序负责处理Http请求,并将处理结果返回到客户端浏览器上。

1.1 什么是URL

URL(Uniform Resource Locator)统一资源定位符。即URL可以用来标识一个资源。

1.2 URL结构
protocol://host:port/path?query#fragment
1.3 URL 实例
http://www.runoob.com/index.html?language=cn#j2se

2 web容器的历史

2.1 Http服务器时代

早期的Web应用服务器将服务端的资源制作成html静态页面,发布于互联网上提供给客户访问,其本质是一个HTTP 服务器(比如 Apache,Nginx)

2.1.1 处理过程

客户端在WEB浏览器(IE、FireFox等)输入一个请求URL,浏览器负责解析URL,并向web服务器发起HTTP请求,web容器作为web服务器上的应用程序负责处理Http请求,web容器首先会解析请求URL,获取客户端想从web服务器访问静态文件路径,通过文件资源路径从系统中读取文件数据并返回给客户端浏览器。

image
2.1.2 缺陷

对于同一个URL请求,返回都是web服务器文件系统中同一个资源。

2.2 Http服务器 + Sevlet容器

Sun 公司推出了 Servlet 技术 。Servlet简单理解为运行在web容器中的Java
小程序,和其他java程序不同是我们编写Servlet没有main方法,不能独立运行,因此必须把它部署到 Servlet 容器中,由容器来实例化并调用Servlet。
这样web容器具有“业务逻辑”,同一个请求可以通过程序处理后返回不同的结果。

2.2.1 处理过程

客户端在WEB浏览器(IE、FireFox等)输入一个请求URL,浏览器负责解析URL,并向web服务器发起HTTP请求,web容器作为web服务器上的应用程序负责处理Http请求

image

3 Servlet容器

3.1 什么是Servlet容器

前面说到servlet是一个程序用来处理URL请求,我们可以编写多个Servlet类来处理多个请求,那web容器又是如何实现不同处理请求到不同servet?

最直接的做法是在 HTTP 服务器代码里写一大堆 if else 逻辑判断:如果是 A 请求就调 X 类的 M1 方法,
如果是 B 请求就调 Y 类的 M2 方法。HTTP 服务器的代码跟业务逻辑耦合在一起了,如果新加一个业务
方法还要改 HTTP 服务器的代码

image

为了将业务处理和Http服务器解耦,于是web容器中定义了一个servelt容器,它用来加载和管理servet实现的业务类。对于动态请求HTTP,Http服务器不直接跟业务类打交道,而是把请求交给 Servlet 容器去处理,Servlet 容器会将请求转发到具体的 Servlet,如果这个 Servlet 还没创建,就加载并实例化这个 Servlet,然后调用这个 Servlet.service方法处理.

tomcat请求设计.jpg
Servlet容器工作流程

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

servelt容器工作流程.jpg

4 servlet规范

4.1 servelt 接口

每一个servet都需要实现了一个servelt接口,servlet接口中定义了servlt运行,初始化,销毁等接口函数.

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接口本质上就是servet规范中定义的接口之一。servelt规范的存在为了让servlet容器更好的管理Servlet,同时让servelt容器和servelt实现解耦。servelt 规范统一了不同web容器对selvet容器的实现。保证同一个servlet可以在不同的web容器中运行。

5 web应用

按照servlet规范我们可以将多个servelt打包一个war包,而这个war包就表示一个web应用程序,war名称就是应用程序的名称

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

web.xml

我们通常会将servelt对应请求url配置在web.xml中

上一篇下一篇

猜你喜欢

热点阅读