写在开始 : 本文存在部分引用, 仅用作个人复习, 大家有需要可以查阅原文链接进行查阅学习!
Tomcat工作机制动画演示
引用地址 : https://blog.csdn.net/qq_19782019/article/details/80292110?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168024297016800182162273%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168024297016800182162273&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-80292110-null-null.142v80insert_down1,201v4add_ask,239v2insert_chatgpt&utm_term=servlet&spm=1018.2226.3001.4187
原文链接:https://blog.csdn.net/qq_19782019/article/details/80292110
1. 什么是Servlet
Servlet(Server Applet),全称Java Servlet 。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。
Servlet 本质上也是 Java 类,但要遵循 Servlet 规范进行编写,没有 main()方法,它的创建、使用、销毁都由 Servlet 容器进行管理(如 Tomcat)。(言外之意:写自己的类,不用写 main 方法,别人自动调用)
Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器 .
Servlet是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能,统一接口。由其他内部厂商如tomcat,jetty内部实现web的功能。如一个http请求到来:容器将请求封装为servlet中的HttpServletRequest对象,调用init(),service()等方法输出response,由容器包装为httpresponse返回给客户端的过程。
常见 Servlet容器有很多,如 Tomcat, Jetty, WebLogic Server, WebSphere, JBoss …
2. Servlet的工作模式
- 客户端发送请求至服务器
- 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
- 服务器将响应返回客户端
引用链接:https://blog.csdn.net/zhangxia_/article/details/128886023?spm=1001.2014.3001.5502
3. Servlet API 概览
Servlet API 包含以下4个Java包:
1.javax.servlet 其中包含定义servlet和servlet容器之间契约的类和接口。
2.javax.servlet.http 其中包含定义HTTP Servlet 和Servlet容器之间的关系。
3.javax.servlet.annotation 其中包含标注servlet,Filter,Listener的标注。它还为被标注元件定义元数据。
4.javax.servlet.descriptor,其中包含提供程序化登录Web应用程序的配置信息的类型。
4. Servlet 的主要类型
5. Servlet 的工作原理
Servlet接口定义了Servlet与servlet容器之间的契约。这个契约是:Servlet容器将Servlet类载入内存,并产生Servlet实例和调用它具体的方法。但是要注意的是,在一个应用程序中,每种Servlet类型只能有一个实例。
用户请求致使Servlet容器调用Servlet的Service()方法,并传入一个ServletRequest对象和一个ServletResponse对象。ServletRequest对象和ServletResponse对象都是由Servlet容器(例如TomCat)封装好的,并不需要程序员去实现,程序员可以直接使用这两个对象。
ServletRequest中封装了当前的Http请求,因此,开发人员不必解析和操作原始的Http数据。ServletResponse表示当前用户的Http响应,程序员只需直接操作ServletResponse对象就能把响应轻松的发回给用户。
对于每一个应用程序,Servlet容器还会创建一个ServletContext对象。这个对象中封装了上下文(应用程序)的环境详情。每个应用程序只有一个ServletContext。每个Servlet对象也都有一个封装Servlet配置的ServletConfig对象。
- Web Client 向 Servlet 容器(Tomcat)发出 Http 请求
- Servlet 容器接收 Web Client 的请求
- Servlet 容器创建一个 HttpServletRequest 对象,将 WebClient 请求的信息封装到这个对象 中
- Servlet 容器创建一个 HttpServletResponse 对象
- Servlet 容器调HttpServlet 对象service 方法,把 Request 与Response 作为参数,传给 HttpServlet
- HttpServlet 调用 HttpServletRequest 对象的有关方法,获取Http 请求信息
- HttpServlet 调用 HttpServletResponse 对象的有关方法,生成响应数据
- Servlet 容器把 HttpServlet 的响应结果传给 Web Client
6. 什么是Servlet规范?
从 Jar 包上来说,Servlet 规范就是两个 Jar 文件。servlet-api.jar 和 jsp-api.jar,Jsp 也是一种Servlet。
从package上来说,就是 javax.servlet 和 javax.servlet.http 两个包。
从接口来说,就是规范了 Servlet 接口、Filter 接口、Listener 接口、ServletRequest 接口、
ServletResponse 接口等。类图如下:
7. HTTP协议
HTTP 协议(Hypertext Transfer Protocol, 超文本传输协议),是一个客户端请求和响应的标准协议,这个协议详细规定了浏览器和万维网服务器之间互相通信的规则
HTTP协议的特点:
1. 支持客户/服务器模式。
**2. 简单快速:**客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有 GET/POST。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
**3. 灵活:**HTTP 允许传输任意类型的数据对象。传输的类型由Content-Type加以标记。
**4. 无连接:**无连接是表示每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。HTTP1.1 版本后支持可持续连接。通过这种连接,就有可能在建立一个 TCP 连接后,发送请求并得到回应,然后发送更多的请求并得到更多的回应.通过把建立和释放 TCP 连接的开销分摊到多
个请求上,则对于每个请求而言,由于 TCP 而造成的相对开销被大大地降低了。而且, 还可以发送流水线请求,也就是说在发送请求 1 之后的回应到来之前就可以发送请求 2.也可以认为,一次连接发送多个请求,由客户机确认是否关闭连接,而服务器会认为这些请求分别来自不同的客户端。
5. 无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送 的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
7.1 get 与 post 区别
HTTP请求默认使用get
get | post |
---|---|
参数在url中 | 参数在 resquest body 请求体中 |
有长度限制 (url最大长度2048字符) | 没有长度限制 |
暴露在url中,不安全 | 隐藏在请求体中,安全 |
只能url编码(ASCⅡ) | 支持多种编码 |
产生一个TCP数据包 | 产生两个TCP数据包 |
获取服务器中的数据 | 修改服务器上的数据 |
能被缓存,静态资源会缓存,数据不会 | 不能缓存 |
速度快 | 速度相对慢一些 |
浏览器回退无害 | 再次提交请求 |
可收藏为书签 | 不可收藏为书签 |
:::success
注:HTTP请求,最初设定了八种方法。这八种方法本质上没有任何区别。只是让请求,更加有语义而已。
常见四种: get(查) post(增) put(改) delete(删)
**else: **OPTIONS 返回服务器所支持的请求方法; HEAD 与GET一致,只不过响应体不返回,只返回响应头; TRACE 回显服务器端收到的请求,测试的时候会用到这个; CONNECT 预留,暂无使用
:::
8. Tomcat服务器
Tomcat 是一个符合 JavaEE WEB 标准的最小的 WEB 容器,(一个免费开放源码的web应用服务器)所有的JSP 程序一定要有 WEB 容器的支持才能运行,而且在给定的 WEB容器里面都会支持事务处理操作。
Tomcat 简单说是一个运行Java 的网络服务器,底层是 Socket 的一个程序,它是 JSP 和Servlet 的一个容器。
Tomcat目录结构
- bin:启动和关闭 tomcat 的 bat 文件
- conf:配置文件server.xml 该文件用于配置 server 相关的信息,比如 tomcat 启动端口号,配置主机(Host) ;web.xml文件配置与 web 应用(web 应用相当于一个 web站点);tomcat-user.xml 配置用户名密码相关权限
- lib:该目录放置运行 tomcat 运行需要的 jar 包
- logs:存放日志,当我们需要查看日志的时候,可以查询信息
- webapps:放置我们的 web 应用
- work 工作目录:该目录用于存放 jsp 被访问后生成对应的server 文件和.class 文件
tomcat是如何处理Http请求流程的
假设来我们在浏览器上输入http://localhost:8080/my-web-mave/index.jsp
在tomcat中是如何处理这个请求流程的:
- 我们的请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得。
- Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应 。
- Engine获得请求localhost/my-web-maven/index.jsp,匹配它所拥有的所有虚拟主机Host ,
我们的虚拟主机在server.xml中默认配置的就是localhost。 - Engine匹配到name=localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host
被定义为该Engine的默认主机)。 - localhost Host获得请求/my-web-maven/index.jsp,匹配它所拥有的所有Context。
- Host匹配路径为/my-web-maven的Context(如果匹配不到就把该请求交给路径名为”"的Context处理)。
- path=”/my-web-maven”的Context获得请求/index.jsp,在它的mapping table中寻找对应的servlet 。
- Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类。
- 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet/doPost方法
- Context把执行完了之后的HttpServletResponse对象返回给Host 。
- Host把HttpServletResponse对象返回给Engine 。
- Engine把HttpServletResponse对象返回给Connector 。
- Connector把HttpServletResponse对象返回给客户browser 。
8.1 Tomcat的缺省端口是多少,怎么修改
- Tomcat目录下的conf
- conf文件夹里面找到server.xml
- server.xml文件里面找到下列信息
- Connector标签的8080端口改成你想要的端口(默认8080)
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8081" />
8.2 Tomcat 有三种Connector 运行模式(优化)
- BIO:同步并阻塞 一个线程处理一个请求; 缺点:并发量高时,线程数较多,浪费资源(7以下)
- NIO:同步非阻塞IO 异步IO处理,通过少量线程处理大量请求,复用同一t处理多个connection(多路复用)8
- APR:即Apache Portable Runtime,从操作系统层面解决io阻塞
异步非阻塞IO(Java NIO2又叫AIO) 主要与NIO的区别主要是操作系统的底层区别.可以做个比喻:比作快递,NIO就是网购后要自己到官网查下快递是否已经到了(可能是多次),然后自己去取快递;AIO就是快递员送货上门了(不用关注快递进度)。
:::success
- 常用的Jetty,Mina,ZooKeeper等都是基于java nio实现
- 需在本地服务器安装APR库。Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。Linux如果安装了apr和native,Tomcat直接启动就支持apr。
:::
8.3 Tomcat四种部署方式
1. 利用Tomcat的自动部署 | web应用拷贝到webapps目录,Tomcat在启动时会加载目录下的应用,编译后的结果放入work目录 |
---|---|
2. 使用Manager App控制台部署 | tomcat主页点击“Manager App” 进入应用管理控制台,指定一个web应用的路径或war文件 |
3. 修改conf/server.xml文件部署 | 增加Context节点可以部署应用 |
4. 增加自定义的Web部署文件 | conf/Catalina/localhost/ 路径下增加 xyz.xml文件,内容是Context节点,可以部署应用 |
8.4 tomcat容器是如何创建servlet类实例,原理
- 当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对 xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过 反射的方式实例化。(有时候
也是在第一次请求时实例化) - 在servlet注册时加上1如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。
8.5 Tomcat工作模式
1、独立的servlet容器,servlet容器是web服务器的一部分;
2、进程内的servlet容器,servlet容器是作为web服务器的插件和java容器的实现,web服务器插件在内部地址空间打开一个jvm使得java容器在内部得以运行。反应速度快但伸缩性不足;
3、进程外的servlet容器,servlet容器运行于web服务器之外的地址空间,并作为web服务器的插件和java容器实现的结合。反应时间不如进程内但伸缩性和稳定性比进程内优;
8.6 Tomcat顶层架构
一个Tomcat中只有一个Server
一个Server可以包含 1~n 个Service
一个Service只有一个Container,但是可以有多个Connectors:因为一个服务可以有多个连接,如同时提供Http和Https链接,也可以提供向相同协议不同端口的连接,示意图如下(Engine、Host、Context下面会说到)
Service主要包含两个部分:Connector和Container (Tomcat 的心脏)
- Connector用于处理连接相关的事情,并提供Socket与Request请求和Response响应相关的转化;
- Container用于封装和管理Servlet,以及具体处理Request请求;
多个 Connector 和一个 Container 就形成了一个 Service,有了 Service 就可以对外提供服务了,但是 Service 还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非 Server 莫属了!所以整个 Tomcat 的生命周期由Server 控制。
tomcat的conf目录下的server.xml配置文件中
:::success
Tomcat顶层架构小结:
- Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container;
- Server掌管着整个Tomcat的生死大权;
- Service 是对外提供服务的;
- Connector用于接受请求并将请求封装成Request和Response来具体处理;
- Container用于封装和管理Servlet,以及具体处理request请求;
:::
Connector架构分析
Connector用于接受请求并将请求封装成Request和Response,然后交给
Container进行处理,Container处理完之后在交给Connector返回给客户端。
Connector就是使用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,比如:Http11Protocol使用的是普通Socket来连接的,Http11NioProtocol使用的是NioSocket来连接的。
其中ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter。 - Endpoint用来处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request, Adapter用于将Request交给Container进行具体的处理。
- Endpoint由于是处理底层的Socket网络连接,因此Endpoint是用来实现TCP/IP协议的,而Processor用来实现HTTP协议的,Adapter将请求适配到Servlet容器进行具体的处理。
- Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收到的Socket,在内部调用Processor进行处理。
Container架构分析
Container用于封装和管理Servlet,以及具体处理Request请求,在Container内部包含了4个子容器,结构图如下
4个子容器的作用分别是: - Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine;
- Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点;
- Context:代表一个应用程序,对应平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件;
- Wrapper:每一Wrapper封装着一个Servlet;
9. 请求转发与重定向的区别
10. cookie 和 session
项目 | Cookie | Session |
---|---|---|
存储位置 | 数据存储在客户端 | 数据存储在服务器 |
安全性 | 不安全 | 安全 |
数据大小 | Cookie一般不超过4kb | Session无大小限制 |
存储时间 | Cookie可以长期存储 | Session默认30分钟 |
服务器性能 | 不占服务器资源 | 占用服务器资源 |
k.v值 | 值一般为string | 值可以任意对象 |
:::success
Session 钝化、活化
- 服务器重启后,Session中的数据是否存在?
- 钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中
- 活化:再次启动服务器后,从文件中加载数据到Session中
:::
————————————————
11. 上传下载
这部分有待补充!
12. Servlet生命周期
对象的生命周期是指一个对象被创建到被销毁的整个过程
Servlet运行在web服务器(Servlet容器)中,其中生命周期由容器来管理分为4个阶段
- 加载和实例化:在默认情况下,Servlet第一次被访问时,容器就创建Servlet对象
- 初始化:在Servlet实例化后,容器调用Servlet的init()方法来初始化这个对象,完成一些如加载配置文件,创建连接等初始化的工作。该方法只调用异常
- 请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service方法对请求进行处理
- 服务终止:当我们需要释放内存或者关闭容器,容器就会调用servlet实例里的destroy()方法来释放资源,随后该实例就会被java的垃圾回收机制给回收
本文系自己 复习使用, JavaWeb阶段的Servlet仅仅用作复习准备面试, 出现频次较少了…