一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第22天,点击查看活动详情。
写在前面👀
这篇文章主要讲讲HTTP协议和Servlet快速入门
一、HTTP协议
HTTP协议可是个大内容,俺在这就讲些主要的,为了引出Servlet的作用。
1️⃣简介
a.HTTP协议概念
数据传输规则:指的是
请求数据和响应数据需要按照指定的格式进行传输
- 而HTTP协议(HyperText Transfer Protocol,
超文本传输协议)是基于TCP/IP通信协议来传递数据的,规定的就是浏览器和服务器之间数据传输规则
b.HTTP协议特点
- 支持客户/服务器模式(
C/S架构模型) - 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有
GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。 - 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- 无连接:
一次请求对应一次响应,请求和响应是一一对应关系。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。 - 无状态:对于事物处理没有记忆能力,每次请求和响应都是独立的。客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息。
- 优点:速度快
- 缺点:多次请求间不能共享数据(所以后面就有了
会话技术cookie和session)
2️⃣HTTP请求数据格式
请求方式有很多种,常用的有GET和POST请求
GET请求数据格式总共分为三部分内容,分别是
请求行、请求头、请求空行POST请求数据格式总共分为四部分内容,分别是
请求行、请求头、请求空行、请求体
- GET请求数据格式示例👇
GET /login.html HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Host: 127.0.0.1:8080
...省略大部分请求头属性
//请求空行
a.请求行
HTTP请求中的第一行数据,请求行包含三块内容:
请求方式、请求URL路径、HTTP协议及版本
- 示例👇
GET /login.html HTTP/1.1
b.请求头
从第二行开始,格式为键值对形式
- 示例👇
Host: 127.0.0.1:8080
- 服务端可以根据请求头中的内容来获取客户端的相关信息,有了这些信息,服务端就可以处理不同的业务需求。比如服务端通过请求头中的数据获取到客户端的浏览器类型,根据不同浏览器类型执行解析HTML的方式也不同,解决了浏览器兼容问题
c.请求空行
即使第四部分的请求体为空,也必须有请求空行
d.请求体
POST请求的最后一部分,用来存储请求参数
POST /login HTTP/1.1
Content-Type: application/x-www-form-urlencoded
...省略大部分请求头属性
//请求空行
username=bighorn&password=123456
f.GET请求和POST请求区别
- GET请求请求参数在请求行中,没有请求体,POST请求请求参数在请求体中
- GET请求请求参数大小有限制,POST没有
3️⃣HTTP响应数据格式
响应数据格式总共分为三部分内容,分别是
响应行、响应头、响应空行、响应体
- 响应数据格式示例👇
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html
...省略大部分响应头属性
//响应空行
<html>
<head></head>
<body>
...
</body>
</html>
a.响应行
响应数据的第一行,响应行包含三块内容,分别是
HTTP协议及版本、响应状态码、状态码消息
- 示例👇
HTTP/1.1 200 OK
b.响应头
从第二行开始,格式为键值对形式,和服务端的信息和响应数据的信息有关
- 示例👇
Content-Type: text/html
c.响应空行
响应空行用来分隔响应体
d.响应体
最后一部分,用来存放响应数据
- 例如上面的示例存放了HTML标签内容
f.状态码
| 状态码分类 | 说明 |
|---|---|
| 1xx | 响应中——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它 |
| 2xx | 成功——表示请求已经被成功接收,处理已完成 |
| 3xx | 重定向——重定向到其它地方:它让客户端再发起一个请求以完成整个处理。 |
| 4xx | 客户端错误——处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等 |
| 5xx | 服务器端错误——处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等 |
二、Servlet简介
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层
1️⃣Servlet工作模式
- 客户端发送请求至服务器
- 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
- 服务器将响应返回客户端
2️⃣Servlet架构
- Servlet 在 Web 应用程序中的位置👇
3️⃣使用Servlet
- Servlet其实是javax.servlet接口,使用前,要先定义Servlet实现类,并重写它的五个方法
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
三、第一个Servlet程序
0️⃣创建web项目
- 这一步就略了,之前文章里演示过好多次
1️⃣导入Servlet依赖坐标
- 注意依赖范围要写
provided(在编译和测试过程中有效,打包的时候无效),这是因为Tomcat的lib目录自带servlet-api这个jar包,这样可以避免在打包时jar包发生冲突
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
2️⃣实现Servlet接口
- 定义一个类,实现Servlet接口,并重写接口中所有方法
- 使用@WebServlet注解,配置该Servlet的访问路径,如
@WebServlet("/demo1")
@WebServlet("/demo1")
public class ServletDemo1 implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello servlet!");
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
3️⃣访问Servlet
- 启动Tomcat服务器
- 在浏览器地址栏里输入URL,访问该Servlet
http://localhost:8080/tomcat/demo1
- 之后会在控制台看见
hello servlet!
写在后面🍻
感谢观看啦✨
有什么不足,欢迎指出哦💖
掘金的运营同学审核辛苦了💗