Tomcat入门

参考链接:

https://zhuanlan.zhihu.com/p/54121733

本文作为笔记用,如有侵权,请联系删除。

1.JavaWeb三大组件

JavaWeb没有main,没有new,写一个类然后在web.xml中配个标签,程序就跑起来了。

简单来说就是“注入”和“回调”,




只要我们实现xxx接口,它会帮我们创建实例,然后搬运(接口注入)到它合适的位置,然后一套既定的流程下来,肯定会执行到。

Servlet接口实现的最难地方在于形参,然而Tomcat会事先把形参对象封装好传给程序员,除此之外,既不需要写TCP连接数据库,也不需要解析HTTP请求,更不需要把结果转成HTTP响应,request对象和response对象已经搞定了。我们写点业务逻辑就好了。

HTTP和Request/Response的关系就像菜园里的大白菜和餐桌上的酸辣白菜一样,HTTP请求到了Tomcat后,Tomcat通过字符串解析,把各个请求头(Header),请求地址(URL),请求参数(QueryString)都封装进了Request对象中。通过调用request.getHeader(); request.getUrl();request.getQueryString()可以得到浏览器当初发送的请求信息。


以上为GenericServlet的实现,是一个抽象类。

·提升了init方法中原本是形参的servletConfig对象的作用域(成员变量),方便其他方法使用

·init方法中还调用了一个init空参方法,如果我们希望在servlet创建时做一些什么初始化操作,可以继承GenericServlet后,覆盖init空参方法。

·由于其他方法内也可以使用servletConfig,于是写了一个getServletContext方法。

但没有实现service方法,果断放弃。

HttpServlet:它继承了GenericServlet。


一个类声明成抽象方法,一般有两个原因:

1.有抽象方法

2.没有抽象方法,但是不希望被实例化

HttpServlet做成抽象类,仅仅是为了不让new。(构造函数为空)

Filter用到了责任链模式,Listener用到了观察者模式,Servlet也不会放过使用设计模式的机会:模板方法模式。

如何写一个Servet?只需继承HttpServlet并重写doGet()/doPost()。

父类把能写的逻辑都写完,把不确定的业务代码抽成一个方法,调用它。当子类重写该方法,整个业务代码就活了。这就是模板方法模式。


2.我们为什么需要服务器?服务器最本质的作用有两个:

将资源对外暴露

配合各种传输协议进行响应输出

想要访问一台服务器,必须知道它的IP。但我们人类不擅长记忆长串数字,于是人类搞了所谓的域名来指向IP。但实际请求时,最终还是要换算成IP去访问。总得来说有两种换算的途径:1.本机的hosts文件 2.DNS服务。

即使DNS解析域名得到对应的IP后,Request请求里还是会带上host。为什么?

因为:域名!=IP。

实际上一个IP可以对应多个域名。也就是说一台实体服务器(大铁柜),理论上可以有多个域名(虚拟主机)。实体服务器和网站是两个概念。IP只是对应实体服务器,而域名对应具体的网站。

比如上面百度服务器,虽然看起来115.239.210.27这个IP完全等同于http://www.baidu.com,但也有可能这个IP对应的服务器上配置了两个虚拟主机:www.baidu.comtieba.baidu.com。所以即使找到了IP对应的服务器实体,Request请求还是要带上host主机名,以确定是哪个虚拟主机。

最后必须解释的是,上面的百度服务器只是举个例子,实际上百度搜索和百度贴吧的IP是不同的,也就是说它们不在同一台服务器上。通常来说,一个IP对应一台服务器,服务器上只有一个主机。拿到IP基本就可以确定要访问哪个网站。

3.3个容易混淆的小概念

(1)软件概念的服务器和硬件概念的服务器

软件概念上,只要是一台硬件配置正常、装有操作系统、插着电能上网,并且安装特定软件的电脑,都可以称为服务器。比如你要学习数据库了,于是你装了MySQL服务端,那么此时你的电脑就是一个MySQL服务器。然后你又装了SVN服务端,那么此时你的电脑既是MySQL服务器,又是SVN服务器。Tomcat服务器同理。

硬件概念上,服务器本质上也是一台电脑,只不过配置高的同时长相丑了点,基本就是一个冰冷的大铁柜。我们的笔记本电脑既能看电影又能玩游戏,而它们基本上专机专用。

(2)Web服务器?Web容器?

其实,Tomcat服务器 = Web服务器 + Servlet/JSP容器(Web容器)。

Web服务器的作用是接收客户端的请求,给客户端作出响应。但是很明显,服务器不止静态资源呀,所以客户端发起请求后,如果是动态资源,Web服务器不可能直接把它响应回去(比如JSP),因为浏览器只认识静态资源。所以对于JavaWeb程序而言,还需要JSP/Servlet容器,JSP/Servlet容器的基本功能是把动态资源转换成静态资源。我们JavaWeb工程师需要使用Web服务器和JSP/Servlet容器,而通常这两者会集于一身,比如Tomcat。


Web服务器接收、响应客户端请求,Web容器装载Servlet/JSP,让它们去处理动态资源
访问百度完整的流程

所以,我们用Java开发的Web应用只是一个半成品,类似于一个插件,而服务器则像一个收发器:


(3)什么是动态资源?

其实对于何谓动态资源,我也没有很精准的概念。要讲清楚一个东西是什么,有时是比较难的事。不如先说它不是什么。

首先,动态资源不等同于动态页面。所谓动态页面,就是页面会动,而会动的页面不一定是动态资源。比如我可以用JQuery执行一段代码,让一个Div不断放大缩小,但是很显然它还是一个HTML页面。

所谓动态资源,其实最显著的特征就是它能动态地生成HTML!比如JSP。动态资源有个“特色”:它的数据是“可拼装”的、而且“可以随时间变化”。下面用号称可以抗住8个明星同时出轨的新浪服务器举个例子:

把人名进行修改:


此时,粉丝们再次打开《花花世界》专栏,看到的就是:佟丽娅深夜买醉bravo。

上面这个例子很好地说明了动态资源(JSP)的两个特性:

可拼装:${name}"深夜买醉bravo"

随时间变化:刘亦菲→佟丽娅

那么为什么说HTML就是静态资源呢?我也可以修改HTML页面使它发生改变啊!很好,很有想法。那么请小编先学会Linux,然后远程连接服务器进入到Tomcat目录下修改吧。


动态资源和静态资源虽然都在服务器里,但是动态资源包含变量(“可拼装”特性),而变量维系着数据库和程序之间的联系。

如果把JSP比作电子广告牌,变量比作一根电线,而电线连接着一台电脑(数据库服务器)。那么只要电脑上重新编辑文本,广告牌的内容也会变,此谓动态。而静态资源就像一张布告,当初写什么就是什么,任他风吹雨打,都不会再改变了。

4.Tomcat架构




conf文件夹下的Server.xml文件

简略解释一下xml里的配置:

1.Server.xml文件中的配置结构和Tomcat的架构是一一对应的。根目录是<Server>,代表服务器,<Server>下面有且仅有1个<Service>,代表服务。

2.<Service>下有两个<Connector>,代表连接(需要的话可以再加)。

其实这个Connector就是我们在上面讨论百度服务器时画过的端口。大家可以看到Tomcat默认配置了两个端口,一个是HTTP/1.1协议的,一个是AJP/1.3协议(我也不知道是啥)。前者专门处理HTTP请求。

3.当我们在浏览器输入"http://localhost:8080/demo/index.html"时,浏览器是以HTTP协议发送的,当这个请求到了服务器后,会被识别为HTTP类型,于是服务器就找来专门处理HTTP的Connector,它的默认端口正是上门Server.xml配置的8080。

4.与Connector平级的还有个<Engine>(Tomcat引擎),也就是说<Service>有两个孩子,小儿子是<Connector>,大儿子是<Engine>。Connector的作用说穿了就是监听端口,如果用户访问地址是“localhost:8080/xx/xx”,那就由监听8080端口的Connector负责,如果是"https://www.baidu.com",那么就是443端口处理。其实Connector也不处理实际业务,它只是个孩子。但它会负责把客人(请求)带到哥哥Engine那,然后Engine会处理。

5.<Engine>下面有个Host,代表主机。

配置介绍到这里,要先停一下,讲个故事:

从前有个国家,叫The United States of Tomcat。

国王Service是个爱猫的人,家庭和谐美满。

他立了一个太子,叫做Engine。

另外还有还几个很小的儿子,不过都是亲王(Connector),未来可能还要再生几个Connector。

由于Tomcat国实在太小了,全城上下就几个人,所以亲王Connector们被派去守城门。

为了让太子得到锻炼,早日继承衣钵,国王Service告诉亲王儿子们:他国使者若来拜访,你们就带他去你们哥哥Engine那去,他会处理一切。

Engine贵为太子,有好几处府邸,比如HOST1,HOST2,未来可能再建几座府邸(新建虚拟主机),但是Engine说了,我一般都在localhost待着,来这找我便可。

每一座府邸里,都有好几个厢房(Context:我们开发的Web应用)。Engine会根据来访使者的通关文牒(localhost:8080/myWeb/index.html)安排他们去哪个房间(myWeb),拿什么礼品(index.html)。

我们每个动态web工程都有个web.xml,而conf里的这个,是它们的“老爹”。它里面的配置,如果动态web工程没有覆盖,就会被“继承”下来。我们会发现,conf/web.xml里配置了一个DefaultServlet:

总结一下Tomcat处理请求的几种方式:


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

推荐阅读更多精彩内容

  • 1、JavaWeb概念Java web,是用java技术来解决相关web互联网领域的技术的总称。web包括:web...
    寒剑飘零阅读 2,572评论 0 12
  • 本文包括: Servlet简介关于Servlet的一些类 Servlet生命周期 ServletConfig获得初...
    廖少少阅读 3,853评论 1 67
  • 这篇文章, 我主要分享JavaWeb动态网页开发.要谈JavaWeb动态网页开发.我们就要来了解Servlet, ...
    sixleaves阅读 974评论 0 6
  • 一、基本概念 Servlet是运行在Web服务器上的小程序,通过http协议和客户端进行交互。这里的客户端一般为浏...
    小李弹花阅读 2,714评论 0 0
  • Servlet技术(上) Tomcat的<CATALINA_HOME>/lib/servlet-api.jar文件...
    So_ProbuING阅读 835评论 0 1