原文地址:
https://www.cnblogs.com/dandelion-000-blog/p/16694147.html
1、HTTP
1.1 请求数据格式
-
请求行:请求数据的第一行
包含三个内容,按顺序分别为:
请求方式(如GET )、请求资源路径(如/ )、协议版本(如HTTP/1.1 )
-
请求头:第二行开始
格式为key:value ,常见的请求头如下:
Host: 表示请求的主机名
User-Agent: 浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0 ...Chrome/79,IE浏览器的标识类似Mozilla/5.0 (Windows NT ...)like Gecko;
Accept:表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有;
Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;
Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip, deflate等。
-
请求体:最后一部分
POST请求才有,存放请求参数
和请求头使用空行隔开
// 请求头
username=root&password=123456
-
GET和POST请求的区别
- GET请求的请求参数在请求行中,没有请求体
- GET请求请求参数大小有限制,POST没有
1.2 相应数据格式
-
响应行:响应数据的第一行
包含三个内容,按顺序分别为:
协议版本(如HTTP/1.1 )、响应状态码(如200 )、表示码描述(如OK )
-
响应头:第二行开始
格式为key:value 格式,常见的响应头如下
Content-Type:表示该响应内容的类型,例如text/html,image/jpeg;
Content-Length:表示该响应内容的长度(字节数);
Content-Encoding:表示该响应压缩算法,例如gzip;
Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒
-
响应体:最后一部分
如HTML代码
与响应头使用空行隔开
-
响应状态码:响应行中内容
响应状态码分类:
状态码分类 | 说明 |
---|
1xx | 响应中——临时状态码,表示请求已经接收,告诉客户端应当继续请求或者如果它已完成则忽略 | 2xx | 成功——表示请求已经被成功接收,处理已完成 | 3xx | 重定向——重定向到其他地方:它让客户端再发起一个请求以完成整个处理 | 4xx | 客户端错误——处理发生错误,责任在客户端。如:请求不存在资源、未授权或禁止访问等 | 5xx | 服务器错误——处理发生错误,责任在服务器。如:抛出异常、路由出错、HTTP版本不支持等 |
状态码大全:https://cloud.tencent.com/developer/chapter/13553
常见的响应状态码:
状态码 | 英文描述 | 解释 |
---|
200 | OK | 客户端请求成功,即处理成功,这是我们最想看到的状态码 | 302 | Found | 指示所请求的资源已移动到由Location 响应头给定的 URL,浏览器会自动重新访问到这个页面 | 304 | Not Modified | 告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向 | 400 | Bad Request | 客户端请求有语法错误,不能被服务器所理解 | 403 | Forbidden | 服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源 | 404 | Not Found | 请求资源不存在,一般是URL输入有误,或者网站资源被删除了 | 428 | Precondition Required | 服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头 | 429 | Too Many Requests | 太多请求,可以限制客户端请求某个资源的数量,配合 Retry-After(多长时间后可以请求)响应头一起使用 | 431 | Request Header Fields Too Large | 请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。 | 405 | Method Not Allowed | 请求方式有误,比如应该用GET请求方式的资源,用了POST | 500 | Internal Server Error | 服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧 | 503 | Service Unavailable | 服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好 | 511 | Network Authentication Required | 客户端需要进行身份验证才能获得网络访问权限 |
2、Servlet
-
快速入门
-
依赖:创建web项目,导入Servlet依赖坐标
Tomcat内置Servlet,若运行时使用该依赖则会导致冲突
使用<scope>provided</scope> ,仅测试和编译环境有效
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
-
创建:定义类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话 public class ServletDemo1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet hello world!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
-
配置:在类上使用@WebServlet("") 注解,配置该Servlet的访问路径 @WebServlet("/demo1")
public class ServletDemo1 implements Servlet { }
-
访问:启动Server,输入URL访问该Servlet http://localhost:8080/servlet_1_0_SNAPSHOT_war/demo1
-
执行流程
-
URL拆解
http://localhost:8080 为本机的服务器地址http://localhost:8080/servlet_1_0_SNAPSHOT_war 为本项目地址http://localhost:8080/servlet_1_0_SNAPSHOT_war/demo1 为该Servlet的访问地址 -
创建和调用
-
客户端发送请求到服务器 -
服务器解析请求 -
Servlet对象由服务器自动创建 -
service()方法由服务器自动调用
自定义Servlet时,必须实现Servlet接口并覆写其中方法,故必然存在可以调用的service() 方法
-
service()方法被执行,服务器对客户端做出响应 -
生命周期
-
方法介绍
-
初始化方法 public void init(ServletConfig servletConfig);
-
提供服务方法 public void service(ServletRequest servletRequest, ServletResponse servletResponse);
-
销毁方法 public void destroy();
-
获取ServletConfig 对象 public ServletConfig getServletConfig();
-
获取Servlet信息 public String getServletInfo();
-
体系结构
多数时候不需要覆写上述五个方法全部,可以简化
-
Servlet体系结构
类或接口 | 说明 |
---|
Servlet | Servlet体系根接口 | ↑ | – | GenericServlet | Servlet抽象类实现 | ↑ | – | HttpServlet | 对HTTP协议封装的Servlet实现 |
由于以开发B/S的Web项目为主,均针对HTTP协议,故可在自定义Servlet时继承HttpServlet
-
HttpServlet 示例
HttpServlet 已经对service() 方法中请求方式判断的方式进行封装
在使用时需要进一步对不同请求方式实现不同的逻辑
@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {
@Override
protected void doGet(
HttpServletRequest req, HttpServletResponse resp
) throws ServletException, IOException {
System.out.println("get...");
}
@Override
protected void doPost(
HttpServletRequest req, HttpServletResponse resp
) throws ServletException, IOException {
System.out.println("post...");
}
}
-
Servlet urlPattern配置
3、Servlert的xml配置
-
说明
@WebServlet() 注解仅支持3.0版本及以上,3.0以下版本仅支持使用XML进行配置
-
快速入门
-
编写Servlet类 package priv.dandelion.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo13")
public class ServletDemo13 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo13 get...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo13 post...");
}
}
-
在web.xml中对该Servlet进行配置 <web-app>
<servlet>
<servlet-name>demo13</servlet-name>
<servlet-class>priv.dandelion.web.ServletDemo13</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo13</servlet-name>
<url-pattern>/demo13</url-pattern>
</servlet-mapping>
</web-app>
|