重点
1、HTTP协议特点
2、HTTP协议的请求响应格式
3、IDEA集成Tomcat服务器
4、Servlet的实现
5,Servlet的内置对象Request,Response对象
6、Servlet 转发与重定向
HTTP协议
客户端发送给服务器的格式叫**“请求协议”**;
服务器发送给客户端的格式叫**“响应协议”**。
HTTP协议特点
- 支持客户/服务器模式。
- 简单快速:客户向服务器请求(get/post)服务时,只需传送请求方法和路径。
- 灵活:HTTP 允许传输任意类型的数据对象。传输的类型由Content-Type加以标记。
- 无连接:无连接是表示每次连接只处理一个请求。
- 无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。
HTTP之URL
HTTP(超文本传输协议)是一个基于请求与响应模式的、应用层的协议,常基于TCP的连接方式,绝大多数的Web开发,都是构建在HTTP协议之上的Web 应用。
HTTP URL(URL 是一种特殊类型的 URI,包含了用于查找某个资源
的足够的信息)的格式 如下:
http://host[:port]/[abc_path]
http://IP(主机名/域名):端口/访问的资源路径
-
http 表示要通过 HTTP 协议来定位网络资源;
-
host 表示合法的 Internet 主机域名或 者 IP 地址;
-
port 指定一个端口号,为空则使用缺省端口 80;
-
abs_path 指定请求资源的 URI; 如果 URL 中没有给出
abs_path,那么当它作为请求 URI 时,必须以“/”的形式给出,
通常 这个工作浏览器自动帮我们完成。
HTTP请求
HTTP 请求由三部分组成,分别是:请求行、请求头、请求正文。
-
Get 请求(没有请求体)
-
Post 请求 格式如下:
请求行 请求头1 请求头2 … 请求空行 请求体
请求行以一个方法符号开头,以空格分开,后面跟着请求的 URI
和协议的版本。
格式如下:Method Request-URI HTTP-Version CRLF
Method 表示请求方法;
Request-URI 是一个统一资源标识符;
HTTP-Version 表示请 求的 HTTP 协议版本;
CRLF 表示回车和换行;
HTTP响应
在接收和解释请求消息后,服务器返回一个 HTTP 响应消息。
HTTP 响应也是由三个部分组成,分别是:状态行、消息报头、响应正文。
格式:
状态行
响应头1
响应头2
…
响应空行
响应体
消息头
HTTP 消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行), 消息报头(可选),空行(只有 CRLF 的行),消息正文(可选)组成。
每一个报头域都是由 名字+“:”+空格+值 组成,消息报头域的名字是大小写无关的。
请求头
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
Referer:该请求头指明请求从哪里来 。
如果是地址栏中输入地址访问的都没有该请求头 地址栏输入地址,通过请求可以看到,此时多了一个 Referer 的请求头,并 且后面的值 为该请求从哪里发出。比如:百度竞价,只能从百度来的才有效果,否则不算;通常用来做统计工作、 防盗链。
响应头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和 对 Request-URI 所标识的资源进行下一步访问的信息。
Location:Location响应报头域用于重定向接受者到一个新的位置。
Location响应报头域,常用在更换域名的时候。
response.sendRedirect("http://www.baidu.com");
Refresh:自动跳转(单位是秒),可以在页面通过meta标签实现,也可在后台实现。
<meta http-equiv="refresh"
content="3;url=http://www.baidu.com">
Servlet
实现Servlet
- 创建普通Java类
- 实现Servlet的规范,继承HttpServlet类
- 重写service方法,用来处理请求
- 设置注解,指定访问的路径
//@WebServlet(name = "Servlet01",value = "/ser01")
//@WebServlet(name = "Servlet01",value = {"/ser01","/ser001"})
//@WebServlet(name = "Servlet01",urlPatterns = "/ser01")
//@WebServlet(name = "Servlet01",urlPatterns = {"/ser01","/ser001"})
@WebServlet("/ser01") // 路径中的"/"不要忘记写!
public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 打印内容在控制台
System.out.println("Hello Servlet!");
// 通过流输出数据到浏览器
resp.getWriter().write("Hello Servlet!");
}
}
Servlet的工作流程
- 通过请求头获知浏览器访问的是哪个主机
- 再通过请求行获取访问的是哪个一个web应用
- 再通过请求行中的请求路径获知访问的是哪个资源
- 通过获取的资源路径在配置中匹配到真实的路径,
- 服务器会创建servlet对象,(如果是第一次访问时,创建
servlet实例,并调用init方法进行初始化操作) - 调用service(request, response)方法来处理请求和响应的
操作 - 调用service完毕后返回服务器 由服务器讲response缓冲区的数
据取出,以http响应的格式发送给浏览器
下面我们描述一下 Tomcat 与 Servlet 是如何工作的,看看下面的时序图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aiFDBy1w-1680270067470)(D:%5CBBBBBB%E7%AC%94%E8%AE%B0%5CMD%5C%E6%AF%8F%E6%97%A5%E9%97%AE%E9%A2%98.assets%5C1680266173542.png)]
-
Web Client 向 Servlet 容器(Tomcat)发出 Http 请求
-
Servlet 容器接收 Web Client 的请求
-
Servlet 容器创建一个 HttpServletRequest 对象,将 Web
Client 请求的信息封装到这个对象 中 -
Servlet 容器创建一个 HttpServletResponse 对象
-
Servlet 容器调HttpServlet 对象service 方法,把 Request 与
Response 作为参数,传给 HttpServlet\ -
HttpServlet 调用 HttpServletRequest 对象的有关方法,获取
Http 请求信息
-
HttpServlet 调用 HttpServletResponse 对象的有关方法,生成
响应数据
-
Servlet 容器把 HttpServlet 的响应结果传给 Web Client
Servlet的生命周期
Servlet没有 main()方法,不能独立运行,它的运行完全由 Servlet
引擎来控制和调度。 所谓生命周期,指的是 servlet 容器何时创建
servlet 实例、何时调用其方法进行请求的处理、 何时并销毁其实
例的整个过程。
init 方法,在 Servlet 实例创建之后执行(证明该 Servlet 有实例创建了)
public void init(ServletConfig config) throws
ServletException {
System.out.println("实例创建了...");
}
service 方法,每次有请求到达某个 Servlet 方法时执行,用来处理请求(证明该Servlet 进行服务了)
protected void service(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("服务调用了...");
}
destroy 方法,Servlet 实例销毁时执行(证明该 Servlet 的实例被销毁了)
public void destroy() {
System.out.println("实例销毁了...");
}
Servlet 的生命周期,简单的概括这就分为四步:
servlet 类加载–> 实例化–>服务–>销毁。
n(“服务调用了…”);
}
**destroy** 方法,Servlet 实例销毁时执行(证明该 Servlet 的实例被销毁了)
```java
public void destroy() {
System.out.println("实例销毁了...");
}
Servlet 的生命周期,简单的概括这就分为四步:
servlet 类加载–> 实例化–>服务–>销毁。