准备-servlet 是什么?

Tomcat 外传(上) - 图1

Tomact 外传

我们为什么需要服务器?

最本质的作用:

  • 将资源对外暴露
  • 配合各种传输协议进行响应输出

3个概念

  • IP:电子设备(计算机)在网络中的唯一标识,一个IP对应一台实体电脑
  • 端口:应用程序在计算机中的唯一标识,一个端口只能被唯一程序占用
  • 传输协议:数据传输规则

域名!=IP; 一个IP可以对应多个域名。也就是说一台实体服务器(大铁柜),理论上可以有多个域名(虚拟主机)。实体服务器和网站是两个概念。IP只是对应实体服务器,而域名对应具体的网站
为什么网站用域名标识,方便人类记忆
**

3个容易混淆的概念

  • 软件概念的服务器和硬件概念的服务器

软件概念上,只要是一台硬件配置正常、装有操作系统、插着电能上网,并且安装特定软件的电脑,都可以称为服务器。比如你要学习数据库了,于是你装了MySQL服务端,那么此时你的电脑就是一个MySQL服务器。然后你又装了SVN服务端,那么此时你的电脑既是MySQL服务器,又是SVN服务器。Tomcat服务器同理
硬件概念上,服务器本质上也是一台电脑,只不过配置高的同时长相丑了点,基本就是一个冰冷的大铁柜。我们的笔记本电脑既能看片又能玩游戏,而它们基本上专机专用

  • Web服务器?Web容器?

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

什么是容器:

  • Web应用程序需要部署到Web容器中才能运行,两者都必须符合J2EE规范。Web容器是一种服务程序,给处于其中的应用程序组件提供环境,使其直接跟容器中的环境变量交互,不必关注其它系统问题。主要由应用服务器来实现,如Tomcat。
  • Web应用程序规范如下:
  1. 目录结构:Web应用程序的所有文件都包含在一个文件夹中,该文件夹包含WEB-INF子文件夹和META-INF子文件夹,WEB-INF文件夹包含classes文件夹和lib文件夹以及web.xml文件。
  2. jar文件:放在WEB-INF/lib文件夹中。
  3. web.xml文件:整个web应用程序的描述文件,里面定义了Servlet,过滤器,监听器等信息。
  4. 其它资源文件:(HTML,CSS,JavaScript,JSP,图片等)放在与WEB-INF同一级目录下。(WEB-INF文件夹对于客户端是不可见的)

Tomcat是一个支持Servlet和JSP技术的容器。Tomcat自己就只实现了这两种。Tomcat目录结构:

  1. /bin:包含启动和关闭Tomcat的文件,如startup.bat,shutdown.bat
  2. /conf:包含不同的配置文件,如server.xml,web.xml
  3. /lib:包含Tomcat 运行时所需要的jar文件
  4. /logs:包含Tomcat 运行时所产生的日志文件
  5. /temp:包含Tomcat 运行时所产生的临时文件
  6. /webapps:包含Web应用程序示例及自己开发的Web应用程序
  7. /work:包含由JSP生成的Servlet

Servlet和JSP两者分工协作,Servlet侧重于解决业务逻辑问题,JSP则侧重于解决页面显示问题。Servlet与JSP一起为Web应用开发带来了巨大的贡献,后来出现的众多Java Web应用开发框架都是基于这两种技术的,更确切的说,都是基于Servlet技术的
总结:Servlet容器的主要任务是管理Servlet的生命周期,而Web容器主要任务是管理Web应用程序

image.png**
访问百度的完整过程

image.png
一般开发的WEB应用和服务器的关系-抽象比喻

  • 什么是动态资源?

  • Tomcat 架构

Tomcat 外传(上) - 图4

Tomcat 外传(上) - 图5
结合Tomcat的一个配置文件(Server.xml)
和 Web.xml 看这2张图
简略解释一下xml里的配置:**

sum: connector 负责连接,一个connector 对应一种协议; 连接之后,交由 engine 处理; engine 下面可以有多个 host , 默认只有一个 Localhost , 用来处理请求

有两个Servlet很重要,但是在“浅谈JSP”中没有提到

  1. DefaultServlet:该出手时就出手.

上面案例中,我新建一个动态web工程,只是写了一个HTML,没有编写Servlet,甚至一句Java代码都没写。但是启动Tomcat后我却可以通过浏览器访问到刚才编写的haha.html。这是为何?
对于像Tomcat这样的Servlet容器来说,任何一个请求的背后肯定有个Servlet在默默处理.
查看Web.xml.不错,我们每个动态web工程都有个web.xml,而conf里的这个,是它们的“老爹”。它里面的配置,如果动态web工程没有覆盖,就会被“继承”下来。我们会发现,conf/web.xml里配置了一个DefaultServlet:
Tomcat 外传(上) - 图6
Tomcat 外传(上) - 图7
sum:DefaultServlet的作用:最低级匹配,当没有对应的Servlet处理当前请求时,才轮到它处理。要么找到并响应请求的资源,要么给出404页面

  1. JspServlet:JSP的卸妆师傅

我们都知道JSP是“化了浓妆”的Servlet,但是好不容易伪装成了一个JSP,是谁帮它卸妆的呢?另外,大家仔细想想,一般来说JavaWeb阶段我们访问资源有三种“形式

  1. localhost:8080/demo/AServlet:很明显,我们手动写了一个AServlet处理它
  2. localhost:8080/demo/haha.html:虽然我们没写,但是Tomcat自己准备了DefaultServlet
  3. localhost:8080/demo/index.jsp:我擦,谁来处理?

对呀,细思恐极,这*.jsp的资源,谁来处理?其实就是JspServlet。它的作用简而言之就是:

  • 首先,根据请求路径找到JSP
  • 然后,将它“翻译成”Servlet

最后总结一下Tomcat处理请求的几种方式:
Tomcat 外传(上) - 图8

  • 动手实现”Tomcat”

JavaWeb中的main() 去哪了?
Tomcat 外传(上) - 图9

参考资料:
1.传智播客崔希凡JavaWeb day8
2.传智播客12年云计算班JavaWeb(梁桐) day4
3.黑马12期JavaWeb(刘悦东) day06
4.尚硅谷JavaWeb(佟刚)
5.tomcat中对静态资源的访问也会用servlet来处理吗?
2019-1-6
6.https://zhuanlan.zhihu.com/p/54121733