Servlet (JavaWeb)

写在开始 : 本文存在部分引用, 仅用作个人复习, 大家有需要可以查阅原文链接进行查阅学习!

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返回给客户端的过程。
image.png
常见 Servlet容器有很多,如 Tomcat, Jetty, WebLogic Server, WebSphere, JBoss …

2. Servlet的工作模式

  • 客户端发送请求至服务器
  • 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
  • 服务器将响应返回客户端

image.png
引用链接: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接口定义了Servletservlet容器之间的契约。这个契约是: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对象。


image.png

  1. Web Client 向 Servlet 容器(Tomcat)发出 Http 请求
  2. Servlet 容器接收 Web Client 的请求
  3. Servlet 容器创建一个 HttpServletRequest 对象,将 WebClient 请求的信息封装到这个对象 中
  4. Servlet 容器创建一个 HttpServletResponse 对象
  5. Servlet 容器调HttpServlet 对象service 方法,把 Request 与Response 作为参数,传给 HttpServlet
  6. HttpServlet 调用 HttpServletRequest 对象的有关方法,获取Http 请求信息
  7. HttpServlet 调用 HttpServletResponse 对象的有关方法,生成响应数据
  8. 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 接口等。类图如下:
image.png

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目录结构
image.png

  1. bin:启动和关闭 tomcat 的 bat 文件
  2. conf:配置文件server.xml 该文件用于配置 server 相关的信息,比如 tomcat 启动端口号,配置主机(Host) ;web.xml文件配置与 web 应用(web 应用相当于一个 web站点);tomcat-user.xml 配置用户名密码相关权限
  3. lib:该目录放置运行 tomcat 运行需要的 jar 包
  4. logs:存放日志,当我们需要查看日志的时候,可以查询信息
  5. webapps:放置我们的 web 应用
  6. work 工作目录:该目录用于存放 jsp 被访问后生成对应的server 文件和.class 文件

tomcat是如何处理Http请求流程的
假设来我们在浏览器上输入http://localhost:8080/my-web-mave/index.jsp
在tomcat中是如何处理这个请求流程的:

  1. 我们的请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得。
  2. Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应 。
  3. Engine获得请求localhost/my-web-maven/index.jsp,匹配它所拥有的所有虚拟主机Host ,
    我们的虚拟主机在server.xml中默认配置的就是localhost。
  4. Engine匹配到name=localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host
    被定义为该Engine的默认主机)。
  5. localhost Host获得请求/my-web-maven/index.jsp,匹配它所拥有的所有Context。
  6. Host匹配路径为/my-web-maven的Context(如果匹配不到就把该请求交给路径名为”"的Context处理)。
  7. path=”/my-web-maven”的Context获得请求/index.jsp,在它的mapping table中寻找对应的servlet 。
  8. Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类。
  9. 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet/doPost方法
  10. Context把执行完了之后的HttpServletResponse对象返回给Host 。
  11. Host把HttpServletResponse对象返回给Engine 。
  12. Engine把HttpServletResponse对象返回给Connector 。
  13. Connector把HttpServletResponse对象返回给客户browser 。
8.1 Tomcat的缺省端口是多少,怎么修改
  1. Tomcat目录下的conf
  2. conf文件夹里面找到server.xml
  3. server.xml文件里面找到下列信息
  4. 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

  1. 常用的Jetty,Mina,ZooKeeper等都是基于java nio实现
  2. 需在本地服务器安装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类实例,原理
  1. 当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对 xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过 反射的方式实例化。(有时候
    也是在第一次请求时实例化)
  2. 在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顶层架构

image.png
一个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请求;

image.png
多个 Connector 和一个 Container 就形成了一个 Service,有了 Service 就可以对外提供服务了,但是 Service 还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非 Server 莫属了!所以整个 Tomcat 的生命周期由Server 控制。
tomcat的conf目录下的server.xml配置文件中
image.png
:::success
Tomcat顶层架构小结:

  1. Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container;
  2. Server掌管着整个Tomcat的生死大权;
  3. Service 是对外提供服务的;
  4. Connector用于接受请求并将请求封装成Request和Response来具体处理;
  5. Container用于封装和管理Servlet,以及具体处理request请求;
    :::
    Connector架构分析
    Connector用于接受请求并将请求封装成Request和Response,然后交给
    Container进行处理,Container处理完之后在交给Connector返回给客户端。
    image.png
    Connector就是使用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,比如:Http11Protocol使用的是普通Socket来连接的,Http11NioProtocol使用的是NioSocket来连接的。
    其中ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter。
  6. Endpoint用来处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request, Adapter用于将Request交给Container进行具体的处理。
  7. Endpoint由于是处理底层的Socket网络连接,因此Endpoint是用来实现TCP/IP协议的,而Processor用来实现HTTP协议的,Adapter将请求适配到Servlet容器进行具体的处理。
  8. Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收到的Socket,在内部调用Processor进行处理。
    Container架构分析
    Container用于封装和管理Servlet,以及具体处理Request请求,在Container内部包含了4个子容器,结构图如下
    image.png
    4个子容器的作用分别是:
  9. Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine;
  10. Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点;
  11. Context:代表一个应用程序,对应平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件;
  12. Wrapper:每一Wrapper封装着一个Servlet;
    image.png

9. 请求转发与重定向的区别

image.png

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仅仅用作复习准备面试, 出现频次较少了…

猜你喜欢

转载自blog.csdn.net/Kaka_csdn14/article/details/131273564