回归基础!每个Java程序员必须熟记在心的servlet知识!(持续更新)

发布于:2022-10-19 ⋅ 阅读:(329) ⋅ 点赞:(0)

servlet复习回顾

前言

如今的Java开发人员实际上可以称为“Spring开发人员”,所有的开发流程的内部细节都由Spring框架封装好的,所以我们在实际开发中就很少考虑其中的细节。然而若想成为一名高级开发工程师,而不是码农,必须对其底层的实现逻辑了如指掌。

依鄙人所见,servlet就是Java做web开发的精髓所在,完全掌握servlet非常重要。

先放一张大图

在这里插入图片描述

这就是总览了,当然有些地方的技术是比较老旧的。

互联网通信流程

两台计算机通过网络实现文件共享行为,就是互联网通信。
通信角色氛围客户端和服务端,有的节点可能既是客户端又是服务端。

通信模型
  1. C/S通信模型
    客户端向指定服务端发送请求,索要资源文件,并将服务端返回的二进制数据解析展示。
    服务端用于接收来自于特定的客户端发送的请求,在接收到请求之后在服务端上定位被访问的资源文件,将文件内容以二进制形式通过网络发回客户端。
    C/S普遍用于个人娱乐市场,比如微信、淘宝、优酷、英雄联盟等,在企业办公应用较少。
    优点是安全性较高,也能降低服务端工作压力;缺点是增加客户获得服务成本(需要下载),且更新较为繁琐。

  2. B/S通信模型
    浏览器可以向任意服务器发送请求,索要资源文件,并将服务端返回的二进制数据解析展示。
    服务端可以处理任意浏览器发送的请求,在接收到请求之后在服务端上定位被访问的资源文件,将文件内容以二进制形式通过网络发回浏览器。
    B/S既适用于个人娱乐市场,也适用于企业日常活动。
    优点是不会增加用户获得服务成本(不用下载对应软件),也不用频繁更新浏览器,缺点是服务端计算机工作压力巨大。

共享资源文件

可以经过网络进行传输的文件

  1. 静态资源文件
    文档、图片、视频等
    可以在浏览器编译执行的命令(html、css、js)

  2. 动态资源文件
    不能在浏览器执行的命令(.class等)
    动态文件被索要时,需要服务器处理逻辑,将运行结果返回给浏览器。

无论是静态还是动态,都是以二进制形式返回浏览器的。

http网络协议

网络协议包

为什么要有包的概念?

在网络中传递信息都是以二进制形式存在的,接收方(服务器或浏览器)接

收到请求或响应数据时,第一时间就是解析二进制数据。
有时传输信息的数据量比较巨大,导致接收方很难获取相应数据。

网络协议包是一组有规律的二进制数据,在这组数据存在固定空间,每一个空间专门存放特定信息,这样接收方在接收网络协议包之后就可以到固定空间得到对应信息。例如

【0000(ip地址)0000(端口号)0000(资源文件名)0000】

网络协议包出现极大降低了接收方对接收二进制数据编译难度

http请求协议包
  1. 请求行
    请求地址、请求方式

  2. 请求头
    get请求参数信息、cookie信息

  3. 空白行
    没有内容,起到隔离作用

  4. 请求体
    post请求参数信息

http响应协议包
  1. 状态行
    http状态码(200、404…)

  2. 响应头
    content-type:指定解析二进制数据的编译器
    location:重定向的地址
    cookie:共享信息

  3. 空白行
    没有内容,起到隔离作用

  4. 响应体
    返回结果的二进制码

get和post

get请求方式

携带的请求参数数量不能超过4k  
必须在参数地址栏显示出来  
将请求参数保存在http请求协议的请求头  
浏览器将服务端返回的内容保存在浏览器缓存中

post请求方式

携带的请求参数数量没有限制  
不能在参数地址栏显示出来  
将请求参数保存在http请求协议的请求体  
不能缓存服务端返回的内容
http状态码

三位数字组成的一个符号,展示请求处理的情况
以下列举一些常见的状态码

  • 1xx:接受的请求还在处理
http状态码 说明
100 继续索要文件
  • 2xx:请求正常处理完毕
http状态码 说明
200 正常处理
204 成功处理,但是没有资源返回
206 范围请求
  • 3xx:需要进行附加操作完成请求
http状态码 说明
301 永久性重定向
302 临时性重定向
303 使用get请求发送新url
  • 4xx:客户端请求出错
http状态码 说明
400 请求报文有语法错误
401 未经许可,需要http认证
403 无访问权限
404 服务器找不到请求资源
405 请求方式(get post)无法受理
  • 5xx:服务器处理出错
http状态码 说明
500 服务器后端代码有bug
503 服务器超负荷或停机维护

servlet

servlet是什么

javaee的一种规范,http服务器操作动态资源文件的规范

servlet的命令、代码都是老旧代码了,不必记住它们,只要记住思想就好了。

servlet的生命周期
  • 所有的servlet的实例对象,都是由http服务器负责创建,开发人员不得手动创建。
  • 默认情况下http服务器接到对当前servlet实现类第一次请求时创建实例对象。
  • 在Http服务器运行期间,一个Servlet实现类只能被创建出一个实例对象
  • 在Http服务器关闭时刻,自动将网站中所有的Servlet对象进行销毁
response对象

响应对象,主要任务是:

  1. 将执行结果以二进制形式写入到响应体
  2. 设置响应头中content-type属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译为文字、图片、视频、前端代码命令
  3. 设置响应头中location属性,将一个请求地址赋值给location从而控制浏览器向指定服务器发送请求(重定向)
request对象

请求对象,主要任务是:

  1. 读取http请求协议包中请求行的信息
  2. 读取http请求协议包中请求头(get)或请求体(post)中请求参数信息
  3. 代替浏览器向http服务器申请资源文件调用
request和response的生命周期
  • 在Http服务器接收到浏览器发送的Http请求协议包之后,自动为当前的Http请求协议包生成一个【请求对象】和一个【响应对象】
  • 在Http服务器调用doGet/doPost方法时,负责将【请求对象】和【响应对象】作为实参传递到方法,确保doGet/doPost正确执行
  • 在Http服务器准备推送Http响应协议包之前,负责将本次请求关联的【请求对象】和【响应对象】销毁
  • 【请求对象】和【响应对象】生命周期贯穿一次请求的处理过程中
  • 【请求对象】和【响应对象】相当于用户在服务端的代言人
重定向

工作原理:用户第一次手动发送请求,浏览器处理完请求后,还需要另一个servlet完成接下来的操作,就在响应协议包的状态行写302,将第二个servlet的地址写到响应头的location属性,由浏览器自动发送第二次请求,完成剩余任务。

请求次数>=2,但是只有第一次用户手动发送,其余都是浏览器自动发送
因为浏览器发送请求默认为get方式,所以重定向请求方式一定是get

缺点:需要在浏览器与服务器之间进行多次往返,大量时间消耗在往返次数上,增加用户等待服务时间。

请求转发

工作原理:用户第一次手动发送请求,浏览器处理完请求后,还需要另一个servlet完成接下来的操作,就通过当前的请求对象代替浏览器向服务器发送请求,调用其完成剩余任务。

无论涉及多少个servlet,浏览器只用发起一次请求,节省浏览器与服务器之间往返速度,提高服务处理速度。
所有servlet接收的请求方式都与浏览器发送的请求方式保持一致。

servlet数据共享

四种数据共享方案

  1. ServletContext接口
    ServletContext对象称为“全局作用域对象”,每个网站都有一个,相当于一个Map,每个servlet都可以存或取其中对象。
    全局作用域对象生命周期贯穿网站整个运行期间。

  2. Cookie类
    cookie是两个来自同一网站的servlet为同一用户服务时,存放当前用户私人数据的载体,只能存储字符串数据,一个cookie对象只能存储一条数据。
    服务器把cookie对象创建出来,放到响应头返回给浏览器,浏览器将cookie存到缓存中,发起下次请求时,将之前保存的cookie写到请求头发送到服务器,这样另一个servlet可以从cookie中拿到数据。
    默认情况,浏览器关闭,cookie对象就被销毁掉;我们可以手动设置cookie存储在硬盘上,并设置自动销毁时间。

  3. HttpSession接口
    HttpSession对象被称为“会话作用域对象”,存储在服务器中,可以存储任意数据类型的数据,使用map集合,可以存储任意数量的数据。
    Tomcat为每一个HttpSession对象设置空闲时间,默认30分钟,如果当前HttpSession对象空闲时间达到30分钟,此时Tomcat认为用户已经放弃了自己的HttpSession,就会销毁掉这个HttpSession。

  4. HttpServletRequest接口
    这个对象叫做“请求作用域对象”,只能在请求转发的时候使用,因为请求转发多个servlet共用同一个request和response。

监听器

此概念了解即可。

监听器接口用于监控【作用域对象生命周期变化时刻】以及【作用域对象共享数据变化时刻】

  1. ServletContext
    全局作用域对象
  2. HttpSession
    会话作用域对象
  3. HttpServletRequest
    请求作用域对象
过滤器

关于过滤器我有一篇专门的文章,详细讲解了过滤器与拦截器的关系与区别。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到