servlet复习回顾
前言
如今的Java开发人员实际上可以称为“Spring开发人员”,所有的开发流程的内部细节都由Spring框架封装好的,所以我们在实际开发中就很少考虑其中的细节。然而若想成为一名高级开发工程师,而不是码农,必须对其底层的实现逻辑了如指掌。
依鄙人所见,servlet就是Java做web开发的精髓所在,完全掌握servlet非常重要。
先放一张大图
这就是总览了,当然有些地方的技术是比较老旧的。
互联网通信流程
两台计算机通过网络实现文件共享行为,就是互联网通信。
通信角色氛围客户端和服务端,有的节点可能既是客户端又是服务端。
通信模型
C/S通信模型
客户端向指定服务端发送请求,索要资源文件,并将服务端返回的二进制数据解析展示。
服务端用于接收来自于特定的客户端发送的请求,在接收到请求之后在服务端上定位被访问的资源文件,将文件内容以二进制形式通过网络发回客户端。
C/S普遍用于个人娱乐市场,比如微信、淘宝、优酷、英雄联盟等,在企业办公应用较少。
优点是安全性较高,也能降低服务端工作压力;缺点是增加客户获得服务成本(需要下载),且更新较为繁琐。B/S通信模型
浏览器可以向任意服务器发送请求,索要资源文件,并将服务端返回的二进制数据解析展示。
服务端可以处理任意浏览器发送的请求,在接收到请求之后在服务端上定位被访问的资源文件,将文件内容以二进制形式通过网络发回浏览器。
B/S既适用于个人娱乐市场,也适用于企业日常活动。
优点是不会增加用户获得服务成本(不用下载对应软件),也不用频繁更新浏览器,缺点是服务端计算机工作压力巨大。
共享资源文件
可以经过网络进行传输的文件
静态资源文件
文档、图片、视频等
可以在浏览器编译执行的命令(html、css、js)动态资源文件
不能在浏览器执行的命令(.class等)
动态文件被索要时,需要服务器处理逻辑,将运行结果返回给浏览器。
无论是静态还是动态,都是以二进制形式返回浏览器的。
http网络协议
网络协议包
为什么要有包的概念?
在网络中传递信息都是以二进制形式存在的,接收方(服务器或浏览器)接
收到请求或响应数据时,第一时间就是解析二进制数据。
有时传输信息的数据量比较巨大,导致接收方很难获取相应数据。
网络协议包是一组有规律的二进制数据,在这组数据存在固定空间,每一个空间专门存放特定信息,这样接收方在接收网络协议包之后就可以到固定空间得到对应信息。例如
【0000(ip地址)0000(端口号)0000(资源文件名)0000】
网络协议包出现极大降低了接收方对接收二进制数据编译难度
http请求协议包
请求行
请求地址、请求方式请求头
get请求参数信息、cookie信息空白行
没有内容,起到隔离作用请求体
post请求参数信息
http响应协议包
状态行
http状态码(200、404…)响应头
content-type:指定解析二进制数据的编译器
location:重定向的地址
cookie:共享信息空白行
没有内容,起到隔离作用响应体
返回结果的二进制码
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对象
响应对象,主要任务是:
- 将执行结果以二进制形式写入到响应体
- 设置响应头中content-type属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译为文字、图片、视频、前端代码命令
- 设置响应头中location属性,将一个请求地址赋值给location从而控制浏览器向指定服务器发送请求(重定向)
request对象
请求对象,主要任务是:
- 读取http请求协议包中请求行的信息
- 读取http请求协议包中请求头(get)或请求体(post)中请求参数信息
- 代替浏览器向http服务器申请资源文件调用
request和response的生命周期
- 在Http服务器接收到浏览器发送的Http请求协议包之后,自动为当前的Http请求协议包生成一个【请求对象】和一个【响应对象】
- 在Http服务器调用doGet/doPost方法时,负责将【请求对象】和【响应对象】作为实参传递到方法,确保doGet/doPost正确执行
- 在Http服务器准备推送Http响应协议包之前,负责将本次请求关联的【请求对象】和【响应对象】销毁
- 【请求对象】和【响应对象】生命周期贯穿一次请求的处理过程中
- 【请求对象】和【响应对象】相当于用户在服务端的代言人
重定向
工作原理:用户第一次手动发送请求,浏览器处理完请求后,还需要另一个servlet完成接下来的操作,就在响应协议包的状态行写302,将第二个servlet的地址写到响应头的location属性,由浏览器自动发送第二次请求,完成剩余任务。
请求次数>=2,但是只有第一次用户手动发送,其余都是浏览器自动发送
因为浏览器发送请求默认为get方式,所以重定向请求方式一定是get
缺点:需要在浏览器与服务器之间进行多次往返,大量时间消耗在往返次数上,增加用户等待服务时间。
请求转发
工作原理:用户第一次手动发送请求,浏览器处理完请求后,还需要另一个servlet完成接下来的操作,就通过当前的请求对象代替浏览器向服务器发送请求,调用其完成剩余任务。
无论涉及多少个servlet,浏览器只用发起一次请求,节省浏览器与服务器之间往返速度,提高服务处理速度。
所有servlet接收的请求方式都与浏览器发送的请求方式保持一致。
servlet数据共享
四种数据共享方案
ServletContext接口
ServletContext对象称为“全局作用域对象”,每个网站都有一个,相当于一个Map,每个servlet都可以存或取其中对象。
全局作用域对象生命周期贯穿网站整个运行期间。Cookie类
cookie是两个来自同一网站的servlet为同一用户服务时,存放当前用户私人数据的载体,只能存储字符串数据,一个cookie对象只能存储一条数据。
服务器把cookie对象创建出来,放到响应头返回给浏览器,浏览器将cookie存到缓存中,发起下次请求时,将之前保存的cookie写到请求头发送到服务器,这样另一个servlet可以从cookie中拿到数据。
默认情况,浏览器关闭,cookie对象就被销毁掉;我们可以手动设置cookie存储在硬盘上,并设置自动销毁时间。HttpSession接口
HttpSession对象被称为“会话作用域对象”,存储在服务器中,可以存储任意数据类型的数据,使用map集合,可以存储任意数量的数据。
Tomcat为每一个HttpSession对象设置空闲时间,默认30分钟,如果当前HttpSession对象空闲时间达到30分钟,此时Tomcat认为用户已经放弃了自己的HttpSession,就会销毁掉这个HttpSession。HttpServletRequest接口
这个对象叫做“请求作用域对象”,只能在请求转发的时候使用,因为请求转发多个servlet共用同一个request和response。
监听器
此概念了解即可。
监听器接口用于监控【作用域对象生命周期变化时刻】以及【作用域对象共享数据变化时刻】
- ServletContext
全局作用域对象 - HttpSession
会话作用域对象 - HttpServletRequest
请求作用域对象
过滤器
关于过滤器我有一篇专门的文章,详细讲解了过滤器与拦截器的关系与区别。