tomcat 综述

Web 容器: 早期的web应用主要是浏览静态页面,想Apache, Nginx 都是向浏览器返回html文件,然后浏览器解析并展示html文件。
后来随着网络的发展,人们希望可以有更多的交互,即希望服务器不是简单的返回一个html,而是可以根据用于的输入,动态的生成html来和用户交互,所以这时我们就需要在服务器端再部署一下java程序来和用户交互,这些程序就是servlet,但是servlet 没有main函数,不能独立运行,需要servlet容器来对他们进行调度,所以就有了servlet容器。 像tomcat, jetty其实就是 HTTP服务器+ servlet容器
Apache是一个HTTP服务器,而Tomcat或者Jetty是一个HTTP服务器+Servlet容器。HTTP服务器与Servlet容器的功能界限是:你可以把HTTP服务器想象成前台的接待,负责网络通信和解析请求,而Servlet容器是业务部门,负责处理业务请求。
如下图所示,HTTP服务器,负责获取客户端请求,然后将请求解析并发送给Servlet服务器,servlet容器决定具体调用那个servlet来执行该请求。servlet怎么知道调用那个类的那个方法来处理请求呢?怎么知道每个方法的名字是啥,参数是啥呢? 很现实servlet容器和servlet之间必须有个接口来统一调度,这个接口就是servlet接口。


image.png

servlet接口如下

public interface Servlet {
    void init(ServletConfig config) throws ServletException;
    
    ServletConfig getServletConfig();
    
    void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;
    
    String getServletInfo();
    
    void destroy();
}

其中的init 方法可以在启动servlet的时候初始化一些资源; destroy则是在servlet销毁时释放一些资源。
getServletConfig则指夹在我们在web.xml中配置的一些参数。
service则是实现具体业务逻辑的地方。
有接口通常就会有一个抽象类来实现一些通用逻辑,这里的抽象类则是GenericServlet. 虽然servlet并不在意请求时通过什么协议传过来的,结果需要使用什么协议传出去,但是通常都是基于HTTP协议,所以为了方便使用这里还是实现了HTTPServlet,以加入http特性,我们乳沟要实现http相关的servlet可以直接继承该子类,然后重新doGet, doPost即可,大大简化了我们编程。
下面我们再来看一下请求处理过程:
HTTP服务器拿到客户端请求之后将其解析打包成一个ServletRequest,然后调用Servlet的service方法,将请求传递给Servlet容器, Servelt容器,根据提前制定好的映射规则,根据请求中的URL 调用指定的servlet,如果servlet还没有被加载,则通过反射机制将其加载到Servlet容器中,然后调用。调用完成之后将结果打包成ServletResponse返给HTTP服务器,http服务器在将其解析打包成满足http协议的数据包发送给客户端。


image.png

那么我们一定很好奇,servlet容器怎么知道去哪里找我们的servlet类呢?我们通常是以web服务的形式来注册servlet,web应用程序通常有制定的目录结构,如果大家都遵从这个目录结构,那servlet容器就知道去哪里找我们的servlet类了。
web应用程序的目录结构如下


image.png

通常一个web应用程序会包含多个servlet。 servlet规范中定义了一个serveltContext来对应这个web应用程序。其中可以存放一些公共信息,servlet之间也可以通过它来进行交互。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Based on Java™ Servlet Specification v3.1 [TOC] Servlet和S...
    0x70e8阅读 1,302评论 0 7
  • IOC 控制反转容器控制程序对象之间的关系,而不是传统实现中,有程序代码之间控制,又名依赖注入。All 类的创建,...
    irckwk1阅读 924评论 0 0
  • 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答...
    杂货铺老板阅读 1,397评论 0 10
  • 一. Java基础部分.................................................
    wy_sure阅读 3,785评论 0 11
  • 1.内存泄露 内存泄漏两种情况: 在堆中申请的空间没有被释放(虚拟机gc可以解决) 对象已不在使用,但仍然在内存中...
    Aimerwhy阅读 572评论 0 0