Http Servlet
Servlet
一、Java Web 开发核心知识点
1.1 - 什么是 Web 开发
Web
通信,指两台计算机通过计算机网络进行资源文件共享活动Web
开发确保本次通信顺利执行
1.2 - Web 通信中两台计算机之间的角色
- 客户端:用于发送请求
- 服务端:提供共享资源文件
1.3 - 资源文件
- 理论上来说,计算机上所有的文件都是资源共享文件
1.3.1 - 静态资源文件
- 文件内容是固定的,不能随请求的变化而变化
- 服务端计算机直接将静态资源文件推给客户端,所有被共享的静态资源文件最终是在客户端运行
1.3.2 - 动态资源文件
- 文件内容可以根据用户提供需求变化而产生不同变化内容
- 服务端会调用执行动态资源文件,服务端将动态资源文件的运行结果交给客户端
1.4 - Web 通信中,两台计算机如何进行通信
1.4.1 - C/S
结构通信方式
C -
Client
,客户端计算机安装特定客户端程序,可以帮助客户端向指定服务器发送请求S -
Server
,在服务端计算机安装一种特定资源调度软件接收特定客户端程序发送请求,将请求需要的资源文件推送回客户端上的客户端程序优点
- 可以有效的保护服务端计算机
- 可以分摊服务端计算机工作压力
缺点
- 增加客户获得服务的成本
- 增加服务端维护成本
1.4.2 - B/S
B -
Browser
,可以帮助客户端向任意服务端发送请求S -
Server
, 在服务端安装一种特定资源调度软件,可以接收所有浏览器发送的请求,将请求的资源文件推送给客户端浏览器优点
- 不会增加客户获得服务的成本
- 不会增加客户端维护的成本
缺点
- 无法有效保护服务端计算机
- 无法通过客户端计算机分摊服务端的计算机压力
1.5 - 网络协议包
1.5.1 - 定义
用于包裹在网络中传输二进制
1.5.2 - 分类
FTP
HTTP
1.5.3 - 注意事项
B/S
到目前为止指使用HTTP
网络协议包
1.6 - HTTP 内部结构
1.6.1 - 请求协议包
- 是浏览器在发送请求时创建的
- 是浏览器负责将请求信息,写入到请求协议包
HTTP
请求协议包内部自上而下有四层结构
1.6.1.1 - 请求行
1 | { |
1.6.1.2 - 请求头
1 | { |
1.6.1.3 - 空白行
隔离层
1.6.1.4 - 请求体
1 | { |
1.6.2 - 响应协议包
- 在服务端计算机的资源调度软件准备推送文件时负责创建
- 响应协议包内容可以有资源调度软件写入,可以由
Java
命令写入HTTP
请求协议包内部自上而下有四层结构
1.6.2.1 - 状态行
1 | { |
1.6.2.2 - 响应头
1 | { |
1.6.2.3 - 空白行
1.6.2.4 - 响应体
1 | { |
1.7 - 请求方式
1.7.1 - GET
- 要求浏览器发送请求时,携带请求参数数量不能操作 4
K
- 要求浏览器将请求参数写入到请求头
- 要求浏览器将请求参数信息在地址栏显示出来
- 要求浏览器对接收的资源文件必须缓存到内存
1.7.2 - POST
- 不会限制浏览器发送请求时,携带请求参数数量
- 要求浏览器将请求参数写入请求体
- 要求浏览器将请求参数在地址栏隐藏
- 要求浏览器对接收的文件不能保存到缓存
1.8 - 控制浏览器的请求方式
1.8.1 - GET
- 超链接
localtion
对象- 表单中的
Method
属性可以设置为GET
1.8.2 - POST
- 表单中的
Method
属性可以设置为POST
二、HTTP 服务器
2.1 - 介绍
- 安装在服务端计算机上的一种软件
- 可以解析来自于浏览器发送的请求协议包
- 调用服务端上被请求的资源共享文件
- 负责生成一个响应协议包
- 负责将文件内容或者文件运行结果写入到响应体
- 负责将响应协议包推送给当前浏览器
2.2 - 分类
- 德国 – SAP
- IBM – WebLogic
- JBOSS – JBOSS
- Apache – Tomcat – 单位时间内大约 1200 次请求
2.3 - Tomcat 介绍
- 是一个由
Java
应用程序编写的资源文件调度器- 可以调用服务端静态资源文件和动态资源文件
Tomcat
负责生成响应协议包,负责将响应协议包推送到浏览器Tomcat
属于Apache
2.4 - 网站
- 全称:网络中的资源站点
- 作用:仓库,存储可以共享静态资源文件和动态资源文件
- 文件管理:由
HTTP
服务器来调用内部共享资源文件- 本质:就是一个文件夹
2.5 - 网站分类
- 静态资源网站:存储都是静态资源文件
- 动态资源网站:存储的是静态资源和动态资源
三、Servlet 规范
3.1 - JavaEE 与 JavaSE 的区别
JavaEE
– 企业级开发规范JavaSE
– 基本开发规范,制定了管理系统与 13 类系统之间的交流规则
3.2 - Servlet 规范
Servlet
规范是JavaEE
规范中的一种Servlet
规范中设置JVM
与Http
服务器的交流规则
- 定义何种
Java
类可以被HTTP
服务器调用
- 只有
Servlet
的实现类才有资格作为**动态共享资源文件Servlet
实现类由开发人员创建HTTP
服务器应该如何管理 动态资源文件
3.3 - 创建 Servlet 实现类
- 创建一个实现类,继承
HttpServlet
HttpServlet
存在于Tomcat/lib/servlet-api.jar
- 根据来访的浏览器采用的请求方式,重写对应 doGet 或者 doPost
- 在
WEB-INF/lib/web.xml
中注册实现类,并创建匹配的对外路径
3.4 - Tomcat 调用 Serlvet 接口实现类流程
浏览器向服务器发送请求
Tomcat
接收到这个请求
首先将请求资源文件作为动态资源文件。到
web.xml
进行文件定位。如果有则调用,如果没有找到对应的动态资源文件,此时Tomcat
认为本次请求的是一个静态资源文件,从web
下进行定位。如果有则返回,如果还是没有,则返回404
Tomcat
定位到 web.xml
根据 <url-pattern/>
进行定位 <servlet-name/>
<servlet-name/>
定位 <servlet-class/>
找到本次请求的 Servlet
Tomcat
根据浏览器采用的请求方式,调用 Servlet
的 doGet
或者 doPost
方法
当 doGet
或者 doPost
调用完毕,Tomcat
负责将相应包推送给浏览器
3.5 - Servlet 请求路径写法规则
3.5.1 - 具体请求路径
<url-parttern>/path</url-partter>
浏览器请求的 资源文件地址 与
<url-partter/>
的内容完全一致优先级最高
3.5.2 - 前置请求路径
<url-parttern>/path/*</url-partter>
浏览器请求的 资源文件地址 以
<url-partter/>
的内容开头优先级第二
3.5.3 - 后置请求路径
<url-parttern>*path</url-partter>
浏览器请求的 资源文件地址 以
<url-parttern/>
的内容结尾优先级最低
3.5.4 - 通配符请求路径
<url-parttern>/*</url-partter>
接收来自浏览器的所有请求
优先级第三
3.6 - Servlet 实例对象的生命周期
项目中所有的
Servlet
的实例对象都是Tomcat
创建的,开发人员没有权利创建创建时机
默认情况:当第一个用户来访问这个
Servlet
时,Tomcat
负责创建人工干预:要求
Tomcat
在启动时,创建Servlet
的实例对象
1 <load-on-startup>任一大于0的数</load-on-startup>在
Tomcat
运行器件,一个Servlet
实现类只能被创建一个对象在
Tomcat
关闭时,由Tomcat
负责销毁所有Servlet
实例类对象
3.7 - 请求对象与响应对象生命周期
- 都是由
Tomcat
负责创建- 每当一个
Tomcat
收到一个 请求协议包,就会为这个请求协议包创建一对 请求对象和响应对象- 一次请求对应一对 请求对象和响应对象
- 在
Tomcat
调用被请求的Servlet
中的doGet
和doPost
方法时,负责将本次 请求对象和响应对象 作为参数传入到服务方法- 在服务方法完毕后,
Tomcat
销毁本次请求相关的request
和response
- 最后,
Tomcat
负责将 相应包 推送到服务器上
四、HttpServletResponse
负责将运行结果写入到相应包
4.1 - 介绍
- 一个来自于
Servlet
规范中的接口,由Tomcat
负责提供这个接口实现类- 负责在
Servlet
运行完毕后,将相关的数据写入到 响应头 和 响应体- 开发人员习惯于将
HttpServletResponse
接口修饰对象称为 响应对象
4.2 - 方法
.setCharacterEncoding()
设置字符编码
key – 字符编码
.getWriter()
获取输出流
.setContentType()
设置响应的类型
key – 内容类型,一般为
text/html;charset='UTF-8'
与
.setCharacterEncoding()
的不同处在于settContentType()
还可以设置内容类型
五、HttpServletRequest
负责读取请求协议包信息
5.1 - 介绍
- 来自于
Servlet
规范中的一个接口,接口实现类由Tomcat
负责提供- 由
HttpServletRequest
接口修饰对象,可以帮助开发人员读取 请求协议包 信息- 一般习惯于将
HttpServletRequest
接口修饰的丢向称为 请求对象
5.2 - 方法
.getRequestURL()
获取请求的
URL
.getMethod()
获取请求使用的方法
.getParameterNames();
将请求头或请求体中所有的请求参数的名字取出来,保存到一个
Enumeration
-枚举类中
.getParameter()
根据参数名获取参数
.getParameterValues()
根据参数名,获取该参数名对应的所有请求值,放入一个
String[]
中
.setCharacterEncoding()
设置字符编码
5.3 - 中文乱码问题
- 如果浏览器以
GET
方式发送请求,请求参数 在 请求头 存放在请求协议包到达服务端之后,请求头 内容是由Tomcat
负责解析,Tomcat
在解析数据时,默认采用的字符集utf-8
,所以如果浏览器以GET
方式发送中文参数,此时在服务端不会出现中文乱码问题- 如果浏览器以
POST
方式发送请求,请求参数 在 请求体 存放在请求协议包到达服务端之后,请求体 内容是由对应请求对象request
负责解码的。request
对 象默认使用IS0-8859-1
字符集所以如果浏览器以post
方式发送中文参数,此时在服务端必须会出现中文乱码问题
六、ServletContext
可以为当前网站中所有的
Servlet
提供 共享数据
6.1 - 介绍
Servlet
规范中的一个接口,接口实现类由Tomcat
提供- 负责为当前工程所有
Servlet
提供 共享数据- 开发人员习惯于将
ServletContext
接口修饰对象称为 全局作用域对象
6.2 - 生命周期
- 全局作用域对象 在
Tomcat
启动时,由Tomcat
为当前网站来创建- 一个网站只能由一个全局作用域对象
- 从网站启动开始,一直到网站关闭,由
Tomcat
负责销毁当前网站的全局作用域对象
6.3 - 方法
ServletContext application = request.getServletContext()
获取 全局作用域对象
applicaion.getAttribute()
获取后来由程序写入的对象
applicaiont.getInitParameter()
获取由配置文件配置的对象
6.4 - 配置文件方式创建
1 | <context-param> |
6.5 - 程序存入来创建
1 | ServletContext application = request.getServletContext(); |
七、Cookie
在一次会话过程中,存储浏览器在服务端产生的私人数据
7.1 - 什么是会话
- 定义:一个浏览器与一个服务端的一次完整的交流
- 特点:
- 在一次会话过程中,经历多次请求与响应
- 在一次会话过程中,同一个浏览器往往访问多个
Servlet
- 需求:在一次会话过程中,在浏览器要访问的
Servlet
之间进行数据共享
7.2 - 介绍
Cookie
是Servlet
规范提供一个工具类- 在参与一个会话过程中
Servlet
之间,进行 数据共享Cookie
存储在浏览器上,保存本次会话的 共享数据
7.3 - 工作原理
- 在浏览器向
Servlet
发送请求时,Servlet
在处理期间,将当前浏览器产生的私人数据保存到Cookie
,然后推送到浏览器- 当浏览器再次来访问当前网站时,会无条件将服务端之前推送的
Cookie
附带上,这样服务器的Servlet
就会得到客户端之前的私人信息
7.4 - 方法
Cookie c = new Cookie(“key”, “value”);
一个
Cookie
只能由一个键值对,且只能存储String
response.addCookie(c)
将
Cookie
写入响应头
Cookie array[ ] = request.getCookies()
从请求中读取
Cookie
数组
.setMaxAge()
设置
Cookie
的存活时间
7.5 - 生命周期
- 默认情况 –
Cookie
保存在浏览器内存,浏览器关闭时,Cookie
会被Windows
销毁- 人工干预 – 将
Cookie
保存在客户端存储器上,同时设置Cookie
的存活时间 (单位:s)
八、HttpSession
在一次会话过程中,存储浏览器在服务端产生的私人数据
8.1 - 介绍
- 来自于
Servlet
规范中的接口,接口实现类来自于Tomcat
- 为参与同一个会话的
Servlet
之间提供共享数据- 开发人员习惯于将
HttpSession
接口修饰的对象称为 会话作用域对象 或 session对象
8.2 - 与 Cookie 的区别
相同点
- 为参与同一个会话的
Servlet
之间提供共享数据不同点
Cookie
存在于客户端的浏览器或存储器HttpSession
存在于服务端计算机的内存Cookie
只能存储String
型HttpSession
可以存储任意类型Cookie
只能存储一个键值对HttpSession
可以存储任意个数的键值对
8.3 - 方法
- 在浏览器来访时,
Tomcat
不会主动为当前浏览器创建对应的HttpSession
对象- 只有一个浏览器所访问的
Servlet
向Tomcat
提出要求时,Tomcat
才会为当前浏览器创建一个HttpSession
对象- 如何在
Servlet
中为当前浏览器申请一个HttpSession
对象
.getSession() / .getSession(true)
- 如果当前浏览器在服务端已经有了一个
Session
,则将这个Session
对象返回,否则创建一个全新的Session
对象返回- 一般用于用户身份已经确认合法的情况下
.getSession(false)
- 如果当前浏览器在服务端已经有了一个
Session
,则将这个Session
对象返回,否则返回一个null
- 一般用于用户身份不确认的情况下
.setAttribute(“key”, value)
将键值对放入
Session
对象
.getAttribute(“key”)
根据
key
从Seesion
对象获取数据
九、HTTP 状态码
9.1 - 介绍
Http
状态码是由一个三位数字组成的符号Http
状态码由Tomcat
负责创建生成Http
状态码由Tomcat
写入到状态行Http
状态码通知浏览器在接到相应包之后的行为Http
状态码通知浏览器服务端无法提供本次服务的原因
9.2 - 1××
通知浏览器本次返回的资源文件并不完整,需要浏览器继续向服务器发送申请
9.3 - 2××
通知浏览器,服务端将一个完整的文件推给了浏览器
- 200 – 完美状态
9.4 - 3××
服务端推给浏览器的是一个网址,要求浏览器在接收到这个网址后立刻自动向这个网址发送请求
9.5 - 4××
通知浏览器服务端本次未能提供服务的原因,是由于服务端没有对应的资源文件
- 404 - 服务端没有对应的资源文件
- 405 - 服务端有本次请求对应的
Servlet
但是Servlet
不负责处理这个请求
9.6 - 5××
通知浏览器服务端本次未能提供服务的原因,被调用
Servlet
在运行中出了异常
十、重定向与请求转发
10.1 - 前提
- 一个
Servlet
只负责实现一个功能- 浏览器在一次请求时,只能请求一个资源文件
- 如果浏览器的请求需要由多个
Servlet
协同完成,需要用户多次手动提交,这样降低服务质量
10.2 - 方案
- 重定向方案
- 请求转发方案
10.3 - 重定向
10.3.1 - 原理
在第一个
Servlet
工作完毕后,将第二个Servlet
地址推送给浏览器,由用户浏览器根据这个地址来自动向第二个Servlet
发送请求
10.3.2 - 特征
- 发生为止 – 客户端浏览器
- 浏览器发送的请求次数 – 多次
- 地址栏变化 – 是
- 重定向采取的请求方式 –
GET
- 重定向时访问资源文件的范围 – 可以是同一个网站的资源,也可以是其他网站的资源
10.3.3 - response.sendRedirect(第二个 Servlet 地址);
将一个地址写入到 响应头 中
Location
,浏览器接收到响应包之后,自动根据Location
地址发送第二次请求,这样的好处是避免用户多次手动发送请求
10.4 - 请求转发
10.4.1 - 原理
- 在第一个
Servlet
工作完毕后,代替当前浏览器向Tomcat
申请调用第二个Servlet
Tomcat
在接收到申请之后,调用第二个Servlet
来完成本次请求中剩余任务
10.4.2 - 特征
- 发生位置 – 服务器
- 浏览器发送请求次数 – 一次
- 地址栏变化 – 否
- 调用文件范围 – 只能访问同一网站的内部资源文件
- 请求转发的请求方式 – 与浏览器第一次发送的方式保持一致,参与同义词请求转发的所有
Servlet
接收的请求都是一样的- 如何共享数据 – 全局作用域对象、会话作用域对象、请求作用域对象
10.4.3 - request.getRequestDisoatcher(第二个 Servlet 地址).forward(request, response)
从响应头获取
RequestDisoatcher
对象,写入第二个Servlet
地址并转发请求